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