Using AudioTrack in Android to play a WAV file Using AudioTrack in Android to play a WAV file android android

Using AudioTrack in Android to play a WAV file


I stumbled on the answer (frankly, by trying &^@! I didn't think would work), in case anybody's interested... In my original code (which is derived from the example in the link in the original post), the data is read from the file like so:

    InputStream             is  = new FileInputStream       (file);    BufferedInputStream     bis = new BufferedInputStream   (is, 8000);    DataInputStream         dis = new DataInputStream       (bis);      //  Create a DataInputStream to read the audio data from the saved file    int i = 0;                                                          //  Read the file into the "music" array    while (dis.available() > 0)    {        music[i] = dis.readShort();                                     //  This assignment does not reverse the order        i++;    }    dis.close();                                                        //  Close the input stream

In this version, music[] is array of SHORTS. So, the readShort() method would seem to make sense here, since the data is 16-bit PCM... However, on the Android that seems to be the problem. I changed that code to the following:

     music=new byte[(int) file.length()];//size & length of the file    InputStream             is  = new FileInputStream       (file);    BufferedInputStream     bis = new BufferedInputStream   (is, 8000);    DataInputStream         dis = new DataInputStream       (bis);      //  Create a DataInputStream to read the audio data from the saved file    int i = 0;                                                          //  Read the file into the "music" array    while (dis.available() > 0)    {        music[i] = dis.readByte();                                      //  This assignment does not reverse the order        i++;    }    dis.close();                                                        //  Close the input stream

In this version, music[] is an array of BYTES. I'm still telling the AudioTrack that it's 16-bit PCM data, and my Android doesn't seem to have a problem with writing an array of bytes into an AudioTrack thus configured... Anyway, it finally sounds right, so if anyone else wants to play Windows sounds on their Android, for some reason, that's the solution. Ah, Endianness......

R.


I found a lot of long answers to this question. My final solution, which given all the cutting and pasting is hardly mine, comes down to:

public boolean play() {    int i = 0;    byte[] music = null;    InputStream is = mContext.getResources().openRawResource(R.raw.noise);    at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,        AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,        minBufferSize, AudioTrack.MODE_STREAM);    try{        music = new byte[512];        at.play();        while((i = is.read(music)) != -1)            at.write(music, 0, i);    } catch (IOException e) {        e.printStackTrace();    }    at.stop();    at.release();    return STOPPED;}

STOPPED is just a "true" sent back as a signal to reset the pause/play button.And in the class initializer:

public Mp3Track(Context context) {    mContext = context;    minBufferSize = AudioTrack.getMinBufferSize(44100,        AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);}

Context is just "this" from the calling activity.You can use a FileInputStream on the sdcard, etc. My files are in res/raw


Are you skipping the first 44 bytes of the file before you dump the rest of the file's data into the buffer? The first 44 bytes are the WAVE header and they would sound like random noise if you tried to play them.

Also, are you sure you are creating the AudioTrack with the same properties as the WAVE you are trying to play (sample rate, bit rate, number of channels, etc)? Windows actually does a good job of giving this information to you in the File Properties page:alt text