2015-12-21 19 views
5

Kısa bir klip oluşturup çaldıktan sonra start() yöntemini arıyorum. Daha sonra, yürütmeyi klip oynatma tamamlanana kadar engellemek için drain() yöntemini çağırın. Ancak, aşağıdaki kod birkaç kez çalıştırırken, bazen çalışır, bazen yoktur ve ses bitmeden önce rasgele durur.Java'nın Klip sınıfındaki süzme yöntemi

Mixer mixer = AudioSystem.getMixer(null); 
AudioFormat format = new AudioFormat(44100, 8, 1, true, false); 
DataLine.Info info = new DataLine.Info(Clip.class, format); 
try { 
    // Create a sound of 1 second 
    Clip clip = (Clip)mixer.getLine(info); 
    byte[] b = new byte[44100]; 
    for(int i=0; i<b.length; i++) 
     b[i] = (byte) (50*Math.sin(i/10.0)); 

    clip.open(format, b, 0, b.length); 
    clip.setFramePosition(0); 
    clip.start(); 
    clip.drain(); 
} catch(LineUnavailableException lue) { lue.printStackTrace(); } 

Bu yüzden sorum şu: bu bir hatadır mı? veya drain() yöntemini yanlış anladım mı?

cevap

0

Görünüşe göre, clip.tart() bazen Start olayı bir hata (?) Tarafından başlatılmadan hemen önce döner ve bu durumda drenajın hiçbir etkisi olmaz.

Geçici çözüm çözüm:

Mixer mixer = AudioSystem.getMixer(null); 
AudioFormat format = new AudioFormat(44100, 8, 1, true, false); 
DataLine.Info info = new DataLine.Info(Clip.class, format); 
try { 
    // Create a sound of 1 second 
    Clip clip = (Clip)mixer.getLine(info); 

    //Workaround part 1 
    clip.addLineListener(new LineListener() { 
     @Override 
     public void update(LineEvent event) { 
      if (event.getType() == Type.START) 
       synchronized (clip) { 
        clip.notify(); 
       } 
     } 
    }); 

    byte[] b = new byte[44100]; 
    for(int i=0; i<b.length; i++) 
     b[i] = (byte) (50*Math.sin(i/10.0)); 

    clip.open(format, b, 0, b.length); 
    clip.setFramePosition(0); 

    //Workaround part 2 
    synchronized (clip) { 
     clip.start(); 
     clip.wait(); 
     System.out.println("Started"); 
    } 
    clip.drain(); 
    System.out.println("Drained"); 
} catch(LineUnavailableException | InterruptedException lue) { lue.printStackTrace(); } 
Geçici bir çözüm olarak biz BAŞLANGIÇ olay yakalamak için Dinleyici kullanabilirsiniz
İlgili konular