Android 音频数据流(2): 从 AudioTrack 到 ALSA 驱动 正如上文所说,上层部件每创建一个 `AudioTrack` 实例,都会有一个 `Track` 实例相应被构造出来。上层部件调用 `AudioTrack::write()` 写入 **匿名共享内存(AshMem)** 的音频数据,会在这个 `Track` 实例中被读取出来,随后,该 `Track` 实例会被加入到 `PlaybackThread` 的成员变量 `mTracks` 中,对应的音频数据也会在 `AudioFlinger` 中作混音处理。当 `AudioTrack::start()` 被调用后,
Android 音频数据流(1): 从 MediaPlayer 到 AudioTrack 从上方时序图可以看出,`media_server` 进程启动时,`NuPlayerFactory` 实例被创建和添加到 `MediaPlayerFactory` 中。之后,当 APP 依次调用 `setDataSource()`、`prepare()` 和 `start()` 接口时,分别主要发生了这些事情:+ 调用 `setDataSource()` —— 创建对应的具体 `Source` 类实例、创建并配置 `BufferMonitor`;+ 调用 `prepare()` —— 创建对应的 `E
State Machine Compiler 用法:使用 SMC 工具自动生成状态机代码 SMC (State Machine Compiler) 目前还没有正式中文名,这里把它意译成 状态机生成器,其主要作者是 Charles W. Rapp。状态机生成器实际上早在 2000 年左右就由 Robert C. Martin (他还有个网名叫 Uncle Bob) 创造出来了,现在一般把他发明的状态机生成器称作 OSMC (Original State Machine Compiler)。Charles 曾经是 Robert 的同事,在后者离职后,前者接手了 OSMC 的维护工作[1]。本文介
在 QNAP(威联通)NAS 上自动查找和删除 重复文件 的方法 ### 0. 前言看到很多人说在 QNAP NAS 上使用 `fdupes` 工具只能实现查找重复文件的效果,要删除文件只能对照生成的重复文件列表手动操作。这个说法其实是不对的,`fdupes` 完全支持自动去重功能。以下正文说明了使用 `fdupes` 工具自动查找并删除重复文件的详细步骤。---### 1. 安装 fdupesQNAP NAS 没有官方的去重工具,需要先手动下载并安装 `fdupes` 软件。`fdupes` 是一款用于文件去重的开源工具([代码仓库](https://
AudioRecord 中的 Java、JNI 和 Native 关系浅析 在 Android 系统中,JNI 作为沟通 Java 和 Native 层的桥梁,从设计角度看,属于 代理模式(Proxy pattern) 的一种。它要求每一个使用 JNI 的组件,比如 AudioRecord、AudioSystem 等,都必须实现同一套接口,即都要在各自的 JNI 源文件中填充结构体数组 JNINativeMethod gMethods[],并在该数组中写明各个函数调用的映射关系。各组件的 JNI 源文件位于目录 frameworks/base/core/jni/ 下,文件命名风
Android 整包编译至 Linux Kernel 时失败并提示 .config 配置错误的解决方法 更新本地 Android 代码后,对 out/ 目录执行了 clean 操作,并重新编译整包。编译到 Kernel 时失败,报错信息如下:CHECK KERNEL DEFCONFIG FATAL ERROR :Kernel config copied from kernel/config-lts/v4.9/bxt/android/x86_64_defconfig has some config issue.Final '.config' and '.config.old' differ. This
Android 8.1 从零开始写 HAL -- (5) 添加执行权限 Android 上使用 SELinux 来管理权限。 尽管在上一篇文章[《Android 8.1 从零开始写 HAL – (4) 编译与打包》](https://blog.csdn.net/Qidi_Huang/article/details/107434111)中, demoComponent HAL 已经成功编译且打包到系统镜像中,但到目前为止还没有被赋予访问 Binder 的权限。所以我们至少会看到,在将 demoService 注册为 Binder 服务时,日志中会打印类似下方的提示:```t
Android 8.1 从零开始写 HAL -- (4) 编译与打包 对于 demoComponent HAL,在上一篇文章[《Android 8.1 从零开始写 HAL – (3) 实现 Bp、Bn 端》](https://blog.csdn.net/Qidi_Huang/article/details/107428286)中,我们已经编写好了 demoService 代码、Bp 端代码和 Bn 端代码。现在来着手把源码编译成可执行文件和库,并且将它们打包进系统镜像中。---#### 一、编写 Makefile **这里说的 Makefile 是指 `Andr
Android 8.1 从零开始写 HAL -- (3) 实现 Bp、Bn 端 既然 Binder 化的 HAL 依赖于 Binder 机制进行实现,那么我们自然必须按照 Binder 框架,相应编写 demoComponent HAL 的 Bp 端和 Bn 端。只有这样,才能打通客户端进程调用到服务端进程 —— 我们的 demoService —— 的通路。
Android 8.1 从零开始写 HAL -- (2) 实现 HAL 主体 通过上一篇文章[《Android 8.1 从零开始写 HAL -- (1) 定义接口》](https://blog.csdn.net/Qidi_Huang/article/details/107420019)的努力,我们定义好了 demoComponent HAL 的接口和参数,也了解到编译时会自动产生 Binder 框架代码。通过 Binder 机制,经过 demoComponent HAL 的 Bp 和 Bn 端,用户进程就可以调用到我们的 demoService 了。 在打通 Bp/Bn 通
Android 8.1 从零开始写 HAL -- (1) 定义接口 对于前一种场景,我们需要为外设编写全新的 HAL;对于后一种场景,我们不需要编写 HAL,但需要实现一个很类似的 vendor service。这二者的实现方式极其类似,区别只在于他们使用的设备节点不同(一个使用 `/dev/hwbinder`,另一个使用 `/dev/vndbinder`),还有各自申请的 sepolicy 权限有别。 以下正文以实现一个全新的 HAL 为例进行说明,但并不涉及对设备节点的操作。
详细图解 Android vndBinder 详细图解 Android vndBinder注意:本文基于 Android 8.1 进行分析Qidi 2020.07.03 (Markdown & Haroopad)【前言】图虽然是根据 vndBinder 的类关系和调用顺序画出的,但实际上对于 Binder 和 hwBinder 也适用。Binder driver 代码十分庞杂,基于安全考虑还存在与 LSM 的交互,所以这部分的调用关系图有所省略。【Binder 通信概要】如果说 Binder 通信机制是 Android 的心脏
AudioFlinger 如何通过 hwBinder 调用 Audio HAL AudioFlinger 如何通过 hwBinder 调用 Audio HAL注意:本文基于 Android 8.0 进行分析Qidi 2020.07.03 (Markdown & Haroopad)我们已经知道,在AudioPolicyManager构造时,会解析配置文件audio_policy.conf或audio_policy_configuration.xml。之后,它会获取到AudioFlinger的实例,并根据解析结果,调用loadHwModule()依次加载各个 audio H
【转】为什么linux系统变慢了 声明:本文转自 http://www.alivepea.me/linux/why-linux-slow/为什么linux系统变慢了“系统变得很慢了,让我重启一下”,这个被经常使用且有效的做法真的很粗暴。 作为程序员最亲密的伙伴,可以待它温柔多些。在linux发行版中,内核很稳定,极少出现bug,所以通常是某个应用导致系统变慢。 只要查出是哪些应用导致的,kill之就可以了。...
为 Android 8.0 添加开机启动脚本 为 Android 8.0 添加开机启动脚本Qidi 2018.01.11 (Markdown & Haroopad)【写在前面】 本人对于 SELinux for Android 理解不深,下文中的各文件及安全规则虽都是我所编写,但也是一边查阅文档一边试验得出的。在此强行为文,若有理解错误之处,请各位工程师同仁热情指出。一、需求描述 项目上需要在 Andr
使用 libTomCrypt 实现 AES、HMAC、HKDF 运算 使用 libTomCrypt 实现 AES、HMAC、HKDF 运算Qidi 2017.11.06 (Markdown & Haroopad)1、libTomCrypt 简介 libTomCrypt 是一个使用 C 语言编写的开源加解密算法库,使用 WTF 协议进行授权,支持 AES、HMAC、HKDF、RSA、PRNG、BASE64 等常用加解密算法。2、基础文件 我们在使用 libTomCr
在 Android 8.0 中绕过 hwbinder 实现跨模块对 audio HAL 调用 在 Android 8.0 中绕过 hwbinder 实现跨模块对 audio HAL 调用Qidi 2017.10.20 (Markdown & Haroopad)【需求描述】 Audio 模块中专门为 TV 产品添加了一些代码,需要在 hdmi 的 HAL 代码中进行调用以完成某些功能。【旧的实现】 在 Android 7.1 中的做法是在 hdmi 的
Kernel 4.9 上 dma_alloc_coherent() 函数开辟 DMA 连续内存空间失败 解决办法 【问题描述】 将之前可以在 Kernel 3.14 上正常运行的驱动代码移植到 Kernel 4.9 上,发现驱动在进行 probe 时失败,具体失败位置为函数 dma\_alloc\_coherent(),对应代码段如下:amaudio_start_addr = (unsigned char *)dma_alloc_coherent(amaudio2_dev,