Ola galera,
Estou trabalhando com a Classe Clip como tipo de linha e existe uma forma de vc configurar o tamanho do buffer de cada linha, nesse método open:
void open(AudioFormat format, byte[] data, int offset, int bufferSize).
Porém eu gostaria de ver um exemplo na prática utilizando esse método, o array de byte data, eu tenho que criar e colocar na programação cada som, como funciona?!
abraço,
De uma olhada vou postar o código
/* Carrega o clipe ao qual pode ser tocado, parado, resumido e loopado
*
* Um objeto implementando a interface SoudWatcher pode ser notificada quando clip
* loopar ou parar.
*/
import java.io.*;
import javax.sound.sampled.*;
import javax.sound.sampled.DataLine.Info;
import java.text.DecimalFormat;
public class SomInfo implements LineListener {
private final static String SOUND_DIR = "/Sons/";
private String name, filename;
private Clip clip = null;
private boolean isLooping = false;
private SoundsWatcher watcher = null;
private DecimalFormat df;
private TargetDataLine linha;
private byte dados[] = new byte[50];
public SomInfo(String nm, String fnm) {
name = nm;
filename = SOUND_DIR + fnm;
df = new DecimalFormat("0.#");
loadClip(filename);
} // fim do construtor
private void loadClip(String fnm) {
try {
// linka o Audio Stream com o arquivo
AudioInputStream stream = AudioSystem.getAudioInputStream(
getClass().getResourceAsStream(fnm));
AudioFormat formato = stream.getFormat();
// converte os formatos ULAW E ALAW para PCM
if((formato.getEncoding() == AudioFormat.Encoding.ULAW)||
(formato.getEncoding() == AudioFormat.Encoding.ALAW)){
AudioFormat novoFormato = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
formato.getSampleRate(),
formato.getSampleSizeInBits()*2,
formato.getChannels(),
formato.getFrameSize()*2,
formato.getFrameRate(), true);
//big_Endian
//atualiza os streams e os detalhes dos formatos
stream = AudioSystem.getAudioInputStream(novoFormato, stream);
System.out.println("Converte o formato de Audio: " + novoFormato);
formato = novoFormato;
}
DataLine.Info info = new DataLine.Info(Clip.class, formato);
// tenha certeza que o sistema suporta o DataLine
if(!AudioSystem.isLineSupported(info)) {
System.out.println("Não suporta no DataLine " + fnm);
return;
}
// pega a linha do clip
clip = (Clip)AudioSystem.getLine(info);
System.out.println("Clip: " + clip.toString());
//Ouvindo os eventos do clip
clip.addLineListener(this);
clip.open(formato,dados,500,1000); // abre o arquivo de som como um clip
clip.close();
checkDuration();
}
catch(UnsupportedAudioFileException auioException) {
System.out.println("Não suportado o arquivo de audio: " + fnm);
}
catch(LineUnavailableException lineException) {
System.out.println("Nenhuma linha suportada: " + fnm);
}
catch(IOException ioException) {
System.out.println("Erro de I/O: " + fnm);
}
catch(Exception e) {
System.out.println("Problema com: " + fnm);
}
} // fim do método
private void checkDuration() {
// duração em segundos do clipe ----- duração > 1 segundo
double duracao = clip.getMicrosecondLength()/1000000.0; // novo
if(duracao <= 1.0) {
System.out.println("Aviso. duração < 1: " + df.format(duracao) +
" segundos");
System.out.println("O arquivo do clipe não pode tocar em J2SE 1.5" +
"fazendo-o maior");
}
else {
System.out.println(filename + ": Duração " + df.format(duracao) +
" segundos.");
}
} // fim do método
public void update(LineEvent lineEvent){System.out.println("som fail");}
//public void update(LineEvent lineEvent) {
/* Chamada quando há a detecção de abertura, fechamento, começo ou a
* paralisação dos eventos. O watcher se há uma saída notificada.
*/
//Quando o clip é parado/ chegou ao final.
/* if(lineEvent.getType() == LineEvent.Type.STOP) {
System.out.println("Atualiza STOP para: " + name);
clip.stop();
clip.setFramePosition(0); // novo
if(!isLooping) { // não está loopando?
if(watcher != null) {
watcher.atSequenceEnd(name, SoundsWatcher.STOPPED);
}
}
}*/
// } // fim do método
public void close() {
if(clip != null) {
clip.stop();
clip.close();
}
}
public void play(boolean toLoop) {
if(clip != null) {
isLooping = toLoop;
clip.start(); // começa a tocar
}
}
public void stop() {
// para e reinicia a track
if(clip != null) {
isLooping = false;
clip.stop();
clip.setFramePosition(0);
}
}
public void pause() {
// para o clipe na atual posição
if(clip != null) {
clip.stop();
}
}
public void resume() {
if(clip != null) {
clip.start();
}
}
public void setWatcher(SoundsWatcher sw) {
watcher = sw;
}
// outros métodos de acesso
public String getName() {
return name;
}
}
Eu gostaria aumentar o buffersize da linha, to usando a linha clip que carrega todos os sons antes para depois tocar, somente isso, eu li na documentação que vc pode configurar o tamanho do buffer nesse método.
clip.open(formato,dados,500,1000); // abre o arquivo de som como um clip
Como apareceu na linha 71, só que quando eu coloco os argumentos do metodo open(), ele não toca nenhum som, vc saberia o porque!?
abraço,