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,平臺聲音實在太大了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章