hardware/libhardware_legacy/include/hardware_legacy/AudioHardwareInterface.h
要想视频底层的音频设备必须要继承该文件中定义的AudioStreamOut,AudioStreamIn,AudioHardwareInterface等类,并实现createAudioHardware函数。
下面我们看一下Android创建音频设备的代码,代码位于:
frameworks/base/libs/audioflinger/AudioHardwareInterface.cpp
该文件有如下代码:
AudioHardwareInterface*AudioHardwareInterface::create()
{
/*
*FIXME:This code needs to instantiate thecorrect audio device
*interface.For now-we use compile-timeswitches.
*/
AudioHardwareInterface*hw=0;
char value[PROPERTY_VALUE_MAX];
#ifdef GENERIC_AUDIO
hw=new AudioHardwareGeneric();
#else
//if running in emulation-use the emulatordriver
if(property_get("ro.kernel.qemu",value,0)){
LOGD("Running in emulation-usinggeneric audio driver");
hw=new AudioHardwareGeneric();
}
else{
LOGV("Creating Vendor Specific AudioHardware");
hw=createAudioHardware();
}
#endif
if(hw->initCheck()!=NO_ERROR){
LOGW("Using stubbed audio hardware.Nosound will be produced.");
delete hw;
hw=new AudioHardwareStub();
}
#ifdef WITH_A2DP
hw=new A2dpAudioInterface(hw);
#endif
#ifdef ENABLE_AUDIO_DUMP
//This code adds a record of buffers in afile to write calls made by AudioFlinger.
//It replaces the currentAudioHardwareInterface object by an intermediateone which
//will record buffers in a file(aftersending them to hardware)for testing purpose.
//This feature is enabled by definingsymbol ENABLE_AUDIO_DUMP.
//The output file is set withsetParameters("test_cmd_file_opening PCM dump
interface");
hw=new AudioDumpInterface(hw);//replaceinterface
#endif
return hw;
}
从代码中我们可以看出如果定义了GENERIC_AUDIO的宏,则会创建
AudioHardwareGeneric,如果是模拟器的话,AudioHardwareGeneric会不能初始化,进而创建AudioHardwareStub。这两个类都是Audio设备的适配层,是Android默认提供的模拟器都是用AudioHardwareStub,不会有声音输出设备都是用AudioHardwareGeneric,因为默认GENERIC_AUDIO是设置的一般我们只关心AudioHardwareGeneric实现,谁会去给模拟器去调试声音呢,反正我没这个闲心。首先说明一下这个音频适配层是Android自带的,可以保证你的音频设备正常运行,但是不能发挥设备的最佳性能。通过后面的描述你将会了解AudioHardwareGeneric的定义位于:
frameworks/base/libs/audioflinger/AudioHardwareGeneric.cpp
查看源码你会发现这个适配层需要实现设备/dev/eac,并且该设备只输出44.1khz采样率的音频数据给/dev/eac设备,如果不是44.1khz的采样率的数据,AudioHardwareGeneric会经过Resample过程把它转换成44.1kHZ的音频数据,然后再输出给音频设备。44.1kHZ音频数据是最普遍的音频采样率,大部分Mp3都是以这个采样率压缩的,所以选择这个采样率做为默认采样率还是有一定的合理性的。
AudioHardwareGeneric是软件实现Resample过程是,效率会比较低。很多音频设备支持不同采样率的数据,可以理解成硬件实现Resample过程。通过上面的描述我们可以知道这个通用音频适配层只是让你的设备可以用而已,不能发挥设备的性能优势,如果你的设备对音频质量有更高的要求,必须要自己实现音频适配层。谷歌只能保证你的音频可以播放,但是不能保证效率(他也没有办法保证效率)。
所支持的音频格式
对于播放,Android支持各种各样的音频文件格式和编解码。对于录音的支持少一些,
以后我们学到录音部分将会讨论这点。
AAC:
高级音频编码(以及其扩展:HEAAC)编解码,.m4a,.3gp文件.AAC是一个流行的标准,IPOD和其他便携式媒体播放器都使用它。Android在MPEG4音频文件和3GP文件内(都是基于MPEG4格式)支持这种音频格式。最近AAC的附加规范HE AAC也被支持了。
MP3:
MPGE-1音频层3,.mp3文件。Android支持MP3,MP3可能是使用最广泛的音频编解码,这允许Android通过各种网站和音乐商店来使用大部分在线音频。
AMR:
自适应多速率编解码(AMR-NB,AMR-WB),.3gp,.amr文件。AMR音频编解码已经被标准化了,主要被3GPP(第三代合作伙伴项目)用于语音音频编解码。3GPP是一个为其
合作伙伴创建规范的电信行业机构。换句话说,AMR编解码主要用于现代移动电话的语音呼叫程序,并且手机厂商和手机携带者普遍都支持这个格式。AMR这格式一般对语音编码很有用,但对更复杂的类型表现的不够好,比如音乐。
Ogg:
Ogg Vorbis,.ogg文件。Ogg Vorbis是个开源的,无专利费的音频编解码。其品质可媲美商业性的,需缴纳专利费的编解码比如MP3,AAC它由一群自愿者开发,当前由Xiph.Org基金会负责维护。
PCM:
脉冲编码调制通常被用在WAVE,WAV文件,.wav文件。PCM这技术主要用于音频在电脑和其他电子音频设备上的存储。它通常是个未压缩的音频文件,其数据代表随着时间流逝一段音频的振幅。“采样率”是多长时间一次一个振幅读取被存储起来。“位深度”是指多少位被用来代表一个单独的样本。一段16KHZ采样率,32位位深度的音频数据是指它包含每秒钟