Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using AudioTrack in Android to play a WAV file

I'm working with Android, trying to make my AudioTrack application play a Windows .wav file (Tada.wav). Frankly, it shouldn't be this hard, but I'm hearing a lot of strange stuff. The file is saved on my phone's mini SD card and reading the contents doesn't seem to be a problem, but when I play the file (with parameters I'm only PRETTY SURE are right), I get a few seconds of white noise before the sound seems to resolve itself into something that just may be right.

I have successfully recorded and played my own voice back on the phone -- I created a .pcm file according to the directions in this example:

http://emeadev.blogspot.com/2009/09/raw-audio-manipulation-in-android.html

(without the backwards masking)...

Anybody got some suggestions or awareness of an example on the web for playing a .wav file on an Android??

Thanks, R.

like image 667
Rich Avatar asked Oct 13 '10 14:10

Rich


People also ask

Can you play a WAV file on Android?

wav file format isn't supported by Android.

Can smartphones play wav files?

Yes, Android supports . wav audio files. The Supported media formats lists the audio & video formats supported by Android, and . wav audio is among the many listed.

What is Android AudioTrack?

android.media.AudioTrack. The AudioTrack class manages and plays a single audio resource for Java applications. It allows streaming of PCM audio buffers to the audio sink for playback.


1 Answers

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.

like image 163
Rich Avatar answered Oct 10 '22 19:10

Rich