2012-05-31 3 views
0

JSlider으로 내 컴퓨터의 주 스피커를 GUI 응용 프로그램에서 제어 할 수있게하려는 Java의 테스트 프로그램을 작성 중입니다. AudioSystem 클래스의 this 페이지와 컨트롤의 this 페이지를 읽었습니다. 믹서를 통해 포트 나 라인을 얻은 다음 그 라인이나 포트에 컨트롤을 설치해야한다는 것을 이해합니다. 볼륨을 제어하고 있으므로 FloatControl을 구현해야합니다. 내 프로그램은 아무 문제없이 컴파일되지만, 실행하고 JSlider를 조정하면 catch 절 아래에 오류 메시지가 전송됩니다. 나는 위 프로그램 예외 전자 인쇄를 실행하면FloatControl을 Java Sound API와 올바르게 사용하려면 어떻게해야합니까?

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); 
      } 
     } 
    } 
} 

: 나는 믹서, 선 및 포트에 대한 내 컴퓨터를 조회 할 때 나는 다음과 같은 얻을

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 

무엇이 잘못 되었습니까? 그리고 나는 무엇을해야합니까? 자기?

+0

코드 포맷을 사용하는 방법을 배우십시오. : –

+0

그 앤드류 게시물을 편집 해 주셔서 감사합니다. "enter code here"함수를 사용하고 있었지만, 코드에 붙여 넣을 때마다 올바르게 나오지 않았습니다. 최선을 다했습니다. –

+1

코드 블록의 경우 일반적으로 1) 코드를 붙여 넣습니다. 2) 코드 블록을 선택하십시오. 3) 코드 단추를 누르십시오. *** 선택한 블록은 '코드'효과를 내기 위해 각 줄의 4 칸만큼 들여 쓰기되어야합니다. 코드 블록 앞에는 전체 빈 줄이 있어야합니다. 때로는리스트의 끝 부분에 올바르게 포맷되지 않지만, 수평 라인에'---'를 삽입하여 수정할 수 있습니다. 아마도 첫 번째 시도가 당신만큼이나 성공하지 못했고 그럴 가능성이 더 높기 때문에 버튼을 클릭 한 경험이별로 없습니다. ;) –

답변

1

나는 조사하기 위해 두 가지 그럴듯한 문제를 생각할 수 있습니다 :

(1) 대상 스피커 포트가 특정 믹서에 나타나는 경우는 기본 믹서가 아닌 경우 명시 적으로 믹서를 열 수 있습니다. 현재 "기본"믹서를 여는 중입니다.

(2) 다른 프로그램에서 오디오 리소스를 사용중인 경우 해당 오디오 리소스를 사용하지 못할 수 있습니다. 필자는 다른 시스템보다 리눅스에서 이런 일이 더 많이 일어나고 있다고 들었습니다.

+0

그래서 Speaker가 iTunes에서 이미 사용되고 있다면 Java 응용 프로그램으로 제어 할 수있는 방법이 없다고 말하는 것입니까? –

+0

아니요. 단지 조사 할 가능성이 있다고 말하고 있습니다. iTunes가 사용되지 않는다면 코드가 작동합니까? 다른 운영 체제 및 응용 프로그램에서 다른 일이 발생한다고 들었습니다. JGO (java-gaming.org)에서 동료가 문제가 발생하여 Linux 시스템이있는 경우를 생각해 보면 사운드 카드 나 다른 것을 공개하지 않는 다른 응용 프로그램으로 인해 판명났습니다. 그 스레드를 추적하는 데 시간이 걸릴 것입니다. 도움이된다고 생각되면 여기에 메모를 남겨 두십시오. –

+0

iTunes가 작동하지 않아도 내 코드가 여전히 동일한 오류를 수신합니다. 해당 믹서를 열 수 있도록 코드를 편집하려면 어떻게합니까? –

관련 문제