您的位置:首页 > 移动开发 > Android开发

Android源码--listAudioPorts调用过程

2016-11-01 14:44 1501 查看
AudioService.java

private void configureHdmiPlugIntent(Intent intent, int state) {

    ArrayList<AudioPort> ports = new ArrayList<AudioPort>();

    int[] portGeneration = new int[1];

    int status = AudioSystem.listAudioPorts(ports, portGeneration);

}

AudioService.java

// declare native method

public static native int listAudioPorts(ArrayList<AudioPort> ports, int[] generation);

android_media_AudioSystem.cpp

// JNI call

static jint android_media_AudioSystem_listAudioPorts(JNIEnv *env, jobject clazz, jobject jPorts, jintArray jGeneration) {

    unsigned int numPorts;

    struct audio_port *nPorts = NULL;

    do {

        numPorts = 0;

        // get numPorts generation1

        AudioSystem::listAudioPorts(AUDIO_PORT_ROLE_NONE, AUDIO_PORT_TYPE_NONE, &numPorts, NULL, &generation1);

        nPorts = (struct audio_port *)realloc(nPorts, numPorts * sizeof(struct audio_port));

        // get numPorts nPorts generation

        AudioSystem::listAudioPorts(AUDIO_PORT_ROLE_NONE, AUDIO_PORT_TYPE_NONE, &numPorts, nPorts, &generation);

    } while(generation1 != generation);

    for (size_t i = 0; i < numPorts; i++) {

        jobject jAudioPort;

        // nPorts --> jAudioPort --> jPorts

        convertAudioPortFromNative(env, &jAudioPort, &nPorts[i]);

        env->CallBooleanMethod(jPorts, gArrayListMethods.add, jAudioPort);

    }

}

AudioSystem.cpp

status_t AudioSystem::listAudioPorts(audio_port_role_t role,

    audio_port_type_t type, unsigned int *num_ports,

    struct audio_port *ports, unsigned int *generation) {

    const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();

    return aps->listAudioPorts(role, type, num_ports, ports, generation);

}

IAudioPolicyService.h

/* List available audio ports and their attributes */

virtual status_t listAudioPorts(audio_port_role_t role,

    audio_port_type_t type, unsigned int *num_ports,

    struct audio_port *ports, unsigned int *generation) = 0;

IAudioPolicyService.cpp

virtual status_t listAudioPorts(audio_port_role_t role,

    audio_port_type_t type, unsigned int *num_ports,

    struct audio_port *ports, unsigned int *generation) {

    // Communicate with binder

    Parcel data, reply;

    data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());

    unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports;

    data.writeInt32(role);

    data.writeInt32(type);

    data.writeInt32(numPortsReq);

    remote()->transact(LIST_AUDIO_PORTS, data, &reply);

    status = (status_t)reply.readInt32();

    *num_ports = (unsigned int)reply.readInt32();

    if (numPortsReq > *num_ports) { numPortsReq = *num_ports; }

    reply.read(ports, numPortsReq * sizeof(struct audio_port));

    *generation = r
4000
eply.readInt32();

}

AudioPolicyService.h

virtual status_t listAudioPorts(audio_port_role_t role,

    audio_port_type_t type, unsigned int *num_ports,

    struct audio_port *ports, unsigned int *generation);

AudioPolicyInterface.h

virtual status_t listAudioPorts(audio_port_role_t role,

    audio_port_type_t type, unsigned int *num_ports,

    struct audio_port *ports, unsigned int *generation) = 0;

AudioPolicyInterfaceImpl.cpp

status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,

    audio_port_type_t type, unsigned int *num_ports,

    struct audio_port *ports, unsigned int *generation) {

    return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);

}

AudioPolicyManager.h

class AudioPolicyManager : public AudioPolicyInterface, public AudioPolicyManagerObserver

virtual status_t listAudioPorts(audio_port_role_t role,

    audio_port_type_t type, unsigned int *num_ports,

    struct audio_port *ports, unsigned int *generation);

// 最终实现在AudioPolicyManager.cpp中,查询设备的接口。

AudioPolicyManager.cpp

status_t AudioPolicyManager::listAudioPorts(audio_port_role_t role,

    audio_port_type_t type, unsigned int *num_ports,

    struct audio_port *ports, unsigned int *generation) {

    if (ports == NULL) { *num_ports = 0; }

    size_t portsWritten = 0;

    size_t portsMax = *num_ports;

    *num_ports = 0;

    for (size_t i = 0; i < mAvailableOutputDevices.size(); i++)

    (*num_ports)++;

    for (size_t i = 0; i < mAvailableInputDevices.size(); i++)

    (*num_ports)++;

    for (size_t i = 0; i < mInputs.size() && portsWritten < portsMax; i++)

        *num_ports += mInputs.size();

    for (size_t i = 0; i < mOutputs.size(); i++) {

    numOutputs++;

        *num_ports += numOutputs;

    }

    *generation = curAudioPortGeneration();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: