Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1888c866 authored by Eric Laurent's avatar Eric Laurent Committed by android-build-merger
Browse files

Merge "audio policy: add device to audio record media metrics" into pi-dev

am: 1ea2c0f9

Change-Id: Ic9cacf6f5b2b9f3aa51367914f71c8c03592a415
parents 34dfaeb3 1ea2c0f9
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -2816,10 +2816,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,
+31 −5
Original line number Diff line number Diff line
@@ -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);
    }

@@ -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) {
@@ -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) {
@@ -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) {
@@ -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.
@@ -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());
                    }
                }
            }
+4 −1
Original line number Diff line number Diff line
@@ -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
@@ -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