am ed4e541a: Fix bug in BlockingAudioTrack.
* commit 'ed4e541a20cc662b8399844684d18ad0060bd1cb': Fix bug in BlockingAudioTrack.
This commit is contained in:
@@ -67,12 +67,10 @@ class BlockingAudioTrack {
|
|||||||
private int mAudioBufferSize;
|
private int mAudioBufferSize;
|
||||||
private int mBytesWritten = 0;
|
private int mBytesWritten = 0;
|
||||||
|
|
||||||
private AudioTrack mAudioTrack;
|
// Need to be seen by stop() which can be called from another thread. mAudioTrack will be
|
||||||
|
// set to null only after waitAndRelease().
|
||||||
|
private volatile AudioTrack mAudioTrack;
|
||||||
private volatile boolean mStopped;
|
private volatile boolean mStopped;
|
||||||
// Locks the initialization / uninitialization of the audio track.
|
|
||||||
// This is required because stop() will throw an illegal state exception
|
|
||||||
// if called before init() or after mAudioTrack.release().
|
|
||||||
private final Object mAudioTrackLock = new Object();
|
|
||||||
|
|
||||||
BlockingAudioTrack(int streamType, int sampleRate,
|
BlockingAudioTrack(int streamType, int sampleRate,
|
||||||
int audioFormat, int channelCount,
|
int audioFormat, int channelCount,
|
||||||
@@ -93,19 +91,21 @@ class BlockingAudioTrack {
|
|||||||
mStopped = false;
|
mStopped = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void init() {
|
public boolean init() {
|
||||||
AudioTrack track = createStreamingAudioTrack();
|
AudioTrack track = createStreamingAudioTrack();
|
||||||
|
mAudioTrack = track;
|
||||||
|
|
||||||
synchronized (mAudioTrackLock) {
|
if (track == null) {
|
||||||
mAudioTrack = track;
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop() {
|
||||||
synchronized (mAudioTrackLock) {
|
AudioTrack track = mAudioTrack;
|
||||||
if (mAudioTrack != null) {
|
if (track != null) {
|
||||||
mAudioTrack.stop();
|
track.stop();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
mStopped = true;
|
mStopped = true;
|
||||||
}
|
}
|
||||||
@@ -120,6 +120,12 @@ class BlockingAudioTrack {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void waitAndRelease() {
|
public void waitAndRelease() {
|
||||||
|
AudioTrack track = mAudioTrack;
|
||||||
|
if (track == null) {
|
||||||
|
if (DBG) Log.d(TAG, "Audio track null [duplicate call to waitAndRelease ?]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// For "small" audio tracks, we have to stop() them to make them mixable,
|
// For "small" audio tracks, we have to stop() them to make them mixable,
|
||||||
// else the audio subsystem will wait indefinitely for us to fill the buffer
|
// else the audio subsystem will wait indefinitely for us to fill the buffer
|
||||||
// before rendering the track mixable.
|
// before rendering the track mixable.
|
||||||
@@ -129,11 +135,11 @@ class BlockingAudioTrack {
|
|||||||
if (mBytesWritten < mAudioBufferSize && !mStopped) {
|
if (mBytesWritten < mAudioBufferSize && !mStopped) {
|
||||||
if (DBG) {
|
if (DBG) {
|
||||||
Log.d(TAG, "Stopping audio track to flush audio, state was : " +
|
Log.d(TAG, "Stopping audio track to flush audio, state was : " +
|
||||||
mAudioTrack.getPlayState() + ",stopped= " + mStopped);
|
track.getPlayState() + ",stopped= " + mStopped);
|
||||||
}
|
}
|
||||||
|
|
||||||
mIsShortUtterance = true;
|
mIsShortUtterance = true;
|
||||||
mAudioTrack.stop();
|
track.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Block until the audio track is done only if we haven't stopped yet.
|
// Block until the audio track is done only if we haven't stopped yet.
|
||||||
@@ -145,11 +151,9 @@ class BlockingAudioTrack {
|
|||||||
// The last call to AudioTrack.write( ) will return only after
|
// The last call to AudioTrack.write( ) will return only after
|
||||||
// all data from the audioTrack has been sent to the mixer, so
|
// all data from the audioTrack has been sent to the mixer, so
|
||||||
// it's safe to release at this point.
|
// it's safe to release at this point.
|
||||||
if (DBG) Log.d(TAG, "Releasing audio track [" + mAudioTrack.hashCode() + "]");
|
if (DBG) Log.d(TAG, "Releasing audio track [" + track.hashCode() + "]");
|
||||||
synchronized (mAudioTrackLock) {
|
track.release();
|
||||||
mAudioTrack.release();
|
mAudioTrack = null;
|
||||||
mAudioTrack = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -87,7 +87,10 @@ final class SynthesisPlaybackQueueItem extends PlaybackQueueItem {
|
|||||||
dispatcher.dispatchOnStart();
|
dispatcher.dispatchOnStart();
|
||||||
|
|
||||||
|
|
||||||
mAudioTrack.init();
|
if (!mAudioTrack.init()) {
|
||||||
|
dispatcher.dispatchOnError();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
byte[] buffer = null;
|
byte[] buffer = null;
|
||||||
@@ -242,4 +245,3 @@ final class SynthesisPlaybackQueueItem extends PlaybackQueueItem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user