0

現在、GUI アプリケーションJavaでコンピュータのメイン SPEAKER を制御できるようにするためのテスト プログラムを作成しています。AudioSystem クラスに関するこのページと、コントロールに関するこのJSliderページを読みました。ミキサーを介してポートまたはラインを取得し、そのラインまたはポートにコントロールを設定する必要があることを理解しています。ボリュームを制御しているので、実装する必要があります。私のプログラムは問題なくコンパイルされますが、実行して JSlider を調整すると、句の下にエラー メッセージが表示されます。FloatControlcatch

これは私のテストプログラムです:

import java.awt.BorderLayout;
import java.io.IOException;

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.Port;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class speakerWork2
{
    public static void main(String [] args)throws IOException
    {
        Frame speaker = new Frame();
    }
}

class Frame extends JFrame
{
    JSlider mainVolume = new JSlider(JSlider.VERTICAL,0,100,50);

    public Frame()
    {
        super();
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        setSize(100, 450);
        setLocation(300,200);

        add(mainVolume);

        mainVolume.addChangeListener(new mainVolumeHandler());
    }

    public class mainVolumeHandler implements ChangeListener
    {
        int sliderVal = mainVolume.getValue();

        public void setValue(FloatControl sliderVal) 
        {
        }

        public void stateChanged(ChangeEvent f)
        {
            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 SPEAKER"  
                        + " VOLUME control: exception = " + e);  
            }
        }
    }
}

上記のプログラムを実行すると、例外 e が出力されます。

java.lang.IllegalArgumentException: Line unsupported: SPEAKER target port

コンピューターにミキサー、ライン、ポートを照会すると、スピーカーについて次の結果が得られます...

mixer name: Port Speakers / Headphones (IDT High Definition Audio CODEC)
Line.Info: SPEAKER target port
volCtrl.getValue() = 1.0

私は何を間違っていますか? 自分を正すために何をする必要がありますか?

4

1 に答える 1

1

調査すべき 2 つのもっともらしい問題を考えることができます。

(1) ターゲット スピーカー ポートが特定のミキサーに表示される場合、それがデフォルトのミキサーでない場合は、そのミキサーを明示的に開く必要があります。現在、「デフォルト」のミキサーを開いています。

(2) オーディオ リソースが別のプログラムによって使用されている場合、使用できない可能性があります。これは、他のシステムよりも Linux で多く発生していると聞いたことがあります。

于 2012-06-01T14:12:48.837 に答える