Loading media/libaudioclient/AudioSystem.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -1017,6 +1017,16 @@ audio_devices_t AudioSystem::getDevicesForStream(audio_stream_type_t stream) return aps->getDevicesForStream(stream); } status_t AudioSystem::getDevicesForAttributes(const AudioAttributes &aa, AudioDeviceTypeAddrVector *devices) { if (devices == nullptr) { return BAD_VALUE; } const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return PERMISSION_DENIED; return aps->getDevicesForAttributes(aa, devices); } audio_io_handle_t AudioSystem::getOutputForEffect(const effect_descriptor_t *desc) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); Loading media/libaudioclient/IAudioPolicyService.cpp +69 −1 Original line number Diff line number Diff line Loading @@ -109,6 +109,7 @@ enum { SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, GET_DEVICES_FOR_ATTRIBUTES, }; #define MAX_ITEMS_PER_LIST 1024 Loading Loading @@ -1348,6 +1349,41 @@ public: } return static_cast<status_t>(reply.readInt32()); } virtual status_t getDevicesForAttributes(const AudioAttributes &aa, AudioDeviceTypeAddrVector *devices) const { if (devices == nullptr) { return BAD_VALUE; } Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); status_t status = aa.writeToParcel(&data); if (status != NO_ERROR) { return status; } status = remote()->transact(GET_DEVICES_FOR_ATTRIBUTES, data, &reply); if (status != NO_ERROR) { // transaction failed, return error return status; } status = static_cast<status_t>(reply.readInt32()); if (status != NO_ERROR) { // APM method call failed, return error return status; } const size_t numberOfDevices = (size_t)reply.readInt32(); for (size_t i = 0; i < numberOfDevices; i++) { AudioDeviceTypeAddr device; if (device.readFromParcel((Parcel*)&reply) == NO_ERROR) { devices->push_back(device); } else { return FAILED_TRANSACTION; } } return NO_ERROR; } }; IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); Loading Loading @@ -1414,7 +1450,8 @@ status_t BnAudioPolicyService::onTransact( case IS_CALL_SCREEN_MODE_SUPPORTED: case SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: case REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: { case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: case GET_DEVICES_FOR_ATTRIBUTES: { if (!isServiceUid(IPCThreadState::self()->getCallingUid())) { ALOGW("%s: transaction %d received from PID %d unauthorized UID %d", __func__, code, IPCThreadState::self()->getCallingPid(), Loading Loading @@ -2473,6 +2510,37 @@ status_t BnAudioPolicyService::onTransact( return NO_ERROR; } case GET_DEVICES_FOR_ATTRIBUTES: { CHECK_INTERFACE(IAudioPolicyService, data, reply); AudioAttributes attributes; status_t status = attributes.readFromParcel(&data); if (status != NO_ERROR) { return status; } AudioDeviceTypeAddrVector devices; status = getDevicesForAttributes(attributes.getAttributes(), &devices); // reply data formatted as: // - (int32) method call result from APM // - (int32) number of devices (n) if method call returned NO_ERROR // - n AudioDeviceTypeAddr if method call returned NO_ERROR reply->writeInt32(status); if (status != NO_ERROR) { return NO_ERROR; } status = reply->writeInt32(devices.size()); if (status != NO_ERROR) { return status; } for (const auto& device : devices) { status = device.writeToParcel(reply); if (status != NO_ERROR) { return status; } } return NO_ERROR; } default: return BBinder::onTransact(code, data, reply, flags); } Loading media/libaudioclient/include/media/AudioSystem.h +2 −0 Original line number Diff line number Diff line Loading @@ -279,6 +279,8 @@ public: static uint32_t getStrategyForStream(audio_stream_type_t stream); static audio_devices_t getDevicesForStream(audio_stream_type_t stream); static status_t getDevicesForAttributes(const AudioAttributes &aa, AudioDeviceTypeAddrVector *devices); static audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc); static status_t registerEffect(const effect_descriptor_t *desc, Loading media/libaudioclient/include/media/IAudioPolicyService.h +2 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,8 @@ public: virtual uint32_t getStrategyForStream(audio_stream_type_t stream) = 0; virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) = 0; virtual status_t getDevicesForAttributes(const AudioAttributes &aa, AudioDeviceTypeAddrVector *devices) const = 0; virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) = 0; virtual status_t registerEffect(const effect_descriptor_t *desc, audio_io_handle_t io, Loading services/audiopolicy/AudioPolicyInterface.h +4 −0 Original line number Diff line number Diff line Loading @@ -192,6 +192,10 @@ public: // return the enabled output devices for the given stream type virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) = 0; // retrieves the list of enabled output devices for the given audio attributes virtual status_t getDevicesForAttributes(const audio_attributes_t &attr, AudioDeviceTypeAddrVector *devices) = 0; // Audio effect management virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) = 0; virtual status_t registerEffect(const effect_descriptor_t *desc, Loading Loading
media/libaudioclient/AudioSystem.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -1017,6 +1017,16 @@ audio_devices_t AudioSystem::getDevicesForStream(audio_stream_type_t stream) return aps->getDevicesForStream(stream); } status_t AudioSystem::getDevicesForAttributes(const AudioAttributes &aa, AudioDeviceTypeAddrVector *devices) { if (devices == nullptr) { return BAD_VALUE; } const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return PERMISSION_DENIED; return aps->getDevicesForAttributes(aa, devices); } audio_io_handle_t AudioSystem::getOutputForEffect(const effect_descriptor_t *desc) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); Loading
media/libaudioclient/IAudioPolicyService.cpp +69 −1 Original line number Diff line number Diff line Loading @@ -109,6 +109,7 @@ enum { SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY, GET_DEVICES_FOR_ATTRIBUTES, }; #define MAX_ITEMS_PER_LIST 1024 Loading Loading @@ -1348,6 +1349,41 @@ public: } return static_cast<status_t>(reply.readInt32()); } virtual status_t getDevicesForAttributes(const AudioAttributes &aa, AudioDeviceTypeAddrVector *devices) const { if (devices == nullptr) { return BAD_VALUE; } Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); status_t status = aa.writeToParcel(&data); if (status != NO_ERROR) { return status; } status = remote()->transact(GET_DEVICES_FOR_ATTRIBUTES, data, &reply); if (status != NO_ERROR) { // transaction failed, return error return status; } status = static_cast<status_t>(reply.readInt32()); if (status != NO_ERROR) { // APM method call failed, return error return status; } const size_t numberOfDevices = (size_t)reply.readInt32(); for (size_t i = 0; i < numberOfDevices; i++) { AudioDeviceTypeAddr device; if (device.readFromParcel((Parcel*)&reply) == NO_ERROR) { devices->push_back(device); } else { return FAILED_TRANSACTION; } } return NO_ERROR; } }; IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); Loading Loading @@ -1414,7 +1450,8 @@ status_t BnAudioPolicyService::onTransact( case IS_CALL_SCREEN_MODE_SUPPORTED: case SET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: case REMOVE_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: { case GET_PREFERRED_DEVICE_FOR_PRODUCT_STRATEGY: case GET_DEVICES_FOR_ATTRIBUTES: { if (!isServiceUid(IPCThreadState::self()->getCallingUid())) { ALOGW("%s: transaction %d received from PID %d unauthorized UID %d", __func__, code, IPCThreadState::self()->getCallingPid(), Loading Loading @@ -2473,6 +2510,37 @@ status_t BnAudioPolicyService::onTransact( return NO_ERROR; } case GET_DEVICES_FOR_ATTRIBUTES: { CHECK_INTERFACE(IAudioPolicyService, data, reply); AudioAttributes attributes; status_t status = attributes.readFromParcel(&data); if (status != NO_ERROR) { return status; } AudioDeviceTypeAddrVector devices; status = getDevicesForAttributes(attributes.getAttributes(), &devices); // reply data formatted as: // - (int32) method call result from APM // - (int32) number of devices (n) if method call returned NO_ERROR // - n AudioDeviceTypeAddr if method call returned NO_ERROR reply->writeInt32(status); if (status != NO_ERROR) { return NO_ERROR; } status = reply->writeInt32(devices.size()); if (status != NO_ERROR) { return status; } for (const auto& device : devices) { status = device.writeToParcel(reply); if (status != NO_ERROR) { return status; } } return NO_ERROR; } default: return BBinder::onTransact(code, data, reply, flags); } Loading
media/libaudioclient/include/media/AudioSystem.h +2 −0 Original line number Diff line number Diff line Loading @@ -279,6 +279,8 @@ public: static uint32_t getStrategyForStream(audio_stream_type_t stream); static audio_devices_t getDevicesForStream(audio_stream_type_t stream); static status_t getDevicesForAttributes(const AudioAttributes &aa, AudioDeviceTypeAddrVector *devices); static audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc); static status_t registerEffect(const effect_descriptor_t *desc, Loading
media/libaudioclient/include/media/IAudioPolicyService.h +2 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,8 @@ public: virtual uint32_t getStrategyForStream(audio_stream_type_t stream) = 0; virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) = 0; virtual status_t getDevicesForAttributes(const AudioAttributes &aa, AudioDeviceTypeAddrVector *devices) const = 0; virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) = 0; virtual status_t registerEffect(const effect_descriptor_t *desc, audio_io_handle_t io, Loading
services/audiopolicy/AudioPolicyInterface.h +4 −0 Original line number Diff line number Diff line Loading @@ -192,6 +192,10 @@ public: // return the enabled output devices for the given stream type virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) = 0; // retrieves the list of enabled output devices for the given audio attributes virtual status_t getDevicesForAttributes(const audio_attributes_t &attr, AudioDeviceTypeAddrVector *devices) = 0; // Audio effect management virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) = 0; virtual status_t registerEffect(const effect_descriptor_t *desc, Loading