Android的Audio系统

2023-05-16

转自:http://blog.csdn.net/gowyz/article/details/6019314


Android的Audio 系统

第一部分 Audio系统综述

第二部分 Audio系统和上层接口

第三部分 Audio的硬件抽象层

第一部分 Audio系统综述

Audio系统在Android中负责音频方面的数据流传输和控制功能,也负责音频设备的管理。

Audio系统主要的分成几个层次:

1. media中库提供的Audio系统的上层接口

2. AudioFlinger作为Audio系统的中枢

3. Audio库的硬件抽象层提供底层的支持

4. Audio接口通过JNIJava框架提供给上层

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

 

AudioJNI部分:

frameworks/base/core/jni

AudioJAVA部分:

frameworks/base/media/java/android/media

主要包含AudioManagerAudio系统的几个类。

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.hmedia库的Audio部分对上层的总管接口;

 IAudioFlinger.h:需要下层实现的总管接口;

 AudioTrack.h:放音部分对上接口;

 IAudioTrack.h:放音部分需要下层实现的接口;

 AudioRecorder.h:录音部分对上接口;

 IAudioRecorder.h:录音部分需要下层实现的接口。

IAudioFlinger.hIAudioTrack.hIAudioRecorder.h这三个接口通过下层的继承来实现(即AudioFlinger)。

AudioFlinger.hAudioTrack.hAudioRecorder.h是对上层提供的接口,它们既供本地程序调用(例如声音的播放器、录制器等),也可以通过JNIJava层提供接口。

 

