Tenho varias saidas de audio no meu computador, e eu quero tocar diferentes musicas para cada saida de audio.
Estou usando um pedaco do exemplo do programa JLGUI.
Para isso preciso identificar todas as linhas/mixers diferentes para depois atribuir um playback de audio em cada uma delas.
O problema e’ que eu nao consigo de jeito nenhum achar as Line’s pra mudar isso.
jlGui BasicPlayer
[E’ so’ mudar a linha 48 do BasicPlayerTest.java para um path onde esteja contida a sua musica]
a minha por exemplo esta assim
BasicPlayerTest test = new BasicPlayerTest();
test.play("F:\\Music\\American\\John Mayer\\Heavier Things\\01 Clarity.mp3");
A classe BasicPlayer que e’ a classe que toca musica efetivamente tem esse metodo
[que e’ o lugar onde eu ACHO que a jvm seleciona a linha para saida de audio]
[code]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());
}
}[/code]
no meu programa ele sempre passa para o else, executando a linha 38
m_line = (SourceDataLine) AudioSystem.getLine(info);
o que acontece e’ que ele sempre acha a linha default do windows de playback.
eu gostaria de atribuir m_line a uma outra saida de audio que eu tenho,
Bom, pesquisando um pouquinho, achei isso aqui.
Fiz uns testes basicos, e eu consigo achar os mixers facil:
[code] Info[] info = AudioSystem.getMixerInfo();
for (int i = 0; i <= info.length-1; i++) {
System.out.println(info[i].getName());
}[/code]
o output sai assim:
[quote]Primary Sound Driver
Speakers (G510 Gaming Keyboard)
SPDIF Interface (TX1) (VIA High Definition Audio)
Digital Output Device (HDMI TX0) (VIA High Definition Audio)
Speakers (VIA High Definition Audio)
Primary Sound Capture Driver
Microphone (3- USB Audio Device
CD Audio (VIA High Definition A
Stereo Mix (VIA High Definition
Microphone (G510 Gaming Keyboar
Port Speakers (G510 Gaming Keyboard)
Port SPDIF Interface (TX1) (VIA High
Port Digital Output Device (HDMI TX0
Port Speakers (VIA High Definition A
Port CD Audio (VIA High Definition A
Port Stereo Mix (VIA High Definition
Port Microphone (G510 Gaming Keyboar
Port Microphone (3- USB Audio Device[/quote]
mas nao consigo achar as SourceLine’s direito
AudioFormat audioFormat = new AudioFormat(44100, 16, 2, true, false);
DataLine.Info info = new DataLine.Info(SourceDataLine.class,audioFormat, 44100);
javax.sound.sampled.Line.Info[] test = AudioSystem.getSourceLineInfo(info);
for (int i = 0; i <= test.length - 1; i++) {
System.out.println(test[i].toString());
}
maaas o output acaba saindo assim:
[quote]interface SourceDataLine supporting 8 audio formats, and buffers of at least 32 bytes
interface SourceDataLine supporting 8 audio formats, and buffers of at least 32 bytes
interface SourceDataLine supporting 8 audio formats, and buffers of at least 32 bytes
interface SourceDataLine supporting 8 audio formats, and buffers of at least 32 bytes
interface SourceDataLine supporting 8 audio formats, and buffers of at least 32 bytes
[/quote]
alguma ajuda? perdao pelo post gigante!
Abracos e sucesso