Loading services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -485,6 +485,7 @@ Status AudioPolicyService::startOutput(int32_t portIdAidl) status_t status = mAudioPolicyManager->startOutput(portId); if (status == NO_ERROR) { client->active = true; onUpdateActiveSpatializerTracks_l(); } return binderStatusFromStatusT(status); } Loading Loading @@ -522,6 +523,7 @@ status_t AudioPolicyService::doStopOutput(audio_port_handle_t portId) status_t status = mAudioPolicyManager->stopOutput(portId); if (status == NO_ERROR) { client->active = false; onUpdateActiveSpatializerTracks_l(); } return status; } Loading Loading @@ -552,8 +554,10 @@ void AudioPolicyService::doReleaseOutput(audio_port_handle_t portId) client->io, client->stream, client->session); } Mutex::Autolock _l(mLock); if (client != nullptr && client->active) { onUpdateActiveSpatializerTracks_l(); } mAudioPlaybackClients.removeItem(portId); // called from internal thread: no need to clear caller identity mAudioPolicyManager->releaseOutput(portId); } Loading services/audiopolicy/service/AudioPolicyService.cpp +52 −4 Original line number Diff line number Diff line Loading @@ -397,6 +397,7 @@ void AudioPolicyService::doOnCheckSpatializer() if (status == NO_ERROR && currentOutput == newOutput) { return; } size_t numActiveTracks = countActiveClientsOnOutput_l(newOutput); mLock.unlock(); // It is OK to call detachOutput() is none is already attached. mSpatializer->detachOutput(); Loading @@ -404,7 +405,7 @@ void AudioPolicyService::doOnCheckSpatializer() mLock.lock(); return; } status = mSpatializer->attachOutput(newOutput); status = mSpatializer->attachOutput(newOutput, numActiveTracks); mLock.lock(); if (status != NO_ERROR) { mAudioPolicyManager->releaseSpatializerOutput(newOutput); Loading @@ -421,6 +422,34 @@ void AudioPolicyService::doOnCheckSpatializer() } } size_t AudioPolicyService::countActiveClientsOnOutput_l(audio_io_handle_t output) REQUIRES(mLock) { size_t count = 0; for (size_t i = 0; i < mAudioPlaybackClients.size(); i++) { auto client = mAudioPlaybackClients.valueAt(i); if (client->io == output && client->active) { count++; } } return count; } void AudioPolicyService::onUpdateActiveSpatializerTracks_l() { if (mSpatializer == nullptr) { return; } mOutputCommandThread->updateActiveSpatializerTracksCommand(); } void AudioPolicyService::doOnUpdateActiveSpatializerTracks() { Mutex::Autolock _l(mLock); if (mSpatializer == nullptr) { return; } mSpatializer->updateActiveTracks(countActiveClientsOnOutput_l(mSpatializer->getOutput())); } status_t AudioPolicyService::clientCreateAudioPatch(const struct audio_patch *patch, audio_patch_handle_t *handle, int delayMs) Loading Loading @@ -1953,8 +1982,8 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() mLock.lock(); } break; case CHECK_SPATIALIZER: { ALOGV("AudioCommandThread() processing updateUID states"); case CHECK_SPATIALIZER_OUTPUT: { ALOGV("AudioCommandThread() processing check spatializer"); svc = mService.promote(); if (svc == 0) { break; Loading @@ -1964,6 +1993,17 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() mLock.lock(); } break; case UPDATE_ACTIVE_SPATIALIZER_TRACKS: { ALOGV("AudioCommandThread() processing update spatializer tracks"); svc = mService.promote(); if (svc == 0) { break; } mLock.unlock(); svc->doOnUpdateActiveSpatializerTracks(); mLock.lock(); } break; default: ALOGW("AudioCommandThread() unknown command %d", command->mCommand); } Loading Loading @@ -2274,11 +2314,19 @@ void AudioPolicyService::AudioCommandThread::routingChangedCommand() void AudioPolicyService::AudioCommandThread::checkSpatializerCommand() { sp<AudioCommand>command = new AudioCommand(); command->mCommand = CHECK_SPATIALIZER; command->mCommand = CHECK_SPATIALIZER_OUTPUT; ALOGV("AudioCommandThread() adding check spatializer"); sendCommand(command); } void AudioPolicyService::AudioCommandThread::updateActiveSpatializerTracksCommand() { sp<AudioCommand>command = new AudioCommand(); command->mCommand = UPDATE_ACTIVE_SPATIALIZER_TRACKS; ALOGV("AudioCommandThread() adding update active spatializer tracks"); sendCommand(command); } status_t AudioPolicyService::AudioCommandThread::sendCommand(sp<AudioCommand>& command, int delayMs) { { Loading services/audiopolicy/service/AudioPolicyService.h +11 −2 Original line number Diff line number Diff line Loading @@ -353,9 +353,13 @@ public: * by audio policy manager and attach/detach the spatializer effect accordingly. */ void onCheckSpatializer() override; void onCheckSpatializer_l(); void onCheckSpatializer_l() REQUIRES(mLock); void doOnCheckSpatializer(); void onUpdateActiveSpatializerTracks_l() REQUIRES(mLock); void doOnUpdateActiveSpatializerTracks(); void setEffectSuspended(int effectId, audio_session_t sessionId, bool suspended); Loading Loading @@ -527,7 +531,8 @@ private: AUDIO_MODULES_UPDATE, ROUTING_UPDATED, UPDATE_UID_STATES, CHECK_SPATIALIZER CHECK_SPATIALIZER_OUTPUT, // verify if spatializer effect should be created or moved UPDATE_ACTIVE_SPATIALIZER_TRACKS // Update active track counts on spalializer output }; AudioCommandThread (String8 name, const wp<AudioPolicyService>& service); Loading Loading @@ -577,6 +582,8 @@ private: void routingChangedCommand(); void updateUidStatesCommand(); void checkSpatializerCommand(); void updateActiveSpatializerTracksCommand(); void insertCommand_l(AudioCommand *command, int delayMs = 0); private: class AudioCommandData; Loading Loading @@ -1001,6 +1008,8 @@ private: void loadAudioPolicyManager(); void unloadAudioPolicyManager(); size_t countActiveClientsOnOutput_l(audio_io_handle_t output) REQUIRES(mLock); mutable Mutex mLock; // prevents concurrent access to AudioPolicy manager functions changing // device connection state or routing // Note: lock acquisition order is always mLock > mEffectsLock: Loading services/audiopolicy/service/Spatializer.cpp +28 −5 Original line number Diff line number Diff line Loading @@ -300,6 +300,7 @@ Status Spatializer::setLevel(SpatializationLevel level) { if (levelChanged && mEngine != nullptr) { setEffectParameter_l(SPATIALIZER_PARAM_LEVEL, std::vector<SpatializationLevel>{level}); } checkHeadSensor_l(); } if (levelChanged) { Loading Loading @@ -374,6 +375,7 @@ Status Spatializer::setDesiredHeadTrackingMode(SpatializerHeadTrackingMode mode) if (mPoseController != nullptr) { mPoseController->setDesiredMode(mDesiredHeadTrackingMode); checkHeadSensor_l(); } return Status::ok(); Loading Loading @@ -448,7 +450,7 @@ Status Spatializer::setHeadSensor(int sensorHandle) { std::lock_guard lock(mLock); mHeadSensor = sensorHandle; if (mPoseController != nullptr) { mPoseController->setHeadSensor(mHeadSensor); checkHeadSensor_l(); } return Status::ok(); } Loading Loading @@ -557,7 +559,6 @@ void Spatializer::onHeadToStagePose(const Pose3f& headToStage) { auto vec = headToStage.toVector(); LOG_ALWAYS_FATAL_IF(vec.size() != sHeadPoseKeys.size(), "%s invalid head to stage vector size %zu", __func__, vec.size()); sp<AMessage> msg = new AMessage(EngineCallbackHandler::kWhatOnHeadToStagePose, mHandler); for (size_t i = 0 ; i < sHeadPoseKeys.size(); i++) { Loading @@ -571,6 +572,9 @@ void Spatializer::onHeadToStagePoseMsg(const std::vector<float>& headToStage) { sp<media::ISpatializerHeadTrackingCallback> callback; { std::lock_guard lock(mLock); if (mActualHeadTrackingMode == SpatializerHeadTrackingMode::DISABLED) { return; } callback = mHeadTrackingCallback; if (mEngine != nullptr) { setEffectParameter_l(SPATIALIZER_PARAM_HEAD_TO_STAGE, headToStage); Loading Loading @@ -621,7 +625,7 @@ void Spatializer::onActualModeChangeMsg(HeadTrackingMode mode) { } } status_t Spatializer::attachOutput(audio_io_handle_t output) { status_t Spatializer::attachOutput(audio_io_handle_t output, size_t numActiveTracks) { std::shared_ptr<SpatializerPoseController> poseController; bool outputChanged = false; sp<media::INativeSpatializerCallback> callback; Loading @@ -634,6 +638,7 @@ status_t Spatializer::attachOutput(audio_io_handle_t output) { // remove FX instance mEngine->setEnabled(false); mEngine.clear(); mPoseController.reset(); } // create FX instance on output AttributionSourceState attributionSource = AttributionSourceState(); Loading Loading @@ -663,7 +668,8 @@ status_t Spatializer::attachOutput(audio_io_handle_t output) { "%s could not allocate pose controller", __func__); mPoseController->setDesiredMode(mDesiredHeadTrackingMode); mPoseController->setHeadSensor(mHeadSensor); mNumActiveTracks = numActiveTracks; checkHeadSensor_l(); mPoseController->setScreenSensor(mScreenSensor); mPoseController->setDisplayOrientation(mDisplayOrientation); poseController = mPoseController; Loading Loading @@ -697,7 +703,6 @@ audio_io_handle_t Spatializer::detachOutput() { output = mOutput; mOutput = AUDIO_IO_HANDLE_NONE; mPoseController.reset(); callback = mSpatializerCallback; } Loading @@ -707,6 +712,24 @@ audio_io_handle_t Spatializer::detachOutput() { return output; } void Spatializer::updateActiveTracks(size_t numActiveTracks) { std::lock_guard lock(mLock); mNumActiveTracks = numActiveTracks; checkHeadSensor_l(); } void Spatializer::checkHeadSensor_l() { if (mSupportsHeadTracking && mPoseController != nullptr) { if(mNumActiveTracks > 0 && mLevel != SpatializationLevel::NONE && mDesiredHeadTrackingMode != HeadTrackingMode::STATIC && mHeadSensor != SpatializerPoseController::INVALID_SENSOR) { mPoseController->setHeadSensor(mHeadSensor); } else { mPoseController->setHeadSensor(SpatializerPoseController::INVALID_SENSOR); } } } void Spatializer::calculateHeadPose() { ALOGV("%s", __func__); std::lock_guard lock(mLock); Loading services/audiopolicy/service/Spatializer.h +7 −1 Original line number Diff line number Diff line Loading @@ -135,7 +135,7 @@ class Spatializer : public media::BnSpatializer, /** Called by audio policy service when the special output mixer dedicated to spatialization * is opened and the spatializer engine must be created. */ status_t attachOutput(audio_io_handle_t output); status_t attachOutput(audio_io_handle_t output, size_t numActiveTracks); /** Called by audio policy service when the special output mixer dedicated to spatialization * is closed and the spatializer engine must be release. */ Loading @@ -143,6 +143,8 @@ class Spatializer : public media::BnSpatializer, /** Returns the output stream the spatializer is attached to. */ audio_io_handle_t getOutput() const { std::lock_guard lock(mLock); return mOutput; } void updateActiveTracks(size_t numActiveTracks); /** Gets the channel mask, sampling rate and format set for the spatializer input. */ audio_config_base_t getAudioInConfig() const; Loading Loading @@ -274,6 +276,8 @@ private: void postFramesProcessedMsg(int frames); void checkHeadSensor_l() REQUIRES(mLock); /** Effect engine descriptor */ const effect_descriptor_t mEngineDescriptor; /** Callback interface to parent audio policy service */ Loading Loading @@ -328,6 +332,8 @@ private: sp<ALooper> mLooper; sp<EngineCallbackHandler> mHandler; size_t mNumActiveTracks GUARDED_BY(mLock) = 0; static const std::vector<const char *> sHeadPoseKeys; }; Loading Loading
services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -485,6 +485,7 @@ Status AudioPolicyService::startOutput(int32_t portIdAidl) status_t status = mAudioPolicyManager->startOutput(portId); if (status == NO_ERROR) { client->active = true; onUpdateActiveSpatializerTracks_l(); } return binderStatusFromStatusT(status); } Loading Loading @@ -522,6 +523,7 @@ status_t AudioPolicyService::doStopOutput(audio_port_handle_t portId) status_t status = mAudioPolicyManager->stopOutput(portId); if (status == NO_ERROR) { client->active = false; onUpdateActiveSpatializerTracks_l(); } return status; } Loading Loading @@ -552,8 +554,10 @@ void AudioPolicyService::doReleaseOutput(audio_port_handle_t portId) client->io, client->stream, client->session); } Mutex::Autolock _l(mLock); if (client != nullptr && client->active) { onUpdateActiveSpatializerTracks_l(); } mAudioPlaybackClients.removeItem(portId); // called from internal thread: no need to clear caller identity mAudioPolicyManager->releaseOutput(portId); } Loading
services/audiopolicy/service/AudioPolicyService.cpp +52 −4 Original line number Diff line number Diff line Loading @@ -397,6 +397,7 @@ void AudioPolicyService::doOnCheckSpatializer() if (status == NO_ERROR && currentOutput == newOutput) { return; } size_t numActiveTracks = countActiveClientsOnOutput_l(newOutput); mLock.unlock(); // It is OK to call detachOutput() is none is already attached. mSpatializer->detachOutput(); Loading @@ -404,7 +405,7 @@ void AudioPolicyService::doOnCheckSpatializer() mLock.lock(); return; } status = mSpatializer->attachOutput(newOutput); status = mSpatializer->attachOutput(newOutput, numActiveTracks); mLock.lock(); if (status != NO_ERROR) { mAudioPolicyManager->releaseSpatializerOutput(newOutput); Loading @@ -421,6 +422,34 @@ void AudioPolicyService::doOnCheckSpatializer() } } size_t AudioPolicyService::countActiveClientsOnOutput_l(audio_io_handle_t output) REQUIRES(mLock) { size_t count = 0; for (size_t i = 0; i < mAudioPlaybackClients.size(); i++) { auto client = mAudioPlaybackClients.valueAt(i); if (client->io == output && client->active) { count++; } } return count; } void AudioPolicyService::onUpdateActiveSpatializerTracks_l() { if (mSpatializer == nullptr) { return; } mOutputCommandThread->updateActiveSpatializerTracksCommand(); } void AudioPolicyService::doOnUpdateActiveSpatializerTracks() { Mutex::Autolock _l(mLock); if (mSpatializer == nullptr) { return; } mSpatializer->updateActiveTracks(countActiveClientsOnOutput_l(mSpatializer->getOutput())); } status_t AudioPolicyService::clientCreateAudioPatch(const struct audio_patch *patch, audio_patch_handle_t *handle, int delayMs) Loading Loading @@ -1953,8 +1982,8 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() mLock.lock(); } break; case CHECK_SPATIALIZER: { ALOGV("AudioCommandThread() processing updateUID states"); case CHECK_SPATIALIZER_OUTPUT: { ALOGV("AudioCommandThread() processing check spatializer"); svc = mService.promote(); if (svc == 0) { break; Loading @@ -1964,6 +1993,17 @@ bool AudioPolicyService::AudioCommandThread::threadLoop() mLock.lock(); } break; case UPDATE_ACTIVE_SPATIALIZER_TRACKS: { ALOGV("AudioCommandThread() processing update spatializer tracks"); svc = mService.promote(); if (svc == 0) { break; } mLock.unlock(); svc->doOnUpdateActiveSpatializerTracks(); mLock.lock(); } break; default: ALOGW("AudioCommandThread() unknown command %d", command->mCommand); } Loading Loading @@ -2274,11 +2314,19 @@ void AudioPolicyService::AudioCommandThread::routingChangedCommand() void AudioPolicyService::AudioCommandThread::checkSpatializerCommand() { sp<AudioCommand>command = new AudioCommand(); command->mCommand = CHECK_SPATIALIZER; command->mCommand = CHECK_SPATIALIZER_OUTPUT; ALOGV("AudioCommandThread() adding check spatializer"); sendCommand(command); } void AudioPolicyService::AudioCommandThread::updateActiveSpatializerTracksCommand() { sp<AudioCommand>command = new AudioCommand(); command->mCommand = UPDATE_ACTIVE_SPATIALIZER_TRACKS; ALOGV("AudioCommandThread() adding update active spatializer tracks"); sendCommand(command); } status_t AudioPolicyService::AudioCommandThread::sendCommand(sp<AudioCommand>& command, int delayMs) { { Loading
services/audiopolicy/service/AudioPolicyService.h +11 −2 Original line number Diff line number Diff line Loading @@ -353,9 +353,13 @@ public: * by audio policy manager and attach/detach the spatializer effect accordingly. */ void onCheckSpatializer() override; void onCheckSpatializer_l(); void onCheckSpatializer_l() REQUIRES(mLock); void doOnCheckSpatializer(); void onUpdateActiveSpatializerTracks_l() REQUIRES(mLock); void doOnUpdateActiveSpatializerTracks(); void setEffectSuspended(int effectId, audio_session_t sessionId, bool suspended); Loading Loading @@ -527,7 +531,8 @@ private: AUDIO_MODULES_UPDATE, ROUTING_UPDATED, UPDATE_UID_STATES, CHECK_SPATIALIZER CHECK_SPATIALIZER_OUTPUT, // verify if spatializer effect should be created or moved UPDATE_ACTIVE_SPATIALIZER_TRACKS // Update active track counts on spalializer output }; AudioCommandThread (String8 name, const wp<AudioPolicyService>& service); Loading Loading @@ -577,6 +582,8 @@ private: void routingChangedCommand(); void updateUidStatesCommand(); void checkSpatializerCommand(); void updateActiveSpatializerTracksCommand(); void insertCommand_l(AudioCommand *command, int delayMs = 0); private: class AudioCommandData; Loading Loading @@ -1001,6 +1008,8 @@ private: void loadAudioPolicyManager(); void unloadAudioPolicyManager(); size_t countActiveClientsOnOutput_l(audio_io_handle_t output) REQUIRES(mLock); mutable Mutex mLock; // prevents concurrent access to AudioPolicy manager functions changing // device connection state or routing // Note: lock acquisition order is always mLock > mEffectsLock: Loading
services/audiopolicy/service/Spatializer.cpp +28 −5 Original line number Diff line number Diff line Loading @@ -300,6 +300,7 @@ Status Spatializer::setLevel(SpatializationLevel level) { if (levelChanged && mEngine != nullptr) { setEffectParameter_l(SPATIALIZER_PARAM_LEVEL, std::vector<SpatializationLevel>{level}); } checkHeadSensor_l(); } if (levelChanged) { Loading Loading @@ -374,6 +375,7 @@ Status Spatializer::setDesiredHeadTrackingMode(SpatializerHeadTrackingMode mode) if (mPoseController != nullptr) { mPoseController->setDesiredMode(mDesiredHeadTrackingMode); checkHeadSensor_l(); } return Status::ok(); Loading Loading @@ -448,7 +450,7 @@ Status Spatializer::setHeadSensor(int sensorHandle) { std::lock_guard lock(mLock); mHeadSensor = sensorHandle; if (mPoseController != nullptr) { mPoseController->setHeadSensor(mHeadSensor); checkHeadSensor_l(); } return Status::ok(); } Loading Loading @@ -557,7 +559,6 @@ void Spatializer::onHeadToStagePose(const Pose3f& headToStage) { auto vec = headToStage.toVector(); LOG_ALWAYS_FATAL_IF(vec.size() != sHeadPoseKeys.size(), "%s invalid head to stage vector size %zu", __func__, vec.size()); sp<AMessage> msg = new AMessage(EngineCallbackHandler::kWhatOnHeadToStagePose, mHandler); for (size_t i = 0 ; i < sHeadPoseKeys.size(); i++) { Loading @@ -571,6 +572,9 @@ void Spatializer::onHeadToStagePoseMsg(const std::vector<float>& headToStage) { sp<media::ISpatializerHeadTrackingCallback> callback; { std::lock_guard lock(mLock); if (mActualHeadTrackingMode == SpatializerHeadTrackingMode::DISABLED) { return; } callback = mHeadTrackingCallback; if (mEngine != nullptr) { setEffectParameter_l(SPATIALIZER_PARAM_HEAD_TO_STAGE, headToStage); Loading Loading @@ -621,7 +625,7 @@ void Spatializer::onActualModeChangeMsg(HeadTrackingMode mode) { } } status_t Spatializer::attachOutput(audio_io_handle_t output) { status_t Spatializer::attachOutput(audio_io_handle_t output, size_t numActiveTracks) { std::shared_ptr<SpatializerPoseController> poseController; bool outputChanged = false; sp<media::INativeSpatializerCallback> callback; Loading @@ -634,6 +638,7 @@ status_t Spatializer::attachOutput(audio_io_handle_t output) { // remove FX instance mEngine->setEnabled(false); mEngine.clear(); mPoseController.reset(); } // create FX instance on output AttributionSourceState attributionSource = AttributionSourceState(); Loading Loading @@ -663,7 +668,8 @@ status_t Spatializer::attachOutput(audio_io_handle_t output) { "%s could not allocate pose controller", __func__); mPoseController->setDesiredMode(mDesiredHeadTrackingMode); mPoseController->setHeadSensor(mHeadSensor); mNumActiveTracks = numActiveTracks; checkHeadSensor_l(); mPoseController->setScreenSensor(mScreenSensor); mPoseController->setDisplayOrientation(mDisplayOrientation); poseController = mPoseController; Loading Loading @@ -697,7 +703,6 @@ audio_io_handle_t Spatializer::detachOutput() { output = mOutput; mOutput = AUDIO_IO_HANDLE_NONE; mPoseController.reset(); callback = mSpatializerCallback; } Loading @@ -707,6 +712,24 @@ audio_io_handle_t Spatializer::detachOutput() { return output; } void Spatializer::updateActiveTracks(size_t numActiveTracks) { std::lock_guard lock(mLock); mNumActiveTracks = numActiveTracks; checkHeadSensor_l(); } void Spatializer::checkHeadSensor_l() { if (mSupportsHeadTracking && mPoseController != nullptr) { if(mNumActiveTracks > 0 && mLevel != SpatializationLevel::NONE && mDesiredHeadTrackingMode != HeadTrackingMode::STATIC && mHeadSensor != SpatializerPoseController::INVALID_SENSOR) { mPoseController->setHeadSensor(mHeadSensor); } else { mPoseController->setHeadSensor(SpatializerPoseController::INVALID_SENSOR); } } } void Spatializer::calculateHeadPose() { ALOGV("%s", __func__); std::lock_guard lock(mLock); Loading
services/audiopolicy/service/Spatializer.h +7 −1 Original line number Diff line number Diff line Loading @@ -135,7 +135,7 @@ class Spatializer : public media::BnSpatializer, /** Called by audio policy service when the special output mixer dedicated to spatialization * is opened and the spatializer engine must be created. */ status_t attachOutput(audio_io_handle_t output); status_t attachOutput(audio_io_handle_t output, size_t numActiveTracks); /** Called by audio policy service when the special output mixer dedicated to spatialization * is closed and the spatializer engine must be release. */ Loading @@ -143,6 +143,8 @@ class Spatializer : public media::BnSpatializer, /** Returns the output stream the spatializer is attached to. */ audio_io_handle_t getOutput() const { std::lock_guard lock(mLock); return mOutput; } void updateActiveTracks(size_t numActiveTracks); /** Gets the channel mask, sampling rate and format set for the spatializer input. */ audio_config_base_t getAudioInConfig() const; Loading Loading @@ -274,6 +276,8 @@ private: void postFramesProcessedMsg(int frames); void checkHeadSensor_l() REQUIRES(mLock); /** Effect engine descriptor */ const effect_descriptor_t mEngineDescriptor; /** Callback interface to parent audio policy service */ Loading Loading @@ -328,6 +332,8 @@ private: sp<ALooper> mLooper; sp<EngineCallbackHandler> mHandler; size_t mNumActiveTracks GUARDED_BY(mLock) = 0; static const std::vector<const char *> sHeadPoseKeys; }; Loading