SourceDataLine.drain() hangs on OSX

前端 未结 1 747
一个人的身影
一个人的身影 2021-01-26 21:52

My game plays back sound via the usual method:

sdl.open();
sdl.start();
sdl.write(data, 0, data.length);
sdl.drain();
sdl.stop();
sdl.close();

相关标签:
1条回答
  • 2021-01-26 22:21

    For reference, this example using close() exits normally under either Java 5 or 6.

    Invoking stop(), rather than close(), on the EDT hangs both Java 5 and 6 unless the line has already been closed normally on the initial thread. This appears to be the expected result of drain() blocking, as a stopped line can't drain.

    import java.awt.EventQueue;
    import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.LineUnavailableException;
    import javax.sound.sampled.SourceDataLine;
    import javax.swing.JOptionPane;
    
    /**
     * @see https://stackoverflow.com/questions/7803310
     * @see https://stackoverflow.com/questions/2065693
     */
    public class Tone {
    
        public static void main(String[] args) throws LineUnavailableException {
            final AudioFormat af =
                new AudioFormat(Note.SAMPLE_RATE, 8, 1, true, true);
            final SourceDataLine line = AudioSystem.getSourceDataLine(af);
            EventQueue.invokeLater(new Runnable() {
    
                public void run() {
                    JOptionPane.showMessageDialog(null, "Halt");
                    //line.stop(); // stops and hangs on drain
                    line.close();
                }
            });
            line.open(af, Note.SAMPLE_RATE);
            line.start();
            for (Note n : Note.values()) {
                play(line, n, 500);
                play(line, Note.REST, 10);
            }
            line.drain();
            line.close();
        }
    
        private static void play(SourceDataLine line, Note note, int ms) {
            ms = Math.min(ms, Note.SECONDS * 1000);
            int length = Note.SAMPLE_RATE * ms / 1000;
            int count = line.write(note.data(), 0, length);
        }
    }
    

    Requires Note.

    0 讨论(0)
提交回复
热议问题