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

android5.0 audioflinger

2016-06-08 11:44 337 查看
音量调节调用setvoicevolume

status_t AudioFlinger::setVoiceVolume(float value)

{

    AutoMutex lock(mHardwareLock);

    audio_hw_device_t *dev = mPrimaryHardwareDev->hwDevice();

    mHardwareStatus = AUDIO_HW_SET_VOICE_VOLUME;

    ret = dev->set_voice_volume(dev, value);

    mHardwareStatus = AUDIO_HW_IDLE;

    return ret;

}

调用audio_hw.c    set_voice_volume   函数指针指向adev_set_voice_volume

adev->device.set_voice_volume = adev_set_voice_volume;

static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)

{

    int ret;

    struct audio_device *adev = (struct audio_device *)dev;

    pthread_mutex_lock(&adev->lock);

    /* cache volume */

    ret = voice_set_volume(adev, volume);

    pthread_mutex_unlock(&adev->lock);

    return ret;

}

Voice.c

int voice_set_volume(struct audio_device *adev, float volume)

{

    int vol, err = 0;

    adev->voice.volume = volume;

    if (adev->mode == AUDIO_MODE_IN_CALL) {

        err = platform_set_voice_volume(adev->platform, vol);

    }

    if (adev->mode == AUDIO_MODE_IN_COMMUNICATION)

        err = voice_extn_compress_voip_set_volume(adev, volume);

    return err;

}

Platform.c   //系统接口,无需关注如何与driver 交互,底层也只需要按接口实现即可

int platform_set_voice_volume(void *platform, int volume)

{

    struct platform_data *my_data = (struct platform_data *)platform;

    int ret = 0;

    if (my_data->csd_client) {

        if (my_data->csd_volume == NULL) {

            ALOGE("%s: dlsym error for csd_volume", __func__);

        } else {

            ret = my_data->csd_volume(volume);

            if (ret < 0) {

                ALOGE("%s: csd_volume error %d", __func__, ret);

            }

        }

    } else {

        ALOGE("%s: No CSD Client present", __func__);

    }

    return ret;

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