Merge "Support multiple error callbacks"

gugelfrei
TreeHugger Robot 5 years ago committed by Android (Google) Code Review
commit b215d7f2ab

@ -36,10 +36,11 @@ namespace android {
// client singleton for AudioFlinger binder interface // client singleton for AudioFlinger binder interface
Mutex AudioSystem::gLock; Mutex AudioSystem::gLock;
Mutex AudioSystem::gLockErrorCallbacks;
Mutex AudioSystem::gLockAPS; Mutex AudioSystem::gLockAPS;
sp<IAudioFlinger> AudioSystem::gAudioFlinger; sp<IAudioFlinger> AudioSystem::gAudioFlinger;
sp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient; sp<AudioSystem::AudioFlingerClient> AudioSystem::gAudioFlingerClient;
audio_error_callback AudioSystem::gAudioErrorCallback = NULL; std::set<audio_error_callback> AudioSystem::gAudioErrorCallbacks;
dynamic_policy_callback AudioSystem::gDynPolicyCallback = NULL; dynamic_policy_callback AudioSystem::gDynPolicyCallback = NULL;
record_config_callback AudioSystem::gRecordConfigCallback = NULL; record_config_callback AudioSystem::gRecordConfigCallback = NULL;
@ -63,9 +64,7 @@ const sp<IAudioFlinger> AudioSystem::get_audio_flinger()
if (gAudioFlingerClient == NULL) { if (gAudioFlingerClient == NULL) {
gAudioFlingerClient = new AudioFlingerClient(); gAudioFlingerClient = new AudioFlingerClient();
} else { } else {
if (gAudioErrorCallback) { reportError(NO_ERROR);
gAudioErrorCallback(NO_ERROR);
}
} }
binder->linkToDeath(gAudioFlingerClient); binder->linkToDeath(gAudioFlingerClient);
gAudioFlinger = interface_cast<IAudioFlinger>(binder); gAudioFlinger = interface_cast<IAudioFlinger>(binder);
@ -500,19 +499,16 @@ void AudioSystem::AudioFlingerClient::clearIoCache()
void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who __unused) void AudioSystem::AudioFlingerClient::binderDied(const wp<IBinder>& who __unused)
{ {
audio_error_callback cb = NULL;
{ {
Mutex::Autolock _l(AudioSystem::gLock); Mutex::Autolock _l(AudioSystem::gLock);
AudioSystem::gAudioFlinger.clear(); AudioSystem::gAudioFlinger.clear();
cb = gAudioErrorCallback;
} }
// clear output handles and stream to output map caches // clear output handles and stream to output map caches
clearIoCache(); clearIoCache();
if (cb) { reportError(DEAD_OBJECT);
cb(DEAD_OBJECT);
}
ALOGW("AudioFlinger server died!"); ALOGW("AudioFlinger server died!");
} }
@ -717,10 +713,23 @@ status_t AudioSystem::AudioFlingerClient::removeAudioDeviceCallback(
return NO_ERROR; return NO_ERROR;
} }
/* static */ void AudioSystem::setErrorCallback(audio_error_callback cb) /* static */ uintptr_t AudioSystem::addErrorCallback(audio_error_callback cb)
{ {
Mutex::Autolock _l(gLock); Mutex::Autolock _l(gLockErrorCallbacks);
gAudioErrorCallback = cb; gAudioErrorCallbacks.insert(cb);
return reinterpret_cast<uintptr_t>(cb);
}
/* static */ void AudioSystem::removeErrorCallback(uintptr_t cb) {
Mutex::Autolock _l(gLockErrorCallbacks);
gAudioErrorCallbacks.erase(reinterpret_cast<audio_error_callback>(cb));
}
/* static */ void AudioSystem::reportError(status_t err) {
Mutex::Autolock _l(gLockErrorCallbacks);
for (auto callback : gAudioErrorCallbacks) {
callback(err);
}
} }
/*static*/ void AudioSystem::setDynPolicyCallback(dynamic_policy_callback cb) /*static*/ void AudioSystem::setDynPolicyCallback(dynamic_policy_callback cb)

@ -27,6 +27,7 @@
#include <media/IAudioFlingerClient.h> #include <media/IAudioFlingerClient.h>
#include <media/IAudioPolicyServiceClient.h> #include <media/IAudioPolicyServiceClient.h>
#include <media/MicrophoneInfo.h> #include <media/MicrophoneInfo.h>
#include <set>
#include <system/audio.h> #include <system/audio.h>
#include <system/audio_effect.h> #include <system/audio_effect.h>
#include <system/audio_policy.h> #include <system/audio_policy.h>
@ -107,7 +108,16 @@ public:
static status_t setParameters(const String8& keyValuePairs); static status_t setParameters(const String8& keyValuePairs);
static String8 getParameters(const String8& keys); static String8 getParameters(const String8& keys);
static void setErrorCallback(audio_error_callback cb); // Registers an error callback. When this callback is invoked, it means all
// state implied by this interface has been reset.
// Returns a token that can be used for un-registering.
// Might block while callbacks are being invoked.
static uintptr_t addErrorCallback(audio_error_callback cb);
// Un-registers a callback previously added with addErrorCallback.
// Might block while callbacks are being invoked.
static void removeErrorCallback(uintptr_t cb);
static void setDynPolicyCallback(dynamic_policy_callback cb); static void setDynPolicyCallback(dynamic_policy_callback cb);
static void setRecordConfigCallback(record_config_callback); static void setRecordConfigCallback(record_config_callback);
@ -562,15 +572,19 @@ private:
static const sp<AudioFlingerClient> getAudioFlingerClient(); static const sp<AudioFlingerClient> getAudioFlingerClient();
static sp<AudioIoDescriptor> getIoDescriptor(audio_io_handle_t ioHandle); static sp<AudioIoDescriptor> getIoDescriptor(audio_io_handle_t ioHandle);
// Invokes all registered error callbacks with the given error code.
static void reportError(status_t err);
static sp<AudioFlingerClient> gAudioFlingerClient; static sp<AudioFlingerClient> gAudioFlingerClient;
static sp<AudioPolicyServiceClient> gAudioPolicyServiceClient; static sp<AudioPolicyServiceClient> gAudioPolicyServiceClient;
friend class AudioFlingerClient; friend class AudioFlingerClient;
friend class AudioPolicyServiceClient; friend class AudioPolicyServiceClient;
static Mutex gLock; // protects gAudioFlinger and gAudioErrorCallback, static Mutex gLock; // protects gAudioFlinger
static Mutex gLockErrorCallbacks; // protects gAudioErrorCallbacks
static Mutex gLockAPS; // protects gAudioPolicyService and gAudioPolicyServiceClient static Mutex gLockAPS; // protects gAudioPolicyService and gAudioPolicyServiceClient
static sp<IAudioFlinger> gAudioFlinger; static sp<IAudioFlinger> gAudioFlinger;
static audio_error_callback gAudioErrorCallback; static std::set<audio_error_callback> gAudioErrorCallbacks;
static dynamic_policy_callback gDynPolicyCallback; static dynamic_policy_callback gDynPolicyCallback;
static record_config_callback gRecordConfigCallback; static record_config_callback gRecordConfigCallback;

Loading…
Cancel
Save