android官方博客,Android的Audio系统 - gowyz的专栏 - CSDN博客

7016668_1.gif 

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)。

7016668_2.gif

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对上层提供接口。

7016668_3.gif

2.2 media库中的Audio框

架部分

Android的Audio的核心框架在media库中提供,其中对上面主要实现AudioSystem、AudioTrack和AudioRecorder三个类。提供了IAudioFlinger类接口,在这个类中,可以获得IAudioTrack和IAudioRecorder两个接口,分别用于声音的播放和录制。AudioTrack和AudioRecorder分别通过调用IAudioTrack和IAudioRecorder来实现。

7016668_4.gif

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,

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已经有了成熟的应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值