logo资料库

Android的音频系统.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
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,
分享到:
收藏