diff options
author | Jay Shrauner <shrauner@google.com> | 2014-02-26 10:08:37 -0800 |
---|---|---|
committer | Jay Shrauner <shrauner@google.com> | 2014-03-05 12:26:33 -0800 |
commit | 8502b724a9fdc104e7b4a3aba1641e101b4c7be9 (patch) | |
tree | f9d9739d3baff68e392a1f4ed62b532beefbfdb2 | |
parent | 30df46f9e6794df82ad5f762416d6e7fb8e71b89 (diff) | |
download | android_frameworks_ex-8502b724a9fdc104e7b4a3aba1641e101b4c7be9.tar.gz android_frameworks_ex-8502b724a9fdc104e7b4a3aba1641e101b4c7be9.tar.bz2 android_frameworks_ex-8502b724a9fdc104e7b4a3aba1641e101b4c7be9.zip |
Fix AudioEngine to allow re-initialization
Add AudioEngine::CompareAndSetEngine and change
VariableSpeed::initializeEngine to use this method so it only initializes
a new engine once rather than asserting on subsequent calls.
Change AudioEngine::DeleteEngine so it ignores repeated calls instead of
asserting. Add VariableSpeed::isReadyToPlay so callers can detect when
the audio library has been properly initialized.
Bug:11511992
Change-Id: I4517cb2ab4c186da43dffc7dbc2a9ad49000059f
6 files changed, 33 insertions, 9 deletions
diff --git a/variablespeed/jni/jni_entry.cc b/variablespeed/jni/jni_entry.cc index 93c12ba..20bcf3c 100644 --- a/variablespeed/jni/jni_entry.cc +++ b/variablespeed/jni/jni_entry.cc @@ -81,9 +81,12 @@ JNI_METHOD(initializeEngine, void) (JNIEnv*, jclass, jfloat initialRate, jint decodeInitialSize, jint decodeMaxSize, jint startPositionMillis, jint audioStreamType) { MethodLog _("initializeEngine"); - AudioEngine::SetEngine(new AudioEngine(targetFrames, + AudioEngine *engine = new AudioEngine(targetFrames, windowDuration, windowOverlapDuration, maxPlayBufferCount, initialRate, - decodeInitialSize, decodeMaxSize, startPositionMillis, audioStreamType)); + decodeInitialSize, decodeMaxSize, startPositionMillis, audioStreamType); + if (!AudioEngine::CompareAndSetEngine(NULL, engine)) { + delete engine; + } } JNI_METHOD(shutdownEngine, void) (JNIEnv*, jclass) { diff --git a/variablespeed/jni/variablespeed.cc b/variablespeed/jni/variablespeed.cc index b5d9067..8e161fc 100644 --- a/variablespeed/jni/variablespeed.cc +++ b/variablespeed/jni/variablespeed.cc @@ -129,14 +129,21 @@ void AudioEngine::SetEngine(AudioEngine* engine) { audioEngine_ = engine; } +bool AudioEngine::CompareAndSetEngine(AudioEngine* expect, AudioEngine* update) { + android::Mutex::Autolock autoLock(publishEngineLock_); + if (audioEngine_ == expect) { + DeleteEngine(); + audioEngine_ = update; + return true; + } + return false; +} + void AudioEngine::DeleteEngine() { - if (audioEngine_ == NULL) { - LOGE("you haven't initialized the audio engine"); - CHECK(false); - return; + if (audioEngine_ != NULL) { + delete audioEngine_; + audioEngine_ = NULL; } - delete audioEngine_; - audioEngine_ = NULL; } // **************************************************************************** diff --git a/variablespeed/jni/variablespeed.h b/variablespeed/jni/variablespeed.h index cf856da..74710e5 100644 --- a/variablespeed/jni/variablespeed.h +++ b/variablespeed/jni/variablespeed.h @@ -64,6 +64,7 @@ class AudioEngine { static AudioEngine* GetEngine(); static void SetEngine(AudioEngine* engine); + static bool CompareAndSetEngine(AudioEngine* expect, AudioEngine* update); static void DeleteEngine(); private: diff --git a/variablespeed/src/com/android/ex/variablespeed/MediaPlayerProxy.java b/variablespeed/src/com/android/ex/variablespeed/MediaPlayerProxy.java index 8489dc1..3b7b576 100644 --- a/variablespeed/src/com/android/ex/variablespeed/MediaPlayerProxy.java +++ b/variablespeed/src/com/android/ex/variablespeed/MediaPlayerProxy.java @@ -42,6 +42,7 @@ public interface MediaPlayerProxy { int getDuration(); void seekTo(int startPosition); void start(); + boolean isReadyToPlay(); boolean isPlaying(); int getCurrentPosition(); void pause(); diff --git a/variablespeed/src/com/android/ex/variablespeed/SingleThreadedMediaPlayerProxy.java b/variablespeed/src/com/android/ex/variablespeed/SingleThreadedMediaPlayerProxy.java index 17692f7..c9a9741 100644 --- a/variablespeed/src/com/android/ex/variablespeed/SingleThreadedMediaPlayerProxy.java +++ b/variablespeed/src/com/android/ex/variablespeed/SingleThreadedMediaPlayerProxy.java @@ -85,6 +85,11 @@ public class SingleThreadedMediaPlayerProxy implements MediaPlayerProxy { } @Override + public synchronized boolean isReadyToPlay() { + return mDelegate.isReadyToPlay(); + } + + @Override public synchronized boolean isPlaying() { return mDelegate.isPlaying(); } diff --git a/variablespeed/src/com/android/ex/variablespeed/VariableSpeed.java b/variablespeed/src/com/android/ex/variablespeed/VariableSpeed.java index 5c93d26..e44a375 100644 --- a/variablespeed/src/com/android/ex/variablespeed/VariableSpeed.java +++ b/variablespeed/src/com/android/ex/variablespeed/VariableSpeed.java @@ -337,9 +337,16 @@ public class VariableSpeed implements MediaPlayerProxy { } @Override + public boolean isReadyToPlay() { + synchronized (lock) { + return !mHasBeenReleased && mHasDuration; + } + } + + @Override public boolean isPlaying() { synchronized (lock) { - return mHasStartedPlayback && !hasPlaybackFinished(); + return isReadyToPlay() && mHasStartedPlayback && !hasPlaybackFinished(); } } |