2012-07-13 90 views
0

我需要在不同的音频输出中播放音乐。例如,我有两种音乐:music1和music2, ,他们必须在不同的发言者的独立线程中演奏。 假设我有一个以上的音频设备,它能够 播放的声音:在多个输出中播放音频

我发现这个方法(here - 它是BasicPlayer):

protected void createLine() throws LineUnavailableException 
{ 
    log.info("Create Line"); 
    if (m_line == null) 
    { 
     AudioFormat sourceFormat = m_audioInputStream.getFormat(); 
     log.info("Create Line : Source format : " + sourceFormat.toString()); 
     int nSampleSizeInBits = sourceFormat.getSampleSizeInBits(); 
     if (nSampleSizeInBits <= 0) nSampleSizeInBits = 16; 
     if ((sourceFormat.getEncoding() == AudioFormat.Encoding.ULAW) || (sourceFormat.getEncoding() == AudioFormat.Encoding.ALAW)) nSampleSizeInBits = 16; 
     if (nSampleSizeInBits != 8) nSampleSizeInBits = 16; 
     AudioFormat targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, sourceFormat.getSampleRate(), nSampleSizeInBits, sourceFormat.getChannels(), sourceFormat.getChannels() * (nSampleSizeInBits/8), sourceFormat.getSampleRate(), false); 
     log.info("Create Line : Target format: " + targetFormat); 
     // Keep a reference on encoded stream to progress notification. 
     m_encodedaudioInputStream = m_audioInputStream; 
     try 
     { 
      // Get total length in bytes of the encoded stream. 
      encodedLength = m_encodedaudioInputStream.available(); 
     } 
     catch (IOException e) 
     { 
      log.error("Cannot get m_encodedaudioInputStream.available()", e); 
     } 
     // Create decoded stream. 
     m_audioInputStream = AudioSystem.getAudioInputStream(targetFormat, m_audioInputStream); 
     AudioFormat audioFormat = m_audioInputStream.getFormat(); 
     DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat, AudioSystem.NOT_SPECIFIED); 
     Mixer mixer = getMixer(m_mixerName); 
     if (mixer != null) 
     { 
      log.info("Mixer : "+mixer.getMixerInfo().toString()); 
      m_line = (SourceDataLine) mixer.getLine(info); 
     } 
     else 
     { 
      m_line = (SourceDataLine) AudioSystem.getLine(info); 
      m_mixerName = null; 
     } 
     log.info("Line : " + m_line.toString()); 
     log.debug("Line Info : " + m_line.getLineInfo().toString()); 
     log.debug("Line AudioFormat: " + m_line.getFormat().toString()); 
    } 
} 

稍加调试,我已经发现混音器总是空的。这是为什么? 混音器不应该是通过目标线输出声音的设备吗? 该程序总是在我的电脑上设置的默认设备中播放,我能做些什么来改变它?

回答

0

我实际上刚刚开始使用Java Sound API作为我自己的项目之一,但根据我的理解,Mixer只是一个接口,而不是一个对象。这可以解释你的问题的一部分。