在Android设备上进行音频开发时,我们可能会遇到各种问题。其中之一是录音音量过低。在本文中,我将探讨如何诊断和解决这个问题,并简要介绍tinyalsa工具的使用。
问题描述
最近我在使用全志Android平台客户有个MIC需求,需要用到录制和播放音频的功能。我发现全志平台声卡驱动,它提供了两个麦克风输入,分别是 MIC1 和 MIC2。我想要使用 MIC1 作为录音输入源,而不是 MIC2。
我尝试了很多方法,包括修改声卡配置文件,混音器控件和录音命令,但都没有成功。
解决方法
经过一番搜索和尝试,找到了一个解决方法,就是通过修改声卡配置文件,混音器控件和录音命令来实现使用 MIC1 作为录音输入源,并且提高 MIC 的录音和功放耳机声音大小。
修改声卡配置文件
声卡配置文件是一个用于定义声卡参数和设备的文件,它通常位于 system\etc\codec_paths.xml 。:
<path name="media-main-mic">
<ctl name="Left Input Mixer MIC2 Boost Switch" value="1" />
<ctl name="Right Input Mixer MIC2 Boost Switch" value="1" />
</path>
<path name="media-main-mic-close">
<ctl name="Left Input Mixer MIC2 Boost Switch" value="0" />
<ctl name="Right Input Mixer MIC2 Boost Switch" value="0" />
</path>
源代码位置: hardware/aw/audio/codec_paths.xml
这段内容,它定义了Android音频系统中的音频路径配置。这些路径配置通常用于确定音频信号如何在硬件和软件之间流动。
-
当
media-main-mic
路径被激活时,MIC2的增益开关在左右输入混音器上都会被打开,这允许MIC2的音频信号进入音频处理链路。 -
当
media-main-mic-close
路径被激活时,MIC2的增益开关在左右输入混音器上都会被关闭,这阻止了MIC2的音频信号进入音频处理链路。
我对比了正常机器的文件是显示的MIC1
, 但不正常的是显示MIC2
所以我认为改这个是有效的。
修改混音器控件
接着我想起了很久以前用过的调试tinyalsa
, 如果没有需要执行mmm external/tinyalsa/
。
混音器控件是一些用于控制声卡设置的参数,例如输入源、输出设备、增益、音量等。要修改混音器控件,需要使用一个命令行工具来查看和设置这些参数。在全志平台上,可以使用 tinyalsa 这个工具来实现这个功能。tinyalsa 他其实是一个简化的 ALSA 库,它提供了一些命令行工具来测试和控制音频设备。
要使用 tinyalsa 来修改混音器控件,比如调节 MIC 的录音和功放耳机声音大小的参数。可以使用 tinymix 命令来修改这些控件的值,例如:
tinymix "digital volume" 63
tinymix "Headphone volume" 63
tinymix "MIC gain volume" 7 7
tinymix "MIC1 boost volume" 7
tinymix "MIC2 boost volume" 7
tinymix "ADC gain volume" 7
它们可以影响 MIC 的录音和功放耳机声音大小:
- digital volume: 这个控件可以调节数字音量,它的范围是 0 到 63,值越大音量越大。
- Headphone volume: 这个控件可以调节耳机音量,它的范围是 0 到 63,值越大音量越大。
- MIC gain volume: 这个控件可以调节 MIC 的增益,它有两个通道,分别对应 MIC1 和 MIC2。它的范围是 0 到 7,值越大增益越大。
- MIC1 boost volume: 这个控件可以调节 MIC1 的额外增益,它的范围是 0 到 7,值越大增益越大。
- MIC2 boost volume: 这个控件可以调节 MIC2 的额外增益,它的范围是 0 到 7,值越大增益越大。
- ADC gain volume: 这个控件可以调节 ADC 的增益,它的范围是 0 到 7,值越大增益越大。
这些命令会将这些控件的值都设置为最大值,临时快捷的 从而提高 MIC 的录音和功放耳机声音大小。然后根据实际情况来调整代码这些值。
修改录音命令
录音命令是一个用于录制音频文件的命令行工具,它可以指定采样率、通道数、格式、时长等参数。在全志平台上,可以使用 tinyalsa 这个工具来实现这个功能。
要使用 tinyalsa 来修改录音命令,需要运行以下命令:
tinycap -D 0 -d mic -c 2 -r 44100 -b 16 -t 10 /sdcard/test.wav
这个命令表示使用声卡 0 的 mic 设备,双通道,44.1 kHz,16 位,录制 10 秒的音频文件到 /sdcard/test.wav。
结果验证
经过以上的修改,我就可以使用 MIC2 来录制和播放音频了。可以使用以下命令来验证我的结果:
tinyplay -D 0 /sdcard/test.wav
这个命令表示使用声卡 0 播放 /sdcard/test.wav 文件。可以听到我录制的音频内容,并且声音很清晰和响亮。
至此我的问题解决了,
其他Audio调试方法
以下是一些常用的命令和方法,用于调试音频相关问题:
1. 音频配置文件检查
在特定的平台,如全志,可能存在为音频设置而特定的配置文件或工具。可以在/system/etc
或其他相关目录中查找这些文件 。
2. 使用dumpsys
命令
dumpsys
它能够提供系统服务的详细信息。为了获取音频系统的详细信息,可以使用:
XXX # dumpsys media.audio_flinger
Library loudness_enhancer
Loudness Enhancer / The Android Open Source Project
UUID: fa415329-2034-4bea-b5dc-5b381c8d1e2c
TYPE: fe3199be-aed0-413f-87bb-11260eb63cf1
apiVersion: 00020000
flags: 00000008
Library downmix
Multichannel Downmix To Stereo / The Android Open Source Project
UUID: 93f04452-e4fe-41cc-91f9-e475b6d1d69f
TYPE: 381e49cc-a858-4aa2-87f6-e8388e7601b2
apiVersion: 00020000
flags: 00000008
Library visualizer
Visualizer / The Android Open Source Project
UUID: d069d9e0-8329-11df-9168-0002a5d5c51b
TYPE: e46b26a0-dddd-11db-8afd-0002a5d5c51b
apiVersion: 00020000
flags: 00000008
Library reverb
Insert Preset Reverb / NXP Software Ltd.
UUID: 172cdf00-a3bc-11df-a72f-0002a5d5c51b
TYPE: 47382d60-ddd8-11db-bf3a-0002a5d5c51b
apiVersion: 00020000
flags: 00000048
Auxiliary Preset Reverb / NXP Software Ltd.
UUID: f29a1400-a3bb-11df-8ddc-0002a5d5c51b
TYPE: 47382d60-ddd8-11db-bf3a-0002a5d5c51b
apiVersion: 00020000
flags: 00000001
Insert Environmental Reverb / NXP Software Ltd.
UUID: c7a511a0-a3bb-11df-860e-0002a5d5c51b
TYPE: c2e5d5f0-94bd-4763-9cac-4e234d06839e
apiVersion: 00020000
flags: 00000048
Auxiliary Environmental Reverb / NXP Software Ltd.
UUID: 4a387fc0-8ab3-11df-8bad-0002a5d5c51b
TYPE: c2e5d5f0-94bd-4763-9cac-4e234d06839e
apiVersion: 00020000
flags: 00000001
Library bundle
Volume / NXP Software Ltd.
UUID: 119341a0-8469-11df-81f9-0002a5d5c51b
TYPE: 09e8ede0-ddde-11db-b4f6-0002a5d5c51b
apiVersion: 00020000
flags: 00000050
Equalizer / NXP Software Ltd.
UUID: ce772f20-847d-11df-bb17-0002a5d5c51b
TYPE: 0bed4300-ddd6-11db-8f34-0002a5d5c51b
apiVersion: 00020000
flags: 00000048
Virtualizer / NXP Software Ltd.
UUID: 1d4033c0-8557-11df-9f2d-0002a5d5c51b
TYPE: 37cc2c00-dddd-11db-8577-0002a5d5c51b
apiVersion: 00020000
flags: 00000250
Dynamic Bass Boost / NXP Software Ltd.
UUID: 8631f300-72e2-11df-b57e-0002a5d5c51b
TYPE: 0634f220-ddd4-11db-a0fc-0002a5d5c51b
apiVersion: 00020000
flags: 00000248
Clients:
pid: 2404
Notification Clients:
pid: 1755
pid: 1765
pid: 2404
pid: 4551
pid: 5872
Global session refs:
session pid count
9 2404 1
Hardware status: 0
Standby Time mSec: 3000
Output thread 0xae003d40 type 0 (MIXER):
Thread name: AudioOut_D
I/O handle: 13
TID: 1823
Standby: yes
Sample rate: 44100 Hz
HAL frame count: 2720
HAL format: 0x1 (pcm16)
HAL buffer size: 10880 bytes
Channel count: 2
Channel mask: 0x00000003 (front-left, front-right)
Processing format: 0x1 (pcm16)
Processing frame size: 4 bytes
Pending config events: none
Output device: 0x2 (SPEAKER)
Input device: 0 (NONE)
Audio source: 0 (default)
Normal frame count: 2720
Last write occurred (msecs): 2158695
Total writes: 4459
Delayed writes: 0
Blocked in write: no
Suspend count: 0
Sink buffer : 0xae054000
Mixer buffer: 0xae072000
Effect buffer: 0xae057000
Fast track availMask=0xfe
Standby delay ns=3000000000
AudioStreamOut: 0xae548150 flags 0x2 (PRIMARY)
Frames written: 12128480
Suspended frames: 0
Hal stream dump:
Thread throttle time (msecs): 1037
AudioMixer tracks: 0x00000001
Master mono: off
FastMixer not initialized
Stream volumes in dB: 0:-5.9, 1:-6, 2:0, 3:0, 4:0, 5:0, 6:0, 7:-6, 8:-6, 9:0, 10:0, 11:0, 12:0
Normal mixer raw underrun counters: partial=0 empty=0
1 Tracks of which 0 are active
Name Active Client Type Fmt Chn mask Session fCount S F SRate L dB R dB Server Main buf Aux Buf Flags UndFrmCnt
0 no 2404 1 00000001 00000003 9 4512 S 1 48000 -inf -inf 0005B6E0 0xae054000 0x0 0x600 0
0 Effect Chains
USB audio module:
No output streams.
No input streams.
Reroute submix audio module:
route[0] rate in=0 out=0, addr=[]
route[1] rate in=0 out=0, addr=[]
route[2] rate in=0 out=0, addr=[]
route[3] rate in=0 out=0, addr=[]
route[4] rate in=0 out=0, addr=[]
route[5] rate in=0 out=0, addr=[]
route[6] rate in=0 out=0, addr=[]
route[7] rate in=0 out=0, addr=[]
route[8] rate in=0 out=0, addr=[]
route[9] rate in=48000 out=48000, addr=[]
a40-p1:/data/data # cat /proc/asound/cards
0 [audiocodec ]: audiocodec - audiocodec
audiocodec
1 [fmidi ]: MIDI Gadget - f_midi
MIDI Gadget
a40-p1:/data/data # dumpsys media.audio_flinger
Library loudness_enhancer
Loudness Enhancer / The Android Open Source Project
UUID: fa415329-2034-4bea-b5dc-5b381c8d1e2c
TYPE: fe3199be-aed0-413f-87bb-11260eb63cf1
apiVersion: 00020000
flags: 00000008
Library downmix
Multichannel Downmix To Stereo / The Android Open Source Project
UUID: 93f04452-e4fe-41cc-91f9-e475b6d1d69f
TYPE: 381e49cc-a858-4aa2-87f6-e8388e7601b2
apiVersion: 00020000
flags: 00000008
Library visualizer
Visualizer / The Android Open Source Project
UUID: d069d9e0-8329-11df-9168-0002a5d5c51b
TYPE: e46b26a0-dddd-11db-8afd-0002a5d5c51b
apiVersion: 00020000
flags: 00000008
Library reverb
Insert Preset Reverb / NXP Software Ltd.
UUID: 172cdf00-a3bc-11df-a72f-0002a5d5c51b
TYPE: 47382d60-ddd8-11db-bf3a-0002a5d5c51b
apiVersion: 00020000
flags: 00000048
Auxiliary Preset Reverb / NXP Software Ltd.
UUID: f29a1400-a3bb-11df-8ddc-0002a5d5c51b
TYPE: 47382d60-ddd8-11db-bf3a-0002a5d5c51b
apiVersion: 00020000
flags: 00000001
Insert Environmental Reverb / NXP Software Ltd.
UUID: c7a511a0-a3bb-11df-860e-0002a5d5c51b
TYPE: c2e5d5f0-94bd-4763-9cac-4e234d06839e
apiVersion: 00020000
flags: 00000048
Auxiliary Environmental Reverb / NXP Software Ltd.
UUID: 4a387fc0-8ab3-11df-8bad-0002a5d5c51b
TYPE: c2e5d5f0-94bd-4763-9cac-4e234d06839e
apiVersion: 00020000
flags: 00000001
Library bundle
Volume / NXP Software Ltd.
UUID: 119341a0-8469-11df-81f9-0002a5d5c51b
TYPE: 09e8ede0-ddde-11db-b4f6-0002a5d5c51b
apiVersion: 00020000
flags: 00000050
Equalizer / NXP Software Ltd.
UUID: ce772f20-847d-11df-bb17-0002a5d5c51b
TYPE: 0bed4300-ddd6-11db-8f34-0002a5d5c51b
apiVersion: 00020000
flags: 00000048
Virtualizer / NXP Software Ltd.
UUID: 1d4033c0-8557-11df-9f2d-0002a5d5c51b
TYPE: 37cc2c00-dddd-11db-8577-0002a5d5c51b
apiVersion: 00020000
flags: 00000250
Dynamic Bass Boost / NXP Software Ltd.
UUID: 8631f300-72e2-11df-b57e-0002a5d5c51b
TYPE: 0634f220-ddd4-11db-a0fc-0002a5d5c51b
apiVersion: 00020000
flags: 00000248
Clients:
pid: 2404
Notification Clients:
pid: 1755
pid: 1765
pid: 2404
pid: 4551
pid: 5872
Global session refs:
session pid count
9 2404 1
Hardware status: 0
Standby Time mSec: 3000
Output thread 0xae003d40 type 0 (MIXER):
Thread name: AudioOut_D
I/O handle: 13
TID: 1823
Standby: yes
Sample rate: 44100 Hz
HAL frame count: 2720
HAL format: 0x1 (pcm16)
HAL buffer size: 10880 bytes
Channel count: 2
Channel mask: 0x00000003 (front-left, front-right)
Processing format: 0x1 (pcm16)
Processing frame size: 4 bytes
Pending config events: none
Output device: 0x2 (SPEAKER)
Input device: 0 (NONE)
Audio source: 0 (default)
Normal frame count: 2720
Last write occurred (msecs): 2540304
Total writes: 4459
Delayed writes: 0
Blocked in write: no
Suspend count: 0
Sink buffer : 0xae054000
Mixer buffer: 0xae072000
Effect buffer: 0xae057000
Fast track availMask=0xfe
Standby delay ns=3000000000
AudioStreamOut: 0xae548150 flags 0x2 (PRIMARY)
Frames written: 12128480
Suspended frames: 0
Hal stream dump:
Thread throttle time (msecs): 1037
AudioMixer tracks: 0x00000001
Master mono: off
FastMixer not initialized
Stream volumes in dB: 0:-5.9, 1:-6, 2:0, 3:0, 4:0, 5:0, 6:0, 7:-6, 8:-6, 9:0, 10:0, 11:0, 12:0
Normal mixer raw underrun counters: partial=0 empty=0
1 Tracks of which 0 are active
Name Active Client Type Fmt Chn mask Session fCount S F SRate L dB R dB Server Main buf Aux Buf Flags UndFrmCnt
0 no 2404 1 00000001 00000003 9 4512 S 1 48000 -inf -inf 0005B6E0 0xae054000 0x0 0x600 0
0 Effect Chains
USB audio module:
No output streams.
No input streams.
Reroute submix audio module:
route[0] rate in=0 out=0, addr=[]
route[1] rate in=0 out=0, addr=[]
route[2] rate in=0 out=0, addr=[]
route[3] rate in=0 out=0, addr=[]
route[4] rate in=0 out=0, addr=[]
route[5] rate in=0 out=0, addr=[]
route[6] rate in=0 out=0, addr=[]
route[7] rate in=0 out=0, addr=[]
route[8] rate in=0 out=0, addr=[]
route[9] rate in=48000 out=48000, addr=[]
3. 查看ALSA PCM设备
要查看当前系统中的ALSA PCM设备,使用以下命令:
XXX:/data/data # cat /proc/asound/pcm
00-00: SUNXI-CODEC sun8iw11codec-0 : : playback 1 : capture 1
4. 列出所有声卡
要查看系统中所有的声卡,使用以下命令:
XXX:/data/data # cat /proc/asound/cards
0 [audiocodec ]: audiocodec - audiocodec
audiocodec
1 [fmidi ]: MIDI Gadget - f_midi
MIDI Gadget
5. 使用tinyalsa工具
tinyalsa
是一个用于与ALSA接口交互的工具。要列出所有的混音器控制,比如使用:
XXX:/ # tinymix
Mixer name: 'audiocodec'
Number of controls: 48
ctl type num name value
0 ENUM 1 codec hub mode hub_disable
1 INT 1 digital volume 63
2 INT 1 Headphone volume 59
3 INT 2 LINEIN Mixer volume 3 3
4 INT 1 FM gain volume 3
5 INT 1 LINEIN gain volume 3
6 INT 2 MIC gain volume 3 3
7 INT 1 phoneout volume 3
8 INT 1 MIC1 boost volume 4
9 INT 1 MIC2 boost volume 4
10 INT 1 ADC gain volume 3
11 ENUM 1 MIC2 Mux MIC2IN
12 ENUM 1 HPL Mux DAC
13 ENUM 1 HPR Mux DAC
14 BOOL 1 Phone Out Mixer LOMIX Switch Off
15 BOOL 1 Phone Out Mixer ROMIX Switch Off
16 BOOL 1 Phone Out Mixer MIC2 Boost Switch Off
17 BOOL 1 Phone Out Mixer MIC1 Boost Switch Off
18 BOOL 1 Right Input Mixer LOMIX Switch Off
19 BOOL 1 Right Input Mixer ROMIX Switch Off
20 BOOL 1 Right Input Mixer FMR Switch Off
21 BOOL 1 Right Input Mixer LINEINR Switch Off
22 BOOL 1 Right Input Mixer LINEINLR Switch Off
23 BOOL 1 Right Input Mixer MIC2 Boost Switch On
24 BOOL 1 Right Input Mixer MIC1 Boost Switch Off
25 BOOL 1 Left Input Mixer ROMIX Switch Off
26 BOOL 1 Left Input Mixer LOMIX Switch Off
27 BOOL 1 Left Input Mixer FML Switch Off
28 BOOL 1 Left Input Mixer LINEINL Switch Off
29 BOOL 1 Left Input Mixer LINEINLR Switch Off
30 BOOL 1 Left Input Mixer MIC2 Boost Switch On
31 BOOL 1 Left Input Mixer MIC1 Boost Switch On
32 BOOL 1 Right Output Mixer DACL Switch Off
33 BOOL 1 Right Output Mixer DACR Switch On
34 BOOL 1 Right Output Mixer FMR Switch Off
35 BOOL 1 Right Output Mixer LINEINR Switch Off
36 BOOL 1 Right Output Mixer LINEINLR Switch Off
37 BOOL 1 Right Output Mixer MIC2 Boost Switch Off
38 BOOL 1 Right Output Mixer MIC1 Boost Switch Off
39 BOOL 1 Left Output Mixer DACR Switch Off
40 BOOL 1 Left Output Mixer DACL Switch On
41 BOOL 1 Left Output Mixer FML Switch Off
42 BOOL 1 Left Output Mixer LINEINL Switch Off
43 BOOL 1 Left Output Mixer LINEINLR Switch Off
44 BOOL 1 Left Output Mixer MIC2 Boost Switch Off
45 BOOL 1 Left Output Mixer MIC1 Boost Switch Off
46 BOOL 1 Headphone Switch On
47 BOOL 1 Phoneout Speaker Switch Off
6. 查看音频相关日志
使用logcat
工具,可以查看与系统音频相关的日志 是否存在问题报错:
logcat | grep -i audio
7. 查看内核日志
dmesg
命令可以看看内核日志,检查下音频驱动是否存在问题 报错:
dmesg | grep -i audio
总结
通过这个过程,学习了如何使用全志Android平台的 声卡驱动来录制和播放音频,特别是如何使用 MIC1 作为录音输入源,也学习了如何使用 tinyalsa 这个工具来查看和设置声卡参数和设备。
我希望这篇博客对你有所帮助,如果有任何问题或建议,请在评论区留言。谢谢!