Loading services/audiopolicy/managerdefault/AudioPolicyManager.cpp +25 −2 Original line number Diff line number Diff line Loading @@ -2811,10 +2811,33 @@ status_t AudioPolicyManager::listAudioPorts(audio_port_role_t role, return NO_ERROR; } status_t AudioPolicyManager::getAudioPort(struct audio_port *port __unused) status_t AudioPolicyManager::getAudioPort(struct audio_port *port) { if (port == nullptr || port->id == AUDIO_PORT_HANDLE_NONE) { return BAD_VALUE; } sp<DeviceDescriptor> dev = mAvailableOutputDevices.getDeviceFromId(port->id); if (dev != 0) { dev->toAudioPort(port); return NO_ERROR; } dev = mAvailableInputDevices.getDeviceFromId(port->id); if (dev != 0) { dev->toAudioPort(port); return NO_ERROR; } sp<SwAudioOutputDescriptor> out = mOutputs.getOutputFromId(port->id); if (out != 0) { out->toAudioPort(port); return NO_ERROR; } sp<AudioInputDescriptor> in = mInputs.getInputFromId(port->id); if (in != 0) { in->toAudioPort(port); return NO_ERROR; } return BAD_VALUE; } status_t AudioPolicyManager::createAudioPatch(const struct audio_patch *patch, audio_patch_handle_t *handle, Loading services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +31 −5 Original line number Diff line number Diff line Loading @@ -408,6 +408,7 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, client->active = false; client->isConcurrent = false; client->isVirtualDevice = false; //TODO : update from APM->getInputForAttr() client->deviceId = *selectedDeviceId; mAudioRecordClients.add(*portId, client); } Loading @@ -434,7 +435,8 @@ static std::string audioSourceString(audio_source_t value) { return rawbuffer; } static std::string audioConcurrencyString(AudioPolicyInterface::concurrency_type__mask_t concurrency) static std::string audioConcurrencyString( AudioPolicyInterface::concurrency_type__mask_t concurrency) { char buffer[64]; // oversized if (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_ALL) { Loading @@ -450,6 +452,17 @@ static std::string audioConcurrencyString(AudioPolicyInterface::concurrency_type return &buffer[1]; } std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) { std::string typeStr; struct audio_port port = {}; port.id = portId; status_t status = mAudioPolicyManager->getAudioPort(&port); if (status == NO_ERROR && port.type == AUDIO_PORT_TYPE_DEVICE) { deviceToString(port.ext.device.type, typeStr); } return typeStr; } status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenced) { if (mAudioPolicyManager == NULL) { Loading Loading @@ -498,9 +511,14 @@ status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenc static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src"; static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg"; static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session"; static constexpr char kAudioPolicyRqstDevice[] = "android.media.audiopolicy.rqst.device"; static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src"; static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg"; static constexpr char kAudioPolicyActiveSession[] = "android.media.audiopolicy.active.session"; static constexpr char kAudioPolicyActiveSession[] = "android.media.audiopolicy.active.session"; static constexpr char kAudioPolicyActiveDevice[] = "android.media.audiopolicy.active.device"; MediaAnalyticsItem *item = new MediaAnalyticsItem(kAudioPolicy); if (item != NULL) { Loading @@ -508,10 +526,15 @@ status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenc item->setCString(kAudioPolicyReason, audioConcurrencyString(concurrency).c_str()); item->setInt32(kAudioPolicyStatus, status); item->setCString(kAudioPolicyRqstSrc, audioSourceString(client->attributes.source).c_str()); item->setCString(kAudioPolicyRqstPkg, std::string(String8(client->opPackageName).string()).c_str()); item->setCString(kAudioPolicyRqstSrc, audioSourceString(client->attributes.source).c_str()); item->setCString(kAudioPolicyRqstPkg, std::string(String8(client->opPackageName).string()).c_str()); item->setInt32(kAudioPolicyRqstSession, client->session); item->setCString( kAudioPolicyRqstDevice, getDeviceTypeStrForPortId(client->deviceId).c_str()); // figure out who is active // NB: might the other party have given up the microphone since then? how sure. // perhaps could have given up on it. Loading @@ -527,8 +550,11 @@ status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenc // keeps the last of the clients marked active item->setCString(kAudioPolicyActiveSrc, audioSourceString(other->attributes.source).c_str()); item->setCString(kAudioPolicyActivePkg, std::string(String8(other->opPackageName).string()).c_str()); item->setCString(kAudioPolicyActivePkg, std::string(String8(other->opPackageName).string()).c_str()); item->setInt32(kAudioPolicyActiveSession, other->session); item->setCString(kAudioPolicyActiveDevice, getDeviceTypeStrForPortId(other->deviceId).c_str()); } } } Loading services/audiopolicy/service/AudioPolicyService.h +4 −1 Original line number Diff line number Diff line Loading @@ -263,6 +263,8 @@ private: // Prints the shell command help status_t printHelp(int out); std::string getDeviceTypeStrForPortId(audio_port_handle_t portId); // If recording we need to make sure the UID is allowed to do that. If the UID is idle // then it cannot record and gets buffers with zeros - silence. As soon as the UID // transitions to an active state we will start reporting buffers with data. This approach Loading Loading @@ -643,7 +645,8 @@ private: const audio_session_t session; // audio session ID bool active; // Capture is active or inactive bool isConcurrent; // is allowed to concurrent capture bool isVirtualDevice; // uses vitual device: updated by APM::getInputForAttr() bool isVirtualDevice; // uses virtual device: updated by APM::getInputForAttr() audio_port_handle_t deviceId; // selected input device port ID }; // A class automatically clearing and restoring binder caller identity inside Loading Loading
services/audiopolicy/managerdefault/AudioPolicyManager.cpp +25 −2 Original line number Diff line number Diff line Loading @@ -2811,10 +2811,33 @@ status_t AudioPolicyManager::listAudioPorts(audio_port_role_t role, return NO_ERROR; } status_t AudioPolicyManager::getAudioPort(struct audio_port *port __unused) status_t AudioPolicyManager::getAudioPort(struct audio_port *port) { if (port == nullptr || port->id == AUDIO_PORT_HANDLE_NONE) { return BAD_VALUE; } sp<DeviceDescriptor> dev = mAvailableOutputDevices.getDeviceFromId(port->id); if (dev != 0) { dev->toAudioPort(port); return NO_ERROR; } dev = mAvailableInputDevices.getDeviceFromId(port->id); if (dev != 0) { dev->toAudioPort(port); return NO_ERROR; } sp<SwAudioOutputDescriptor> out = mOutputs.getOutputFromId(port->id); if (out != 0) { out->toAudioPort(port); return NO_ERROR; } sp<AudioInputDescriptor> in = mInputs.getInputFromId(port->id); if (in != 0) { in->toAudioPort(port); return NO_ERROR; } return BAD_VALUE; } status_t AudioPolicyManager::createAudioPatch(const struct audio_patch *patch, audio_patch_handle_t *handle, Loading
services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +31 −5 Original line number Diff line number Diff line Loading @@ -408,6 +408,7 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, client->active = false; client->isConcurrent = false; client->isVirtualDevice = false; //TODO : update from APM->getInputForAttr() client->deviceId = *selectedDeviceId; mAudioRecordClients.add(*portId, client); } Loading @@ -434,7 +435,8 @@ static std::string audioSourceString(audio_source_t value) { return rawbuffer; } static std::string audioConcurrencyString(AudioPolicyInterface::concurrency_type__mask_t concurrency) static std::string audioConcurrencyString( AudioPolicyInterface::concurrency_type__mask_t concurrency) { char buffer[64]; // oversized if (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_ALL) { Loading @@ -450,6 +452,17 @@ static std::string audioConcurrencyString(AudioPolicyInterface::concurrency_type return &buffer[1]; } std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) { std::string typeStr; struct audio_port port = {}; port.id = portId; status_t status = mAudioPolicyManager->getAudioPort(&port); if (status == NO_ERROR && port.type == AUDIO_PORT_TYPE_DEVICE) { deviceToString(port.ext.device.type, typeStr); } return typeStr; } status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenced) { if (mAudioPolicyManager == NULL) { Loading Loading @@ -498,9 +511,14 @@ status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenc static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src"; static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg"; static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session"; static constexpr char kAudioPolicyRqstDevice[] = "android.media.audiopolicy.rqst.device"; static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src"; static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg"; static constexpr char kAudioPolicyActiveSession[] = "android.media.audiopolicy.active.session"; static constexpr char kAudioPolicyActiveSession[] = "android.media.audiopolicy.active.session"; static constexpr char kAudioPolicyActiveDevice[] = "android.media.audiopolicy.active.device"; MediaAnalyticsItem *item = new MediaAnalyticsItem(kAudioPolicy); if (item != NULL) { Loading @@ -508,10 +526,15 @@ status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenc item->setCString(kAudioPolicyReason, audioConcurrencyString(concurrency).c_str()); item->setInt32(kAudioPolicyStatus, status); item->setCString(kAudioPolicyRqstSrc, audioSourceString(client->attributes.source).c_str()); item->setCString(kAudioPolicyRqstPkg, std::string(String8(client->opPackageName).string()).c_str()); item->setCString(kAudioPolicyRqstSrc, audioSourceString(client->attributes.source).c_str()); item->setCString(kAudioPolicyRqstPkg, std::string(String8(client->opPackageName).string()).c_str()); item->setInt32(kAudioPolicyRqstSession, client->session); item->setCString( kAudioPolicyRqstDevice, getDeviceTypeStrForPortId(client->deviceId).c_str()); // figure out who is active // NB: might the other party have given up the microphone since then? how sure. // perhaps could have given up on it. Loading @@ -527,8 +550,11 @@ status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenc // keeps the last of the clients marked active item->setCString(kAudioPolicyActiveSrc, audioSourceString(other->attributes.source).c_str()); item->setCString(kAudioPolicyActivePkg, std::string(String8(other->opPackageName).string()).c_str()); item->setCString(kAudioPolicyActivePkg, std::string(String8(other->opPackageName).string()).c_str()); item->setInt32(kAudioPolicyActiveSession, other->session); item->setCString(kAudioPolicyActiveDevice, getDeviceTypeStrForPortId(other->deviceId).c_str()); } } } Loading
services/audiopolicy/service/AudioPolicyService.h +4 −1 Original line number Diff line number Diff line Loading @@ -263,6 +263,8 @@ private: // Prints the shell command help status_t printHelp(int out); std::string getDeviceTypeStrForPortId(audio_port_handle_t portId); // If recording we need to make sure the UID is allowed to do that. If the UID is idle // then it cannot record and gets buffers with zeros - silence. As soon as the UID // transitions to an active state we will start reporting buffers with data. This approach Loading Loading @@ -643,7 +645,8 @@ private: const audio_session_t session; // audio session ID bool active; // Capture is active or inactive bool isConcurrent; // is allowed to concurrent capture bool isVirtualDevice; // uses vitual device: updated by APM::getInputForAttr() bool isVirtualDevice; // uses virtual device: updated by APM::getInputForAttr() audio_port_handle_t deviceId; // selected input device port ID }; // A class automatically clearing and restoring binder caller identity inside Loading