使用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();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读