Что такое класс com.sun.media.sound.PortMixer-s? - PullRequest
1 голос
/ 07 июня 2011

Я ищу способ выбрать один конкретный микрофон для записи звука.Я обнаружил, что есть микшеры, имеющие isLineSupported(Port.Info.MICROPHONE)==true.

Но эти микшеры имеют недокументированный класс com.sun.media.sound.PortMixer, и я ничего не могу с ними поделать.

Например, я не могу читатьданные из TargetLines этих смесителей, потому что они не относятся к типу TargetDataLine.

Что это за смесители?Просто чтобы создать беспорядок?

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

Посмотрев на это более внимательно, я думаю, что это может помочь.

выполнение этого для возвращаемых значений из AudioSystem.getMixerInfo ()

mixerDetails.getDescription()
mixerDetails.getName()

дает следующее:

Direct Audio Device: DirectSound Playback
Primary Sound Driver

Direct Audio Device: DirectSound Playback
Realtek HD Audio output

Direct Audio Device: DirectSound Playback
Microsoft LifeChat LX-3000 

Direct Audio Device: DirectSound Capture
Primary Sound Capture Driver

Direct Audio Device: DirectSound Capture
Microsoft LifeChat LX-3000 

Direct Audio Device: DirectSound Capture
Realtek HD Audio Input

Software mixer and synthesizer
Java Sound Audio Engine

Port Mixer
Port Realtek HD Audio output

Port Mixer
Port Realtek HD Audio Input

Port Mixer
Port Microsoft LifeChat LX-3000 

У меня была такая же проблема с 'микшером портов' 'Port Microsoft LifeChat LX-3000', который был экземпляром 'com.sun.media.sound.PortMixer'. Звонок

AudioSystem.getTargetDataLine(format, mixerInfo)

на этом микшере дает следующее:

Exception in thread "main" java.lang.IllegalArgumentException: Line unsupported: interface TargetDataLine

Загрузка исходного кода и запуск в режиме отладки в eclipse показывает, что для моего экземпляра этого порта у него есть только javax.sound.sampled.Port.class, поэтому вызовы AudioSystem.getTargetDataLine, которые под прикрытием делают это:

DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);
Mixer mixer = AudioSystem.getMixer(mixerinfo);
return (TargetDataLine) mixer.getLine(info);

fail - в portMixer доступны только строки javax.sound.sampled.Port.class. В моем порту эта линия была динамиком, но даже если это не так, все целевые линии, хранимые внутри, кажутся портами, что не особенно полезно. Даже комментарии в классе говорят: «Микшер, который обеспечивает только порты».

Так что, для чего бы он ни использовался, он не получает строки источника / цели. Честно говоря, я не вижу, для чего он используется. Я бы попробовал посмотреть на другие микшеры в вашей системе. Если ваш будет похож на мой, вы сможете использовать захват звука, который вы можете использовать вместо этого.

0 голосов
/ 07 июня 2011

Надеюсь, этот исходный код может быть вам полезен.

...