将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,平台声音实在太大了