diff options
author | Ricardo Garcia <rago@google.com> | 2015-06-23 00:25:07 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-06-23 00:25:08 +0000 |
commit | 55a2dcce3a409393dc51ab2eb433914331f2df51 (patch) | |
tree | ce69e72bd8520a05807a88a64bb58d33b0dc7962 /media/libmedia/AudioTrack.cpp | |
parent | 2b343b1b2dd9e4885ef2b7ec2f798215d714ab3a (diff) | |
parent | 6c7f062d3149d6890daaee64828959ad6f61ea54 (diff) | |
download | frameworks_av-55a2dcce3a409393dc51ab2eb433914331f2df51.zip frameworks_av-55a2dcce3a409393dc51ab2eb433914331f2df51.tar.gz frameworks_av-55a2dcce3a409393dc51ab2eb433914331f2df51.tar.bz2 |
Merge "Using centralized isAudioPlaybackRateValid to validate parameters" into mnc-dev
Diffstat (limited to 'media/libmedia/AudioTrack.cpp')
-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 b5d7614..ab720c6 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; |