在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 这个工具来查看和设置声卡参数和设备。
我希望这篇博客对你有所帮助,如果有任何问题或建议,请在评论区留言。谢谢!