自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(232)
  • 资源 (11)
  • 收藏
  • 关注

原创 SOF项目简介

Sound Open Firmware SDK 由许多成分组成,可以定制这些成分以用于固件/软件开发生命周期。定制允许 “最适合” 的开发方法,其中 SDK 可以针对特定流程或环境进行优化。有些 SDK 成分是可选的,而其他成分可以有多次选择,如下图所示。图 2:SDK 示例配置显示了运行 Linux 操作系统的 Intel Apollo Lake 平台上的 SOF 开发流程。请注意编译器工具链的选择和可选的 DSP 仿真器的选择。

2024-03-31 10:01:41 404

原创 拓扑 2.0

0123!type "pga"

2024-03-03 09:36:10 988

原创 高通 AudioReach 框架简介

从实现上,AudioReach 的 Linux ASoC 驱动是 AudioReach 能力的代理,或者适配器,它通过核间通信机制和 DSP 上运行的 AudioReach 通信,对于 Linux 内核,它实现 ASoC 的 PCM 和 compress 接口,向用户空间提供访问音频能力必不可少设备文件等接口。除了运行于 DSP 的 AudioReach 和它的 Linux ASoC 驱动程序,拓扑配置是整个子系统运行的另一个组成部分,Audioreach 的拓扑配置文件可以参考。

2024-03-01 19:15:15 732

原创 ALSA 拓扑

ALSA 拓扑给音频驱动程序提供了一种在运行时,从用户空间加载它们的混音器,路由,PCM 和能力,而无需修改任何驱动程序源码的方法。其目标是编写一次驱动程序,而在拓扑中处理变化和差异。

2024-02-23 22:17:46 965

原创 ALSA Compress-Offload API

从 ALSA API 的早期开始,它就被定义为支持 PCM,或考虑到了 IEC61937 等固定比特率的载荷。参数和返回值以帧计算是常态,这使得扩展已有的 API 以支持压缩数据流充满挑战。最近这些年,音频数字信号处理器 (DSP) 常常被集成进片上系统 (SoC) 设计中,且 DSPs 也常被集成进音频编解码器 (这里的音频编解码器与 AAC 之类的音频数据压缩方案不同,它是指主要用于完成模拟信号和数字信号转换的器件) 中。与基于主机的处理相比,在 DSP 这样的处理器上处理压缩数据可以显著降低功耗。

2023-12-09 11:14:13 963

原创 深入浅出 Linux 中的 ARM IOMMU SMMU III

