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<IAudioTrack> createTrack( // 获得音频输出接口( Track) pid_t pid, int streamType,uint32_t sampleRate, int format,int channelCount, int frameCount, uint32_t flags, const sp<IMemory>& 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<IAudioRecord> 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已经有了成熟的应用。 |
|
来自: techres > 《Android系统》