5

現在、PC のマスター ボリュームをコントロールするためにJSliderin を使用しようとしています。Javaこれまでのところ、PC のメイン スピーカーのポートを見つけることができました。ただし、それを正常に呼び出して getValue() や setValue() などのメソッドを実行する方法がわかりません。

次のコードを使用して、PC のすべてのオーディオ デバイスを検索しました。

Mixer.Info [] mixers = AudioSystem.getMixerInfo();  
    System.out.println("There are " + mixers.length + " mixer info objects");  
    for (Mixer.Info mixerInfo : mixers)  
    {  
        System.out.println("mixer name: " + mixerInfo.getName());  
        Mixer mixer = AudioSystem.getMixer(mixerInfo);  
        Line.Info [] lineInfos = mixer.getTargetLineInfo(); // target, not source  
        for (Line.Info lineInfo : lineInfos)  
        {  
            System.out.println("  Line.Info: " + lineInfo);  
            Line line = null;  
            boolean opened = true;  
            try  
            {  
                line = mixer.getLine(lineInfo);  
                opened = line.isOpen() || line instanceof Clip;  
                if (!opened)  
                {  
                    line.open();  
                }  
                FloatControl volCtrl = (FloatControl)line.getControl(FloatControl.Type.VOLUME);  
                System.out.println("    volCtrl.getValue() = " + volCtrl.getValue());  
            }  
            catch (LineUnavailableException e)  
            {  
                e.printStackTrace();  
        }  
            catch (IllegalArgumentException iaEx)  
            {  
                System.out.println("    " + iaEx);  
            }  
            finally  
            {  
                if (line != null && !opened)  
                {  
                    line.close();  
                }  
            }  
        }  
    }  

スピーカーラインを制御して値を変更するにはどうすればよいですか?

私はこれまで、このWeb サイトをヘルプとして使用してきました。


アップデート

よし、少し近づいたと思う。私のテストGUIプログラムでは、「必要なコントロールを持つ行を取得する」(あなたがくれたリンク)の下にあるJavaチュートリアルのコードを使用しようとしています。JSlider の Change Listener の下のプログラムに貼り付けました。

これは次のようになります。

Port SPEAKER;
        FloatControl volCtrl;
        try {
          Mixer mixer = AudioSystem.getMixer(null);
          SPEAKER = (Port)mixer.getLine(Port.Info.SPEAKER);
          SPEAKER.open();
          volCtrl = (FloatControl) SPEAKER.getControl(

            FloatControl.Type.VOLUME);

        } catch (Exception e) {
        System.out.println("Failed trying to find LINE_IN"
            + " VOLUME control: exception = " + e);
        }

スライダーを動かすたびに、エラー例外メッセージ「検索に失敗しました...」が出力されます。メイン出力スピーカーで volCtrl を取得できないのはなぜですか? このコードを修正して SPEAKER を制御するにはどうすればよいですか?

4

1 に答える 1

1

JavaRanch で大発見!私はそこで多くの貴重な助けを得ました。

行を見つけたら、次のチュートリアルでコントロールを作成する方法を示します: http://docs.oracle.com/javase/tutorial/sound/controls.html

しかし、高値と低値が予想外の場合もあります。-80 から +6 の範囲の 1 つの行を見つけました (VU メーターのデシベル範囲を模倣するように設定されていました)。したがって、JSlider の出力から数値変換を行って、妥当な一致する Control 値を取得する必要がある場合があります (特に Control が指数関数の場合)。

于 2012-05-17T19:19:52.847 に答える