Android的Audio系统
Android的Audio系统
第一部分Audio系统综述
第二部分Audio系统和上层接口
第三部分Audio的硬件抽象层
第一部分Audio系统综述
Audio系统在Android中负责音频方面的数据流传输和控制功能,也负责音频设备的管
理。
Audio系统主要的分成几个层次:
1. media中库提供的Audio系统的上层接口
2. AudioFlinger作为Audio系统的中枢
3. Audio库的硬件抽象层提供底层的支持
4. Audio接口通过JNI和Java框架提供给上层
Audio系统的上层接口主要提供了两方面的功能:放音(Track)和录音(Recorder)。
Media库(libmedia.so)的Audio部分的目录中:
frameworks/base/include/media/
frameworks/base/media/libmedia/
这部分的内容被编译成库libmedia.so,提供Audio部分的接口。
Audio
Flinger (libaudioflinger.so):
frameworks/base/libs/audioflinger
这部分内容被编译成库libaudioflinger.so。
Audio的JNI部分:
frameworks/base/core/jni
Audio的JAVA部分:
frameworks/base/media/java/android/media
主要包含AudioManager和Audio系统的几个类。
Audio硬件抽象层的接口:
hardware/libhardware_legacy/include/hardware/
第二部分Audio系统和上层接口
2.1 Audio系统的各个层次
2.2 media库中的Audio框
架部分
2.3 AudioFlinger本地代码
2.4 Audio系统的JNI代
码
2.5 Audio系统的Java代码
2.1 Audio系统的各个层次
Audio系统的结构:
libmedia.so提供Audio接口,这些Audio接口既向上层开放,也向本地代码开发。
libaudiofilnger.so提供Audio接口实现。
Audio硬件抽象层提供到硬件的接口,供AudioFlinger调用。
Audio使用JNI和JAVA对上层提供接口。
2.2 media库中的Audio框
架部分
Android的Audio的核心框架在media库中提供,其中对上面主要实现AudioSystem、AudioTrack和AudioRecorder三个类。提供了IAudioFlinger类接口,在这个类中,可以获得IAudioTrack和IAudioRecorder两个接口,分别用于声音的播放和录制。AudioTrack和AudioRecorder分别通过调用IAudioTrack和IAudioRecorder来实现。
Audio系统的头文件
(路径为:frameworks/base/include/media/):
AudioSystem.h
IAudioFlinger.h
AudioTrack.h
IAudioTrack.h
AudioRecorder.h
IAudioRecorder.h
Ixxx的接口通过AudioFlinger来实现,其他接口通过JNI向上层提供接口。
Audio系统的头文件在frameworks/base/include/media/目录中,主要的头文件如下:
AudioSystem.h:media库的Audio部分对上层的总管接口;
IAudioFlinger.h:需要下层实现的总管接口;
AudioTrack.h:放音部分对上接口;
IAudioTrack.h:放音部分需要下层实现的接口;
AudioRecorder.h:录音部分对上接口;
IAudioRecorder.h:录音部分需要下层实现的接口。
IAudioFlinger.h、IAudioTrack.h和IAudioRecorder.h这三个接口通过下层的继承来实现
(即AudioFlinger)。
AudioFlinger.h,AudioTrack.h和AudioRecorder.h是对上层提供的接口,它们既供本
地程序调用(例如声音的播放器、录制器等),也可以通过JNI向Java层提供接口。
AudioTrack和AudioRecorder都具有start,stop和pause等接口。前者具有write接口,用于声音的播放,后者具有read接口,用于声音的录制。AudioSystem用于Audio系统的控制工作,主要包含一些set和get接口,是一个对上层的类。
AudioSystem.h:
class
AudioSystem
{
public:
enum
stream_type { // Audio流的类型
SYSTEM = 1,
RING = 2,
MUSIC = 3,
ALARM = 4,
NOTIFICATION =
5,
BLUETOOTH_SCO =
6,
ENFORCED_AUDIBLE
= 7,
NUM_STREAM_TYPES
};
enum
audio_output_type { // Audio数据输出类型
//……省略部分内容};
enum
audio_format { // Audio数据格式
FORMAT_DEFAULT =
0,
PCM_16_BIT,
PCM_8_BIT,
INVALID_FORMAT
};
enum audio_mode { // Audio模式
//……省略部分内容};
enum
audio_routes { // Audio路径类型
ROUTE_EARPIECE =
(1 << 0),
ROUTE_SPEAKER =
(1 << 1),
ROUTE_BLUETOOTH_SCO
= (1 << 2),
ROUTE_HEADSET =
(1 << 3),
ROUTE_BLUETOOTH_A2DP
= (1 << 4),
ROUTE_ALL =
-1UL,
};
static status_t
setMasterVolume(float value);
static status_t
setMasterMute(bool mute);
static status_t
getMasterVolume(float* volume);
static status_t
getMasterMute(bool* mute);
static status_t
setStreamVolume(int stream, float value);
static status_t
setStreamMute(int stream, bool mute);
static status_t
getStreamVolume(int stream, float* volume);
static status_t
getStreamMute(int stream, bool* mute);
static status_t
setMode(int mode);
static status_t
getMode(int* mode);
static status_t
setRouting(int mode, uint32_t routes, uint32_t mask);
static status_t
getRouting(int mode, uint32_t* routes);
//……省略部分内容
};
2.3 AudioFlinger本地代码
Audio是AudioFlinger系统的中间层,其代码的路径为:
frameworks/base/libs/audioflinger
AudioFlinger的核心文件是AudioFlinger.h和AudioFlinger.cpp,提供了类AudioFlinger,这个类是一个IAudioFlinger的实现。
AudioFlinger的实现:
class
AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient
{
public: //……省略部分内容
virtual
sp createTrack( //获得音频输出接口(Track)
pid_t pid, int
streamType,uint32_t sampleRate,
int format,int
channelCount, int frameCount,
uint32_t flags,
const sp& sharedBuffer,
status_t
*status);
//……省略部分内容
virtual
status_t setMasterVolume(float value);
virtual
status_t setMasterMute(bool muted);
virtual
status_t setStreamVolume(int stream, float value);
virtual
status_t setStreamMute(int stream, bool muted);
virtual
status_t setRouting(int mode, uint32_t routes, uint32_t mask);
virtual
uint32_t getRouting(int mode) const;
virtual
status_t setMode(int mode);
virtual int
getMode() const;
virtual
sp openRecord( //获得音频输出接口(Record)
pid_t pid,int
streamType, uint32_t sampleRate,
int format, int
channelCount,int frameCount,
uint32_t
flags,status_t *status);
2.4 Audio系统的JNI代
码
Audio的JNI部分的代码的路径为:
frameworks/base/core/jni
实现的几个文件为:
android_media_AudioSystem.cpp
android_media_AudioTrack.cpp
android_media_AudioRecord.cpp
主要提供三个类的支持:
android.media.AudioSystem
android.media.AudioTrack
android.media.AudioRecorder
2.5 Audio系统的JAVA代
码
Audio的JAVA部分的代码的路径为:
frameworks/base/media/java/android/media
实现了以下的几个类:
android.media.AudioSystem
android.media.AudioTrack
android.media.AudioRecorder
android.media.AudioFormat
android.media.AudioManager
第三部分Audio的硬件抽象层
Audio的硬件抽象层可以是AudioFlinger和Audio硬件的接口。可以基于Linux标准的Alsa或OSS实现,也可以基于私有的Audio驱动接口来实现。
Audio的硬件抽象层的代码路径为:
hardware/libhardware_legacy/include/hardware/
其中主要的文件为:
AudioHardwareBase.h
AudioHardwareInterface.h
在AudioHardwareInterface.h中定义了类:
AudioStreamOut
AudioStreamIn
AudioHardwareInterface
在AudioHardwareInterface.h中定义了类:
AudioHardwareBase,它继承AudioHardwareInterface,
这是实现Audio硬件抽象层的主要接口。
Audio的硬件抽象层AudioStreamOut和AudioStreamIn接口:
class
AudioStreamOut {
public:
virtual
~AudioStreamOut() = 0;
virtual status_t
setVolume(float volume) = 0;
virtual ssize_t
write(const void* buffer, size_t bytes) = 0;
/*... ... */
};
class
AudioStreamIn {
public:
virtual
~AudioStreamIn() = 0;
virtual status_t
setGain(float gain) = 0;
virtual ssize_t
read(void* buffer, ssize_t bytes) = 0;
/*... ... */
};
Audio的硬件抽象层AudioHardwareInterface类:
class
AudioHardwareInterface
{
public:
virtual status_t
initCheck() = 0;
virtual status_t
setVoiceVolume(float volume) = 0;
virtual status_t
setMasterVolume(float volume) = 0;
virtual status_t
setRouting(int mode, uint32_t routes) = 0;
virtual status_t
getRouting(int mode, uint32_t* routes) = 0;
virtual status_t
setMode(int mode) = 0;
virtual status_t
getMode(int* mode) = 0;
/*... ... */
virtual
AudioStreamOut* openOutputStream(
int format=0,
int
channelCount=0,
uint32_t
sampleRate=0,
status_t
*status=0) = 0;
virtual
AudioStreamIn* openInputStream(
int format,
int channelCount,
uint32_t
sampleRate,
status_t *status,
AudioSystem::audio_in_acoustics
acoustics) = 0;
static
AudioHardwareInterface* create();
};
在AudioFlinger的实现中,以下几个文件提供了Audio系统的通用实现:
AudioHardwareGeneric.cpp
AudioHardwareStub.cpp
AudioDumpInterface.cpp
这些代码将编译成静态库libaudiointerface.so,这作为Audio系统的通用实现来完成。
实际的Audio硬件抽象层,通常可以基于Linux中的OSS驱动程序和ALSA驱动程序来实现。
基于OSS的硬件抽象层的实现类似AudioGeneric的实现,但是增加了控制接口。
基于ALSA的硬件抽象层的实现需要构建于用户空间的ALSA库上,目前在Android已经有了成熟的应用。