使用AudioTrack播放PCM数据的App demo
2018-12-28 本文已影响9人
Ed_Lannister
package com.qiyi.mytrackdemo;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private static int minBufferSize = 0;
private static AudioTrack mAudioTrack;
private static DataInputStream mDataInputStream;
private static File mFile;
private static Thread playbackthread;
private static final boolean DEBUG = true;
private static final String TAG = "PlayAudioTrack";
private static final String mShutDownMusicPath = "/sdcard/shutdownmusic.wav";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(DEBUG){
Log.d(TAG,"EdwardSDT begin to start SDT MUSIC 44100");
}
minBufferSize = AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);
if(DEBUG){
Log.d(TAG,"EdwardSDT get the min buffer size " + minBufferSize);
}
mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT, minBufferSize*2, AudioTrack.MODE_STREAM);
if(DEBUG){
Log.d(TAG,"EdwardSDT has started the track with 2 min buffer size");
}
//begin to start shutdown music-++-
try {
if(DEBUG){
Log.d(TAG,"EdwardSDT begin to read file");
}
mFile = new File(mShutDownMusicPath);
mDataInputStream = new DataInputStream(new FileInputStream(mFile));
} catch (IOException e) {
e.printStackTrace();
}
}
static Runnable playTrackThread = new Runnable(){
@Override
public void run(){
try{
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
if(DEBUG){
Log.d(TAG,"EdwardSDT increase the buffer size to 300");
}
byte[] tmpBuffer = new byte[minBufferSize*300];
int readCount = 0;
mAudioTrack.play();
while (mDataInputStream.available()>0){
if(DEBUG){
Log.d(TAG,"EdwardSDT count loop how many times");
}
readCount = mDataInputStream.read(tmpBuffer);
if(readCount == AudioTrack.ERROR_INVALID_OPERATION || readCount == AudioTrack.ERROR_BAD_VALUE){
continue;
}
if(readCount !=0 && readCount != -1){
mAudioTrack.write(tmpBuffer, 0, readCount);
}
}
} catch(Exception e) {
e.printStackTrace();
} finally {
try{
if(playbackthread != null && playbackthread.getState() == Thread.State.RUNNABLE){
try{
Thread.sleep(500);
playbackthread.interrupt();
} catch (Exception e){
playbackthread = null;
}
}
if(mAudioTrack != null){
mAudioTrack.stop();
mAudioTrack.release();
}
if(mDataInputStream != null){
mDataInputStream.close();
}
} catch (Exception e){
e.printStackTrace();
}
}
}
};
public void click123(View v){
if(DEBUG){
Log.d(TAG,"EdwardSDT begin to start Thead");
}
playbackthread = new Thread(playTrackThread);
playbackthread.start();
}
}