Android的Audio系统之二

 

来自《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运行时信息。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值