audio: add implementation for TV related API
1. TunerConfiguration.
2. AudioDescriptionMixLevel getter/setter.
3. DualMonoMode getter/setter.
4. PlaybackRate getter/setter.
Test: TIS player with instrumented HAL
Test: atest AudioTrackTest#testTunerConfiguration
Test: atest AudioTrackTest#testDualMonoMode
Test: atest AudioTrackTest#testAudioDescriptionMixLevel
Test: atest AudioManagerTest#testGetAdditionalOutputDeviceDelay
Bug: 173482792
Change-Id: Idb22ce6714fa240b2b4b3b8637b16d3a51228fa1
diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp
index b1eb950..57bd04f 100644
--- a/media/libaudioclient/AudioTrack.cpp
+++ b/media/libaudioclient/AudioTrack.cpp
@@ -51,6 +51,8 @@
#define WAIT_STREAM_END_TIMEOUT_SEC 120
static const int kMaxLoopCountNotifications = 32;
+using ::android::aidl_utils::statusTFromBinderStatus;
+
namespace android {
// ---------------------------------------------------------------------------
@@ -1096,6 +1098,53 @@
return mOriginalSampleRate;
}
+status_t AudioTrack::setDualMonoMode(audio_dual_mono_mode_t mode)
+{
+ AutoMutex lock(mLock);
+ return setDualMonoMode_l(mode);
+}
+
+status_t AudioTrack::setDualMonoMode_l(audio_dual_mono_mode_t mode)
+{
+ const status_t status = statusTFromBinderStatus(
+ mAudioTrack->setDualMonoMode(VALUE_OR_RETURN_STATUS(
+ legacy2aidl_audio_dual_mono_mode_t_AudioDualMonoMode(mode))));
+ if (status == NO_ERROR) mDualMonoMode = mode;
+ return status;
+}
+
+status_t AudioTrack::getDualMonoMode(audio_dual_mono_mode_t* mode) const
+{
+ AutoMutex lock(mLock);
+ media::AudioDualMonoMode mediaMode;
+ const status_t status = statusTFromBinderStatus(mAudioTrack->getDualMonoMode(&mediaMode));
+ if (status == NO_ERROR) {
+ *mode = VALUE_OR_RETURN_STATUS(
+ aidl2legacy_AudioDualMonoMode_audio_dual_mono_mode_t(mediaMode));
+ }
+ return status;
+}
+
+status_t AudioTrack::setAudioDescriptionMixLevel(float leveldB)
+{
+ AutoMutex lock(mLock);
+ return setAudioDescriptionMixLevel_l(leveldB);
+}
+
+status_t AudioTrack::setAudioDescriptionMixLevel_l(float leveldB)
+{
+ const status_t status = statusTFromBinderStatus(
+ mAudioTrack->setAudioDescriptionMixLevel(leveldB));
+ if (status == NO_ERROR) mAudioDescriptionMixLeveldB = leveldB;
+ return status;
+}
+
+status_t AudioTrack::getAudioDescriptionMixLevel(float* leveldB) const
+{
+ AutoMutex lock(mLock);
+ return statusTFromBinderStatus(mAudioTrack->getAudioDescriptionMixLevel(leveldB));
+}
+
status_t AudioTrack::setPlaybackRate(const AudioPlaybackRate &playbackRate)
{
AutoMutex lock(mLock);
@@ -1103,7 +1152,13 @@
return NO_ERROR;
}
if (isOffloadedOrDirect_l()) {
- return INVALID_OPERATION;
+ const status_t status = statusTFromBinderStatus(mAudioTrack->setPlaybackRateParameters(
+ VALUE_OR_RETURN_STATUS(
+ legacy2aidl_audio_playback_rate_t_AudioPlaybackRate(playbackRate))));
+ if (status == NO_ERROR) {
+ mPlaybackRate = playbackRate;
+ }
+ return status;
}
if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
return INVALID_OPERATION;
@@ -1168,9 +1223,18 @@
return NO_ERROR;
}
-const AudioPlaybackRate& AudioTrack::getPlaybackRate() const
+const AudioPlaybackRate& AudioTrack::getPlaybackRate()
{
AutoMutex lock(mLock);
+ if (isOffloadedOrDirect_l()) {
+ media::AudioPlaybackRate playbackRateTemp;
+ const status_t status = statusTFromBinderStatus(
+ mAudioTrack->getPlaybackRateParameters(&playbackRateTemp));
+ if (status == NO_ERROR) { // update local version if changed.
+ mPlaybackRate =
+ aidl2legacy_AudioPlaybackRate_audio_playback_rate_t(playbackRateTemp).value();
+ }
+ }
return mPlaybackRate;
}
@@ -1771,6 +1835,13 @@
mProxy->setPlaybackRate(playbackRateTemp);
mProxy->setMinimum(mNotificationFramesAct);
+ if (mDualMonoMode != AUDIO_DUAL_MONO_MODE_OFF) {
+ setDualMonoMode_l(mDualMonoMode);
+ }
+ if (mAudioDescriptionMixLeveldB != -std::numeric_limits<float>::infinity()) {
+ setAudioDescriptionMixLevel_l(mAudioDescriptionMixLeveldB);
+ }
+
mDeathNotifier = new DeathNotifier(this);
IInterface::asBinder(mAudioTrack)->linkToDeath(mDeathNotifier, this);