AudioPolicyManager volume init on invalid min/max
Detect situations where min/max volumes are invalid
in AudioPolicyManager::checkAndSetVolume and return
an error. On error, call back into AudioService
to request the volume ranges to be reinitialized.
Bug: 206966260
Test: upcoming AudioService test
Change-Id: Ie63d9b9e3faad0a3e897f2807ece383632860adb
diff --git a/services/audiopolicy/service/AudioPolicyClientImpl.cpp b/services/audiopolicy/service/AudioPolicyClientImpl.cpp
index 63a1e71..c766a15 100644
--- a/services/audiopolicy/service/AudioPolicyClientImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyClientImpl.cpp
@@ -277,6 +277,11 @@
mAudioPolicyService->onRoutingUpdated();
}
+void AudioPolicyService::AudioPolicyClient::onVolumeRangeInitRequest()
+{
+ mAudioPolicyService->onVolumeRangeInitRequest();
+}
+
audio_unique_id_t AudioPolicyService::AudioPolicyClient::newAudioUniqueId(audio_unique_id_use_t use)
{
return AudioSystem::newAudioUniqueId(use);
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index da0a4a9..08ab4b6 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -488,6 +488,19 @@
}
}
+void AudioPolicyService::onVolumeRangeInitRequest()
+{
+ mOutputCommandThread->volRangeInitReqCommand();
+}
+
+void AudioPolicyService::doOnVolumeRangeInitRequest()
+{
+ Mutex::Autolock _l(mNotificationClientsLock);
+ for (size_t i = 0; i < mNotificationClients.size(); i++) {
+ mNotificationClients.valueAt(i)->onVolumeRangeInitRequest();
+ }
+}
+
void AudioPolicyService::onCheckSpatializer()
{
Mutex::Autolock _l(mLock);
@@ -721,6 +734,13 @@
}
}
+void AudioPolicyService::NotificationClient::onVolumeRangeInitRequest()
+{
+ if (mAudioPolicyServiceClient != 0 && isServiceUid(mUid)) {
+ mAudioPolicyServiceClient->onVolumeRangeInitRequest();
+ }
+}
+
void AudioPolicyService::binderDied(const wp<IBinder>& who) {
ALOGW("binderDied() %p, calling pid %d", who.unsafe_get(),
IPCThreadState::self()->getCallingPid());
@@ -2157,6 +2177,17 @@
mLock.lock();
} break;
+ case VOL_RANGE_INIT_REQUEST: {
+ ALOGV("AudioCommandThread() processing volume range init request");
+ svc = mService.promote();
+ if (svc == 0) {
+ break;
+ }
+ mLock.unlock();
+ svc->doOnVolumeRangeInitRequest();
+ mLock.lock();
+ } break;
+
default:
ALOGW("AudioCommandThread() unknown command %d", command->mCommand);
}
@@ -2480,6 +2511,14 @@
sendCommand(command);
}
+void AudioPolicyService::AudioCommandThread::volRangeInitReqCommand()
+{
+ sp<AudioCommand>command = new AudioCommand();
+ command->mCommand = VOL_RANGE_INIT_REQUEST;
+ ALOGV("AudioCommandThread() adding volume range init request");
+ sendCommand(command);
+}
+
status_t AudioPolicyService::AudioCommandThread::sendCommand(sp<AudioCommand>& command, int delayMs)
{
{
@@ -2647,6 +2686,10 @@
} break;
+ case VOL_RANGE_INIT_REQUEST: {
+ // command may come from different requests, do not filter
+ } break;
+
default:
break;
}
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index d863ff1..3a08cf8 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -343,6 +343,9 @@
void onRoutingUpdated();
void doOnRoutingUpdated();
+ void onVolumeRangeInitRequest();
+ void doOnVolumeRangeInitRequest();
+
/**
* Spatializer SpatializerPolicyCallback implementation.
* onCheckSpatializer() sends an event on mOutputCommandThread which executes
@@ -530,7 +533,8 @@
ROUTING_UPDATED,
UPDATE_UID_STATES,
CHECK_SPATIALIZER_OUTPUT, // verify if spatializer effect should be created or moved
- UPDATE_ACTIVE_SPATIALIZER_TRACKS // Update active track counts on spalializer output
+ UPDATE_ACTIVE_SPATIALIZER_TRACKS, // Update active track counts on spalializer output
+ VOL_RANGE_INIT_REQUEST, // request to reset the volume range indices
};
AudioCommandThread (String8 name, const wp<AudioPolicyService>& service);
@@ -581,6 +585,7 @@
void updateUidStatesCommand();
void checkSpatializerCommand();
void updateActiveSpatializerTracksCommand();
+ void volRangeInitReqCommand();
void insertCommand_l(AudioCommand *command, int delayMs = 0);
private:
@@ -803,6 +808,8 @@
virtual void onRoutingUpdated();
+ virtual void onVolumeRangeInitRequest();
+
virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use);
void setSoundTriggerCaptureState(bool active) override;
@@ -842,6 +849,7 @@
audio_patch_handle_t patchHandle,
audio_source_t source);
void onRoutingUpdated();
+ void onVolumeRangeInitRequest();
void setAudioPortCallbacksEnabled(bool enabled);
void setAudioVolumeGroupCallbacksEnabled(bool enabled);