`
isiqi
  • 浏览: 16157599 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Android Audioflinger

阅读更多

一:录制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 audioflinger.pdf

    Android 12 AudioFlinger 分析(RK3588)

    Android 12 AudioFlinger 分析(RK3588)

    Android P Audio系统笔记:AudioPolicy&AudioFlinger初始化

    AudioFlinger和AudioPolicy两者是Android Audio框架层最主要的两个服务,他们两个是Android框架层的本地服务,在init.rc中启动; AudioPolicyManager负责音频策略定制者,说白了就相当于Audio系统的司令。 Audio...

    Android深入浅出之AudioFlinger

    android音频子系统之AudioFlinger深入分析

    Android端AudioTrack以及OpenSL ES结合ffmpeg播放mp3文件

    使用Android端AudioTrack以及OpenSL ES结合ffmpeg播放mp3文件

    Android深入浅出之Audio 第二部分 AudioFlinger分析

    NULL博文链接:https://innost.iteye.com/blog/875435

    AndroidAudio系统概述[参考].pdf

    本系统主要分成四个层次:media库提供的Audio系统本地部分接口、AudioFlinger作为Audio系统的中间层、Audio的硬件抽象层提供底层支持、Audio接口通过JNI和Java框架提供给上层。 Android Audio系统的结构如图7-1所示...

    安卓audio-audioflinger、audiopolicy策略加载

    最全策略加载,一片文档让你熟悉整个安卓audio framework

    Android的Audio系统.pdf

    该系统主要分为四个层次:Media 库提供的 Audio 系统的上层接口、AudioFlinger 作为 Audio 系统的中枢、Audio 库的硬件抽象层提供底层的支持、Audio 接口通过 JNI 和 Java 框架提供给上层。 第一部分:Audio 系统...

    audio上层框架介绍

    IAudioFlinger.cpp是AudioFlinger.cpp给上层提供的接口,降低了耦合性,同样对于AudioPolicyService也是如此。即使AudioFlinger.cpp里面的内容发生变化,只要与IAudioFlinger.cpp预留的接口保持一致,上层的代码就不...

    Android Audio架构全分析PPT学习教案.pptx

    ALSA lib 编译后会生成 libasound.so 库,该库会被 AudioFlinger 动态链接,除此之外,编译后还会生成 alsa lib 配置文件。 五、ALSA 驱动分析 ALSA 驱动是一个运行在内核空间的驱动,负责音频硬件的驱动和控制。...

    Android 9 Audio系统笔记:音频路由实现——从AudioTrack到audiohal

    上一篇介绍了AudioFlinger的初始化,接下来对音频路由进行介绍。注意,本文主要介绍动态路由,即汽车音频路由的常规方式。针对Android原生路由策略不做深入分析。 什么是音频路由?如何实现音频路由?如何定制音频...

    android audio system

    (2)AudioFlinger 作为 Audio 系统的中间层; (3)Audio 的硬件抽象层提供底层支持; (4)Audio 接口通过 JNI 和 Java 框架提供给上层。 Audio 系统的各个层次接口主要提供了两方面功能:放音(Track)和录音(Recorder) 。

    Android音频详解.pdf

    这个文档是我整理别人博客的,写的非常的不错,通俗易懂,相对来说还是比较全面,讲了linux下的声卡,Android音频 , AudioPolicyService, AudioFlinger, AudioTrack这些都有详细的讲解,然后我也做了书签,方便...

    android Audio ALSA框架分析

    从框图中可以看出 android 对于 java 层一共提供 3 个接口,分别 ...AudioFlinger 层相同步,之后调用到 AudioHardware ,其中提供的接口主要 AudioStreamOut以及AudioStreamin。最终将进入Linux内核调用到ALSA。

    Audio Framework.vsdx

    AudioPolicyService和AudioFLinger、AudioPolicyManager、AudioPolicyClient之间的调用关系

    深入理解Android卷一、二、三

    深入理解android卷一、卷二、卷三系统的讲解了Android的启动、Binder、AMS、PWS、AudioFlinger、SurfaceFlinger、WIFI、BT和NFC知识点,适合android进阶的好书。

    android多媒体框架

    android体系结构 媒体层结构 Android-MediaPlayer上层应用程序使用JAVA语言编写,实现逻辑处理;JAVA程序通过调用底层媒体库来实现具体的音视频文件和网络视频播放...通过调用AudioFlinger的接口来实现音频数据的回放;

    基于ALSA的Android音频系统设计与实现

    基于ALSA的Andorid音频系统拥有一个标准和健全的架构,自上而下由Audio应用程序、Audio Java框架层、Audio本地框架层、AudioFlinger、Audio硬件抽象层、alsa-lib和底层Audio驱动几个部分组成。本文分析音频系统架构...

    《深入理解Android》卷Ⅰ

    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 声音路由切换实例分析 ...

Global site tag (gtag.js) - Google Analytics