Boa noite pessoal. Depois de criar um “trocentos” exemplos consegui usar as bibliotecas da Javazoom para executar arquivos .ogg (padrão aberto de audio)
O problema é que preciso para um jogo, e, obviamente preciso executar vários arquivos de audio simultaneamente.
Minha classe utilitária para audio é essa:
[code]package br.com.freeladev.utils;
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
public class Audio implements Runnable{
private Sound s;
public enum Sound{
ROULLETS(“br/com/freeladev/gui/sounds/roullets.ogg”),
COINS(“br/com/freeladev/gui/sounds/coins.ogg”),
LEVER(“br/com/freeladev/gui/sounds/lever.ogg”),
LEVERHOVER(“br/com/freeladev/gui/sounds/leverHover.ogg”),
BUTTON(“br/com/freeladev/gui/sounds/button.ogg”),
ROULLETSINFINITY(“br/com/freeladev/gui/sounds/roulletsInfinity.ogg”);
private String file;
Sound(String file){
this.file=file;
}
public String getFile(){
return this.file;
}
}
public void play(Sound s){
this.s=s;
new Thread(this).start();
}
@Override
public void run() {
try {
File file = new File(getClass().getClassLoader().getResource(s.getFile()).toURI());
soundPlay(file);
} catch (Exception e) {
e.printStackTrace();
}
}
private void soundPlay(File file)
{
try
{
// Get AudioInputStream from given file.
AudioInputStream in= AudioSystem.getAudioInputStream(file);
AudioInputStream din = null;
if (in != null)
{
AudioFormat baseFormat = in.getFormat();
AudioFormat decodedFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16,
baseFormat.getChannels(),
baseFormat.getChannels() * 2,
baseFormat.getSampleRate(),
false);
// Get AudioInputStream that will be decoded by underlying VorbisSPI
din = AudioSystem.getAudioInputStream(decodedFormat, in);
// Play now !
rawplay(decodedFormat, din);
in.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
private void rawplay(AudioFormat targetFormat,
AudioInputStream din) throws IOException, LineUnavailableException
{
byte[] data = new byte[4096];
SourceDataLine line = getLine(targetFormat);
if (line != null)
{
// Start
line.start();
int nBytesRead = 0, nBytesWritten = 0;
while (nBytesRead != -1)
{
nBytesRead = din.read(data, 0, data.length);
if (nBytesRead != -1) nBytesWritten = line.write(data, 0, nBytesRead);
}
// Stop
line.drain();
line.stop();
line.close();
din.close();
}
}
private SourceDataLine getLine(AudioFormat audioFormat) throws LineUnavailableException
{
SourceDataLine res = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
res = (SourceDataLine) AudioSystem.getLine(info);
res.open(audioFormat);
return res;
}
}
[/code]
Essa classe é uma modificação do exemplo do javazoom.com (http://www.javazoom.net/vorbisspi/documents.html)
O problema é o seguinte, não consigo rodar dois arquivos simultaneamente, mesmo que através de instancias diferentes da classe Audio, diferentes arquivos de audio e/ou diferentes locais do sistema. Definitivamente não toca dois sons ao mesmo tempo. Parece que o “canal” fica bloqueado e não há mixagem de todos os sons pra sair por um canal só, mas não entendo isso e só arrisquei um palpite.
Algum gamer de plantão? (Tipo um Vinicius Godoy ^^)