how do I get Mixer channels layout in java

后端 未结 2 507
我寻月下人不归
我寻月下人不归 2020-12-20 03:17

I thought I can find anything on this great site but now I seem to face the issue with no answer :) Please help!

Thing is, I need to play up to 6 different wav files

相关标签:
2条回答
  • 2020-12-20 03:44

    My friend and I just figured out that java7 sound system supports 6 channels and all the variants of their using with different bits, etc.

    Here is the code to list what your java can do:

            Mixer.Info[] mi = AudioSystem.getMixerInfo();
            for (Mixer.Info info : mi) {
                System.out.println("info: " + info);
                Mixer m = AudioSystem.getMixer(info);
                System.out.println("mixer " + m);
                Line.Info[] sl = m.getSourceLineInfo();
                for (Line.Info info2 : sl) {
                    System.out.println("    info: " + info2);
                    Line line = AudioSystem.getLine(info2);
                    if (line instanceof SourceDataLine) {
                        SourceDataLine source = (SourceDataLine) line;
    
                        DataLine.Info i = (DataLine.Info) source.getLineInfo();
                        for (AudioFormat format : i.getFormats()) {
                            System.out.println("    format: " + format);
                        }
                    }
                }
            }
    

    This is output from my macbook pro with usb connected external sound card:

    info: Default Audio Device, version Unknown Version
    mixer com.sun.media.sound.DirectAudioDevice@67310bf
        info: interface SourceDataLine supporting 14 audio formats, and buffers of at least 32 bytes
        format: PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, big-endian
        format: PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, big-endian
        format: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
        format: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian
        info: interface Clip supporting 14 audio formats, and buffers of at least 32 bytes
    info: Built-in Input, version Unknown Version
    mixer com.sun.media.sound.DirectAudioDevice@2edf98c4
    info: Built-in Output, version Unknown Version
    mixer com.sun.media.sound.DirectAudioDevice@59a683e6
        info: interface SourceDataLine supporting 14 audio formats, and buffers of at least 32 bytes
        format: PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, big-endian
        format: PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, big-endian
        format: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
        format: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian
        info: interface Clip supporting 14 audio formats, and buffers of at least 32 bytes
    info: SB X-Fi Surround 5.1 Pro, version Unknown Version
    mixer com.sun.media.sound.DirectAudioDevice@431d9f05
        info: interface SourceDataLine supporting 20 audio formats, and buffers of at least 32 bytes
        format: PCM_UNSIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 8 bit, mono, 1 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 16 bit, mono, 2 bytes/frame, big-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, mono, 3 bytes/frame, big-endian
        format: PCM_UNSIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 8 bit, stereo, 2 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame, big-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, stereo, 6 bytes/frame, big-endian
        format: PCM_UNSIGNED unknown sample rate, 8 bit, 6 channels, 6 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 8 bit, 6 channels, 6 bytes/frame, 
        format: PCM_SIGNED unknown sample rate, 16 bit, 6 channels, 12 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 16 bit, 6 channels, 12 bytes/frame, big-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, 6 channels, 18 bytes/frame, little-endian
        format: PCM_SIGNED unknown sample rate, 24 bit, 6 channels, 18 bytes/frame, big-endian
        format: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian
        format: PCM_SIGNED 48000.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian
        info: interface Clip supporting 20 audio formats, and buffers of at least 32 bytes
    info: SB X-Fi Surround 5.1 Pro, version Unknown Version
    mixer com.sun.media.sound.DirectAudioDevice@4db323af
    info: Port Built-in Input, version Unknown Version
    mixer com.sun.media.sound.PortMixer@4b743fba
        info: Built-in Input source port
    info: Port Built-in Output, version Unknown Version
    mixer com.sun.media.sound.PortMixer@45d1edcc
    info: Port SB X-Fi Surround 5.1 Pro, version Unknown Version
    mixer com.sun.media.sound.PortMixer@59530fe3
    info: Port SB X-Fi Surround 5.1 Pro, version Unknown Version
    mixer com.sun.media.sound.PortMixer@5c382de5
        info: SB X-Fi Surround 5.1 Pro source port
    
    0 讨论(0)
  • 2020-12-20 03:54

    Yes, its an old question but since i was searching to get all the channels, depths and so on i decided to write a small debug method which is usefull if you like to see more details and would like to use java 8 streams :-)

    Enjoy:

    //filter may be all if you want to include microphone 
     public void getDeviceInfos(String filter) {
    
                Stream
                        .of(AudioSystem.getMixerInfo())
                        .forEach(info -> {
                            System.out.println("Mixer Name: " + info.getName());
                            System.out.println("Mixer Description: " + info.getDescription());
                            System.out.println("Mixer Vendor: " + info.getVendor());
    
                            Mixer m = AudioSystem.getMixer(info);
    
                            Stream
                                    .of(Arrays.asList(m.getSourceLineInfo()), filter.equals("record") ? Arrays.asList(m.getTargetLineInfo()) : null)
                                    .flatMap(List::stream)
                                    .collect(Collectors.toList())
                                    .forEach(lineInfo -> {
                                        System.out.println("    info: " + lineInfo);
                                        try {
                                            Line line = AudioSystem.getLine(lineInfo);
                                            if (line instanceof SourceDataLine || line instanceof TargetDataLine) {
    
                                                Arrays.asList(((DataLine.Info) line.getLineInfo()).getFormats()).forEach(format -> {
                                                    System.out.println("Channels: " + format.getChannels());
                                                    System.out.println("Size in Bits: " + format.getSampleSizeInBits());
                                                    System.out.println("Frame Rate: " + format.getFrameRate());
                                                    System.out.println("Frame Size: " + format.getFrameSize());
                                                    System.out.println("Encoding: " + format.getEncoding());
                                                    System.out.println("Sample Rate: " + format.getSampleRate());
    
                                                });
                                            }
                                        } catch (Exception ex) {
                                            ex.printStackTrace();
                                        }
                                    });
                        });
    
        }
    
    0 讨论(0)
提交回复
热议问题