《2022年Android的Audio系统 .pdf》由会员分享,可在线阅读,更多相关《2022年Android的Audio系统 .pdf(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Android的 Audio 系统第一部分 Audio 系统综述第二部分 Audio 系统和上层接口第三部分 Audio 的硬件抽象层第一部分 Audio 系统综述Audio系统在 Android 中负责音频方面的数据流传输和控制功能,也负责音频设备的管理。Audio系统主要的分成几个层次:1. media 中库提供的 Audio系统的上层接口2. AudioFlinger作为Audio系统的中枢3. Audio 库的硬件抽象层提供底层的支持4. Audio 接口通过 JNI和Java框架提供给上层Audio系统的上层接口主要提供了两方面的功能:放音(Track)和录音( Recorder )
2、。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - Media库(libmedia.so)的Audio部分的目录中:frameworks/base/include/media/ frameworks/base/media/libmedia/ 这部分的内容被编译成库libmedia.so,提供 Audio部分的接口。Audio Flinger (libaudioflinger.so):frameworks/base/libs/aud
3、ioflinger 这部分内容被编译成库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、.4 Audio 系统的 JNI代码2.5 Audio系统的 Java 代码2.1 Audio 系统的各个层次Audio系统的结构: libmedia.so提供Audio接口,这些 Audio接口既向上层开放,也向本地代码开发。 libaudiofilnger.so提供Audio接口实现。 Audio 硬件抽象层提供到硬件的接口,供AudioFlinger 调用。 Audio 使用 JNI 和 JAVA对上层提供接口。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页
5、 - - - - - - - - - 2.2 media 库中的 Audio框架部分Android 的Audio的核心框架在 media库中提供,其中对上面主要实现AudioSystem、AudioTrack 和AudioRecorder 三个类。提供了 IAudioFlinger类接口,在这个类中,可以获得IAudioTrack 和IAudioRecorder 两个接口,分别用于声音的播放和录制。AudioTrack 和AudioRecorder 分别通过调用 IAudioTrack 和IAudioRecorder 来实现。名师资料总结 - - -精品资料欢迎下载 - - - - - - -
6、 - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - Audio 系统的头文件(路径为:frameworks/base/include/media/) : AudioSystem.h IAudioFlinger.h AudioTrack.h IAudioTrack.h AudioRecorder.h 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - -
7、- - - IAudioRecorder.h Ixxx 的接口通过 AudioFlinger 来实现,其他接口通过JNI向上层提供接口。Audio系统的头文件在 frameworks/base/include/media/目录中,主要的头文件如下:AudioSystem.h :media库的Audio部分对上层的总管接口; IAudioFlinger.h:需要下层实现的总管接口; AudioTrack.h :放音部分对上接口; IAudioTrack.h:放音部分需要下层实现的接口; AudioRecorder.h :录音部分对上接口; IAudioRecorder.h:录音部分需要下层实现的
8、接口。IAudioFlinger.h、IAudioTrack.h和IAudioRecorder.h这三个接口通过下层的继承来实现(即AudioFlinger)。AudioFlinger.h,AudioTrack.h 和AudioRecorder.h 是对上层提供的接口,它们既供本地程序调用(例如声音的播放器、录制器等),也可以通过JNI向Java层提供接口。AudioTrack 和AudioRecorder 都具有 start,stop 和pause等接口。前者具有 write 接口,用于声音的播放,后者具有 read接口,用于声音的录制。AudioSystem用于Audio系统的控制工作,主
9、要包含一些 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数据格式FORM
10、AT_DEFAULT = 0, PCM_16_BIT, PCM_8_BIT, INVALID_FORMAT ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - enum audio_mode / Audio模式/ 省略部分内容 ; enum audio_routes / Audio 路径类型ROUTE_EARPIECE = (1 0), ROUTE_SPEAKER = (1 1), ROUTE_BLUETOOTH_SCO = (
11、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
12、, 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_
13、t routes, uint32_t mask); static status_t getRouting(int mode, uint32_t* routes); / 省略部分内容; 2.3 AudioFlinger本地代码Audio 是AudioFlinger系统的中间层,其代码的路径为:frameworks/base/libs/audioflingerAudioFlinger的核心文件是 AudioFlinger.h和AudioFlinger.cpp,提供了类 AudioFlinger,这个类是一个IAudioFlinger的实现。AudioFlinger的实现:class AudioFl
14、inger : 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 setM
15、asterVolume(float value); virtual status_t setMasterMute(bool muted); virtual status_t setStreamVolume(int stream, float value); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - - - virtual status_t setStreamMute(int stream, bool muted); virtual
16、 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 frame
17、Count, 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 Audi
18、o 系统的 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实现,
19、也可以基于私有的Audio驱动接口来实现。Audio的硬件抽象层的代码路径为:hardware/libhardware_legacy/include/hardware/ 其中主要的文件为:AudioHardwareBase.h AudioHardwareInterface.h 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - - - - - - 在AudioHardwareInterface.h中定义了类:AudioStreamOut AudioSt
20、reamIn 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(c
21、onst 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 sta
22、tus_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 statu
23、s_t getMode(int* mode) = 0; /*. . */ virtual AudioStreamOut* openOutputStream( int format=0, 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - - - - - - int channelCount=0, uint32_t sampleRate=0, status_t *status=0) = 0; virtual AudioStreamIn* openInpu
24、tStream( 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 已经有了成熟的应用。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -