如何在执行java程序时更改音频输入设备?

时间:2014-11-05 16:08:29

标签: java audio input microphone

我已经可以获得操作系统标准输入设备的字节流。我现在想在程序运行时更改输入设备。

这是获取标准输入设备的targetDataLine /输入流的代码(它可以工作):

dataLineInfo = new DataLine.Info( TargetDataLine.class , getAudioFormat() ) ;
targetDataLine = (TargetDataLine)AudioSystem.getLine( dataLineInfo  ) ;
targetDataLine.open( getAudioFormat() );
targetDataLine.start();

我也可以获取所有可用输入设备的列表,并在组合框中输出它们以选择另一个输入设备(它可以工作):

Mixer.Info[] mixerInfo;
mixerInfo = AudioSystem.getMixerInfo();
Line.Info targetDLInfo = new Line.Info(TargetDataLine.class);

for(int cnt = 0; cnt < mixerInfo.length; cnt++) {
    Mixer currentMixer = AudioSystem.getMixer(mixerInfo[cnt]);

    if( currentMixer.isLineSupported(targetDLInfo) ) {
        combo1.addItem(mixerInfo[cnt].getName());
    }
}

这是我改变输入设备的代码(它不起作用)

    if(e.getSource() == combo1){
        System.out.println("Gewählter Input: " + combo1.getSelectedItem());


        Mixer.Info[] mixerInfo;
        mixerInfo = AudioSystem.getMixerInfo();
        Line.Info targetDLInfo = new Line.Info(TargetDataLine.class);

        for(int cnt = 0; cnt < mixerInfo.length; cnt++) {
            Mixer currentMixer = AudioSystem.getMixer(mixerInfo[cnt]);

            if( mixerInfo[cnt].getName() ==  combo1.getSelectedItem().toString()) {
                System.out.println("Gewählter Input gefunden");

                targetDataLine.close();

                dataLineInfo = new DataLine.Info( TargetDataLine.class , getAudioFormat() ) ;
                try {
                    targetDataLine = (TargetDataLine) currentMixer.getLine(dataLineInfo) ;
                    targetDataLine.open( getAudioFormat() );
                    targetDataLine.start();

                } catch (LineUnavailableException e1) {
                    e1.printStackTrace();
                }
            }}
    }

事实上,我认为我在最后一部分只犯了一个小错误,但我不知道是什么错误。如果我切换到另一个音频输入设备,我只听到一声小哔声,然后什么都没有。如果我切换回主音频设备,我可以再次听到输入。我没有任何错误。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

带有以下代码的行

if( mixerInfo[cnt].getName() ==  combo1.getSelectedItem().toString()) {

您尚未正确比较字符串。比较字符串时,请使用String.equals(String)方法,如下所示:

if( mixerInfo[cnt].getName().equals(combo1.getSelectedItem().toString())) {

如果在任何两个非基本对象上使用==运算符,则只比较两个对象的指针。在绝大多数情况下,String对象将具有不同的指针值,就像任何其他动态分配的对象一样,无论它们指向的位置是否包含相同的字节排列。