【Android】【Audio】TTY设备原理

2023-12-25 18:58
文章标签 android 原理 设备 audio tty

本文主要是介绍【Android】【Audio】TTY设备原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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,值得注意的是,VCOFULLsuffixheadphones,而HCOsuffixTTY。而带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,还需要AFEI2S切换正确,可以通过tinymix看看这些节点是否正确,tinymix到的信息如下:

root@idol4:/ # tinymix | grep"TTY"                                          

4   ENUM    1    TTY Mode                                 HCO

130|root@idol4:/ # tinymix | grep"TTY"                                      

4   ENUM    1    TTY Mode                                 FULL

130|root@idol4:/ # 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参数确定。



这篇关于【Android】【Audio】TTY设备原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/536590

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO