【网学网提醒】:以下是网学会员为您推荐的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部分的接口。AudioFlinger(libaudioflinger.so):frameworks/base/libs/audioflinger这部分内容被编译成库libaudioflinger.so。
Audio的JNI部分:frameworks/base/core/jniAudio的JAVA部分:frameworks/base/media/java/android/media主要包含AudioManager和Audio系统的几个类。Audio硬件抽象层的接口:hardware/libhardware_legacy/include/hardware/
第二部分Audio系统和上层接口2.1Audio系统的各个层次2.2media库中的Audio框架部分2.3AudioFlinger本地代码2.4Audio系统的JNI代码2.5Audio系统的Java代码2.1Audio系统的各个层次Audio系统的结构:?libmedia.so提供Audio接口,这些Audio接口既向上层开放,也向本地代码开发。?libaudiofilnger.so提供Audio接口实现。?Audio硬件抽象层提供到硬件的接口,供AudioFlinger调用。?Audio使用JNI和JAVA对上层提供接口。
2.2media库中的Audio框架部分Android的Audio的核心框架在media库中提供,其中对上面主要实现AudioSystem、AudioTrack和AudioRecorder三个类。提供了IAudioFlinger类接口,在这个类中,可以获得IAudioTrack和IAudioRecorder两个接口,分别用于声音的播放和录制。AudioTrack和AudioRecorder分别通过调用IAudioTrack和IAudioRecorder来实现。
Audio系统的头文件Audio(路径为:frameworks/base/include/media/):AudioSystem.hIAudioFlinger.hAudioTrack.hIAudioTrack.hAudioRecorder.h
IAudioRecorder.hIxxx的接口通过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和AudioRecord
er.h是对上层提供的接口,它们既供本地
程序调用(例如声音的播放器、录制器等),也可以通过JNI向Java层提供接口。AudioTrack和AudioRecorder都具有start,stop和pause等接口。前者具有write接口,用于声音的播放,后者具有read接口,用于声音的录制。AudioSystem用于Audio系统的控制工作,主要包含一些set和get接口,是一个对上层的类。
AudioSystem.h:AudioSystemclassAudioSystem{public:enumstream_type{//Audio流的类型SYSTEM=1,RING=2,MUSIC=3,ALARM=4,NOTIFICATION=5,BLUETOOTH_SCO=6,ENFORCED_AUDIBLE=7,NUM_STREAM_TYPES};enumaudio_output_type{//Audio数据输出类型//……省略部分内容};enumaudio_format{//Audio数据格式FORMAT_DEFAULT=0,PCM_16_BIT,PCM_8_BIT,INVALID_FORMAT};
enumaudio_mode{//Audio模式//……省略部分内容};enumaudio_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,};staticstatus_tsetMasterVolume(floatvalue);staticstatus_tsetMasterMute(boolmute);staticstatus_tgetMasterVolume(float*volume);staticstatus_tgetMasterMute(bool*mute);staticstatus_tsetStreamVolume(intstream,floatvalue);staticstatus_tsetStreamMute(intstream,boolmute);staticstatus_tgetStreamVolume(intstream,float*volume);staticstatus_tgetStreamMute(intstream,bool*mute);staticstatus_tsetMode(intmode);staticstatus_tgetMode(int*mode);staticstatus_tsetRouting(intmode,uint32_troutes,uint32_tmask);staticstatus_tgetRouting(intmode,uint32_t*routes);//……省略部分内容};
2.3AudioFlinger本地代码
Audio是AudioFlinger系统的中间层,其代码的路径为:frameworks/base/libs/audioflingerAudioFlinger的核心文件是AudioFlinger.h和AudioFlinger.cpp,提供了类AudioFlinger,这个类是一个IAudioFlinger的实现。
AudioFlinger的实现:
classAudioFlinger:publicBnAudioFlinger,publicIBinder::DeathRecipient{public://……省略部分内容virtualsp
createTrack(//获得音频输出接口(Track)pid_tpid,intstreamType,uint32_tsampleRate,intformat,intchannelCount,intframeCount,uint32_tflags,constsp&;sharedBuffer,status_t*status);//……省略部分内容virtualstatus_tsetMasterVolume(floatvalue);virtualstatus_tsetMasterMute(boolmuted);virtualstatus_tsetStreamVolume(intstream,floatvalue);
virtualstatus_tsetStreamMute(intstream,boolmuted);virtualstatus_tsetRouting(intmode,uint32_troutes,uint32_tmask);virtualuint32_tgetRouting(intmode)const;virtualstatus_tsetMode(intmode);virtualintgetMode()const;virtualspopenRecord(//获得音频输出接口(Record)pid_tpid,intstreamType,uint32_tsampleRate,intformat,intchannelCount,intframeCount,uint32_tflags,s
tatus_t*status);
2.4Audio系统的JNI代码Audio的JNI部分的代码的路径为:frameworks/base/core/jni实现的几个文件为:android_media_AudioSystem.cppandroid_media_AudioTrack.cppandroid_media_AudioRecord.cpp主要提供三个类的支持:android.media.AudioSystemandroid.media.AudioTrackandroid.media.AudioRecorder2.5Audio系统的JAVA代码Audio的JAVA部分的代码的路径为:frameworks/base/media/java/android/media实现了以下的几个类:android.media.AudioSystemandroid.media.AudioTrackandroid.media.AudioRecorderandroid.media.AudioFormatandroid.media.AudioManager第三部分Audio的硬件抽象层Audio的硬件抽象层可以是AudioFlinger和Audio硬件的接口。可以基于Linux标准的Alsa或OSS实现,也可以基于私有的Audio驱动接口来实现。Audio的硬件抽象层的代码路径为:hardware/libhardware_legacy/include/hardware/其中主要的文件为:AudioHardwareBase.hAudioHardwareInterface.h
在AudioHardwareInterface.h中定义了类:AudioStreamOutAudioStreamInAudioHardwareInterface在AudioHardwareInterface.h中定义了类:AudioHardwareBase,它继承AudioHardwareInterface,这是实现Audio硬件抽象层的主要接口。Audio的硬件抽象层AudioStreamOut和AudioStreamIn接口:classAudioStreamOut{public:virtual~AudioStreamOut()=0;virtualstatus_tsetVolume(floatvolume)=0;virtualssize_twrite(constvoid*buffer,size_tbytes)=0;/*......*/};classAudioStreamIn{public:virtual~AudioStreamIn()=0;virtualstatus_tsetGain(floatgain)=0;virtualssize_tread(void*buffer,ssize_tbytes)=0;/*......*/};Audio的硬件抽象层AudioHardwareInterface类:classAudioHardwareInterface{public:virtualstatus_tinitCheck()=0;virtualstatus_tsetVoiceVolume(floatvolume)=0;virtualstatus_tsetMasterVolume(floatvolume)=0;virtualstatus_tsetRouting(intmode,uint32_troutes)=0;virtualstatus_tgetRouting(intmode,uint32_t*routes)=0;virtualstatus_tsetMode(intmode)=0;virtualstatus_tgetMode(int*mode)=0;/*......*/virtualAudioStreamOut*openOutputStream(intformat=0,
intchannelCount=0,uint32_tsampleRate=0,status_t*status=0)=0;virtualAudioStreamIn*openInputStream(intformat,intchannelCount,uint32_tsampleRate,status_t*status,AudioSystem::audio_in_acousticsacoustics)=0;staticAudioHardwareInterface*create();};在AudioFlinger的实现中,以下几个文件提供了Audio系统的通用实现:?AudioHardwareGeneric.cpp?AudioHardwareStub.cpp?AudioDumpInterface.cpp这些代码将编译成静态库libaudiointerface.so,这作为Audio系统的通用实现来完成。实际的Audio硬件抽象层,通常可以基于Linux中的OSS驱动程序和ALSA驱动程序来实现。基于OSS的硬件抽象层的实现类似AudioGeneric的实现,但是增加了控制接口。基于ALSA的硬件抽象层的实现需要构建于用户空间的ALSA库上,目
前在Android已经有了成熟的应用。