Android音频底层调试-基于tinyalsa

本文围绕基于tinyalsa的Android音频底层调试展开。介绍了编译tinyalsa配套工具,如tinyplay、tinymix、tinycap等;说明了查看当前系统声卡、用tinymix查看混响器、用tinyplay播放wav音乐及tinycap录音的方法,还提及tinyalsa后续发展及错误处理等内容。

转自:https://www.cnblogs.com/yxwkf/p/5344068.html

Android音频底层调试-基于tinyalsa

      因为Android中默认并没有使用标准alsa,而是使用的是tinyalsa。所以就算基于命令行的測试也要使用libtinyalsa。Android系统在上层Audio千变万化的时候,能够能这些个工具实时查看到,比方音频通道的切换等等.

 

1.编译tinyalsa配套工具

$ mmm external/tinyalsa/

编译完后会产生tinyplay/tinymix/tinycap等等工具。

tinymix: 查看配置混音器

tinyplay: 播放音频

tinycap: 录音

 

2.查看当前系统的声卡

 

root@android:/ # cat /proc/asound/cards
 0 [RKRK616        ]: RK_RK616 - RK_RK616
                      RK_RK616
 1 [ROCKCHIPSPDIF  ]: ROCKCHIP-SPDIF - ROCKCHIP-SPDIF
                      ROCKCHIP-SPDIF
root@android:/ # 

 

 

3.tinymix查看混响器

tinymix用法a.不加不论什么參数-显示当前配置情况 b.tinymix [ctrl id] [var]不加[var]能够查看该[ctrl id]可选选项。

 

root@android:/ # tinymix
Number of controls: 7
ctl	type	num	name                                     value
0	ENUM	1	Playback Path                            OFF
1	ENUM	1	Capture MIC Path                         MIC OFF
2	ENUM	1	Voice Call Path                          OFF
3	ENUM	1	Voip Path                                OFF
4	INT	2	Speaker Playback Volume                  0 0
5	INT	2	Headphone Playback Volume                0 0
6	ENUM	1	Modem Input Enable                       ON
root@android:/ #

 

相应解释:

英文

中文

备注

Playback Path

音频输出通道

 

Capture MIC Path

音频输入通道

 

Voice Call Pah

通话音频通道

设备没有通话模块,暂无法測试

Voip Pah 

IP电话音频通道

场景Gtalk;值有:SPK/HP_NO_MIC/BT

Speaker Playback Volume

扬声器音量

和上层音量值无关

Headphone Playback Volume

耳机音量

同上

Modem Input Enable

暂不知何用

经測试不能控制音频输入输出

 

 

 

Playback Path有:

英文

中文

备注

OFF

关闭

 

RCV

 

SPK

扬声器

经常使用

HP

耳机带麦

 

HP_NO_MIC

耳机无麦

经常使用

BT

蓝牙

 

SPK_HP

 

RING_SPK

 

RING_HP

 

RING_HP_NO_MIC

 

RING_SPK_HP

 

例:将输出切换到扬声器

root@android:/ # tinymix 0 SPK

关于tinymix小结:

通过观察发现,Android系统的声音音量的调节并没有直接使用tinyalsa,而基于上层软件实现,由于不管上层音量怎么改变。这里看到的都是24(以我採用的设备为例)。

通道的切换是真正使用了tinyalsa,当通过不同通道播放音乐的时候能够实时观察到通道的切换。在某个站点上看到Android在没有声音播放的3秒后会关于alsa,这里也得到了证实,我曾经觉得Android系统会永久占用音频设备。

 

当通过蓝牙播放音乐的时候,已经不经过alsa了。tinymix查看得都处理关闭状态,由于Android4.2的蓝牙协议所有在用户层实现了。直接走uart通道。这种设计方式一时半会不能理解。

 

4.使用tinyplay播放wav音乐

这个仅仅是一个最主要的播放器。所以不支持播放MP3等等压缩过格式的音乐。

没有学会使用前。网上都说非常麻烦。可是如今看来一点也不麻烦,直接播放了44.1kHz/44.8kHz的wav音乐。

 

root@android:/ # tinyplay /sdcard/0_16.wav                                     
Playing sample: 2 ch, 44100 hz, 16 bit
root@android:/ # 

 

注:播放之前得首先使用tinymix把通道设置好,上文中已经给出了设置到扬声器中的样例;因为播放时使用的最大音量进行播放的,所以注意防止被吓到。这里将測试音频文件上传。

 

5.tinycap使用

