简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮文章目录1. 前言要点概括2. 用法与应用场景函数原型参数说明回调函数原型应用场景1. 麦克风录音2. 实时语音识别3. 音频数据分析3. 调用流程剖析3.1 核心步骤1. 应用层注册 read callback2. libpulse 保存回调函数3. 服务端产生录音数据4. libpulse 接收到音频数据5. libpulse 触发 read callback3.2 调用流程图3.3 Read Callback 生命周期图4. 实战应用案例5. 源码层核心原理6. 一句话总结1. 前言本篇目的Linux PulseAudio 深度解析之pa_stream_set_read_callback调用流程与实战。要点概括核心功能为录音 Stream 注册“可读数据到达”回调函数。工作机制当 PulseAudio Server 有新的录音数据到达时由 libpulse 异步触发应用层 read callback。2. 用法与应用场景pa_stream_set_read_callback是 PulseAudio 录音链路中的核心接口之一。在 PulseAudio 中录音数据到达是异步的麦克风采集是持续流式的应用层无法主动轮询高效获取数据因此PulseAudio 使用 read callback 通知应用层“新的 PCM 数据已经到达”。函数原型voidpa_stream_set_read_callback(pa_stream*p,pa_stream_request_cb_tcb,void*userdata);参数说明p:目标 pa_stream cb:录音数据到达回调函数 userdata:用户私有数据回调函数原型typedefvoid(*pa_stream_request_cb_t)(pa_stream*p,size_tnbytes,void*userdata);应用场景1. 麦克风录音pa_stream_set_read_callback(stream,read_cb,NULL);用于PCM 录音麦克风采集实时语音输入2. 实时语音识别例如ASRAI 语音助手实时字幕都依赖read callback实时获取音频数据。3. 音频数据分析例如FFTVU Meter波形显示音量检测都需要实时获取 PCM 数据。3. 调用流程剖析3.1 核心步骤1. 应用层注册 read callbackpa_stream_set_read_callback(stream,read_callback,userdata);2. libpulse 保存回调函数内部本质执行stream-read_callbackcb;stream-read_userdatauserdata;3. 服务端产生录音数据例如麦克风采集Source 输出monitor source 数据都会产生PCM 数据块4. libpulse 接收到音频数据native protocol 收到RECORD_STREAM_DATA数据包后libpulse 把数据写入stream buffer5. libpulse 触发 read callback内部自动执行stream-read_callback(stream,nbytes,userdata);通知应用层有新的录音数据到达。3.2 调用流程图Application应用程序调用 pa_stream_set_read_callbacklibpulse 保存 callbackPulseAudio Server 持续录音产生 PCM 数据发送 RECORD_STREAM_DATAlibpulse 接收数据写入 stream buffer触发 read callback应用层读取 PCM 数据3.3 Read Callback 生命周期图connect_recordPA_STREAM_READY注册 read callback麦克风采集数据服务端发送 PCMlibpulse 接收数据触发 read callbackpa_stream_peek处理 PCM 数据pa_stream_drop4. 实战应用案例#includepulse/pulseaudio.h#includestdio.hvoidread_callback(pa_stream*s,size_tnbytes,void*userdata){constvoid*data;/* * 获取 PCM 数据 */if(pa_stream_peek(s,data,nbytes)0){printf(pa_stream_peek failed\n);return;}if(!data||nbytes0){pa_stream_drop(s);return;}printf(收到录音数据: %zu bytes\n,nbytes);/* * 这里可执行 * * FFT * ASR * 编码 * 保存文件 *//* * 数据消费完成 */pa_stream_drop(s);}intmain(){pa_stream*stream;/* * 假设 stream 已 connect_record 成功 */pa_stream_set_read_callback(stream,read_callback,NULL);return0;}5. 源码层核心原理pa_stream_set_read_callback在 libpulse 中本质非常简单。内部逻辑类似voidpa_stream_set_read_callback(pa_stream*s,pa_stream_request_cb_tcb,void*userdata){pa_assert(s);s-read_callbackcb;s-read_userdatauserdata;}真正复杂的是read callback 的触发时机。内部核心流程服务端录音 ↓ native protocol ↓ 客户端接收数据 ↓ 写入 memblockq ↓ 触发 read callback因此它涉及Socket 通信shm/memfd 共享内存memblockq异步主循环protocol-native属于PulseAudio 录音链路中的核心异步机制。6. 一句话总结pa_stream_set_read_callback本质上是“给 PulseAudio 录音流安装数据到达监听器”。它负责接收录音数据驱动实时语音链路驱动 PCM 数据处理驱动 ASR/FFT/编码是 PulseAudio 录音体系中的核心基础接口之一。
Linux Pulseaudio深度解析之pa_stream_set_read_callback调用流程与实战(三十六)
简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮文章目录1. 前言要点概括2. 用法与应用场景函数原型参数说明回调函数原型应用场景1. 麦克风录音2. 实时语音识别3. 音频数据分析3. 调用流程剖析3.1 核心步骤1. 应用层注册 read callback2. libpulse 保存回调函数3. 服务端产生录音数据4. libpulse 接收到音频数据5. libpulse 触发 read callback3.2 调用流程图3.3 Read Callback 生命周期图4. 实战应用案例5. 源码层核心原理6. 一句话总结1. 前言本篇目的Linux PulseAudio 深度解析之pa_stream_set_read_callback调用流程与实战。要点概括核心功能为录音 Stream 注册“可读数据到达”回调函数。工作机制当 PulseAudio Server 有新的录音数据到达时由 libpulse 异步触发应用层 read callback。2. 用法与应用场景pa_stream_set_read_callback是 PulseAudio 录音链路中的核心接口之一。在 PulseAudio 中录音数据到达是异步的麦克风采集是持续流式的应用层无法主动轮询高效获取数据因此PulseAudio 使用 read callback 通知应用层“新的 PCM 数据已经到达”。函数原型voidpa_stream_set_read_callback(pa_stream*p,pa_stream_request_cb_tcb,void*userdata);参数说明p:目标 pa_stream cb:录音数据到达回调函数 userdata:用户私有数据回调函数原型typedefvoid(*pa_stream_request_cb_t)(pa_stream*p,size_tnbytes,void*userdata);应用场景1. 麦克风录音pa_stream_set_read_callback(stream,read_cb,NULL);用于PCM 录音麦克风采集实时语音输入2. 实时语音识别例如ASRAI 语音助手实时字幕都依赖read callback实时获取音频数据。3. 音频数据分析例如FFTVU Meter波形显示音量检测都需要实时获取 PCM 数据。3. 调用流程剖析3.1 核心步骤1. 应用层注册 read callbackpa_stream_set_read_callback(stream,read_callback,userdata);2. libpulse 保存回调函数内部本质执行stream-read_callbackcb;stream-read_userdatauserdata;3. 服务端产生录音数据例如麦克风采集Source 输出monitor source 数据都会产生PCM 数据块4. libpulse 接收到音频数据native protocol 收到RECORD_STREAM_DATA数据包后libpulse 把数据写入stream buffer5. libpulse 触发 read callback内部自动执行stream-read_callback(stream,nbytes,userdata);通知应用层有新的录音数据到达。3.2 调用流程图Application应用程序调用 pa_stream_set_read_callbacklibpulse 保存 callbackPulseAudio Server 持续录音产生 PCM 数据发送 RECORD_STREAM_DATAlibpulse 接收数据写入 stream buffer触发 read callback应用层读取 PCM 数据3.3 Read Callback 生命周期图connect_recordPA_STREAM_READY注册 read callback麦克风采集数据服务端发送 PCMlibpulse 接收数据触发 read callbackpa_stream_peek处理 PCM 数据pa_stream_drop4. 实战应用案例#includepulse/pulseaudio.h#includestdio.hvoidread_callback(pa_stream*s,size_tnbytes,void*userdata){constvoid*data;/* * 获取 PCM 数据 */if(pa_stream_peek(s,data,nbytes)0){printf(pa_stream_peek failed\n);return;}if(!data||nbytes0){pa_stream_drop(s);return;}printf(收到录音数据: %zu bytes\n,nbytes);/* * 这里可执行 * * FFT * ASR * 编码 * 保存文件 *//* * 数据消费完成 */pa_stream_drop(s);}intmain(){pa_stream*stream;/* * 假设 stream 已 connect_record 成功 */pa_stream_set_read_callback(stream,read_callback,NULL);return0;}5. 源码层核心原理pa_stream_set_read_callback在 libpulse 中本质非常简单。内部逻辑类似voidpa_stream_set_read_callback(pa_stream*s,pa_stream_request_cb_tcb,void*userdata){pa_assert(s);s-read_callbackcb;s-read_userdatauserdata;}真正复杂的是read callback 的触发时机。内部核心流程服务端录音 ↓ native protocol ↓ 客户端接收数据 ↓ 写入 memblockq ↓ 触发 read callback因此它涉及Socket 通信shm/memfd 共享内存memblockq异步主循环protocol-native属于PulseAudio 录音链路中的核心异步机制。6. 一句话总结pa_stream_set_read_callback本质上是“给 PulseAudio 录音流安装数据到达监听器”。它负责接收录音数据驱动实时语音链路驱动 PCM 数据处理驱动 ASR/FFT/编码是 PulseAudio 录音体系中的核心基础接口之一。