在HW 修改电路之后,SW 通常也需要重新修改匹配硬件,这样才能保证功能的正常使用。
下面以VGA 通过的line-lin 为例:
从原理图上看,VGA通道的PC audio in 是属于芯片端的pin 脚是Y3,AA4,对应的 port 是line-in 第 0 路。
mstar 平台 audio 的映射关系包含audio in,audio out,以及内部 audio mux。对应的是board.h 文件中的三个结构体:
// audio-in , 右侧对应的是通道,左侧是对应的声音进入的port static AudioMux_t BOARD_AudioMux_t[BOARD_AUDIO_INPUT_SOURCE_TYPE_SIZE] = { {AUDIO_DSP1_DVB_INPUT}, //AUDIO_SOURCE_DTV {AUDIO_DSP1_DVB_INPUT}, //AUDIO_SOURCE_DTV2 {AUDIO_DSP4_SIF_INPUT}, //AUDIO_SOURCE_ATV {AUDIO_AUIN4_INPUT}, //AUDIO_SOURCE_PC {AUDIO_AUIN0_INPUT}, //AUDIO_SOURCE_YPbPr {AUDIO_NULL_INPUT}, //AUDIO_SOURCE_YPbPr2 {AUDIO_AUIN0_INPUT}, //AUDIO_SOURCE_AV {AUDIO_NULL_INPUT}, //AUDIO_SOURCE_AV2 {AUDIO_NULL_INPUT}, //AUDIO_SOURCE_AV3 {AUDIO_NULL_INPUT}, //AUDIO_SOURCE_SV {AUDIO_NULL_INPUT}, //AUDIO_SOURCE_SV2 {AUDIO_AUIN4_INPUT}, //AUDIO_SOURCE_SCART {AUDIO_NULL_INPUT}, //AUDIO_SOURCE_SCART2 {AUDIO_HDMI_INPUT}, //AUDIO_SOURCE_HDMI {AUDIO_HDMI_INPUT}, //AUDIO_SOURCE_HDMI2 {AUDIO_HDMI_INPUT}, //AUDIO_SOURCE_HDMI3 {AUDIO_AUIN0_INPUT}, //AUDIO_SOURCE_DVI {AUDIO_AUIN0_INPUT}, //AUDIO_SOURCE_DVI2 {AUDIO_AUIN0_INPUT}, //AUDIO_SOURCE_DVI3 {AUDIO_NULL_INPUT}, //AUDIO_SOURCE_KTV }; // audio mux,右侧对应的通道也即input source,左侧对应的是耳机/喇叭的port static AudioMux_t BOARD_AudioPath_t[BOARD_AUDIO_PATH_TYPE_SIZE] = { {AUDIO_T3_PATH_I2S}, //AUDIO_PATH_MAIN_SPEAKER {AUDIO_T3_PATH_AUOUT1}, //AUDIO_PATH_HP {AUDIO_T3_PATH_AUOUT0}, //AUDIO_PATH_LINEOUT {AUDIO_PATH_NULL}, //AUDIO_PATH_SIFOUT {AUDIO_PATH_NULL}, //AUDIO_PATH_SCART1 = SIF out {AUDIO_T3_PATH_AUOUT0}, //AUDIO_PATH_SCART2 = Lineout {AUDIO_T3_PATH_SPDIF}, //AUDIO_PATH_SPDIF {AUDIO_PATH_NULL}, //AUDIO_PATH_HDMI {AUDIO_T3_PATH_MIXER_MAIN}, // AUDIO_PATH_MIXER_MAIN {AUDIO_T3_PATH_MIXER_SECONDARY}, // AUDIO_PATH_MIXER_SECONDARY {AUDIO_PATH_NULL}, // AUDIO_PATH_7 {AUDIO_T3_PATH_MIXER_DMA_IN}, // AUDIO_PATH_MIXER_DMA_IN }; // audio-out, 是输出path 的选择 static AudioOutputType_t BOARD_AudioOutputType_t[BOARD_AUDIO_OUTPUT_TYPE_SIZE] = { {AUDIO_I2S_OUTPUT}, //AUDIO_PATH_MAIN_SPEAKER {AUDIO_AUOUT1_OUTPUT}, //AUDIO_PATH_HP {AUDIO_AUOUT0_OUTPUT}, //AUDIO_PATH_LINEOUT {AUDIO_NULL_OUTPUT}, //AUDIO_PATH_SIFOUT {AUDIO_NULL_OUTPUT}, //AUDIO_PATH_SCART1 = SIF out {AUDIO_AUOUT0_OUTPUT}, //AUDIO_PATH_SCART2 = Lineout };
从上面的信息可以看到,line-in 里面AUDIO_AUIN0_INPUT port 对应了YPBPR,AV,DVI,DVI2,DVI3 几个通道,未看到VGA通道,配置audio in, out ,mux 信息之后,需要在系统中生效就必须初始化,设置到寄存器中去,继续查到找到三个结构体,分别保存在systeminfo模块的m_pAudioMuxInfo,m_pAudioPathInfo,m_pAudioOutputTypeInfo三个成员中,通过下面接口获取:
@vendor\mstar\supernova\projects\systeminfo\src\SystemInfo.cpp const AudioMux_t* SystemInfo::GetAudioInputMuxInfo() { if(m_pAudioMuxInfo != NULL) { return m_pAudioMuxInfo; } ASSERT(0); } const AudioPath_t* SystemInfo::GetAudioPathInfo() { if(m_pAudioPathInfo != NULL) { return m_pAudioPathInfo; } ASSERT(0); } const AudioOutputType_t* SystemInfo::GetAudioOutputTypeInfo() { if(m_pAudioOutputTypeInfo != NULL) { return m_pAudioOutputTypeInfo; } ASSERT(0); }
接着在_InputSourceTypeToAudioInputType(vendor\mstar\supernova\projects\customization\MStarSDK\audio\mapi_audio_customer.cpp)接口中获取,根据通道进行设置:
static AUDIO_INPUT_TYPE _InputSourceTypeToAudioInputType(MAPI_INPUT_SOURCE_TYPE eSourceType) { const AudioMux_t* const p_AudioInputMux = mapi_syscfg_fetch::GetInstance()->GetAudioInputMuxInfo(); AUDIO_INPUT_TYPE eAudioInputType = AUDIO_NULL_INPUT; MAPI_U32 u32Port = 0xFF; switch(eSourceType) { case MAPI_INPUT_SOURCE_DTV: { u32Port = p_AudioInputMux[MAPI_AUDIO_SOURCE_DTV].u32Port; break; } ........ case MAPI_INPUT_SOURCE_YPBPR: { u32Port = p_AudioInputMux[MAPI_AUDIO_SOURCE_YPBPR].u32Port; break; } case MAPI_INPUT_SOURCE_YPBPR2: { u32Port = p_AudioInputMux[MAPI_AUDIO_SOURCE_YPBPR2].u32Port; break; } case MAPI_INPUT_SOURCE_VGA: case MAPI_INPUT_SOURCE_VGA2: case MAPI_INPUT_SOURCE_VGA3: { u32Port = p_AudioInputMux[MAPI_AUDIO_SOURCE_PC].u32Port; break; } case MAPI_INPUT_SOURCE_HDMI: case MAPI_INPUT_SOURCE_HDMI2: case MAPI_INPUT_SOURCE_HDMI3: case MAPI_INPUT_SOURCE_HDMI4: { u32Port = p_AudioInputMux[MAPI_AUDIO_SOURCE_HDMI].u32Port; break; } case MAPI_INPUT_SOURCE_DVI: { u32Port = p_AudioInputMux[MAPI_AUDIO_SOURCE_DVI].u32Port; break; } ...... } eAudioInputType = _u32PortToAudioInputType(u32Port); return eAudioInputType; }
到这里可以发现VGA,VGA2,VGA3 使用的是 audio in 结构体中的source (MAPI_AUDIO_SOURCE_PC) 对应的的port :
diff --git a/serials/MST160D_10ABQM_18443_DTMB_AH/Board.h b/serials/MST160D_10ABQM_18443_DTMB_AH/Board.h index 24b27d5..da095f1 100755 --- a/serials/MST160D_10ABQM_18443_DTMB_AH/Board.h +++ b/serials/MST160D_10ABQM_18443_DTMB_AH/Board.h @@ -820,7 +820,7 @@ static AudioMux_t BOARD_AudioMux_t[BOARD_AUDIO_INPUT_SOURCE_TYPE_SIZE] = {AUDIO_DSP1_DVB_INPUT}, //AUDIO_SOURCE_DTV {AUDIO_DSP1_DVB_INPUT}, //AUDIO_SOURCE_DTV2 {AUDIO_DSP4_SIF_INPUT}, //AUDIO_SOURCE_ATV - {AUDIO_AUIN4_INPUT}, //AUDIO_SOURCE_PC + {AUDIO_AUIN0_INPUT}, //AUDIO_SOURCE_PC {AUDIO_AUIN0_INPUT}, //AUDIO_SOURCE_YPbPr {AUDIO_NULL_INPUT}, //AUDIO_SOURCE_YPbPr2 {AUDIO_AUIN0_INPUT}, //AUDIO_SOURCE_AV
因此将AUDIO_AUIN4_INPUT 换成AUDIO_AUIN0_INPUT 即可。
如果 speaker 和 headphone 同一路硬件输出,优先以speaker 为主,同时AUDIO_OUTPUT_HP 的audio path 可以配置为NULL。
更多mstar 平台音频属性,音效设置详参文件:drvAUDIO_if.h,mapi_audio_datatype.h,apiAUDIO.h,mapi_audio.h,mapi_audio_customer.cpp,mapi_audio.cpp,MSrv_SSSound.cpp