I would really appreciate some advice on using AudioTrack.  I need to
be able to play a number of audio signals on demand, potentially mixed
together.

I have no problem setting AudioTrack up and writing an audio buffer to
it (originally captured by another Android device's AudioRecord and
received via network). However, when I try to put AudioTrack in its
own Runnable class, I run into problems. My current implementation
instantiates the AudioTrack in the constructor and, to keep things
simple, the run() function is a while loop that checks a Buffer queue
(modified version of http://www.siafoo.net/snippet/216 to use short
instead of byte) and writes anything over 100 bytes to AudioTrack. The
buffer queue fills fine, but as soon as I try to write it, the
AudioTrack blocks.

I am really not sure what relevant code to post, but here is a version
of my AudioTrack Runnable code with the irrelevant code missing:

public class SoundIn implements Runnable{

        BufferQueue m_queue = null;

        // Audio track to output audio on phone
        AudioTrack m_audioTrack = null;

        // Buffer size required to support AudioTrack
        int m_BufferSize;

        short[] m_outbuf;

        public SoundIn(BufferQueue queue)
        {
                m_queue = queue;

                // Get minimum supported buffer size
                m_BufferSize = AudioTrack.getMinBufferSize(11025,
                                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                AudioFormat.ENCODING_PCM_16BIT);

                // Initialize a streaming audio track with minimum-size buffer
                m_audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025,
                                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                                AudioFormat.ENCODING_PCM_16BIT, m_BufferSize,
                                AudioTrack.MODE_STREAM);

                m_audioTrack.play();

        }

        public void run()
        {
                int minsize;
                m_outbuf = new short[50000];
                while(true)
                {
                        minsize = //...Get available data size

                        if (minsize == 0)
                        {
                                Log.d("SoundIn", "Sleeping...");
                                try{Thread.sleep(100);}
                                catch (Exception e){e.printStackTrace();}
                                continue;
                        }

                        //read available bytes from queue
                        m_queue().read(m_outbuf, 0, minsize);

                        //Gets here with m_outbuf correctly holding data
                        m_audioTrack.write(m_outbuf,0,minsize);
                        //Never gets here
                }
        }

}

Any suggestions on why the AudioTrack.write call might block in a
situation like this would be greatly appreciated.

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to