diff options
author | Eric Laurent <elaurent@google.com> | 2014-05-20 11:18:06 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2014-05-29 17:57:55 -0700 |
commit | 6a94d69dc4f32abb53c466a96f905bb199be6417 (patch) | |
tree | eef3552877f202429801a0b20f2ae31aad7801e7 /services/audiopolicy/AudioPolicyInterfaceImpl.cpp | |
parent | 32f93b7bedc44b425ba99d69dec998334e759532 (diff) | |
download | frameworks_av-6a94d69dc4f32abb53c466a96f905bb199be6417.zip frameworks_av-6a94d69dc4f32abb53c466a96f905bb199be6417.tar.gz frameworks_av-6a94d69dc4f32abb53c466a96f905bb199be6417.tar.bz2 |
audio policy: implement routing control
Add implementation of audio routing control via AudioSystem APIs.
The following APIs are implemented:
- listAudioPorts(): return a list of devices and output/input mixers ports
that can be used as sources or sinks for audio patches.
- createAudioPatch()/releaseAudioPatch(): create/release a connection patch between
two audio ports (e.g. to connect input from an HDMI device to a speaker output device).
Only one client application can own a patch from a given source.
When an audio port (device or mix) is part of an application created patch, its routing cannot
not be changed by a policy decision.
- listAudioPatches(): return a list of existing patches.
Each audio port addition/removal and each audio patch creation/release increments a generation count.
This generation count is used to ensure consistency betwen calls to
listAudioPorts() and listAudioPatches().
Bug: 14815883.
Change-Id: I022b638c2f5f0bb41543c7cfca7488fb45cfdd80
Diffstat (limited to 'services/audiopolicy/AudioPolicyInterfaceImpl.cpp')
-rw-r--r-- | services/audiopolicy/AudioPolicyInterfaceImpl.cpp | 67 |
1 files changed, 48 insertions, 19 deletions
diff --git a/services/audiopolicy/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/AudioPolicyInterfaceImpl.cpp index 7cd253b..2b33703 100644 --- a/services/audiopolicy/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/AudioPolicyInterfaceImpl.cpp @@ -463,43 +463,72 @@ bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info) return mAudioPolicyManager->isOffloadSupported(info); } -status_t AudioPolicyService::listAudioPorts(audio_port_role_t role __unused, - audio_port_type_t type __unused, +status_t AudioPolicyService::listAudioPorts(audio_port_role_t role, + audio_port_type_t type, unsigned int *num_ports, - struct audio_port *ports __unused, - unsigned int *generation __unused) + struct audio_port *ports, + unsigned int *generation) { - *num_ports = 0; - return INVALID_OPERATION; + Mutex::Autolock _l(mLock); + if (mAudioPolicyManager == NULL) { + return NO_INIT; + } + + return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation); } -status_t AudioPolicyService::getAudioPort(struct audio_port *port __unused) +status_t AudioPolicyService::getAudioPort(struct audio_port *port) { - return INVALID_OPERATION; + Mutex::Autolock _l(mLock); + if (mAudioPolicyManager == NULL) { + return NO_INIT; + } + + return mAudioPolicyManager->getAudioPort(port); } -status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch __unused, - audio_patch_handle_t *handle __unused) +status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch, + audio_patch_handle_t *handle) { - return INVALID_OPERATION; + Mutex::Autolock _l(mLock); + if (mAudioPolicyManager == NULL) { + return NO_INIT; + } + return mAudioPolicyManager->createAudioPatch(patch, handle, + IPCThreadState::self()->getCallingUid()); } -status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle __unused) +status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle) { - return INVALID_OPERATION; + Mutex::Autolock _l(mLock); + if (mAudioPolicyManager == NULL) { + return NO_INIT; + } + + return mAudioPolicyManager->releaseAudioPatch(handle, + IPCThreadState::self()->getCallingUid()); } status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches, - struct audio_patch *patches __unused, - unsigned int *generation __unused) + struct audio_patch *patches, + unsigned int *generation) { - *num_patches = 0; - return INVALID_OPERATION; + Mutex::Autolock _l(mLock); + if (mAudioPolicyManager == NULL) { + return NO_INIT; + } + + return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation); } -status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config __unused) +status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config) { - return INVALID_OPERATION; + Mutex::Autolock _l(mLock); + if (mAudioPolicyManager == NULL) { + return NO_INIT; + } + + return mAudioPolicyManager->setAudioPortConfig(config); } }; // namespace android |