Translate 'FALLBACK_DEFAULT' playback parameter into 'FALLBACK_FAIL'

For 'android.media.PlaybackParams', the SDK says that the fallback
mode 'AUDIO_FALLBACK_MODE_DEFAULT' means "System will determine best
handling." That means, the system (framework) must translate this
value into some concrete one before passing it to the HAL. Since
the initialization for 'audio_playback_rate_t' uses 'FALLBACK_FAIL',
use it as the "best" value.

Flag: EXEMPT bugfix
Bug: 431714495
Test: atest CtsMediaAudioTestCases
Change-Id: Iaf2f1ea57f5901546ce68d9f5e4750e179821e1d
diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp
index 7f77cfa..5456bed 100644
--- a/media/libaudioclient/AudioTrack.cpp
+++ b/media/libaudioclient/AudioTrack.cpp
@@ -1211,9 +1211,14 @@
         return NO_ERROR;
     }
     if (isAfTrackOffloadedOrDirect_l()) {
+        AudioPlaybackRate servicePlaybackRate = playbackRate;
+        if (servicePlaybackRate.mFallbackMode == AUDIO_TIMESTRETCH_FALLBACK_DEFAULT) {
+            // unspecified by client, system determines behavior, set to `FAIL`.
+            servicePlaybackRate.mFallbackMode = AUDIO_TIMESTRETCH_FALLBACK_FAIL;
+        }
         const status_t status = statusTFromBinderStatus(mAudioTrack->setPlaybackRateParameters(
-                VALUE_OR_RETURN_STATUS(
-                        legacy2aidl_audio_playback_rate_t_AudioPlaybackRate(playbackRate))));
+                VALUE_OR_RETURN_STATUS(legacy2aidl_audio_playback_rate_t_AudioPlaybackRate(
+                        servicePlaybackRate))));
         if (status == NO_ERROR) {
             mPlaybackRate = playbackRate;
         } else if (status == INVALID_OPERATION
@@ -1294,8 +1299,19 @@
         const status_t status = statusTFromBinderStatus(
                 mAudioTrack->getPlaybackRateParameters(&playbackRateTemp));
         if (status == NO_ERROR) { // update local version if changed.
-            mPlaybackRate =
+            AudioPlaybackRate servicePlaybackRate =
                     aidl2legacy_AudioPlaybackRate_audio_playback_rate_t(playbackRateTemp).value();
+            if (servicePlaybackRate.mFallbackMode == AUDIO_TIMESTRETCH_FALLBACK_DEFAULT) {
+                // This is not expected, may be an issue with HAL.
+                ALOGW("%s(%d) got 'FALLBACK_DEFAULT' from service", __func__, mPortId);
+                servicePlaybackRate.mFallbackMode = AUDIO_TIMESTRETCH_FALLBACK_FAIL;
+            }
+            if (mPlaybackRate.mFallbackMode == AUDIO_TIMESTRETCH_FALLBACK_DEFAULT &&
+                    servicePlaybackRate.mFallbackMode == AUDIO_TIMESTRETCH_FALLBACK_FAIL) {
+                // Leave the client view as 'DEFAULT'.
+                servicePlaybackRate.mFallbackMode = AUDIO_TIMESTRETCH_FALLBACK_DEFAULT;
+            }
+            mPlaybackRate = servicePlaybackRate;
         }
     }
     return mPlaybackRate;
diff --git a/media/libaudioclient/include/media/AudioTrack.h b/media/libaudioclient/include/media/AudioTrack.h
index a21ebe4..a5057f6 100644
--- a/media/libaudioclient/include/media/AudioTrack.h
+++ b/media/libaudioclient/include/media/AudioTrack.h
@@ -1262,7 +1262,7 @@
     float                   mSendLevel;
     mutable uint32_t        mSampleRate;            // mutable because getSampleRate() can update it
     uint32_t                mOriginalSampleRate;
-    AudioPlaybackRate       mPlaybackRate;
+    AudioPlaybackRate       mPlaybackRate;          // what is requested by the client
     float                   mMaxRequiredSpeed;      // use PCM buffer size to allow this speed
 
     // Corresponds to current IAudioTrack, value is reported back by AudioFlinger to the client.