Android-Audio-代码路径说明

Android Audio 代码路径详解

整体架构图

┌─────────────────────────────────────────────────────────────┐
│                   应用层 (Applications)                      │
├─────────────────────────────────────────────────────────────┤
│  Java Media Framework (android.media.*)                    │
├─────────────────────────────────────────────────────────────┤
│  JNI 桥接层 (android_media_*)                             │
├─────────────────────────────────────────────────────────────┤
│  C++ Media Framework (libmedia, libaudioclient)           │
├─────────────────────────────────────────────────────────────┤
│  音频服务层 (AudioFlinger, AudioPolicyService)            │
├─────────────────────────────────────────────────────────────┤
│  Audio HAL (Hardware Abstraction Layer)                   │
├─────────────────────────────────────────────────────────────┤
│  Linux 内核 (ALSA, tinyalsa, sound driver)                │
└─────────────────────────────────────────────────────────────┘

详细代码路径说明

1. Java Framework 层 (应用API)

路径: frameworks/base/media/java/android/media/

文件/目录说明
AudioTrack.java音频播放主类,管理PCM数据播放
AudioRecord.java音频录制主类,管理PCM数据采集
AudioManager.java音频系统管理,音量、设备、焦点控制
AudioSystem.java音频系统属性设置和查询
AudioAttributes.java音频属性定义(用途、内容类型等)
AudioDeviceInfo.java音频设备信息
AudioFormat.java音频格式定义(编码、采样率等)
AudioPlaybackConfiguration.java播放配置管理
AudioRecordingConfiguration.java录制配置管理

示例调用:

// 应用层代码
AudioTrack track = new AudioTrack.Builder()
    .setAudioAttributes(new AudioAttributes.Builder()
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build())
    .setAudioFormat(new AudioFormat.Builder()
        .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
        .setSampleRate(44100)
        .setChannelMask(AudioFormat.CHANNEL_OUT_STEREO)
        .build())
    .build();
track.play();

2. JNI 桥接层

路径: frameworks/base/core/jni/

文件对应的Java类功能
android_media_AudioTrack.cppAudioTrack连接Java AudioTrack和C++ AudioTrack
android_media_AudioRecord.cppAudioRecord连接Java AudioRecord和C++ AudioRecord
android_media_AudioSystem.cppAudioSystem系统音频属性JNI
android_media_AudioManager.cppAudioManager音频管理JNI
android_media_AudioDeviceAttributes.cppAudioDeviceInfo设备信息JNI

关键代码流:

Java AudioTrack.write() 
    → android_media_AudioTrack.cpp 的 write() 
    → C++ AudioTrack::write()

3. Native Client 层 (C++ API)

路径: frameworks/av/media/libaudioclient/

文件功能
AudioTrack.cppC++ AudioTrack实现,应用直接调用
AudioRecord.cppC++ AudioRecord实现
AudioSystem.cppC++ AudioSystem实现
AudioEffect.cpp音频效果处理
MonoPipe.cpp/Pipe.cpp音频管道工具

特点:

  • 提供C++接口给Native应用
  • 通过Binder与AudioFlinger通信
  • 实现音频数据缓冲和传输

4. 核心服务层 (AudioFlinger)

路径: frameworks/av/services/audioflinger/

audioflinger/
├── AudioFlinger.h/cpp          # 主服务入口,管理所有音频线程
├── Threads.h/cpp               # 音频线程基类和派生类
│   ├── PlaybackThread         # 播放线程基类
│   ├── MixerThread           # 混音播放线程
│   ├── DirectOutputThread    # 直接输出线程
│   ├── OffloadThread         # 硬件解码线程
│   ├── DuplicatingThread     # 复制线程(录音/A2DP)
│   └── RecordThread          # 录制线程
├── Tracks.h/cpp               # 音频轨道管理
├── AudioMixer.h/cpp           # 混音器实现
├── Effects.h/cpp              # 音频效果框架
├── StateQueue.h/cpp           # 状态队列
├── FastCapture.h/cpp          # 快速录制
├── FastMixer.h/cpp            # 快速混音
└── AudioHwDevice.h/cpp       # 音频硬件设备封装

线程类型对比:

线程类型用途延迟特性
MixerThread普通音频混音标准延迟 (~50ms)
FastMixer低延迟音频低延迟 (<20ms)
DirectOutputThread独占输出(如通话)低延迟
OffloadThread硬件解码输出低功耗
DuplicatingThread多路输出(录音)标准延迟

5. 策略服务层 (AudioPolicyService)

路径: frameworks/av/services/audiopolicy/

audiopolicy/
├── AudioPolicyService.h/cpp    # 策略服务入口
├── managerdefault/            # 默认策略实现
│   ├── AudioPolicyManager.h/cpp
│   └── AudioPolicyManagerDefault.cpp
├── engine/                    # 策略引擎
│   ├── Interface/            # 引擎接口
│   ├── common/               # 公共组件
│   ├── config/               # 配置管理
│   └── default/              # 默认引擎
├── common/                    # 公共工具
├── service/                   # 服务管理
└── Engine.h/cpp               # 策略引擎基类

主要功能:

  • 设备选择策略
  • 音量曲线管理
  • 音频焦点管理
  • 策略配置文件解析
  • 动态策略切换

