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.