一:录制audioflinger层和audiorecord。
音频系统的对外接口是AudioRecord,它通过iBinder来远程调用Audioflinger的openRecorder函数。AudioRecord构造函数如下:
1:AudioRecord
AudioRecord::AudioRecord(
int streamType,
uint32_t sampleRate,
int format,
int channelCount,
int frameCount,
uint32_t flags,
callback_t cbf,
void* user,
int notificationFrames)
: mStatus(NO_INIT)
{
log_wj("ENTER IN::--%s---%s---\n",__FILE__,__FUNCTION__);
mStatus = set(streamType, sampleRate, format, channelCount,
frameCount, flags, cbf, user, notificationFrames);
}
调用:
status_t AudioRecord::set(int streamType,
uint32_t sampleRate,
int format,
int channelCount,
int frameCount,
uint32_t flags,
callback_t cbf,
void* user,
int notificationFrames,
bool threadCanCallJava)
{
const sp& audioFlinger = AudioSystem::get_audio_flinger();
//获取缓存大小,间接调用我们修改过该函数(经过三次调用中转),返回值为//channelCount*320
AudioSystem::getInputBufferSize(sampleRate, format, channelCount, &inputBuffSizeInBytes);
//远程调用audioFlinger的openrecord函数,openRecord相当于audioflinger为audioRecord
//开辟相应的服务窗口
sp record = audioFlinger->openRecord(getpid(), streamType,
sampleRate, format,
channelCount,
frameCount,
((uint16_t)flags) << 16,
&status);
//创建一个线程用来处理
mClientRecordThread = new ClientRecordThread(*this, threadCanCallJava);
}
AudioRecord相当于一个代理,它的线程是用来处理其它客户的请求。
2:AudioFlinger
sp AudioFlinger::openRecord(
pid_t pid,
int streamType,
uint32_t sampleRate,
int format,
int channelCount,
int frameCount,
uint32_t flags,
status_t *status)
{
// AudioRecord线程
if (mAudioRecordThread == 0) {
LOGE("Audio record thread not started");
lStatus = NO_INIT;
goto Exit;
}
// add client to list
{ // scope for mLock
Mutex::Autolock _l(mLock);
wclient = mClients.valueFor(pid);
if (wclient != NULL) {
client = wclient.promote();
} else {
client = new Client(this, pid);
mClients.add(pid, client);
}
// create new record track. The record track uses one track in mHardwareMixerThread by //convention.
//生成一个recordTrack用来作为数据的中转(audioflinger与audiorecord之间)。
//他们使用audio_track_cblk_t数据结构来传输数据。
recordTrack = new MixerThread::RecordTrack(mHardwareMixerThread, client, streamType, sampleRate, format, channelCount, frameCount, flags);
if (recordTrack->getCblk() == NULL) {
recordTrack.clear();
lStatus = NO_MEMORY;
goto Exit;
}
// return to handle to client------我们的audiorecord。
recordHandle = new RecordHandle(recordTrack);
}
AudioRecord和AudioFlinger操作的都是RecordTrack实例,AudioRecord通过它的执行控制操作(start/stop)和读取操作(read)。Audiorecord的start/stop操作可以理解为一个开关,控制的是AudiorecordThread的运行与否。
Audioflinger则负责从音频设备读取数据放置到
audio_track_cblk_t数据结构中。
二:硬件抽象层
分享到:
相关推荐
android audioflinger.pdf
Android 12 AudioFlinger 分析(RK3588)
AudioFlinger和AudioPolicy两者是Android Audio框架层最主要的两个服务,他们两个是Android框架层的本地服务,在init.rc中启动; AudioPolicyManager负责音频策略定制者,说白了就相当于Audio系统的司令。 Audio...
android音频子系统之AudioFlinger深入分析
使用Android端AudioTrack以及OpenSL ES结合ffmpeg播放mp3文件
NULL博文链接:https://innost.iteye.com/blog/875435
本系统主要分成四个层次:media库提供的Audio系统本地部分接口、AudioFlinger作为Audio系统的中间层、Audio的硬件抽象层提供底层支持、Audio接口通过JNI和Java框架提供给上层。 Android Audio系统的结构如图7-1所示...
最全策略加载,一片文档让你熟悉整个安卓audio framework
该系统主要分为四个层次:Media 库提供的 Audio 系统的上层接口、AudioFlinger 作为 Audio 系统的中枢、Audio 库的硬件抽象层提供底层的支持、Audio 接口通过 JNI 和 Java 框架提供给上层。 第一部分:Audio 系统...
IAudioFlinger.cpp是AudioFlinger.cpp给上层提供的接口,降低了耦合性,同样对于AudioPolicyService也是如此。即使AudioFlinger.cpp里面的内容发生变化,只要与IAudioFlinger.cpp预留的接口保持一致,上层的代码就不...
ALSA lib 编译后会生成 libasound.so 库,该库会被 AudioFlinger 动态链接,除此之外,编译后还会生成 alsa lib 配置文件。 五、ALSA 驱动分析 ALSA 驱动是一个运行在内核空间的驱动,负责音频硬件的驱动和控制。...
上一篇介绍了AudioFlinger的初始化,接下来对音频路由进行介绍。注意,本文主要介绍动态路由,即汽车音频路由的常规方式。针对Android原生路由策略不做深入分析。 什么是音频路由?如何实现音频路由?如何定制音频...
(2)AudioFlinger 作为 Audio 系统的中间层; (3)Audio 的硬件抽象层提供底层支持; (4)Audio 接口通过 JNI 和 Java 框架提供给上层。 Audio 系统的各个层次接口主要提供了两方面功能:放音(Track)和录音(Recorder) 。
这个文档是我整理别人博客的,写的非常的不错,通俗易懂,相对来说还是比较全面,讲了linux下的声卡,Android音频 , AudioPolicyService, AudioFlinger, AudioTrack这些都有详细的讲解,然后我也做了书签,方便...
从框图中可以看出 android 对于 java 层一共提供 3 个接口,分别 ...AudioFlinger 层相同步,之后调用到 AudioHardware ,其中提供的接口主要 AudioStreamOut以及AudioStreamin。最终将进入Linux内核调用到ALSA。
AudioPolicyService和AudioFLinger、AudioPolicyManager、AudioPolicyClient之间的调用关系
深入理解android卷一、卷二、卷三系统的讲解了Android的启动、Binder、AMS、PWS、AudioFlinger、SurfaceFlinger、WIFI、BT和NFC知识点,适合android进阶的好书。
android体系结构 媒体层结构 Android-MediaPlayer上层应用程序使用JAVA语言编写,实现逻辑处理;JAVA程序通过调用底层媒体库来实现具体的音视频文件和网络视频播放...通过调用AudioFlinger的接口来实现音频数据的回放;
基于ALSA的Andorid音频系统拥有一个标准和健全的架构,自上而下由Audio应用程序、Audio Java框架层、Audio本地框架层、AudioFlinger、Audio硬件抽象层、alsa-lib和底层Audio驱动几个部分组成。本文分析音频系统架构...
7.3.2 通过流程分析AudioFlinger 7.3.3 audio_track_cblk_t分析 7.3.4 关于AudioFlinger的总结 7.4 AudioPolicyService的破解 7.4.1 AudioPolicyService的创建 7.4.2 重回AudioTrack 7.4.3 声音路由切换实例分析 ...