androidAudio系统.docx

上传人:b****3 文档编号:902312 上传时间:2022-10-13 格式:DOCX 页数:13 大小:179.56KB
下载 相关 举报
androidAudio系统.docx_第1页
第1页 / 共13页
androidAudio系统.docx_第2页
第2页 / 共13页
androidAudio系统.docx_第3页
第3页 / 共13页
androidAudio系统.docx_第4页
第4页 / 共13页
androidAudio系统.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

androidAudio系统.docx

《androidAudio系统.docx》由会员分享,可在线阅读,更多相关《androidAudio系统.docx(13页珍藏版)》请在冰豆网上搜索。

androidAudio系统.docx

androidAudio系统

Audio系统

----李昊天

包括三方面的内容:

1,AudioRecord和AudioTrack,对外提供API类,分别完成音频数据的采集和输出。

2,AudioFlinger,工作引擎,管理音频流的输入输出,音频数据的混音读写Audio硬件等。

3,AudioPolicyService,策略控制中心,声音设备的选择和切换,音量控制等。

--AudioTrack

工作流程如下所示(java层)

1,根据音频数据的特性来确定缓冲区的最小size:

AudioTrack.getMinBufferSize(

intsampleRateInHz,//采样率

intchannelConfig,//声道数

intaudioFormat//采样精度

2,AudioTrack构造

newAudioTrack(intstreamType,//音频流类型

intsampleRateInHz,

intchannelConfig,

intaudioFormat,

intbufferSizeInBytes,//前面获取的缓冲大小

intmode//数据加载模式

说明1:

数据加载模式两种

MODE_STREAM:

通过write一次次把音频数据写到AudioTrack中;

MODE_STATIC:

在play之前把所有数据通过一次write传递到AudioTrack的内部缓冲区中,适合内存占用小,延时要求高的文件。

说明2;常见的流类型,定义于AudioManager

STREAM_ALARM;警告声

STREAM_MUSIC:

音乐声

STREAM_RING;铃声

STREAM_SYSTEM:

系统声音

STREAM_VOCIE_CALL;通话声

----AudioTrackde的构造流程图

说明1:

native_setup对应于jni层的

Android_media_AudioTrack_native_setup,主要工作:

1,进行一些信息查询;

2,java层的值和jni层的值转换,java层的streamType转换为native层的streamType。

streamType定义于AudioSystem:

DEFAULT默认

VOICE_CALL通话声

SYSTEM系统声

RING来电铃声

MUSIC音乐声

……

3,AudiotrackJniStorage对象,保存一些信息,与共享内存有关。

AT与AF见的数据传递就是通过共享内存的方式来完成的。

STATIC模式用该对象的allocSharedMem(intsizeInBytes)创建共享内存,STREAM模式下共享内存由AF创建。

4,调用native层的set(…)函数。

说明2:

native层的set(…)函数:

1,调用AudioSystem:

:

getOutput(…)根据流类型等参数获取合适的工作线程,并返回该线程的索引号。

工作线程由AudioFlinger创建,后面细讲。

2,调用createTrack(…)

说明3:

createTrack(…):

1,得到AudioFlinger的Binder代理端;

2,调用得到的audioFlinger的createTrack(…),该函数得到track的同时还创建了共享内存cblk;

3,对上述的共享内存做处理,在这个共享内存的首部中加入audio_track_cblk_t对象。

1)audio_track_cblk_t对象声明在AudioTrackShared.h,定义在AudioTrack.cpp中。

2)该对象加与共享内存的首部用来控制AT和AF生产和消费数据的步伐

 

----开始播放play(),调用jni层的start(),jni层的start()在调用native层的start(),最终会调用AudioFlinger的AudioFlinger:

:

PlaybackThread:

:

Track:

:

start(),后文细讲。

----调用write()写数据,最终会调用android_media_AudioTrack.cpp的writeToTrack(),接着如果是STREAM模式的话,就调用native层的AudioTrack的write(),而在STATIC模式下,直接把数据memcpy到共享内存。

STREAM模式下的流程图如下:

----调用release()释放相关资源

总结一下AudioTrack与AudioFlinger交互的流程图:

--AudioFlinger

1,构造函数

2,AudioFlinger:

:

createTrack(…)图解

这样就返回了一个track并创建了一个共享内存。

图中的client对象是AudioFlinger对客户端的封装。

3,下面是AudioFlinger中几个重要的工作线程:

PlaybackThread:

回放线程,音频输出。

有一个mOutput为AudioStreamOutput类型,说明它直接与音频的输出设备建立了联系;

MixerThread:

继承了PlaybackThread,混音线程,将多个源的音频数据混音后在输出;

DirectOutputThread:

直接输出线程;

DuplicatingThread:

多线程输出,继承了MixerThread,可以把混音的数据写到多个输出中。

4,工作线程的创建过程,跟AudioPolicyService有关:

AudioFlinger创建线程收到了AudioPolicyService的控制。

5,start()分析:

其中AudioMixer:

:

process()解析如下:

process()过程:

调用getNextBuffer得到刻度缓冲;数据处理,即混音;调用releaseBuffer释放数据缓冲。

6,stop()

7,audio_track_cblk_t对象

将线性缓冲巧妙地变为了环形缓冲

关键变量user----当前读位置

Server-----当前写位置

userBase,serverBase配合user,server

---AudioPolicyService

1,AudioPolicyInterface主要提供了一些设备切换管理和音量控制的借口,每个厂商有各自的实现方式,Audio系统提供了一个通用的实现类AudioPolicyManagerBase。

2,AudioSystem定义了一些重要的类型,比如音频流类型,音频设备等:

1)streamtype(音频流类型)

如DEFAULT默认

VOICE_CALL通话声

SYSTEM系统声

RING来电铃声

……

2)audiomode(声音模式)和电话的状态有直接的关系

如MODE_NOMAL正常,既不打电话,也不接电话

MODE_RINGTONE有来电

MODE_IN_CALL通话状态

……

3)forceuse和config强制使用及配置

强制使用某种设备由forced_config控制

FORCE_NONE

FORCE_SPEAKER强制使用扬声器

FORCE_HEADPHONE强制使用耳机

……

在什么情况下需要强制使用由force_use控制

FOR_COMMUNICATION通话情况

FOR_MEDIA媒体相关情况

……

4)输出设备的定义audio_devices

DEVICE_OUT_EARPIECE=0x1听筒

DEVICE_OUT_SPEAKER=0x2扬声器

DEVICE_OUT_WIRED_HEADSET=0x4耳机

DEVICE_OUT_WIRED_HEADPHONE=0x8另一种耳机

……

编号规律1,10,100,1000…便于对设备号的&,|操作

3,AudioPolicyManagerBase

实现了AudioPolicyInterface

回顾:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1