Dźwięki javax.sound.sampled

0

Witam!
W swoim programie mam kilka przycisków, które odtwarzają dźwięki. Problem w tym, że jeżeli klikniemy na przycisk a następnie na kolejny to oba dźwięki się nakładają na siebie. Chciałbym, aby nie dało się odpalić kolejnego dźwięku dopóki poprzednie odtwarzanie się nie skończy. Oto klasa, którą używam do odpalania dźwięku:

class odpal{
    odpal(String a){
       try {

                    AudioInputStream stream = AudioSystem.getAudioInputStream(new File(a));

                    AudioFormat format = stream.getFormat();
                    if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
                        format = new AudioFormat(
                        AudioFormat.Encoding.PCM_SIGNED,
                        format.getSampleRate(),
                        format.getSampleSizeInBits()*2,
                        format.getChannels(),
                        format.getFrameSize()*2,
                        format.getFrameRate(),
                        true);        // big endian
                    stream = AudioSystem.getAudioInputStream(format, stream);
                    }

                    DataLine.Info info = new DataLine.Info(
                    Clip.class, stream.getFormat(), ((int)stream.getFrameLength()*format.getFrameSize()));
                    Clip clip = (Clip) AudioSystem.getLine(info);
                    
                    clip.open(stream);
                    clip.start();
                    
} catch (IOException e) {
} catch (LineUnavailableException e) {
} catch (UnsupportedAudioFileException e) {
}
    }
}

Pomoże ktoś?

0

Nie bardzo Cię rozumiem. Masz dwie możliwości:

  1. po odpaleniu muzyki,dla wszystkich przycisków wywołujesz setEnabled(false)
  2. po próbie odpalenia kolejnej muzyki, przed wywołaniem metody start() wywołujesz metodę stop() dla odtwarzanego właśnie clipu.
0

co do sposobu 2:
dodałem przed start() clip.stop(); ale to nic nie dało...co robię źle?

0

Nie ten klip zatrzymujesz, "zatrzymujesz" ten który właśnie chcesz odtwarzać.
Zrezygnuj z klasy odpal, metodę odpal() przenieś do głównej klasy, ze zmiennej clip zrób pole klasy

if(clip!=null)
{
    clip.stop();
}
clip = (Clip) AudioSystem.getLine(info);
                   
clip.open(stream);
clip.start();
0

wielkie dzięki;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1