Loading media/audioserver/main_audioserver.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -169,6 +169,11 @@ int main(int argc __unused, char **argv) "%s: AudioSystem already has an AudioFlinger instance!", __func__); const auto aps = sp<AudioPolicyService>::make(); ALOGD("%s: AudioPolicy created", __func__); ALOGW_IF(AudioSystem::setLocalAudioPolicyService(aps) != OK, "%s: AudioSystem already has an AudioPolicyService instance!", __func__); // Start initialization of internally managed audio objects such as Device Effects. aps->onAudioSystemReady(); // Add AudioFlinger and AudioPolicy to ServiceManager. sp<IServiceManager> sm = defaultServiceManager(); Loading services/audiopolicy/service/AudioPolicyEffects.cpp +0 −5 Original line number Diff line number Diff line Loading @@ -61,11 +61,6 @@ AudioPolicyEffects::AudioPolicyEffects(const sp<EffectsFactoryHalInterface>& eff } } void AudioPolicyEffects::setDefaultDeviceEffects() { mDefaultDeviceEffectFuture = std::async( std::launch::async, &AudioPolicyEffects::initDefaultDeviceEffects, this); } status_t AudioPolicyEffects::addInputEffects(audio_io_handle_t input, audio_source_t inputSource, audio_session_t audioSession) Loading services/audiopolicy/service/AudioPolicyEffects.h +2 −21 Original line number Diff line number Diff line Loading @@ -116,10 +116,8 @@ public: // Remove the default stream effect from wherever it's attached. status_t removeStreamDefaultEffect(audio_unique_id_t id) EXCLUDES_AudioPolicyEffects_Mutex; // Called by AudioPolicyService::onFirstRef() to load device effects // on a separate worker thread. // TODO(b/319515492) move this initialization after AudioPolicyService::onFirstRef(). void setDefaultDeviceEffects(); // Initializes the Effects (AudioSystem must be ready as this creates audio client objects). void initDefaultDeviceEffects() EXCLUDES(mDeviceEffectsMutex) EXCLUDES_EffectHandle_Mutex; private: Loading Loading @@ -201,11 +199,6 @@ private: }; // Called on an async thread because it creates AudioEffects // which register with AudioFlinger and AudioPolicy. // We must therefore exclude the EffectHandle_Mutex. void initDefaultDeviceEffects() EXCLUDES(mDeviceEffectsMutex) EXCLUDES_EffectHandle_Mutex; status_t loadAudioEffectConfig_ll(const sp<EffectsFactoryHalInterface>& effectsFactoryHal) REQUIRES(mMutex, mDeviceEffectsMutex); Loading Loading @@ -281,18 +274,6 @@ private: std::mutex mDeviceEffectsMutex; std::map<std::string, std::unique_ptr<DeviceEffects>> mDeviceEffects GUARDED_BY(mDeviceEffectsMutex); /** * Device Effect initialization must be asynchronous: the audio_policy service parses and init * effect on first reference. AudioFlinger will handle effect creation and register these * effect on audio_policy service. * * The future is associated with the std::async launched thread - no need to lock as * it is only set once on init. Due to the async nature, it is conceivable that * some device effects are not available immediately after AudioPolicyService::onFirstRef() * while the effects are being created. */ std::future<void> mDefaultDeviceEffectFuture; }; } // namespace android services/audiopolicy/service/AudioPolicyService.cpp +10 −3 Original line number Diff line number Diff line Loading @@ -312,9 +312,16 @@ void AudioPolicyService::onFirstRef() } } AudioSystem::audioPolicyReady(); // AudioFlinger will handle effect creation and register these effects on audio_policy // service. Hence, audio_policy service must be ready. audioPolicyEffects->setDefaultDeviceEffects(); } void AudioPolicyService::onAudioSystemReady() { sp<AudioPolicyEffects> audioPolicyEffects; { audio_utils::lock_guard _l(mMutex); audioPolicyEffects = mAudioPolicyEffects; } audioPolicyEffects->initDefaultDeviceEffects(); } void AudioPolicyService::unloadAudioPolicyManager() Loading services/audiopolicy/service/AudioPolicyService.h +3 −0 Original line number Diff line number Diff line Loading @@ -320,6 +320,9 @@ public: // RefBase virtual void onFirstRef(); // Commence initialization when AudioSystem is ready. void onAudioSystemReady(); // // Helpers for the struct audio_policy_service_ops implementation. // This is used by the audio policy manager for certain operations that Loading Loading
media/audioserver/main_audioserver.cpp +5 −0 Original line number Diff line number Diff line Loading @@ -169,6 +169,11 @@ int main(int argc __unused, char **argv) "%s: AudioSystem already has an AudioFlinger instance!", __func__); const auto aps = sp<AudioPolicyService>::make(); ALOGD("%s: AudioPolicy created", __func__); ALOGW_IF(AudioSystem::setLocalAudioPolicyService(aps) != OK, "%s: AudioSystem already has an AudioPolicyService instance!", __func__); // Start initialization of internally managed audio objects such as Device Effects. aps->onAudioSystemReady(); // Add AudioFlinger and AudioPolicy to ServiceManager. sp<IServiceManager> sm = defaultServiceManager(); Loading
services/audiopolicy/service/AudioPolicyEffects.cpp +0 −5 Original line number Diff line number Diff line Loading @@ -61,11 +61,6 @@ AudioPolicyEffects::AudioPolicyEffects(const sp<EffectsFactoryHalInterface>& eff } } void AudioPolicyEffects::setDefaultDeviceEffects() { mDefaultDeviceEffectFuture = std::async( std::launch::async, &AudioPolicyEffects::initDefaultDeviceEffects, this); } status_t AudioPolicyEffects::addInputEffects(audio_io_handle_t input, audio_source_t inputSource, audio_session_t audioSession) Loading
services/audiopolicy/service/AudioPolicyEffects.h +2 −21 Original line number Diff line number Diff line Loading @@ -116,10 +116,8 @@ public: // Remove the default stream effect from wherever it's attached. status_t removeStreamDefaultEffect(audio_unique_id_t id) EXCLUDES_AudioPolicyEffects_Mutex; // Called by AudioPolicyService::onFirstRef() to load device effects // on a separate worker thread. // TODO(b/319515492) move this initialization after AudioPolicyService::onFirstRef(). void setDefaultDeviceEffects(); // Initializes the Effects (AudioSystem must be ready as this creates audio client objects). void initDefaultDeviceEffects() EXCLUDES(mDeviceEffectsMutex) EXCLUDES_EffectHandle_Mutex; private: Loading Loading @@ -201,11 +199,6 @@ private: }; // Called on an async thread because it creates AudioEffects // which register with AudioFlinger and AudioPolicy. // We must therefore exclude the EffectHandle_Mutex. void initDefaultDeviceEffects() EXCLUDES(mDeviceEffectsMutex) EXCLUDES_EffectHandle_Mutex; status_t loadAudioEffectConfig_ll(const sp<EffectsFactoryHalInterface>& effectsFactoryHal) REQUIRES(mMutex, mDeviceEffectsMutex); Loading Loading @@ -281,18 +274,6 @@ private: std::mutex mDeviceEffectsMutex; std::map<std::string, std::unique_ptr<DeviceEffects>> mDeviceEffects GUARDED_BY(mDeviceEffectsMutex); /** * Device Effect initialization must be asynchronous: the audio_policy service parses and init * effect on first reference. AudioFlinger will handle effect creation and register these * effect on audio_policy service. * * The future is associated with the std::async launched thread - no need to lock as * it is only set once on init. Due to the async nature, it is conceivable that * some device effects are not available immediately after AudioPolicyService::onFirstRef() * while the effects are being created. */ std::future<void> mDefaultDeviceEffectFuture; }; } // namespace android
services/audiopolicy/service/AudioPolicyService.cpp +10 −3 Original line number Diff line number Diff line Loading @@ -312,9 +312,16 @@ void AudioPolicyService::onFirstRef() } } AudioSystem::audioPolicyReady(); // AudioFlinger will handle effect creation and register these effects on audio_policy // service. Hence, audio_policy service must be ready. audioPolicyEffects->setDefaultDeviceEffects(); } void AudioPolicyService::onAudioSystemReady() { sp<AudioPolicyEffects> audioPolicyEffects; { audio_utils::lock_guard _l(mMutex); audioPolicyEffects = mAudioPolicyEffects; } audioPolicyEffects->initDefaultDeviceEffects(); } void AudioPolicyService::unloadAudioPolicyManager() Loading
services/audiopolicy/service/AudioPolicyService.h +3 −0 Original line number Diff line number Diff line Loading @@ -320,6 +320,9 @@ public: // RefBase virtual void onFirstRef(); // Commence initialization when AudioSystem is ready. void onAudioSystemReady(); // // Helpers for the struct audio_policy_service_ops implementation. // This is used by the audio policy manager for certain operations that Loading