Android的Audio系统之二

转载 2012年03月21日 12:09:52
 

来自《Android系统原理及开发要点详解》一书

7.2.2  media库中的Audio框架部分

AndroidAudio系统的核心框架在media库中提供,对上面主要实现AudioSystemAudioTrackAudioRecorder三个类。

提供了IAudioFlinger类接口,在这个类中,可以获得IAudioTrackIAudioRecorder两个接口,分别用于声音的播放和录制。AudioTrackAudioRecorder分别通过调用IAudioTrackIAudioRecorder来实现。

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

meida库中Audio部分的结构如图7-2所示。

7-2  meida库中Audio部分的结构


从功能上看,AudioSystem负责的是Audio系统的综合管理功能,而AudioTrackAudioRecorder分别负责音频数据的输出和输入,即播放和录制。

AudioSystem.h中主要定义了一些枚举值和set/get等一系列接口,如下所示:

  1. class AudioSystem  
  2. {  
  3. public:  
  4. enum stream_type {                      // Audio 流的类型
  5.         SYSTEM          = 1,  
  6.         RING            = 2,  
  7.         MUSIC           = 3,  
  8.         ALARM           = 4,  
  9.         NOTIFICATION    = 5,  
  10.         BLUETOOTH_SCO   = 6,  
  11.         ENFORCED_AUDIBLE = 7,  
  12.         NUM_STREAM_TYPES  
  13.     };  
  14. enum audio_output_type {            // Audio数据输出类型
  15. // …… 省略部分内容
  16. };
  17. enum audio_format {                 // Audio数据格式
  18.         FORMAT_DEFAULT = 0,  
  19.         PCM_16_BIT,  
  20.         PCM_8_BIT,  
  21.         INVALID_FORMAT  
  22.     };  
  23. enum audio_mode {                       // Audio模式
  24. // …… 省略部分内容
  25. };
  26. enum audio_routes {                 // Audio 路径类型
  27.         ROUTE_EARPIECE         = (1 << 0),  
  28.         ROUTE_SPEAKER          = (1 << 1),  
  29.         ROUTE_BLUETOOTH_SCO  = (1 << 2),  
  30.         ROUTE_HEADSET           = (1 << 3),  
  31.         ROUTE_BLUETOOTH_A2DP  = (1 << 4),  
  32.         ROUTE_ALL                 = -1UL,  
  33.     };  
  34. // …… 省略部分内容
  35. static status_t setMasterVolume(float value);  
  36. static status_t setMasterMute(bool mute);  
  37. static status_t getMasterVolume(float* volume);  
  38. static status_t getMasterMute(bool* mute);  
  39. static status_t setStreamVolume(int stream, float value);  
  40. static status_t setStreamMute(int stream, bool mute);  
  41. static status_t getStreamVolume(int stream, float* volume);  
  42. static status_t getStreamMute(int stream, bool* mute);  
  43. static status_t setMode(int mode);  
  44. static status_t getMode(int* mode);  
  45. static status_t setRouting(int mode,
  46. uint32_t routes, uint32_t mask);  
  47. static status_t getRouting(int mode, uint32_t* routes);  
  48. // …… 省略部分内容
  49. };
复制代码


Audio系统的几个枚举值中,audio_routes是由单独的位来表示的,而不是由顺序的枚举值表示,因此这个值在使用过程中可以使用""的方式。例如,表示声音可以既从耳机(EARPIECE)输出,也从扬声器(SPEAKER)输出,这样是否能实现,由下层提供支持。在这个类中,set/get等接口控制的也是相关的内容,例如Audio声音的大小、Audio的模式、路径等。

AudioTrackAudio输出环节的类,其中最重要的接口是write(),主要的函数如下所示。

  1. class AudioTrack  
  2. {  
  3.     typedef void (*callback_t)(int event,  void* user, void *info);  
  4.     AudioTrack( int streamType,  
  5.              uint32_t sampleRate  = 0,       // 音频的采样律
  6.              int format           = 0,       //音频的格式(例如8位或者16位的PCM)
  7.              int channelCount     = 0,       // 音频的通道数
  8.              int frameCount       = 0,       // 音频的帧数
  9.              uint32_t flags = 0,  callback_t cbf = 0,  void* user = 0,  int notificationFrames = 0);

  10.     void        start();  
  11.     void        stop();  
  12.     void        flush();  
  13.     void        pause();  
  14.     void        mute(bool);  
  15.     ssize_t     write(const
  16.     void* buffer, size_t size);  
  17.     // …… 省略部分内容
  18. }
