TTY设备原理
1.文章概述
TTY mode是一种专为听力 & 语言障碍人士设置的一种模式,该模式下可以将audio数据和文字数据之间相互转化,以帮助障碍人士获取或者发出信息,正常交流。
由于该功能需要audio和文字数据的转化,是一种网络通话方式,所以说需要网络方面的支持,而目前在国内是没有这种支持的,所以,国内的手机一般不会开发这个功能,也无法使用该功能。
TTY属于voice范畴,问题一般都是测试环境没搭好或者音频设备没有配置对。但是因为国内没有TTY的环境,因此会比较生疏
2.TTY设备介绍
TTY设备类似一个老式打字机带上一块小显示屏,通过该机器可以将数据从语音和文字间转换,设备和接口样式具体如下:
首先TTY设备跟手机连接的是音频耳机线,连接TTY设备端是3段式耳机;但连接手机端必须是4段式耳机,因此需要一个转街头(不是普通的4段式耳机延长线,需要把4段式MIC信号转到TTY设备的3段式耳机的MIC pin),如上图1和图2,最后完整的TTY设备样式图下图3。
3.TTY的使用方法
在通话界面的左上角setting界面,选择Accessibility,就能看到TTY mode选项,在TTY mode中有四个选项设置,表达的意思和使用环境分别如下:
l OFF:该功能为关闭TTY功能,正常手机都默认是OFF。如果在国内发现只能听,或者只能说的情况,可能是误选成了其余模式,请检查状态栏是否存在TTY标志。
l FULL:完整模式,该模式下,无法收到声音,也无法从mic传输声音,接受/发送数据都通过TTY设备转化来完成。
l VCO:只说不听模式,该模式下,用户可以用mic说话输出数据,但无法听到声音,接受方面会被转化成文字信息显示在TTY设备上
l HCO:只听不说模式,该模式下,用户可以听到声音,但无法从mic输出数据,输出数据是通过TTY设备typing文字传输。
4.TTY逻辑分析
首先在选择TTY设备模式的时候,此时会从上层设置模式到底层,上层在TTYManager.java中有如下逻辑:
private static int telecomModeToPhoneMode(int telecomMode) {
switch (telecomMode) {
case TelecomManager.TTY_MODE_FULL:
return Phone.TTY_MODE_FULL;
case TelecomManager.TTY_MODE_VCO:
return Phone.TTY_MODE_VCO;
case TelecomManager.TTY_MODE_HCO:
return Phone.TTY_MODE_HCO;
case TelecomManager.TTY_MODE_OFF:
default:
return Phone.TTY_MODE_OFF;
}
}
根据用户设置的TTY模式,该函数会返回一个对应模式的值到底层。底层在platform.c中接收到该模式,然后根据模式选择对应的I/O设备,如下代码(仅以input device为例):
5 if ((adev->voice.tty_mode !=TTY_MODE_OFF) &&
2886 !voice_extn_compress_voip_is_active(adev)) {
2887 switch(adev->voice.tty_mode) {
2888 case TTY_MODE_FULL:
2889 snd_device =SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES;
2890 break;
2891 case TTY_MODE_VCO:
2892 snd_device =SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES;
2893 break;
2894 case TTY_MODE_HCO:
2895 snd_device =SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET;
2896 break;
2897 default:
2898 ALOGE("%s: Invalid TTYmode (%#x)",
2899 __func__,adev->voice.tty_mode);
2900 }
同时会选择suffix的终端设备,在platform_add_backend_name()函数中,根据模式的选择,和log的确定最后TTY的设备具体名字
171#endif
2172 suffix = "speaker";
2173 break;
2174 case SND_DEVICE_OUT_HANDSET:
2175 case SND_DEVICE_OUT_VOICE_HANDSET:
2176 #ifdef TCT_TARGET_RECEIVER_REVERSE
2177 case SND_DEVICE_OUT_SECOND_HANDSET:
2178 case SND_DEVICE_OUT_VOICE_SECOND_HANDSET:
2179 #endif
2180 #ifdef TCT_TARGET_VOICE_CALL_BMK
2181 case SND_DEVICE_OUT_HANDSET_BMK:
2182 case SND_DEVICE_OUT_VOICE_HANDSET_BMK:
2183 case SND_DEVICE_OUT_SECOND_HANDSET_BMK:
2184 case SND_DEVICE_OUT_VOICE_SECOND_HANDSET_BMK:
2185 #endif
2186 suffix = "handset";
2187 break;
2188 case SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES:
2189 suffix ="speaker-and-headphones";
2190 break;
2191
2192 caseSND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET:
2193 suffix= "TTY";
2194 break;
2195 default:
2196 //suffix = NULL;/*change for thenew process logic of androidM*/
2197 break;
2198 }
2199 ALOGD("%s: after idol4 suffix %s", __func__, (suffix ==NULL)?"NULL":suffix);
2200#endif
2201/*[FEATURE]-Add-END by kun.guan, 526254, 2015/09/23, add forIdol455*/
2202
2203 if (suffix != NULL) {
2204 strlcat(mixer_path, " ", MIXER_PATH_MAX_LENGTH);
2205 strlcat(mixer_path, suffix, MIXER_PATH_MAX_LENGTH);
2206 }
2207
2208 ALOGD("%s: mixer after append %s", __func__, mixer_path);
2209}
此代码后,该设备命会在设备尾部加上TTY的suffix,值得注意的是,VCO和FULL的suffix是headphones,而HCO的suffix是TTY。而带TTY suffix的设备默认平台上是没有在mixer_paths_mtp.xml中配置的。
然后根据这里的device,在xml中读取对应的patch参数和配置,如果没有的话,需要新配置对应的参数。例如,可以从log(以idol4_bell在HCO失败为例)中确认:
8-08 14:11:53.535 D/msm8916_platform( 536): platform_add_backend_name: b4 idol4suffix NULL
08-08 14:11:53.535 D/msm8916_platform( 536): platform_add_backend_name: after idol4 suffix TTY
08-08 14:11:53.535 D/msm8916_platform( 536): platform_add_backend_name: mixer afterno voicemmode1-call TTY
add_backend的device为voicemmode1-call+ TTY(suffix),同时能确定在TTY的I/O设备为:
08-08 14:11:52.854 V/msm8916_platform( 536): platform_get_output_snd_device: exit:snd_device(voice-tty-hco-handset)
08-08 14:11:52.854 V/msm8916_platform( 536): platform_get_input_snd_device: enter:out_device(0x4) in_device(0)
08-08 14:11:52.854 V/msm8916_platform( 536): platform_get_input_snd_device: exit:in_snd_device(voice-tty-hco-headset-mic)
08-08 14:11:52.854 D/audio_hw_primary( 536): select_devices: out_snd_device(30:voice-tty-hco-handset) in_snd_device(91: voice-tty-hco-headset-mic)
在platform中选择了最终使用的设备后,也可以借此log确定该设备的通路:
[SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET]= "voice-tty-hco-handset",
……
07 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37,
然后,系统从device库下的mixer_paths_mtp.xml中寻找对应path的参数配置,如果没有的话,会存在没有声音的情况,其中配置信息需要参考对应设备类似的参数值。
同时,在idol4中,有几点需要注意:
A.在idol4bell中使用了smartpA和HIFI芯片,HIFI会在使用耳机的时候开启,而使用speaker和handset是开启的smartpa。"handset"控制的是smart pa,如下,可以看到RCV和SPK走的都是tfa98xx这个设备的配置
243 <!-- tfa98xx speaker/handset -->
244 <ctl name="TFA98XX_SPK_AMP" value="Off" />
245 <ctl name="TFA98XX_RCV_AMP" value="Off" />
246 <ctl name="QUAT_MI2S_RX Audio Mixer MultiMedia1"value="0" />
247 <ctl name="QUAT_MI2S_RX Audio Mixer MultiMedia4"value="0" />
248 <ctl name="QUAT_MI2S_RX Audio Mixer MultiMedia5"value="0" />
249 <ctl name="QUAT_MI2S_RX_Voice Mixer CSVoice"value="0" />
250 <ctl name="QUAT_MI2S_RX_Voice Mixer Voice2"value="0" />
251 <ctl name="QUAT_MI2S_RX_Voice Mixer VoLTE"value="0" />
252 <ctl name="QUAT_MI2S_RX_Voice Mixer Voip"value="0" />
253 <ctl name="QUAT_MI2S_RX_Voice Mixer QCHAT"value="0" />
254 <ctl name="QUAT_MI2S_RX_Voice Mixer VoWLAN"value="0" />
255 <!-- tfa98xx speaker/handset end -->
如果想有声音,除了smartpa,还需要AFE中I2S切换正确,可以通过tinymix看看这些节点是否正确,tinymix到的信息如下:
[email protected]:/ # tinymix | grep"TTY"
4 ENUM 1 TTY Mode HCO
130|[email protected]:/ # tinymix | grep"TTY"
4 ENUM 1 TTY Mode FULL
130|[email protected]:/ # tinymix | grep"TTY"
4 ENUM 1 TTY Mode VCO
同时,在mixer_paths_mtp.xm中,具体对HCO模式设备的配置如下:
<path name="voice-tty-hco-handset">
<ctl name="TTY Mode"value="HCO" />
<path name="handset" />
</path>
……
<path name="handset">
<ctl name="TFA98XX_RCV_AMP"value="On" />
</path>
……
<path name="voicemmode1-callTTY">
<ctl name="QUIN_MI2S_RX_VoiceMixer VoiceMMode1" value="1" />
<ctl name="VoiceMMode1_Tx MixerTERT_MI2S_TX_MMode1" value="1" />
</path>
其中,HCO和FULL现在配置的TTY都是走QUIN I2S, 即耳机的通路。而因为TTY设备上无语音输出(类似耳机)的,则这里的配置是不正确的,要改为QUAT_MI2S_RX_Voice来对应RCV和SPK的设备。
B.检查audio path时,注意audiopath在mixer xml以及device id是否正确,且能够有声音,比如HCO-handset的device id为37(在platform.c中确认)的这个设备,里面的参数是否正常SW是无法得知的。具体在通路下的音量和音效,都是由该通路下DSP增益决定,这点可以请HW去重新校验DSP参数确定。