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 | |
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
-rw-r--r-- | include/media/AudioResamplerPublic.h | 17 | ||||
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 32 | ||||
-rw-r--r-- | services/audioflinger/AudioMixer.cpp | 10 | ||||
-rw-r--r-- | services/audioflinger/BufferProviders.cpp | 8 | ||||
-rw-r--r-- | services/audioflinger/BufferProviders.h | 1 |
5 files changed, 46 insertions, 22 deletions
diff --git a/include/media/AudioResamplerPublic.h b/include/media/AudioResamplerPublic.h index 6cf2ca9..055f724 100644 --- a/include/media/AudioResamplerPublic.h +++ b/include/media/AudioResamplerPublic.h @@ -108,6 +108,23 @@ static inline bool isAudioPlaybackRateEqual(const AudioPlaybackRate &pr1, pr2.mFallbackMode == pr2.mFallbackMode; } +static inline bool isAudioPlaybackRateValid(const AudioPlaybackRate &playbackRate) { + if (playbackRate.mFallbackMode == AUDIO_TIMESTRETCH_FALLBACK_FAIL && + (playbackRate.mStretchMode == AUDIO_TIMESTRETCH_STRETCH_SPEECH || + playbackRate.mStretchMode == AUDIO_TIMESTRETCH_STRETCH_DEFAULT)) { + //test sonic specific constraints + return playbackRate.mSpeed >= TIMESTRETCH_SONIC_SPEED_MIN && + playbackRate.mSpeed <= TIMESTRETCH_SONIC_SPEED_MAX && + playbackRate.mPitch >= AUDIO_TIMESTRETCH_PITCH_MIN && + playbackRate.mPitch <= AUDIO_TIMESTRETCH_PITCH_MAX; + } else { + return playbackRate.mSpeed >= AUDIO_TIMESTRETCH_SPEED_MIN && + playbackRate.mSpeed <= AUDIO_TIMESTRETCH_SPEED_MAX && + playbackRate.mPitch >= AUDIO_TIMESTRETCH_PITCH_MIN && + playbackRate.mPitch <= AUDIO_TIMESTRETCH_PITCH_MAX; + } +} + // TODO: Consider putting these inlines into a class scope // Returns the source frames needed to resample to destination frames. This is not a precise 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; diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp index 01efc53..8a9a837 100644 --- a/services/audioflinger/AudioMixer.cpp +++ b/services/audioflinger/AudioMixer.cpp @@ -733,13 +733,9 @@ void AudioMixer::setParameter(int name, int target, int param, void *value) case PLAYBACK_RATE: { const AudioPlaybackRate *playbackRate = reinterpret_cast<AudioPlaybackRate*>(value); - ALOG_ASSERT(AUDIO_TIMESTRETCH_SPEED_MIN <= playbackRate->mSpeed - && playbackRate->mSpeed <= AUDIO_TIMESTRETCH_SPEED_MAX, - "bad speed %f", playbackRate->mSpeed); - ALOG_ASSERT(AUDIO_TIMESTRETCH_PITCH_MIN <= playbackRate->mPitch - && playbackRate->mPitch <= AUDIO_TIMESTRETCH_PITCH_MAX, - "bad pitch %f", playbackRate->mPitch); - //TODO: use function from AudioResamplerPublic.h to test validity. + ALOGW_IF(!isAudioPlaybackRateValid(*playbackRate), + "bad parameters speed %f, pitch %f",playbackRate->mSpeed, + playbackRate->mPitch); if (track.setPlaybackRate(*playbackRate)) { ALOGV("setParameter(TIMESTRETCH, PLAYBACK_RATE, STRETCH_MODE, FALLBACK_MODE " "%f %f %d %d", diff --git a/services/audioflinger/BufferProviders.cpp b/services/audioflinger/BufferProviders.cpp index 8a580e8..3566ee2 100644 --- a/services/audioflinger/BufferProviders.cpp +++ b/services/audioflinger/BufferProviders.cpp @@ -332,7 +332,8 @@ TimestretchBufferProvider::TimestretchBufferProvider(int32_t channelCount, mLocalBufferData(NULL), mRemaining(0), mSonicStream(sonicCreateStream(sampleRate, mChannelCount)), - mFallbackFailErrorShown(false) + mFallbackFailErrorShown(false), + mAudioPlaybackRateValid(false) { LOG_ALWAYS_FATAL_IF(mSonicStream == NULL, "TimestretchBufferProvider can't allocate Sonic stream"); @@ -460,6 +461,8 @@ status_t TimestretchBufferProvider::setPlaybackRate(const AudioPlaybackRate &pla sonicSetSpeed(mSonicStream, mPlaybackRate.mSpeed); //TODO: pitch is ignored for now //TODO: optimize: if parameters are the same, don't do any extra computation. + + mAudioPlaybackRateValid = isAudioPlaybackRateValid(mPlaybackRate); return OK; } @@ -479,8 +482,7 @@ void TimestretchBufferProvider::processFrames(void *dstBuffer, size_t *dstFrames *srcFrames = targetSrc + 1; } - if (mPlaybackRate.mSpeed< TIMESTRETCH_SONIC_SPEED_MIN || - mPlaybackRate.mSpeed > TIMESTRETCH_SONIC_SPEED_MAX ) { + if (!mAudioPlaybackRateValid) { //fallback mode if (*dstFrames > 0) { switch(mPlaybackRate.mFallbackMode) { diff --git a/services/audioflinger/BufferProviders.h b/services/audioflinger/BufferProviders.h index 4970b6c..4bc895c 100644 --- a/services/audioflinger/BufferProviders.h +++ b/services/audioflinger/BufferProviders.h @@ -188,6 +188,7 @@ private: sonicStream mSonicStream; // handle to sonic timestretch object //FIXME: this dependency should be abstracted out bool mFallbackFailErrorShown; // log fallback error only once + bool mAudioPlaybackRateValid; // flag for current parameters validity }; // ---------------------------------------------------------------------------- |