/* * Copyright (C) 2013 gujicheng * * Licensed under the GPL License Version 2.0; * you may not use this file except in compliance with the License. * * If you have any question, please contact me. * ************************************************************************* ** Author information ** ************************************************************************* ** Email: gujicheng197@126.com ** ** QQ : 29600731 ** ** Weibo: http://weibo.com/gujicheng197 ** ************************************************************************* */ package com.libra.sinvoice; import android.media.AudioManager; import android.media.AudioTrack; import com.libra.sinvoice.Buffer.BufferData; public class PcmPlayer { private final static String TAG = "PcmPlayer"; private final static int STATE_START = 1; private final static int STATE_STOP = 2; private int mState; private AudioTrack mAudio; private long mPlayedLen; private Listener mListener; private Callback mCallback; public static interface Listener { void onPlayStart(); void onPlayStop(); } public static interface Callback { BufferData getPlayBuffer(); void freePlayData(BufferData data); } public PcmPlayer(Callback callback, int sampleRate, int channel, int format, int bufferSize) { mCallback = callback; mAudio = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, channel, format, bufferSize, AudioTrack.MODE_STREAM); mState = STATE_STOP; mPlayedLen = 0; } public void setListener(Listener listener) { mListener = listener; } public void start() { LogHelper.d(TAG, "start"); if (STATE_STOP == mState && null != mAudio) { mPlayedLen = 0; if (null != mCallback) { mState = STATE_START; LogHelper.d(TAG, "start"); if (null != mListener) { mListener.onPlayStart(); } while (STATE_START == mState) { LogHelper.d(TAG, "start getbuffer"); BufferData data = mCallback.getPlayBuffer(); if (null != data) { if (null != data.mData) { int len = mAudio.write(data.mData, 0, data.getFilledSize()); if (0 == mPlayedLen) { mAudio.play(); } mPlayedLen += len; mCallback.freePlayData(data); } else { // it is the end of input, so need stop LogHelper.d(TAG, "it is the end of input, so need stop"); break; } } else { LogHelper.e(TAG, "get null data"); break; } } if (null != mAudio) { mAudio.pause(); mAudio.flush(); mAudio.stop(); } mState = STATE_STOP; if (null != mListener) { mListener.onPlayStop(); } LogHelper.d(TAG, "end"); } } } public void stop() { if (STATE_START == mState && null != mAudio) { mState = STATE_STOP; } } }