mtk loopback功能测试

将mic2 loopback到 spk

将视频线与音频线接到车机对应的线,CD机播放音乐,发现没有声音,先查硬件,
在这里插入图片描述
在这里插入图片描述
量到在播放的时候 ,有波形

note:示波器要调成交流模式才可以看模块型号

查了mtk online ,查看了大多数接口,后面又自己写了apk,发现没有权限,没效果,怀疑是自已写的apk需要系统权限
于是将他放到系统apk去,调了几下参数,发现有效果了
接口是:

打开

吹气的

sAudioManager.setParameters("SET_LOOPBACK_TYPE=3,3");

能听到声音的

 sAudioManager.setParameters("SET_LOOPBACK_TYPE=25,3");

其实这两个没有多大区别

关闭

 sAudioManager.setParameters("SET_LOOPBACK_TYPE=0");

实现地方:

status_t AudioMTKHardware::setCommonParameters(const String8 &keyValuePairs) {

 // Loopback
        if (param.get(keySET_LOOPBACK_TYPE, value_str) == NO_ERROR) {
            param.remove(keySET_LOOPBACK_TYPE);

            // parse format like "SET_LOOPBACK_TYPE=1" / "SET_LOOPBACK_TYPE=1+0"
            int type_value = NO_LOOPBACK;
            int device_value = -1;
            sscanf(value_str.string(), "%d,%d", &type_value, &device_value);
            ALOGV("type_value = %d, device_value = %d", type_value, device_value);

            const loopback_t loopback_type = (loopback_t)type_value;
            loopback_output_device_t loopback_output_device;

            if (loopback_type == NO_LOOPBACK) { // close loopback
                LoopbackManager::GetInstance()->SetLoopbackOff();
            } else { // open loopback
                if (device_value == LOOPBACK_OUTPUT_RECEIVER ||
                    device_value == LOOPBACK_OUTPUT_EARPHONE ||
                    device_value == LOOPBACK_OUTPUT_SPEAKER) { // assign output device
                    loopback_output_device = (loopback_output_device_t)device_value;
                } else { // not assign output device
                    if (AudioSystem::getDeviceConnectionState(AUDIO_DEVICE_OUT_WIRED_HEADSET,   "") == AUDIO_POLICY_DEVICE_STATE_AVAILABLE ||
                        AudioSystem::getDeviceConnectionState(AUDIO_DEVICE_OUT_WIRED_HEADPHONE, "") == AUDIO_POLICY_DEVICE_STATE_AVAILABLE) {
                        loopback_output_device = LOOPBACK_OUTPUT_EARPHONE;
                    } else if (bForceUseLoudSpeakerInsteadOfReceiver == true) {
                        loopback_output_device = LOOPBACK_OUTPUT_SPEAKER;
                    } else {
                        loopback_output_device = LOOPBACK_OUTPUT_RECEIVER;
                    }
                }
                LoopbackManager::GetInstance()->SetLoopbackOn(loopback_type, loopback_output_device);
            }
            break;
        }

从中可以知道 :SET_LOOPBACK_TYPE=25,3

25为对应下面的要loopback的源端设备 MD_REF_MIC_ACOUSTIC_LOOPBACK ,或AP_REF_MIC_AFE_LOOPBACK
我们mic2对应的就是这个带ref的mic

// for loopback
enum loopback_t {
    NO_LOOPBACK                                 = 0,

    // AFE Loopback
    AP_MAIN_MIC_AFE_LOOPBACK                    = 1,
    AP_HEADSET_MIC_AFE_LOOPBACK                 = 2,
    AP_REF_MIC_AFE_LOOPBACK                     = 3,
    AP_3RD_MIC_AFE_LOOPBACK                     = 4,

    // Acoustic Loopback
    MD_MAIN_MIC_ACOUSTIC_LOOPBACK               = 21,
    MD_HEADSET_MIC_ACOUSTIC_LOOPBACK            = 22,
    MD_DUAL_MIC_ACOUSTIC_LOOPBACK_WITHOUT_DMNR  = 23,
    MD_DUAL_MIC_ACOUSTIC_LOOPBACK_WITH_DMNR     = 24,
    MD_REF_MIC_ACOUSTIC_LOOPBACK                = 25,
    MD_3RD_MIC_ACOUSTIC_LOOPBACK                = 26,

    // BT Loopback with codec
    AP_BT_LOOPBACK                              = 30,
    MD_BT_LOOPBACK                              = 31,

    // BT Loopback without codec
    AP_BT_LOOPBACK_NO_CODEC                     = 32,
    MD_BT_LOOPBACK_NO_CODEC                     = 33,
};

目标输出设备SET_LOOPBACK_TYPE=25,3 逗号后面的3就是我们要输出的spk,LOOPBACK_OUTPUT_SPEAKER

enum loopback_output_device_t {
    LOOPBACK_OUTPUT_RECEIVER = 1,
    LOOPBACK_OUTPUT_EARPHONE = 2,
    LOOPBACK_OUTPUT_SPEAKER  = 3,
};

后面就有声音了

其中使能设备的接口

            AudioALSALoopbackController::getInstance()->open(output_device, input_device);

实现方法如下:可知打开设备的配置都是

    mConfig.channels = 2;
    mConfig.rate = 48000;
    mConfig.period_size = 1024;
    mConfig.period_count = 2;
    mConfig.format = PCM_FORMAT_S16_LE;
    mConfig.start_threshold = 0;
    mConfig.stop_threshold = 0;
    mConfig.silence_threshold = 0;

在这里插入图片描述
打开的设备名是:ULDL_Loopback,如下cat /proc/asound/pcm命令查看到设备信息:在card0 dev4上的设备
在这里插入图片描述

其所在snd_soc_dai_link如下:

\kernel-3.18\sound\soc\mediatek\mt6580\mt_soc_machine.c
	{
		.name = "ULDLOOPBACK",
		.stream_name = MT_SOC_ULDLLOOPBACK_STREAM_NAME,
		.cpu_dai_name   = MT_SOC_ULDLLOOPBACK_NAME,
		.platform_name  = MT_SOC_ULDLLOOPBACK_PCM,
		.codec_dai_name = MT_SOC_CODEC_ULDLLOOPBACK_NAME,
		.codec_name = MT_SOC_CODEC_NAME,
		.init = mt_soc_audio_init,
		.ops = &mt_machine_audio_ops,
	},

在硬件将mic输入输出的波形解决后,SET_LOOPBACK_TYPE=25,3用这个会产生声音断续问题
在mtk online查问题发现:是消噪产生的后果
在这里插入图片描述
于是将参数改成"SET_LOOPBACK_TYPE=3,3看看,发现 吹气模式没有这个现象,可以了

再次给硬件去测试

后发现不播放时,底噪太大,则调试了一下mic2增益:就发现小好多了,底噪,声音也清晰了

 tinymix  Audio_PGA2_Setting 0
ch007_27:/ # tinymix  Audio_PGA2_Setting
Audio_PGA2_Setting: >-6Db 0Db 6Db 12Db 18Db 24Db

调pa增益的方法
播放本地音乐,在平台2档的位置,确定好pa的幅度,

做loopback,从dv机接mic2软件将数据转到pa播放,将pa输出调到指定功率,调pa增益到与先前播放音乐时一样幅度,调高arm音量,看是否有失真,确定在此场景下的增益

最终调到-5Db,平台声音实在太大了

发布了168 篇原创文章 · 获赞 39 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/u010481276/article/details/104995476
MTK