<Sound Dev> Opening multiple output lines

View: New views
1 Messages — Rating Filter:   Alert me  

<Sound Dev> Opening multiple output lines

by Thomas Fitzsimmons :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi,

I'm testing a sound-using applet on Fedora 8.  Sun JDK 1.6 runs the applet
correctly but OpenJDK does not.  The applet attempts to open two audio playback
lines in succession, without closing the first before attempting to open the
second.  The first open attempt succeeds but the second attempt fails with:

javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED
44100.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian not supported.
         at
com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:511)
         at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:124)
         at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:156)
         at PAPU.start(PAPU.java:198)
         at NES.enableSound(NES.java:390)
         at AppletGui.init(AppletGui.java:38)
         at sun.applet.AppletPanel.run(AppletPanel.java:435)
         at java.lang.Thread.run(Thread.java:674)

The exception message is misleading since the line format is supported.  The
actual cause of the failure is in:

PLATFORM_API_LinuxOS_ALSA_PCMUtils.c:openPCMfromDeviceID

This call:

     ret = snd_pcm_open(handle, buffer,
                        isSource?SND_PCM_STREAM_PLAYBACK:SND_PCM_STREAM_CAPTURE,
                        SND_PCM_NONBLOCK);

returns the error corresponding to "Device or resource busy".

The attached test case demonstrates the failure.

Tom


import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;

public class AudioSystemGetLineTest {
    public static void main(String[] args) throws LineUnavailableException {
        AudioFormat audioFormat = new AudioFormat(44100, 16, 2, true, false);
        DataLine.Info info = new DataLine.Info(SourceDataLine.class,
                                               audioFormat, 44100);
        SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info);
        line.open(audioFormat);
        line = (SourceDataLine)AudioSystem.getLine(info);
        line.open(audioFormat);
    }
}