root@android:/ # tinycap /sdcard/test.wav

能够进行录音。

 

眼下仅仅遇到这些,就先总结到这,能够随时再深入。

 

 

20141014更新:

1.原来tinyalsa最原始的源代码在这里tinyalsa_github

2.自己fork一份。加入静态编译方法以及busybox方式的将tinymix/tinyplay/tinycap/tinypcminfo集成一个tinyalsa。

tinyalsa-utils 包括了tinymix/tinyplay/tinycap/tinypcminfo用法是 tinyalsa + 工具名。比方要执行tinymix,那么就执行 tinyalsa mix或者tinyalsa tinymix。下载地址

root@android:/ # tinyalsa mix                                                  

Mixer name: 'RK_RK616'

Number of controls: 7

ctl type num name                                     value

0 ENUM 1 Playback Path                            OFF

1 ENUM 1 Capture MIC Path                         Main Mic

2 ENUM 1 Voice Call Path                          OFF

3 ENUM 1 Voip Path                                OFF

4 INT 2 Speaker Playback Volume                  0 0

5 INT 2 Headphone Playback Volume                0 0

6 ENUM 1 Modem Input Enable                       ON

root@android:/ # 

3.依据这个[PATCH] tinyalsa: new package信息显示。以后tinyalsa也会被集成进busybox中。

4.假设出现Failed to open mixer错误,代表你的Android设备不是alsa音频驱动,而是legacy OSS device。

 

制作静态库參考:Linux下Gcc生成和使用静态库和动态库具体解释

 

 

其他被证实为假的如果:

1.须要改写init.rc让系统不启动android相关的服务(mediaserver)

2.须要通过其他途径获取tinyalsa.

### 调试基于 TinyALSAAndroid 庿用教程 #### 1. **TinyALSA 基础** TinyALSAAndroid 系统中用于处理音频硬件的一个轻量化库。它提供了对 ALSA(Advanced Linux Sound Architecture)驱动程序的支持,允许开发者直接访问底层音频设备并控制其行为[^1]。 #### 2. **安装与配置环境** 为了调试基于 TinyALSA 的应用,首先需要确保开发环境中已正确安装和配置 libtinyalsa 库。以下是具体步骤: - 克隆官方仓库 `git clone https://github.com/tinyalsa/libtinyalsa.git`。 - 使用交叉编译工具链构建静态或动态链接库。 - 将生成的 `.so` 或 `.a` 文件集成到项目中以便调用相关函数[^2]。 ```bash # 示例:克隆仓库 git clone https://github.com/tinyalsa/libtinyalsa.git # 进入目录并执行构建脚本 cd libtinyalsa ./autogen.sh ./configure --host=arm-linux-androideabi make ``` #### 3. **常用 API 及其实现** TinyALSA 提供了一系列接口来管理 PCM 数据流以及混音器设置。下面列举几个核心方法及其用途: - **打开 PCM 设备**: ```c struct pcm *pcm_open(unsigned int card, unsigned int device, enum pcm_stream stream, struct pcm_config *config); ``` 此函数用于初始化指定声卡上的 PCM 流,并返回句柄对象以进一步操作[^3]。 - **读写音频帧**: 对于输入/输出模式下的数据交互可通过如下方式完成: ```c size_t pcm_write(struct pcm *pcm, const void *data, size_t count); ``` - **获取当前状态**: 判断缓冲区是否满载或者发生错误等情况时可借助此功能: ```c bool pcm_is_ready(const struct pcm *pcm); ``` #### 4. **实际案例分析** 假设我们正在开发一款支持多声道切换的应用,则可以通过监听事件触发相应的逻辑更改默认路由路径。例如,在检测到耳机拔插动作后立即更新目标端点参数从而实现无缝过渡效果[^4]。 ```python import subprocess def check_audio_route(): result = subprocess.run(['tinymix', 'show'], capture_output=True, text=True) if "Headphone" in result.stdout: set_headphones_as_default() elif "Speaker" in result.stdout: use_speaker_mode() def set_headphones_as_default(): pass # 实际业务代码省略... if __name__ == "__main__": while True: try: check_audio_route() except Exception as e: print(f"Error occurred: {e}") finally: time.sleep(0.5) # 防止频繁轮询造成性能损耗 ``` #### 5. **注意事项** 在进行任何修改之前务必备份原始配置文件以防意外损坏系统稳定性;另外还需注意权限问题以免因缺乏适当授权而导致某些特性不可用。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值