6. Audio HAL 接口定义

路径: hardware/libhardware/include/hardware/

文件功能
audio.h主音频HAL接口定义
audio_policy.h音频策略HAL接口
audio_effects.h音频效果HAL接口

关键结构体:

// 音频HAL主要接口
struct audio_hw_device {
    struct hw_device_t common;
    
    // 必须实现的函数
    int (*open_output_stream)(...);
    int (*close_output_stream)(...);
    int (*open_input_stream)(...);
    int (*close_input_stream)(...);
    
    // 音频控制函数
    int (*set_parameters)(...);
    char* (*get_parameters)(...);
    
    // 更多功能...
};

7. 厂商HAL实现路径

路径示例:

# Qualcomm平台
hardware/qcom/audio/
├── hal/                    # HAL实现
├── legacy/                # 旧版HAL
└── post_proc/             # 后处理

# 设备特定
device/<vendor>/<device>/audio/
├── hal/                   # 设备特定HAL
└── configs/              # 音频配置文件

8. 系统定义和配置文件

路径: system/media/audio/include/system/

文件内容
audio.h音频系统核心定义(C API)
audio-base.h基础音频类型定义
audio_effect.h音频效果定义
audio_policy.h音频策略定义

路径: system/media/audio_utils/include/

文件功能
audio_utils/音频工具库
fifo/FIFO缓冲区实现
format/格式转换工具

9. 音频效果框架

路径: frameworks/av/media/libeffects/

libeffects/
├── factory/               # 效果工厂
│   └── EffectsFactory.c
├── lvm/                  # Loudness Maximizer
│   ├── lib/              # 库文件
│   └── bundle/           # 效果包
├── preprocessing/        # 预处理效果
│   ├── Include/         # 头文件
│   └── src/             # 源码
└── libs/                 # 效果库
    └── reverb/          # 混响效果

10. 音频工具和测试

路径: frameworks/av/media/libaudioclient/tests/

测试文件测试内容
AudioTrackTests.cppAudioTrack功能测试
AudioRecordTests.cppAudioRecord功能测试
AudioEffectTests.cpp音频效果测试

路径: frameworks/av/media/mtp/

工具功能
audioserver音频服务进程
media.log音频日志工具

关键配置文件路径

1. 音频策略配置

# 通用配置
/system/etc/audio_policy_configuration.xml
/system/etc/audio_policy_volumes.xml
/system/etc/audio_policy_volumes_drc.xml

# 设备特定配置
/vendor/etc/audio_policy_configuration.xml
/vendor/etc/audio_effects.xml

2. 效果配置文件

/system/etc/audio_effects.conf
/vendor/etc/audio_effects.conf
/data/misc/audio_effects/  # 用户效果配置

编译系统配置

路径: frameworks/av/services/audioflinger/Android.bp

cc_library_shared {
    name: "libaudioflinger",
    srcs: [
        "AudioFlinger.cpp",
        "Threads.cpp",
        "Tracks.cpp",
        // ...
    ],
    shared_libs: [
        "libaudioclient",
        "libmedia",
        "libcutils",
        // ...
    ],
    // ...
}

调试和日志

1. 日志标签

# 常用日志过滤
adb logcat -s AudioFlinger
adb logcat -s AudioPolicyManager
adb logcat -s AudioTrack
adb logcat -s AudioRecord
adb logcat -s audio_hw_primary
adb logcat -s audio_policy

2. 调试工具

# 音频调试工具
tinymix          # 混音器控制
tinyplay         # 音频播放
tinycap          # 音频录制
alsa_amixer      # ALSA混音器
alsa_aplay       # ALSA播放
alsa_arecord     # ALSA录制

# 系统工具
dumpsys media.audio_flinger  # AudioFlinger状态
dumpsys media.audio_policy   # AudioPolicy状态
dumpsys audio                # 音频系统状态

代码流程示例

音频播放完整流程:

1. App → AudioTrack.java (Java)
2. AudioTrack.write() → android_media_AudioTrack.cpp (JNI)
3. android_media_AudioTrack_write() → AudioTrack.cpp (C++)
4. AudioTrack::obtainBuffer() → AudioTrack::write() (libaudioclient)
5. AudioTrack::createTrackI() → IAudioFlinger.createTrack() (Binder IPC)
6. AudioFlinger.createTrack() (services/audioflinger)
7. AudioFlinger::PlaybackThread::createTrack_l()
8. AudioFlinger::MixerThread::prepareTracks_l()
9. AudioFlinger::AudioMixer::process()
10. PlaybackThread::threadLoop_write()
11. AudioStreamOut::write() (HAL)
12. audio_hw_device::out_write() (厂商HAL)
13. tinyalsa/ALSA驱动写入

常见问题定位路径

问题类型建议查看路径
无声/杂音AudioFlinger Threads.cpp, HAL实现
音频延迟FastMixer.cpp, audio_hw.cpp
设备切换失败AudioPolicyManager.cpp, 策略配置
音量问题AudioPolicyManager音量曲线, audio_policy_volumes.xml
录音问题RecordThread.cpp, 输入设备配置
音效失效Effects.cpp, audio_effects.conf

这个代码路径结构反映了Android音频系统的模块化设计,每个层级都有明确的职责边界,便于维护和扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值