summaryrefslogtreecommitdiffstats
path: root/core/jni
diff options
context:
space:
mode:
authorAndy Hung <hunga@google.com>2015-05-13 15:15:25 -0700
committerAndy Hung <hunga@google.com>2015-05-13 15:17:36 -0700
commit973b8851eecbdcbab4992be01aaab568fd371a0a (patch)
treefaf704341c66449a396a4bed0e56c18166f9a482 /core/jni
parent20e16f4f762ddaf8a3574ad03c3f3a9f97a44637 (diff)
downloadframeworks_base-973b8851eecbdcbab4992be01aaab568fd371a0a.zip
frameworks_base-973b8851eecbdcbab4992be01aaab568fd371a0a.tar.gz
frameworks_base-973b8851eecbdcbab4992be01aaab568fd371a0a.tar.bz2
Allow partial playback parameter settings in AudioTrack
Change-Id: Ifb12c85312e25aa74da47fe0eae2d5b1fa4bb23b
Diffstat (limited to 'core/jni')
-rw-r--r--core/jni/android_media_AudioTrack.cpp42
1 files changed, 32 insertions, 10 deletions
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index aeb058b..daafd5e 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);
-
- if (lpTrack->setPlaybackRate(pbs.audioRate) != OK) {
- jniThrowException(env, "java/lang/IllegalArgumentException",
- "arguments out of range");
+ pbp.speedSet, pbp.audioRate.mSpeed,
+ pbp.pitchSet, pbp.audioRate.mPitch,
+ pbp.audioFallbackModeSet, pbp.audioRate.mFallbackMode,
+ pbp.audioStretchModeSet, pbp.audioRate.mStretchMode);
+
+ // 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");
+ }
}
}