Using centralized isAudioPlaybackRateValid to validate parameters

Centralized validation code
bug: 20701446

Change-Id: I9d9941c7639c05b2afe069ff4f858c693c910bfe
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 @@
             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 @@
         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 @@
     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 @@
         *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 @@
     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
 };
 
 // ----------------------------------------------------------------------------