summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Shrauner <shrauner@google.com>2014-02-26 10:08:37 -0800
committerJay Shrauner <shrauner@google.com>2014-03-06 16:58:27 +0000
commitce2b95ae200332495b348be07f77fe60b6c23dcc (patch)
tree08e2e3db703c977325d4d0fb15d01831a888b5eb
parente49544de8cf5224d0fd2af944b1431c92f7b83f9 (diff)
downloadandroid_frameworks_ex-ce2b95ae200332495b348be07f77fe60b6c23dcc.tar.gz
android_frameworks_ex-ce2b95ae200332495b348be07f77fe60b6c23dcc.tar.bz2
android_frameworks_ex-ce2b95ae200332495b348be07f77fe60b6c23dcc.zip
Fix AudioEngine to allow re-initialization - DO NOT MERGE
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 (cherry picked from commit 8502b724a9fdc104e7b4a3aba1641e101b4c7be9)
-rw-r--r--variablespeed/jni/jni_entry.cc7
-rw-r--r--variablespeed/jni/variablespeed.cc19
-rw-r--r--variablespeed/jni/variablespeed.h1
-rw-r--r--variablespeed/src/com/android/ex/variablespeed/MediaPlayerProxy.java1
-rw-r--r--variablespeed/src/com/android/ex/variablespeed/SingleThreadedMediaPlayerProxy.java5
-rw-r--r--variablespeed/src/com/android/ex/variablespeed/VariableSpeed.java9
6 files changed, 33 insertions, 9 deletions
diff --git a/variablespeed/jni/jni_entry.cc b/variablespeed/jni/jni_entry.cc
index 368d230..d679475 100644
--- a/variablespeed/jni/jni_entry.cc
+++ b/variablespeed/jni/jni_entry.cc
@@ -81,9 +81,12 @@ JNI_METHOD(initializeEngine, void) (JNIEnv*, jclass,
float initialRate, size_t decodeInitialSize, size_t decodeMaxSize,
size_t startPositionMillis, int 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 73ac609..4bdbbcc 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 07cba0f..b48dbc2 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();
}
}