复制代码


AudioRecordAudio输入环节的类,其中最重要的接口为read(),主要的函数如下所示。.

  1. class AudioRecord  
  2. {  
  3. public:  
  4.         AudioRecord(int streamType,  uint32_t sampleRate  = 0,       // 音频的采样律
  5.                 int format           = 0,       // 音频的格式(例如8位或者16位的PCM)
  6.                 int channelCount     = 0,       // 音频的通道数
  7.                 int frameCount       = 0,       // 音频的帧数
  8.                 uint32_t flags      = 0,  
  9.                 callback_t cbf = 0,  
  10.                 void* user = 0,  
  11.                 int notificationFrames = 0);  
  12.         status_t    start();  
  13.         status_t    stop();  
  14.         ssize_t     read(void* buffer, size_t size);  
  15.                 // …… 省略部分内容
  16. }
复制代码


AudioTrackAudioRecordread/write函数的参数都是内存的指针及其大小,内存中的内容一般表示的是Audio的原始数据(PCM数据)。这两个类还涉及Auido数据格式、通道数、帧数目等参数,可以在建立时指定,也可以在建立之后使用set()函数进行设置。

libmedia库中提供的只是一个Audio系统框架,AudioSystemAudioTrackAudioRecord分别调用下层的IAudioFlingerIAudioTrackIAudioRecord来实现。另外的一个接口是IAudioFlingerClient,它作为向IAudioFlinger中注册的监听器,相当于使用回调函数获取IAudioFlinger运行时信息。

相关文章推荐

Android Audio System 之二:AudioFlinger

引言     AudioFlinger是Android音频系统的两大服务之一,另一个服务是AudioPolicyService,这两大服务都在系统启动时有MediaSever加载,加载的代码位于:...

Android Audio System 之二:AudioFlinger

引言    AudioFlinger是Android音频系统的两大服务之一,另一个服务是AudioPolicyService,这两大服务都在系统启动时有MediaSever加载,加载的代码位于:fra...

Android Audio System 之二:AudioFlinger

引言     AudioFlinger是Android音频系统的两大服务之一,另一个服务是AudioPolicyService,这两大服务都在系统启动时有MediaSever加载,加载的代码位于:fr...

三星平台 android audio 架构探讨点滴积累之二

今天基本调完了android 3G 通话功能,各种情况的下的audio path 切换,音量调整等一系列功能。但是音质还不是很好,模拟干扰比较多,有待改善。       先说一下电话 audio p...

Android Audio System 之二:AudioFlinger

引言     AudioFlinger是Android音频系统的两大服务之一,另一个服务是AudioPolicyService,这两大服务都在系统启动时有 MediaSever加载,加载的代码位...

Android Audio System 之二:AudioFlinger

引言     AudioFlinger是Android音频系统的两大服务之一,另一个服务是AudioPolicyService,这两大服务都在系统启动时有MediaSever加载,加载的代码位于:...

Android Audio System 之二 AudioFlinger

引言     AudioFlinger是Android音频系统的两大服务之一,另一个服务是AudioPolicyService,这两大服务都在系统启动时有MediaSever加载,加载的代码位于:...

android Audio OverView之二(hal)

下面开始进入hal篇, 如图,是某平台的音频硬件架构图,下面开始解释一下: 在HAL层有一套软件解码和音效处理的code,在LPE中也就是硬件Dsp内部同样有一套 硬解码的逻辑,这种逻辑是专门为A...
  • fuxy3
  • fuxy3
  • 2017-06-18 22:35
  • 59

Android -- Audio系统之AudioTrack内部实现简析(二)

Android -- Audio系统之AudioTrack内部实现简析(二) 在上一篇博文中,我们主要分析了Audio系统所依赖的Native服务的启动过程;说是启动,其实也就是分析它的初始化流程...

【转】Android的Audio系统(二)

Android的Audio系统(二)转自 http://hi.baidu.com/offt/blog/item/8dc38af115667fd80b46e0f4.html1.3 Audio的硬件抽象层...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)