From 973b8851eecbdcbab4992be01aaab568fd371a0a Mon Sep 17 00:00:00 2001 From: Andy Hung Date: Wed, 13 May 2015 15:15:25 -0700 Subject: [PATCH] Allow partial playback parameter settings in AudioTrack Change-Id: Ifb12c85312e25aa74da47fe0eae2d5b1fa4bb23b --- core/jni/android_media_AudioTrack.cpp | 40 +++++++++++++++++++++------ 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp index aeb058bc9ce45..daafd5e46148c 100644 --- a/core/jni/android_media_AudioTrack.cpp +++ b/core/jni/android_media_AudioTrack.cpp @@ -702,18 +702,40 @@ static void android_media_AudioTrack_set_playback_params(JNIEnv *env, jobject t return; } - PlaybackParams pbs; - pbs.fillFromJobject(env, gPlaybackParamsFields, params); + PlaybackParams pbp; + pbp.fillFromJobject(env, gPlaybackParamsFields, params); ALOGV("setPlaybackParams: %d:%f %d:%f %d:%u %d:%u", - pbs.speedSet, pbs.audioRate.mSpeed, - pbs.pitchSet, pbs.audioRate.mPitch, - pbs.audioFallbackModeSet, pbs.audioRate.mFallbackMode, - pbs.audioStretchModeSet, pbs.audioRate.mStretchMode); + pbp.speedSet, pbp.audioRate.mSpeed, + pbp.pitchSet, pbp.audioRate.mPitch, + pbp.audioFallbackModeSet, pbp.audioRate.mFallbackMode, + pbp.audioStretchModeSet, pbp.audioRate.mStretchMode); - if (lpTrack->setPlaybackRate(pbs.audioRate) != OK) { - jniThrowException(env, "java/lang/IllegalArgumentException", - "arguments out of range"); + // to simulate partially set params, we do a read-modify-write. + // TODO: pass in the valid set mask into AudioTrack. + AudioPlaybackRate rate = lpTrack->getPlaybackRate(); + bool updatedRate = false; + if (pbp.speedSet) { + rate.mSpeed = pbp.audioRate.mSpeed; + updatedRate = true; + } + if (pbp.pitchSet) { + rate.mPitch = pbp.audioRate.mPitch; + updatedRate = true; + } + if (pbp.audioFallbackModeSet) { + rate.mFallbackMode = pbp.audioRate.mFallbackMode; + updatedRate = true; + } + if (pbp.audioStretchModeSet) { + rate.mStretchMode = pbp.audioRate.mStretchMode; + updatedRate = true; + } + if (updatedRate) { + if (lpTrack->setPlaybackRate(rate) != OK) { + jniThrowException(env, "java/lang/IllegalArgumentException", + "arguments out of range"); + } } }