summaryrefslogtreecommitdiffstats
path: root/media/libmedia/AudioTrack.cpp
diff options
context:
space:
mode:
authorRicardo Garcia <rago@google.com>2015-06-23 00:25:07 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-06-23 00:25:08 +0000
commit55a2dcce3a409393dc51ab2eb433914331f2df51 (patch)
treece69e72bd8520a05807a88a64bb58d33b0dc7962 /media/libmedia/AudioTrack.cpp
parent2b343b1b2dd9e4885ef2b7ec2f798215d714ab3a (diff)
parent6c7f062d3149d6890daaee64828959ad6f61ea54 (diff)
downloadframeworks_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.cpp32
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;