Loading include/media/AudioSystem.h +24 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <hardware/audio_effect.h> #include <media/IAudioFlingerClient.h> #include <media/IAudioPolicyServiceClient.h> #include <system/audio.h> #include <system/audio_policy.h> #include <utils/Errors.h> Loading Loading @@ -301,6 +302,21 @@ public: // ---------------------------------------------------------------------------- class AudioPortCallback : public RefBase { public: AudioPortCallback() {} virtual ~AudioPortCallback() {} virtual void onAudioPortListUpdate() = 0; virtual void onAudioPatchListUpdate() = 0; virtual void onServiceDied() = 0; }; static void setAudioPortCallback(sp<AudioPortCallback> callBack); private: class AudioFlingerClient: public IBinder::DeathRecipient, public BnAudioFlingerClient Loading @@ -319,7 +335,8 @@ private: virtual void ioConfigChanged(int event, audio_io_handle_t ioHandle, const void *param2); }; class AudioPolicyServiceClient: public IBinder::DeathRecipient class AudioPolicyServiceClient: public IBinder::DeathRecipient, public BnAudioPolicyServiceClient { public: AudioPolicyServiceClient() { Loading @@ -327,6 +344,10 @@ private: // DeathRecipient virtual void binderDied(const wp<IBinder>& who); // IAudioPolicyServiceClient virtual void onAudioPortListUpdate(); virtual void onAudioPatchListUpdate(); }; static sp<AudioFlingerClient> gAudioFlingerClient; Loading @@ -349,6 +370,8 @@ private: // list of output descriptors containing cached parameters // (sampling rate, framecount, channel count...) static DefaultKeyedVector<audio_io_handle_t, OutputDescriptor *> gOutputs; static sp<AudioPortCallback> gAudioPortCallback; }; }; // namespace android Loading include/media/IAudioPolicyService.h +2 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <utils/Errors.h> #include <binder/IInterface.h> #include <media/AudioSystem.h> #include <media/IAudioPolicyServiceClient.h> #include <system/audio_policy.h> Loading Loading @@ -124,6 +125,7 @@ public: /* Set audio port configuration */ virtual status_t setAudioPortConfig(const struct audio_port_config *config) = 0; virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) = 0; }; Loading include/media/IAudioPolicyServiceClient.h 0 → 100644 +56 −0 Original line number Diff line number Diff line /* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_IAUDIOPOLICYSERVICECLIENT_H #define ANDROID_IAUDIOPOLICYSERVICECLIENT_H #include <utils/RefBase.h> #include <binder/IInterface.h> #include <system/audio.h> namespace android { // ---------------------------------------------------------------------------- class IAudioPolicyServiceClient : public IInterface { public: DECLARE_META_INTERFACE(AudioPolicyServiceClient); // Notifies a change of audio port configuration. virtual void onAudioPortListUpdate() = 0; // Notifies a change of audio patch configuration. virtual void onAudioPatchListUpdate() = 0; }; // ---------------------------------------------------------------------------- class BnAudioPolicyServiceClient : public BnInterface<IAudioPolicyServiceClient> { public: virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); }; // ---------------------------------------------------------------------------- }; // namespace android #endif // ANDROID_IAUDIOPOLICYSERVICECLIENT_H media/libmedia/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ LOCAL_SRC_FILES:= \ JetPlayer.cpp \ IOMX.cpp \ IAudioPolicyService.cpp \ IAudioPolicyServiceClient.cpp \ MediaScanner.cpp \ MediaScannerClient.cpp \ CharacterEncodingDetector.cpp \ Loading media/libmedia/AudioSystem.cpp +29 −1 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ audio_format_t AudioSystem::gPrevInFormat; audio_channel_mask_t AudioSystem::gPrevInChannelMask; size_t AudioSystem::gInBuffSize = 0; // zero indicates cache is invalid sp<AudioSystem::AudioPortCallback> AudioSystem::gAudioPortCallback; // establish binder interface to AudioFlinger service const sp<IAudioFlinger>& AudioSystem::get_audio_flinger() Loading Loading @@ -528,6 +529,7 @@ void AudioSystem::setErrorCallback(audio_error_callback cb) gAudioErrorCallback = cb; } bool AudioSystem::routedToA2dpOutput(audio_stream_type_t streamType) { switch (streamType) { Loading Loading @@ -566,6 +568,7 @@ const sp<IAudioPolicyService>& AudioSystem::get_audio_policy_service() } binder->linkToDeath(gAudioPolicyServiceClient); gAudioPolicyService = interface_cast<IAudioPolicyService>(binder); gAudioPolicyService->registerClient(gAudioPolicyServiceClient); gLock.unlock(); } else { gLock.unlock(); Loading Loading @@ -880,14 +883,39 @@ status_t AudioSystem::setAudioPortConfig(const struct audio_port_config *config) return aps->setAudioPortConfig(config); } void AudioSystem::setAudioPortCallback(sp<AudioPortCallback> callBack) { Mutex::Autolock _l(gLock); gAudioPortCallback = callBack; } // --------------------------------------------------------------------------- void AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who __unused) { Mutex::Autolock _l(AudioSystem::gLock); Mutex::Autolock _l(gLock); if (gAudioPortCallback != 0) { gAudioPortCallback->onServiceDied(); } AudioSystem::gAudioPolicyService.clear(); ALOGW("AudioPolicyService server died!"); } void AudioSystem::AudioPolicyServiceClient::onAudioPortListUpdate() { Mutex::Autolock _l(gLock); if (gAudioPortCallback != 0) { gAudioPortCallback->onAudioPortListUpdate(); } } void AudioSystem::AudioPolicyServiceClient::onAudioPatchListUpdate() { Mutex::Autolock _l(gLock); if (gAudioPortCallback != 0) { gAudioPortCallback->onAudioPatchListUpdate(); } } }; // namespace android Loading
include/media/AudioSystem.h +24 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <hardware/audio_effect.h> #include <media/IAudioFlingerClient.h> #include <media/IAudioPolicyServiceClient.h> #include <system/audio.h> #include <system/audio_policy.h> #include <utils/Errors.h> Loading Loading @@ -301,6 +302,21 @@ public: // ---------------------------------------------------------------------------- class AudioPortCallback : public RefBase { public: AudioPortCallback() {} virtual ~AudioPortCallback() {} virtual void onAudioPortListUpdate() = 0; virtual void onAudioPatchListUpdate() = 0; virtual void onServiceDied() = 0; }; static void setAudioPortCallback(sp<AudioPortCallback> callBack); private: class AudioFlingerClient: public IBinder::DeathRecipient, public BnAudioFlingerClient Loading @@ -319,7 +335,8 @@ private: virtual void ioConfigChanged(int event, audio_io_handle_t ioHandle, const void *param2); }; class AudioPolicyServiceClient: public IBinder::DeathRecipient class AudioPolicyServiceClient: public IBinder::DeathRecipient, public BnAudioPolicyServiceClient { public: AudioPolicyServiceClient() { Loading @@ -327,6 +344,10 @@ private: // DeathRecipient virtual void binderDied(const wp<IBinder>& who); // IAudioPolicyServiceClient virtual void onAudioPortListUpdate(); virtual void onAudioPatchListUpdate(); }; static sp<AudioFlingerClient> gAudioFlingerClient; Loading @@ -349,6 +370,8 @@ private: // list of output descriptors containing cached parameters // (sampling rate, framecount, channel count...) static DefaultKeyedVector<audio_io_handle_t, OutputDescriptor *> gOutputs; static sp<AudioPortCallback> gAudioPortCallback; }; }; // namespace android Loading
include/media/IAudioPolicyService.h +2 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <utils/Errors.h> #include <binder/IInterface.h> #include <media/AudioSystem.h> #include <media/IAudioPolicyServiceClient.h> #include <system/audio_policy.h> Loading Loading @@ -124,6 +125,7 @@ public: /* Set audio port configuration */ virtual status_t setAudioPortConfig(const struct audio_port_config *config) = 0; virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) = 0; }; Loading
include/media/IAudioPolicyServiceClient.h 0 → 100644 +56 −0 Original line number Diff line number Diff line /* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_IAUDIOPOLICYSERVICECLIENT_H #define ANDROID_IAUDIOPOLICYSERVICECLIENT_H #include <utils/RefBase.h> #include <binder/IInterface.h> #include <system/audio.h> namespace android { // ---------------------------------------------------------------------------- class IAudioPolicyServiceClient : public IInterface { public: DECLARE_META_INTERFACE(AudioPolicyServiceClient); // Notifies a change of audio port configuration. virtual void onAudioPortListUpdate() = 0; // Notifies a change of audio patch configuration. virtual void onAudioPatchListUpdate() = 0; }; // ---------------------------------------------------------------------------- class BnAudioPolicyServiceClient : public BnInterface<IAudioPolicyServiceClient> { public: virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0); }; // ---------------------------------------------------------------------------- }; // namespace android #endif // ANDROID_IAUDIOPOLICYSERVICECLIENT_H
media/libmedia/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ LOCAL_SRC_FILES:= \ JetPlayer.cpp \ IOMX.cpp \ IAudioPolicyService.cpp \ IAudioPolicyServiceClient.cpp \ MediaScanner.cpp \ MediaScannerClient.cpp \ CharacterEncodingDetector.cpp \ Loading
media/libmedia/AudioSystem.cpp +29 −1 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ audio_format_t AudioSystem::gPrevInFormat; audio_channel_mask_t AudioSystem::gPrevInChannelMask; size_t AudioSystem::gInBuffSize = 0; // zero indicates cache is invalid sp<AudioSystem::AudioPortCallback> AudioSystem::gAudioPortCallback; // establish binder interface to AudioFlinger service const sp<IAudioFlinger>& AudioSystem::get_audio_flinger() Loading Loading @@ -528,6 +529,7 @@ void AudioSystem::setErrorCallback(audio_error_callback cb) gAudioErrorCallback = cb; } bool AudioSystem::routedToA2dpOutput(audio_stream_type_t streamType) { switch (streamType) { Loading Loading @@ -566,6 +568,7 @@ const sp<IAudioPolicyService>& AudioSystem::get_audio_policy_service() } binder->linkToDeath(gAudioPolicyServiceClient); gAudioPolicyService = interface_cast<IAudioPolicyService>(binder); gAudioPolicyService->registerClient(gAudioPolicyServiceClient); gLock.unlock(); } else { gLock.unlock(); Loading Loading @@ -880,14 +883,39 @@ status_t AudioSystem::setAudioPortConfig(const struct audio_port_config *config) return aps->setAudioPortConfig(config); } void AudioSystem::setAudioPortCallback(sp<AudioPortCallback> callBack) { Mutex::Autolock _l(gLock); gAudioPortCallback = callBack; } // --------------------------------------------------------------------------- void AudioSystem::AudioPolicyServiceClient::binderDied(const wp<IBinder>& who __unused) { Mutex::Autolock _l(AudioSystem::gLock); Mutex::Autolock _l(gLock); if (gAudioPortCallback != 0) { gAudioPortCallback->onServiceDied(); } AudioSystem::gAudioPolicyService.clear(); ALOGW("AudioPolicyService server died!"); } void AudioSystem::AudioPolicyServiceClient::onAudioPortListUpdate() { Mutex::Autolock _l(gLock); if (gAudioPortCallback != 0) { gAudioPortCallback->onAudioPortListUpdate(); } } void AudioSystem::AudioPolicyServiceClient::onAudioPatchListUpdate() { Mutex::Autolock _l(gLock); if (gAudioPortCallback != 0) { gAudioPortCallback->onAudioPatchListUpdate(); } } }; // namespace android