系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的等接口。等接口通过 DMA IOMMU 的回调分配内存,并为经过 IOMMU 的 DMA 内存访问准备转换表。之后经过 IOMMU 的 DMA 内存访问所需的所有工作都已完成。音频子系统 ALSA 的驱动程序,通过等函数为 DMA 分配内存,这些函数定义 (位于和函数用于DMA 内存,两者的区别在于,前者为单个子流预分配,后者为某个 PCM 下的所有子流预分配。它们都通过函数为某个子流预分配内存。

2023-12-02 07:57:19 1343

原创 深入浅出 Linux 中的 ARM IOMMU SMMU II

要使系统 I/O 设备的 DMA 内存访问能通过 IOMMU,需要将系统 I/O 设备和 IOMMU 设备绑定起来,也就是执行 SMMU 驱动中的系统 I/O 设备探测。总线发现系统 I/O 设备并和对应的驱动程序绑定,与 IOMMU 设备驱动程序注册并为 IOMMU 设备执行探测初始化的相对顺序不固定,可能系统 I/O 设备先被发现并和对应的驱动程序绑定,也可能 IOMMU 设备驱动程序注册及为 IOMMU 设备执行探测初始化先进行。创建系统 I/O 设备和 IOMMU 设备间的链接。

2023-11-25 09:55:25 1477

原创 深入浅出 Linux 中的 ARM IOMMU SMMU I

在计算机系统架构中,与传统的用于 CPU 访问内存的管理的 MMU 类似,IOMMU (Input Output Memory Management Unit) 将来自系统 I/O 设备的 DMA 请求传递到系统互连之前,它会先转换请求的地址,并对系统 I/O 设备的内存访问事务进行管理和限制。IOMMU 将设备可见的虚拟地址 (IOVA) 映射到物理内存地址。不同的硬件体系结构有不同的 IOMMU 实现,ARM 平台的 IOMMU 是 SMMU (System Memory Management)。

2023-11-22 19:01:21 1325

原创 Linux 内核音频数据传递主要流程

这里的可用空间大小是站在用户空间应用程序的视角来说的,即对于播放来说,可用空间大小指还可以向 DMA buffer 写入的数据量,对于录制来说,则指可以从 DMA buffer 读取的数据量。大多数情况下,音频设备会同时提供播放和录制功能,用于播放和录制的 PCM 设备文件是一起导出的,播放和录制的 PCM 设备文件的文件操作也是一起定义的,其中索引为。操作分别拷贝各个 channel 的数据,传入的音频数据保存在多个不同的缓冲区中,每个通道一个,音频数据通过指针数组的方式传递。操作用于执行数据拷贝。

2023-08-06 10:14:58 1744

原创 Linux 内核 ASoC DMA 引擎驱动程序

Linux 内核 ASoC 框架,在概念上将嵌入式音频系统拆分为多个可复用的组件驱动程序,包括 Codec 类驱动程序、平台类驱动程序和机器类驱动程序。在实现上,机器类驱动程序用和结构描述,属于平台类驱动程序的 DMA 引擎驱动程序由结构描述,codec 类驱动程序和 I2S 等驱动程序,由和等结构描述。除平台类驱动程序外的各种驱动程序都通过 component 抽象组织在一起,即这些驱动程序都作为注册给 Linux 内核 ASoC 框架,Linux 内核 ASoC 框架为它们各自创建结构对象,并保存在。

2023-07-29 09:48:47 633

原创 Linux 内核 ASoC 基本数据结构

Linux 内核 ASoC 框架建立了新的抽象,并通过一些中间层,将这些抽象接入 ALSA 音频框架。Linux 内核 ASoC 设备驱动的结构如下图:Linux 内核 ASoC 设备驱动程序在 Linux 内核中扮演多个角色。Linux 内核 ASoC 设备驱动程序在初始化阶段向内核注册某个总线类型的设备驱动程序,总线负责相应的设备发现。这里的总线不一定是真实的硬件总线,如 PCI 等,也可能是虚拟的,如 platform 等。总线在发现设备之后,会记录发现的设备,并尝试匹配注册的驱动程序。

2023-07-23 18:27:39 565

原创 Linux 内核设备树时钟绑定

这种绑定依然处于开发中,并且基于 benh[1] 的一些实验性工作。时钟信号源可以由设备树中的任何节点表示。这些节点被指定为时钟提供者。时钟消费者节点使用phandle和时钟指示符对将时钟提供者输出连接到时钟输入。与 gpio 指示符类似,时钟指示符是 0 个、1 个或多个标识设备上的时钟输出的元素的数组。时钟指示符的长度由时钟提供者节点中的属性值定义。

2023-07-14 22:29:59 1012

原创 Linux ALSA 核心简单分析

Linux 内核 ALSA 框架通过向用户空间导出多个设备文件,以使用户空间程序可以与内核的音频子系统交互,可以访问音频硬件设备。

2023-07-14 22:27:48 510

原创 Android Java 音频采集 AudioRecord

在 Android Java 应用中,一般用管理从平台的音频输入设备采集音频数据所需的资源。音频采集和音频播放密切关系,Android 系统中 Java和AudioTrack在许多方面,都有着很高的相似性,无论是代码的目录组织,还是整个类的接口设计和实现结构,但它们也有着不小的区别。对比来看 Java和AudioTrack的实现,有助于我们对音频的播放和采集做更好地理解。的 Java 代码位于,它的 JNI 代码位于。Java 层类实现基于库,该库位于。

2023-04-29 19:52:34 2716 2

原创 Android 中的跨进程数据块传递

Android 的 Binder 进程间通信机制主要用于实现远程过程调用 RPC,Android 系统中进程之间的大块数据传递,如音频数据,出于效率等原因,一般不直接用 Binder 机制。

2023-04-29 19:00:53 1064

原创 Android Java 播放音频 AudioTrack

【很多同学读 Android 系统的源码时感觉比较费力,一定会觉得是自己水平不够见识有限认知水平不足,觉得自己需要多学习多努力多下功夫,但 Android 系统源码质量之烂简直超乎想象。尽管 Android 系统确实实现了很多功能、特性,提供了很多亮点,但不可否认,把 Android 系统的代码称为屎山,可能都有点侮辱屎山了。关于 Android 的音频数据处理,音频播放和采集是两个紧密相关的过程,但这两个过程又有着巨大的差别。

2023-04-19 19:59:14 2411 1

原创 Android 中的混音器 AudioMixer 实现分析

Android 混音器 AudioMixer 实现分析。

2023-04-12 18:56:19 2406 1

原创 Android 中打开音频流所用的配置

对于通道掩码(通道数),如果是直接输出 (Direct Output),则通道数越小优先级越高,否则,通道数越大优先级越高;对于采样率,如果是直接输出 (Direct Output),则采样率越小优先级越高,否则,采样率越大优先级越高。Android 中打开音频输出流,所需的主要参数采样率、通道掩码(通道数)、采样格式、增益和标记来自于传入的。音频策略配置文件,更具地说,来自于音频策略配置文件中的。的标记和增益直接来自于音频策略配置文件的。对象,后者的构造函数的定义 (位于。在音频策略配置文件中,

2023-04-08 18:44:21 851

原创 Android 中 libnbaio 库的设计和实现

在整个 Android 系统中,找不到使用它们的地方,随着 Android 系统的发展,它们大概已处于年久失修不可用的状态。的缩写) 库主要是为非阻塞的音频 I/O 设计的,但现在它也包含了一些接口的阻塞实现,因而它的主要作用也变成了为各种音频 I/O 设施提供统一的读写接口。对象在构造时,需要传入最大帧数,音频数据格式,和可选的一块用于交换数据的缓冲区。如果是同步写入,没有足够的空间写入全部数据时,会根据当前缓冲区中已经写入的数据的水位计算休眠时间,并休眠等待,否则返回实际写入的音频帧个数。

2023-04-03 20:28:11 557

原创 Android 音频设备信息加载

Android 系统的守护进程 audioserver 中运行着多个与音频相关的系统服务,主要包括和,当需要支持 AAudio 的 MMap 模式时,会运行。需要启动服务时,audioserver 程序会 fork 一个进程运行其它那些系统服务,在父进程中运行,并将进程名修改为。

2023-03-24 21:31:26 1573 1

原创 Android AAudio 的实现分析

AAudio 是一个自 Android O 引入的新的 Android C API。它主要是为需要低延迟的高性能音频应用设计的。应用程序通过直接从流中读取或向流中写入数据来与 AAudio 通信,但它只包含基本的音频输入输出能力。Android 的官方文档对 AAudio 的 API 及设计思想做了良好的介绍,这里来看一下 AAudio 的实现。后面的代码分析基于 android-12.1.0_r27 进行。AAudio 在应用程序和 Android 设备上的音频输入输出之间移动音频数据。

2023-03-18 10:56:24 2668 1

原创 Audio HAL 提供的操作

这个线程执行的主要任务为,周期性地唤醒,遍历所有的输出音频流的数据,把它们做混音,并将混音之后的数据通过 ALSA 的接口写入设备。这里输出音频流的数据和混音之后的音频数据都用。是音频输出设备的抽象接口,它提供了关于音频输出硬件驱动的各种属性的信息,同样提供了更加丰富的操作,其定义 (位于。对象,且如果输入音频流的数据来源指定为音频发生器设备,则初始化相关的状态;单例对象时,会起一个线程,用于将各个输出流的音频数据,通过 ALSA 的接口写入设备;这个操作完成的主要的事情为创建一个单实例的定制版的。

2023-03-18 10:53:00 1886

原创 Android Audio HAL 服务

在 Android 系统中,Audio HAL 服务用于管理对音频硬件的访问,AudioFlinger 通过 Audio HAL 服务访问音频硬件。这里以 Android Automotive (AAOS) 版模拟器为例,来看 Audio HAL 服务的设计、实现和访问,代码分析基于 android-12.1.0_r27 进行。AAOS 版模拟器的 Audio HAL 服务的实现位于,在 android 设备中,它将以名为的进程存在,这个进程的主函数定义 (位于。

2023-03-09 20:00:16 2705 1

原创 核心 Android 调节音量的过程

由上面这些调节音量的方法可以看到,Android Automotive 调节音量的动作有意在 Car 服务中直接对设备调节了音量,而没有继续经过核心 Android 系统的 audio 服务。Audio policy service 接收 index 形式的音量值,将音量的 index 值转为db 值,又转为增益值,最后将音量增益设置给 audio flinger。然后发送消息去设置设备的音量。设置设备的音量时,先设置传入的设备的音量,然后设置别名设备的音量,之后发送消息将音量设置持久化。

2023-03-06 18:51:32 3617 1

原创 Android Automotive 调节音量的过程

Android Automotive OS (AAOS) 是在核心 Android 系统的基础之上打造而成,以支持将 Android 系统用作车辆信息娱乐系统的场景。AAOS 的音频系统对核心 Android 音频系统做了扩充,创建了新的概念和抽象,如音区等,提供了新的 API 接口,添加了的新的服务,以支持智能座舱的特殊需要。Google Android 官方文档和提供了对 AAOS 系统架构和 AAOS 音频子系统架构的清晰而权威描述。

2023-03-04 08:24:31 1639

原创 WebRTC 媒体数据传输控制之平滑发送实现

WebRTC 的平滑发送 pacer 模块用于更有节奏地发送音视频媒体数据及音视频媒体传输控制数据,更具体地说,由于音频数据包大多比较小,一般不会超过 MTU,因而 pacer 模块主要用于控制视频数据包的发送。WebRTC 官方有一份文档对 pacer 的背景及主要设计思路做了简要介绍,其中文版翻译可以参考。这里分析 WebRTC pacer 模块的实现。

2022-10-20 14:06:17 1289

原创 WebRTC 一对一语音通话中音频端到端分段延迟分析

WebRTC 一对一语音通话中的音频端到端延迟指从一个音频信号被发送端采集,到同一个信号被接收端播放出来这整个过程的时间。音频端到端延迟由多个阶段组成。音频端到端处理的冲采样、混音、回声和降噪等操作会使音频数据在数值上变得面目全非,变得难以比较。真正的音频端到端延迟一般使用专业的声卡设备配上专门的音频处理软件来测,这种测试在线上环境中是难以实现的。音频端到端分段延迟常常也能在很大程度上反应音频端到端延迟,分段延迟的分析甚至可以帮我找到造成延迟的瓶颈所在。

2022-09-03 10:47:35 1916 2

原创 在 Android C/C++ 代码中接入 breakpad

本文概述在 Android 的 C++ 代码中使用 Breakpad 的方法。

2022-07-10 09:35:35 775

原创 Breakpad Windows 集成概述

Breakpad windows 集成。

2022-07-06 09:51:07 695

原创 在 Mac 客户端 C++ 代码中使用 breakpad

本文概述在 Mac 平台的 C++ 可执行程序或动态链接库中使用 Breakpad 的方法。

2022-07-04 15:49:42 915

原创 在 Mac 客户端应用程序中使用 breakpad

本文档是使用 Breakpad 构建 Mac 客户端应用程序的分步指南。

2022-06-30 09:59:29 357

原创 在 Linux 程序中使用 breakpad

本文概述在 Linux 平台的可执行程序或动态链接库中使用 Breakpad 的方法。

2022-06-24 14:04:37 1268

原创 WebRTC 的平滑发送

Paced sender,也常常被称为 “pacer”,它是 WebRTC RTP 栈的一部分,主要用于平缓发送到网络的数据包流。

2022-06-16 08:20:17 570 1

原创 WebRTC 的音频网络对抗概述

WebRTC 音频数据处理中,期望可以实现音频数据处理及传输,延时低,互动性好,声音平稳无抖动,码率低消耗带宽少等。在数据传输上,WebRTC 采用基于 UDP 的 RTP/RTCP 协议,RTP/RTCP 本身不提供数据的可靠传输及质量保障。公共互联网这种分组交换网络,天然具有数据包传输的丢失、重复、乱序及延时等问题。WebRTC 音频数据处理的这些目标很难同时实现,WebRTC 的音频网络对抗实现中针对不同情况对这些目标进行平衡。这里更仔细地看一下 WebRTC 音频数据处理管线,并特别关注与音频网.

2022-06-10 21:23:38 772

原创 WebRTC 的音频弱网对抗之 NACK

本文梳理 WebRTC 的音频弱网对抗中的 NACK 机制的实现。音频的 NACK 机制在 WebRTC 中默认是关闭的,本文会介绍开启 NACK 机制的方法。

2022-06-08 21:15:29 1096

原创 OpenCV 中的图像处理 007_Canny 边缘探测

本文主要内容来自于 OpenCV-Python 教程 的 OpenCV 中的图像处理 部分,这部分的全部主要内容如下:改变色彩空间学习在不同色彩空间之间改变图像。另外学习跟踪视频中的彩色对象。图像的几何变换学习对图像应用不同的几何变换,比如旋转、平移等。图像阈值学习使用全局阈值、自适应阈值、Otsu 的二值化等将图像转换为二值图像。平滑图像学习模糊图像,使用自定义内核过滤图像等。形态变换了解形态学变换,如侵蚀、膨胀、开放、闭合等。图像渐变学习寻找图像渐变、边缘等。Canny 边缘检测学习通过 Canny 边

2022-06-04 10:09:43 225

原创 WebRTC 的音频数据编码及发送控制管线

WebRTC 的音频数据处理发送的概念抽象层面的完整流程如下: 用于控制各个操作系统平台的音频设备,主要用来做音频的采集和播放。 是一个适配和胶水模块,它把 的音频数据采集和 的音频数据处理及 / 的音频数据编码和发送控制粘起来, 把采集的音频数据送给 处理,之后再把处理后的数据给到 / 编码发送出去。 用于做音频数据处理,如降噪、自动增益控制和回声消除等。/ 用于对音频数据做编码,比如 OPUS、AAC 等,RTP 打包和发送控制。

2022-06-02 07:43:15 757

原创 C++ 对象内存布局

可能会对 C++ 对象的内存布局产生影响的因素:对象的数据成员变量对象的一般成员函数对象的虚成员函数对象继承 - 父类不包含虚函数对象继承 - 父类包含虚函数对象多继承 - 父类不包含虚函数对象多继承 - 父类包含虚函数对象虚继承动态类型信息(这里不讨论)通过汇编代码看虚函数调用过程这些特性的实现常常因操作系统平台和编译器/ABI 而异,这里的分析主要基于 linux x86_64 平台上的 GCC 11.2.0/G++ 11.2.0 的行为进行。一般 C++ 对象的内存布局

2022-05-29 17:09:06 1117

原创 ALSA 音频 API 使用入门

文章目录理解音频接口典型的音频应用做了什么最小的播放程序最小的采集程序最小的中断驱动程序最小的全双工程序术语如何做 . . .打开设别设置参数硬件参数软件参数为什么你可以忘掉这里的一切本文尝试提供一些对 ALSA 音频 API 的介绍。它不是 ALSA API 的完整参考手册,它也不包含更复杂的软件需要解决的许多特有问题。然而,它确实尝试为技能娴熟,但对 ALSA API 不熟悉的程序员提供充足的背景和信息,来编写使用 ALSA API 的简单程序。理解音频接口让我们先回顾一下一个音频接口的基本

2022-05-28 21:35:37 1961

原创 一次 ASAN 找不到 symbolizer 问题的分析与解决

AddressSanitizer(简称 ASAN)一直是一个检测分析 C/C++ 内存问题很方便的工具。WebRTC 工程集成了 ASAN,只要配置一个简单的选项即可对整个工程打开或关闭 ASAN,具体来说是 is_asan 选项。is_asan 选项的默认值为 false,在 args.gn 文件中写入 is_asan = true 行可以对整个工程打开 ASAN,在 args.gn 文件中写入 is_asan = false 行或者不配置 is_asan 选项可以对整个工程关闭 ASAN。OpenRT

2022-05-01 13:34:52 2154 1

QUIC 加密协议规范中文版

QUIC 是一种新型的高效的安全的网络协议。这份文档是 QUIC 的加密协议的规范中文版翻译。

2018-07-23

HPACK 协议规范中文版

HTTP/2 协议的一些关键特性包括:二进制分帧,连接复用,首部压缩等。首部压缩是 HTTP/2 用于减少多请求执行时数据传输量的方法。这份文档是 HTTP/2 首部压缩部分,即 HPACK 的协议规范。

2018-07-23

HTTP/2规范中文版

这份文档是 HTTP/2 协议 RFC 规范的中文版翻译,协议规范完整定义了 HTTP/2 协议的行为和特性。

2018-07-23

Real-Time Streaming Protocol Version 2.0

Real-Time Streaming Protocol Version 2.0 协议规范

2017-08-19

RTP Payload Format for H.264 Video

RTP 传输 H.264 视频的 IETF 规范。

2017-08-19

OpenGL ES 2 for Android

OpenGL ES应用开发实践指南 的英文原版

2017-08-19

Advance Bash Scripting Guide

Advance Bash Scripting Guide

2007-11-04

Programming Perl

Programming PerlProgramming PerlProgramming Perl

2007-11-04

GNU Linux Tools Summary

GNU Linux Tools GNU Linux Tools SummarySummaryGNU Linux Tools Summary

2007-11-04

BSD Hacks

BSD HacksBSD HacksBSD Hacks

2007-11-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除