AudioTrack和AudioRecorder 都具有startstoppause等接口。前者具有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<IAudioTrack> createTrack( // 获得音频输出接口( Track)

pid_t pid, int streamType,uint32_t sampleRate,

int format,int channelCount, int frameCount,

uint32_t flags, const sp<IMemory>& 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<IAudioRecord> 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代码

AudioJNI部分的代码的路径为:

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代码

AudioJAVA部分的代码的路径为:

frameworks/base/media/java/android/media

实现了以下的几个类:

android.media.AudioSystem

android.media.AudioTrack

android.media.AudioRecorder

android.media.AudioFormat

android.media.AudioManager

 

第三部分 Audio的硬件抽象层

Audio的硬件抽象层可以是AudioFlingerAudio硬件的接口。可以基于Linux标准的AlsaOSS实现,也可以基于私有的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已经有了成熟的应用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android的Audio系统 的相关文章

随机推荐

  • 国标PS流打包和RTP发送代码

    这个国标PS流打包 封包的代码来自于互联网 xff0c QuickGBLink在原先代码基础上做了一些改进 因为代码来自于别人的成果 xff0c 基于互联网知识分享的精神 xff0c 我们打算将其开源 xff0c 希望能对更多学习和开发国标
  • 国标PS流解包(解封装)代码

    该代码最初的版本来自于互联网 xff0c 首先感谢前辈无私分享的精神 xff0c 这个PS流解析代码小巧和可读性好 xff0c 是学习PS格式的一个很好的参考例子 但原来的代码有不少Bug xff0c QuickGBLink在原先代码基础上
  • 错误./hello: error while loading shared libraries: libQtGui.so.4: cannot open shared object file:

    之前一直想在ARM 上跑qt xff0c 但都出现错误 xff1a hello error while loading shared libraries libQtGui so 4 cannot open shared object fil
  • linux eth0设置

    命令行设定IP地址 ifconfig eth0 192 168 1 12 将eth0IP设置为192 168 1 12 ifconfig eth0 up 使eth0使能 如果开发板与路由器连接 xff0c 并且路由器能够自动分配IP地址 x
  • printk打印不能显示到终端的解决方法

    printk与printf有个不同的地方 xff0c 就是printk有打印级别 使用printk时 xff0c Linux内核根据日志级别 xff0c 可能把消息打印到当前控制台上 xff0c 这个控制台是一个字符设备 这些消息从终端输出
  • qt socket通信中接收client发送是十六进制数据包

    在QT的服务端接收客户端发送的十六进制收据包 xff0c 经转换后显示在LineEdit上 xff0c 并把接收到的数据包转化为char 类型 xff0c 为后期数据处理做准备 recbuf在头文件类中一定义 xff1a QByteArra
  • 两个双口ram之间数据的传递

    1 如果两个双口ram数据位宽相同 xff0c 则采用时钟快的ram等待时钟慢的ram来完成从一个ram中读取数据并存储到另一个ram中 xff1b 例如从ram A中读取数据到ram xff22 中 xff0c xff52 xff41 x
  • + - 与>> <<运算优先级

    43 运算符的优先级高于 lt lt gt gt 位移运算符 span class hljs keyword int span mian span class hljs keyword int span a 61 span class hl
  • linux col 过滤控制字符

    参考http blog 51cto com jim123 1833502 使用过Unix系统的人肯定会知道man帮助的功能强大 xff0c 是官方的帮助文档 xff0c 我们平时可以通过它来查询不知道如何使用的命令或者查询linux的系统C
  • gcc 参数

    gcc gcc与 g 43 43 分别是GNU的C与 C 43 43 的编译器 xff0c 在编译工作中分4步 xff1a 1 预处理 xff0c 生成 i文件 2 编译器 xff0c 编译后停下来 xff0c 生成 o的目标文件 3 汇编
  • gdb 调试

    原文http linuxtools rst readthedocs io zh CN latest tool gdb html span class hljs variable span span class hljs number 1 s
  • Linux-C语言 网络TCP单次通信、多次通信、多线程通信逐步实现

    一 TCP通信 xff0c 只发送一次就结束程序 功能描述 xff1a 1 服务端一次只能连接一个客户端 2 客户端只能向服务端发送一次消息 xff0c 消息返回后客户端和服务器程序结束 3 客户端向服务端发送一个字符串 xff0c 服务端
  • 奇偶校验通俗易懂

    简介 xff1a 奇偶校验是奇校验和偶校验的统称 xff0c 就是在最低位或最高位添加一个校验位 xff0c 应用于主存储器信息的校验及字节传输的出错校验 原理 xff1a 奇校验 连同校验位使得所有位上的1相加为奇数 偶校验 xff1a
  • Ubuntu系统rosdep update报错的解决办法(2022.10.3亲测有效)

    目录 一 问题 xff1a Ubuntu22 04系统下面 xff0c rosdep update总是报错 二 方法一一道来 1 直接访问raw githubusercontent com是不行的 按照网上的解决办法先把ip地址找到 xff
  • Socket通信实验总结

    在实验设计的过程中遇到了不少困难 xff0c 先是服务器监听时怎么保持已有的socket 连接 xff0c 又能接受新的连接 在此用了 C 的 Dictionary lt string Socket gt socketDic 61 new
  • [Excel]Excel函数和用法(4)——查找字符串,SEARCH和FIND函数

    区别 xff1a SEARCH大小写不敏感 xff0c FIND大小写敏感 作用 xff1a 都是从左到右返回搜索到的字符串的起始位置 SEARCH语法 xff1a SEARCH find text within text start nu
  • Error: L6200E: Symbol B_DisCnctRelayTime multiply defined (by cdma_gps_hc.o and main.o).

    现象 xff1a 最近调试MDK的程序 xff0c 老是报这样的错误 L6200E Symbol B DisCnctRelayTime multiply defined by cdma gps o and main o 记录下来 xff1a
  • STM32 ADC用到的 抗脉冲滤波算法

    先介绍一下算法的基本思想 xff1a 在一组采样值中 xff0c 去掉 abandonMaxNum 个最大数据 xff0c 去掉 abandonMinNum 个最小数据 xff0c 余下的数据求平均值 函数功能 xff1a 抗脉冲滤波法 输
  • STM32使用内部振荡器及其和外部晶体振荡器的区别

    转自 xff1a http blog csdn net meic51 article details 8778518 在STM32上如果不使用外部晶振 xff0c OSC IN和OSC OUT的接法 如果使用内部RC振荡器而不使用外部晶振
  • Android的Audio系统

    转自 xff1a http blog csdn net gowyz article details 6019314 Android的Audio 系统 第一部分 Audio 系统综述 第二部分 Audio 系统和上层接口 第三部分 Audio