diff options
author | Ricardo Garcia <rago@google.com> | 2015-04-30 18:39:16 -0700 |
---|---|---|
committer | Ricardo Garcia <rago@google.com> | 2015-06-22 16:08:40 -0700 |
commit | 6c7f062d3149d6890daaee64828959ad6f61ea54 (patch) | |
tree | dcab2e17178bf6d01ead75fad5df883961a6e195 /media/libmedia | |
parent | fa907d4ee326c7bb9cbb4882ab7c0ec42bbceee3 (diff) | |
download | frameworks_av-6c7f062d3149d6890daaee64828959ad6f61ea54.zip frameworks_av-6c7f062d3149d6890daaee64828959ad6f61ea54.tar.gz frameworks_av-6c7f062d3149d6890daaee64828959ad6f61ea54.tar.bz2 |
Using centralized isAudioPlaybackRateValid to validate parameters
Centralized validation code
bug: 20701446
Change-Id: I9d9941c7639c05b2afe069ff4f858c693c910bfe
Diffstat (limited to 'media/libmedia')
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 81ae6d7..2649ade 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -78,7 +78,7 @@ static inline uint32_t adjustSampleRate(uint32_t sampleRate, float pitch) static inline float adjustSpeed(float speed, float pitch) { - return kFixPitch ? (speed / pitch) : speed; + return kFixPitch ? speed / max(pitch, AUDIO_TIMESTRETCH_PITCH_MIN_DELTA) : speed; } static inline float adjustPitch(float pitch) @@ -809,25 +809,33 @@ status_t AudioTrack::setPlaybackRate(const AudioPlaybackRate &playbackRate) const uint32_t effectiveRate = adjustSampleRate(mSampleRate, playbackRate.mPitch); const float effectiveSpeed = adjustSpeed(playbackRate.mSpeed, playbackRate.mPitch); const float effectivePitch = adjustPitch(playbackRate.mPitch); - if (effectiveSpeed < AUDIO_TIMESTRETCH_SPEED_MIN - || effectiveSpeed > AUDIO_TIMESTRETCH_SPEED_MAX - || effectivePitch < AUDIO_TIMESTRETCH_PITCH_MIN - || effectivePitch > AUDIO_TIMESTRETCH_PITCH_MAX) { + AudioPlaybackRate playbackRateTemp = playbackRate; + playbackRateTemp.mSpeed = effectiveSpeed; + playbackRateTemp.mPitch = effectivePitch; + + if (!isAudioPlaybackRateValid(playbackRateTemp)) { return BAD_VALUE; - //TODO: add function in AudioResamplerPublic.h to check for validity. } // Check if the buffer size is compatible. if (!isSampleRateSpeedAllowed_l(effectiveRate, effectiveSpeed)) { ALOGV("setPlaybackRate(%f, %f) failed", playbackRate.mSpeed, playbackRate.mPitch); return BAD_VALUE; } - mPlaybackRate = playbackRate; - mProxy->setPlaybackRate(playbackRate); - //modify this - AudioPlaybackRate playbackRateTemp = playbackRate; - playbackRateTemp.mSpeed = effectiveSpeed; - playbackRateTemp.mPitch = effectivePitch; + // Check resampler ratios are within bounds + if (effectiveRate > mSampleRate * AUDIO_RESAMPLER_DOWN_RATIO_MAX) { + ALOGV("setPlaybackRate(%f, %f) failed. Resample rate exceeds max accepted value", + playbackRate.mSpeed, playbackRate.mPitch); + return BAD_VALUE; + } + + if (effectiveRate * AUDIO_RESAMPLER_UP_RATIO_MAX < mSampleRate) { + ALOGV("setPlaybackRate(%f, %f) failed. Resample rate below min accepted value", + playbackRate.mSpeed, playbackRate.mPitch); + return BAD_VALUE; + } + mPlaybackRate = playbackRate; + //set effective rates mProxy->setPlaybackRate(playbackRateTemp); mProxy->setSampleRate(effectiveRate); // FIXME: not quite "atomic" with setPlaybackRate return NO_ERROR; |