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 | |
| 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')
| -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;  | 
