Loading media/utils/ServiceUtilities.cpp +9 −2 Original line number Diff line number Diff line Loading @@ -167,9 +167,16 @@ bool settingsAllowed() { } bool modifyAudioRoutingAllowed() { return modifyAudioRoutingAllowed( IPCThreadState::self()->getCallingPid(), IPCThreadState::self()->getCallingUid()); } bool modifyAudioRoutingAllowed(pid_t pid, uid_t uid) { if (isAudioServerUid(IPCThreadState::self()->getCallingUid())) return true; // IMPORTANT: Use PermissionCache - not a runtime permission and may not change. bool ok = PermissionCache::checkCallingPermission(sModifyAudioRouting); if (!ok) ALOGE("android.permission.MODIFY_AUDIO_ROUTING"); bool ok = PermissionCache::checkPermission(sModifyAudioRouting, pid, uid); if (!ok) ALOGE("%s(): android.permission.MODIFY_AUDIO_ROUTING denied for uid %d", __func__, uid); return ok; } Loading media/utils/include/mediautils/ServiceUtilities.h +1 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ bool captureMediaOutputAllowed(pid_t pid, uid_t uid); bool captureHotwordAllowed(const String16& opPackageName, pid_t pid, uid_t uid); bool settingsAllowed(); bool modifyAudioRoutingAllowed(); bool modifyAudioRoutingAllowed(pid_t pid, uid_t uid); bool modifyDefaultAudioEffectsAllowed(); bool dumpAllowed(); bool modifyPhoneStateAllowed(pid_t pid, uid_t uid); Loading services/audiopolicy/AudioPolicyInterface.h +10 −1 Original line number Diff line number Diff line Loading @@ -69,6 +69,14 @@ public: API_INPUT_TELEPHONY_RX, // used for capture from telephony RX path } input_type_t; typedef enum { API_OUTPUT_INVALID = -1, API_OUTPUT_LEGACY = 0,// e.g. audio playing to speaker API_OUT_MIX_PLAYBACK, // used for "remote submix" playback of audio from remote source // to local capture API_OUTPUT_TELEPHONY_TX, // used for playback to telephony TX path } output_type_t; public: virtual ~AudioPolicyInterface() {} // Loading Loading @@ -115,7 +123,8 @@ public: audio_output_flags_t *flags, audio_port_handle_t *selectedDeviceId, audio_port_handle_t *portId, std::vector<audio_io_handle_t> *secondaryOutputs) = 0; std::vector<audio_io_handle_t> *secondaryOutputs, output_type_t *outputType) = 0; // indicates to the audio policy manager that the output starts being used by corresponding stream. virtual status_t startOutput(audio_port_handle_t portId) = 0; // indicates to the audio policy manager that the output stops being used by corresponding stream. Loading services/audiopolicy/managerdefault/AudioPolicyManager.cpp +20 −4 Original line number Diff line number Diff line Loading @@ -945,7 +945,8 @@ status_t AudioPolicyManager::getOutputForAttrInt( audio_output_flags_t *flags, audio_port_handle_t *selectedDeviceId, bool *isRequestedDeviceForExclusiveUse, std::vector<sp<SwAudioOutputDescriptor>> *secondaryDescs) std::vector<sp<SwAudioOutputDescriptor>> *secondaryDescs, output_type_t *outputType) { DeviceVector outputDevices; const audio_port_handle_t requestedPortId = *selectedDeviceId; Loading @@ -953,6 +954,7 @@ status_t AudioPolicyManager::getOutputForAttrInt( const sp<DeviceDescriptor> requestedDevice = mAvailableOutputDevices.getDeviceFromId(requestedPortId); *outputType = API_OUTPUT_INVALID; status_t status = getAudioAttributes(resultAttr, attr, *stream); if (status != NO_ERROR) { return status; Loading Loading @@ -991,7 +993,13 @@ status_t AudioPolicyManager::getOutputForAttrInt( mix->mDeviceAddress, AUDIO_FORMAT_DEFAULT); *selectedDeviceId = deviceDesc != 0 ? deviceDesc->getId() : AUDIO_PORT_HANDLE_NONE; ALOGV("getOutputForAttr() returns output %d", *output); if (resultAttr->usage == AUDIO_USAGE_VIRTUAL_SOURCE) { *outputType = API_OUT_MIX_PLAYBACK; } else { *outputType = API_OUTPUT_LEGACY; } return NO_ERROR; } // Virtual sources must always be dynamicaly or explicitly routed Loading Loading @@ -1048,6 +1056,12 @@ status_t AudioPolicyManager::getOutputForAttrInt( *selectedDeviceId = getFirstDeviceId(outputDevices); if (outputDevices.onlyContainsDevicesWithType(AUDIO_DEVICE_OUT_TELEPHONY_TX)) { *outputType = API_OUTPUT_TELEPHONY_TX; } else { *outputType = API_OUTPUT_LEGACY; } ALOGV("%s returns output %d selectedDeviceId %d", __func__, *output, *selectedDeviceId); return NO_ERROR; Loading @@ -1062,7 +1076,8 @@ status_t AudioPolicyManager::getOutputForAttr(const audio_attributes_t *attr, audio_output_flags_t *flags, audio_port_handle_t *selectedDeviceId, audio_port_handle_t *portId, std::vector<audio_io_handle_t> *secondaryOutputs) std::vector<audio_io_handle_t> *secondaryOutputs, output_type_t *outputType) { // The supplied portId must be AUDIO_PORT_HANDLE_NONE if (*portId != AUDIO_PORT_HANDLE_NONE) { Loading @@ -1082,7 +1097,7 @@ status_t AudioPolicyManager::getOutputForAttr(const audio_attributes_t *attr, status_t status = getOutputForAttrInt(&resultAttr, output, session, attr, stream, uid, config, flags, selectedDeviceId, &isRequestedDeviceForExclusiveUse, &secondaryOutputDescs); &secondaryOutputDescs, outputType); if (status != NO_ERROR) { return status; } Loading Loading @@ -3909,10 +3924,11 @@ status_t AudioPolicyManager::connectAudioSource(const sp<SourceClientDescriptor> audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; bool isRequestedDeviceForExclusiveUse = false; std::vector<sp<SwAudioOutputDescriptor>> secondaryOutputs; output_type_t outputType; getOutputForAttrInt(&resultAttr, &output, AUDIO_SESSION_NONE, &attributes, &stream, sourceDesc->uid(), &config, &flags, &selectedDeviceId, &isRequestedDeviceForExclusiveUse, &secondaryOutputs); &secondaryOutputs, &outputType); if (output == AUDIO_IO_HANDLE_NONE) { ALOGV("%s no output for device %s", __FUNCTION__, dumpDeviceTypes(sinkDevices.types()).c_str()); Loading services/audiopolicy/managerdefault/AudioPolicyManager.h +4 −2 Original line number Diff line number Diff line Loading @@ -121,7 +121,8 @@ public: audio_output_flags_t *flags, audio_port_handle_t *selectedDeviceId, audio_port_handle_t *portId, std::vector<audio_io_handle_t> *secondaryOutputs) override; std::vector<audio_io_handle_t> *secondaryOutputs, output_type_t *outputType) override; virtual status_t startOutput(audio_port_handle_t portId); virtual status_t stopOutput(audio_port_handle_t portId); virtual void releaseOutput(audio_port_handle_t portId); Loading Loading @@ -809,7 +810,8 @@ private: audio_output_flags_t *flags, audio_port_handle_t *selectedDeviceId, bool *isRequestedDeviceForExclusiveUse, std::vector<sp<SwAudioOutputDescriptor>> *secondaryDescs); std::vector<sp<SwAudioOutputDescriptor>> *secondaryDescs, output_type_t *outputType); // internal method to return the output handle for the given device and format audio_io_handle_t getOutputForDevices( const DeviceVector &devices, Loading Loading
media/utils/ServiceUtilities.cpp +9 −2 Original line number Diff line number Diff line Loading @@ -167,9 +167,16 @@ bool settingsAllowed() { } bool modifyAudioRoutingAllowed() { return modifyAudioRoutingAllowed( IPCThreadState::self()->getCallingPid(), IPCThreadState::self()->getCallingUid()); } bool modifyAudioRoutingAllowed(pid_t pid, uid_t uid) { if (isAudioServerUid(IPCThreadState::self()->getCallingUid())) return true; // IMPORTANT: Use PermissionCache - not a runtime permission and may not change. bool ok = PermissionCache::checkCallingPermission(sModifyAudioRouting); if (!ok) ALOGE("android.permission.MODIFY_AUDIO_ROUTING"); bool ok = PermissionCache::checkPermission(sModifyAudioRouting, pid, uid); if (!ok) ALOGE("%s(): android.permission.MODIFY_AUDIO_ROUTING denied for uid %d", __func__, uid); return ok; } Loading
media/utils/include/mediautils/ServiceUtilities.h +1 −0 Original line number Diff line number Diff line Loading @@ -85,6 +85,7 @@ bool captureMediaOutputAllowed(pid_t pid, uid_t uid); bool captureHotwordAllowed(const String16& opPackageName, pid_t pid, uid_t uid); bool settingsAllowed(); bool modifyAudioRoutingAllowed(); bool modifyAudioRoutingAllowed(pid_t pid, uid_t uid); bool modifyDefaultAudioEffectsAllowed(); bool dumpAllowed(); bool modifyPhoneStateAllowed(pid_t pid, uid_t uid); Loading
services/audiopolicy/AudioPolicyInterface.h +10 −1 Original line number Diff line number Diff line Loading @@ -69,6 +69,14 @@ public: API_INPUT_TELEPHONY_RX, // used for capture from telephony RX path } input_type_t; typedef enum { API_OUTPUT_INVALID = -1, API_OUTPUT_LEGACY = 0,// e.g. audio playing to speaker API_OUT_MIX_PLAYBACK, // used for "remote submix" playback of audio from remote source // to local capture API_OUTPUT_TELEPHONY_TX, // used for playback to telephony TX path } output_type_t; public: virtual ~AudioPolicyInterface() {} // Loading Loading @@ -115,7 +123,8 @@ public: audio_output_flags_t *flags, audio_port_handle_t *selectedDeviceId, audio_port_handle_t *portId, std::vector<audio_io_handle_t> *secondaryOutputs) = 0; std::vector<audio_io_handle_t> *secondaryOutputs, output_type_t *outputType) = 0; // indicates to the audio policy manager that the output starts being used by corresponding stream. virtual status_t startOutput(audio_port_handle_t portId) = 0; // indicates to the audio policy manager that the output stops being used by corresponding stream. Loading
services/audiopolicy/managerdefault/AudioPolicyManager.cpp +20 −4 Original line number Diff line number Diff line Loading @@ -945,7 +945,8 @@ status_t AudioPolicyManager::getOutputForAttrInt( audio_output_flags_t *flags, audio_port_handle_t *selectedDeviceId, bool *isRequestedDeviceForExclusiveUse, std::vector<sp<SwAudioOutputDescriptor>> *secondaryDescs) std::vector<sp<SwAudioOutputDescriptor>> *secondaryDescs, output_type_t *outputType) { DeviceVector outputDevices; const audio_port_handle_t requestedPortId = *selectedDeviceId; Loading @@ -953,6 +954,7 @@ status_t AudioPolicyManager::getOutputForAttrInt( const sp<DeviceDescriptor> requestedDevice = mAvailableOutputDevices.getDeviceFromId(requestedPortId); *outputType = API_OUTPUT_INVALID; status_t status = getAudioAttributes(resultAttr, attr, *stream); if (status != NO_ERROR) { return status; Loading Loading @@ -991,7 +993,13 @@ status_t AudioPolicyManager::getOutputForAttrInt( mix->mDeviceAddress, AUDIO_FORMAT_DEFAULT); *selectedDeviceId = deviceDesc != 0 ? deviceDesc->getId() : AUDIO_PORT_HANDLE_NONE; ALOGV("getOutputForAttr() returns output %d", *output); if (resultAttr->usage == AUDIO_USAGE_VIRTUAL_SOURCE) { *outputType = API_OUT_MIX_PLAYBACK; } else { *outputType = API_OUTPUT_LEGACY; } return NO_ERROR; } // Virtual sources must always be dynamicaly or explicitly routed Loading Loading @@ -1048,6 +1056,12 @@ status_t AudioPolicyManager::getOutputForAttrInt( *selectedDeviceId = getFirstDeviceId(outputDevices); if (outputDevices.onlyContainsDevicesWithType(AUDIO_DEVICE_OUT_TELEPHONY_TX)) { *outputType = API_OUTPUT_TELEPHONY_TX; } else { *outputType = API_OUTPUT_LEGACY; } ALOGV("%s returns output %d selectedDeviceId %d", __func__, *output, *selectedDeviceId); return NO_ERROR; Loading @@ -1062,7 +1076,8 @@ status_t AudioPolicyManager::getOutputForAttr(const audio_attributes_t *attr, audio_output_flags_t *flags, audio_port_handle_t *selectedDeviceId, audio_port_handle_t *portId, std::vector<audio_io_handle_t> *secondaryOutputs) std::vector<audio_io_handle_t> *secondaryOutputs, output_type_t *outputType) { // The supplied portId must be AUDIO_PORT_HANDLE_NONE if (*portId != AUDIO_PORT_HANDLE_NONE) { Loading @@ -1082,7 +1097,7 @@ status_t AudioPolicyManager::getOutputForAttr(const audio_attributes_t *attr, status_t status = getOutputForAttrInt(&resultAttr, output, session, attr, stream, uid, config, flags, selectedDeviceId, &isRequestedDeviceForExclusiveUse, &secondaryOutputDescs); &secondaryOutputDescs, outputType); if (status != NO_ERROR) { return status; } Loading Loading @@ -3909,10 +3924,11 @@ status_t AudioPolicyManager::connectAudioSource(const sp<SourceClientDescriptor> audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE; bool isRequestedDeviceForExclusiveUse = false; std::vector<sp<SwAudioOutputDescriptor>> secondaryOutputs; output_type_t outputType; getOutputForAttrInt(&resultAttr, &output, AUDIO_SESSION_NONE, &attributes, &stream, sourceDesc->uid(), &config, &flags, &selectedDeviceId, &isRequestedDeviceForExclusiveUse, &secondaryOutputs); &secondaryOutputs, &outputType); if (output == AUDIO_IO_HANDLE_NONE) { ALOGV("%s no output for device %s", __FUNCTION__, dumpDeviceTypes(sinkDevices.types()).c_str()); Loading
services/audiopolicy/managerdefault/AudioPolicyManager.h +4 −2 Original line number Diff line number Diff line Loading @@ -121,7 +121,8 @@ public: audio_output_flags_t *flags, audio_port_handle_t *selectedDeviceId, audio_port_handle_t *portId, std::vector<audio_io_handle_t> *secondaryOutputs) override; std::vector<audio_io_handle_t> *secondaryOutputs, output_type_t *outputType) override; virtual status_t startOutput(audio_port_handle_t portId); virtual status_t stopOutput(audio_port_handle_t portId); virtual void releaseOutput(audio_port_handle_t portId); Loading Loading @@ -809,7 +810,8 @@ private: audio_output_flags_t *flags, audio_port_handle_t *selectedDeviceId, bool *isRequestedDeviceForExclusiveUse, std::vector<sp<SwAudioOutputDescriptor>> *secondaryDescs); std::vector<sp<SwAudioOutputDescriptor>> *secondaryDescs, output_type_t *outputType); // internal method to return the output handle for the given device and format audio_io_handle_t getOutputForDevices( const DeviceVector &devices, Loading