Linux Pulseaudio深度解析之pa_stream_cork用流程与实战(三十一)
本篇目的:Linux PulseAudio 深度解析之调用流程与实战。本质上是:“给 PulseAudio Stream 按下暂停/恢复按钮”。暂停音频流恢复音频流控制后台功耗实现音频焦点切换是 PulseAudio 流控制体系中的核心基础接口之一。《Android系统多媒体进阶实战》Audio工程师进阶系列多媒体系统工程师系列AAOS车载系统+AOSP14系统攻城狮入门视频实战课Android1
简介: CSDN博客专家、《Android系统多媒体进阶实战》作者
博主新书推荐:《Android系统多媒体进阶实战》🚀
Android Audio工程师专栏地址: Audio工程师进阶系列【原创干货持续更新中……】🚀
Android多媒体专栏地址: 多媒体系统工程师系列【原创干货持续更新中……】🚀
专题一 二:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀
专题三:Android14 Binder之HIDL与AIDL通信实战课 🚀
专题四:Android15快速自定义与集成音效实战课 🚀
专题五:Android15音频策略实战课 🚀
专题六:Android15音频性能实战课(无声/杂音/断音/爆音实战案例) 🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

🍉🍉🍉文章目录🍉🍉🍉
🌻1. 前言
本篇目的:Linux PulseAudio 深度解析之 pa_stream_cork 调用流程与实战。
要点概括
- 核心功能:暂停或恢复 PulseAudio Stream 的数据传输。
- 工作机制:通过异步协议通知 PulseAudio Server,对 Sink Input 或 Source Output 执行 cork/uncork 操作。
🌻2. 用法与应用场景
pa_stream_cork
是 PulseAudio 中最核心的流暂停控制接口之一。
它类似:
“音频流的暂停键”。
与:
pa_stream_disconnect()
不同的是:
disconnect会彻底断开 Streamcork只是临时暂停数据流动
因此:
cork 更适合“暂停/恢复”场景。
函数原型
pa_operation* pa_stream_cork(
pa_stream *s,
int b,
pa_stream_success_cb_t cb,
void *userdata);
参数说明
s:
目标 pa_stream
b:
1 表示 cork(暂停)
0 表示 uncork(恢复)
cb:
异步完成回调
userdata:
用户私有数据
返回值
返回 pa_operation 对象
用于:
- 查询异步操作状态
- 等待操作完成
- operation 生命周期管理
应用场景
1. 音乐暂停
pa_stream_cork(stream,
1,
NULL,
NULL);
用于:
- 音乐暂停
- 视频暂停
- 游戏暂停
2. 音乐恢复
pa_stream_cork(stream,
0,
NULL,
NULL);
用于:
- 恢复播放
- 恢复录音
- 恢复数据传输
3. 后台节电优化
例如:
- App 进入后台
- 屏幕熄灭
- 通话抢占音频焦点
都会:
cork 当前 Stream
减少:
- CPU 消耗
- 音频 DMA
- 数据搬运
🌻3. 调用流程剖析
🌻3.1 核心步骤
1. 应用层调用 cork
pa_stream_cork(
stream,
1,
callback,
userdata);
2. libpulse 创建 operation
内部创建:
pa_operation
用于表示:
当前异步 cork 操作。
3. libpulse 发送协议命令
客户端通过 native protocol 发送:
PA_COMMAND_CORK_PLAYBACK_STREAM
或者:
PA_COMMAND_CORK_RECORD_STREAM
到 PulseAudio Daemon。
4. 服务端处理 cork
服务端执行:
- 暂停 Sink Input
- 停止 Source Output
- 挂起数据流
此时:
- 数据不再流动
- Stream 仍然存在
5. 服务端返回 ACK
Daemon 返回:
success
客户端随后:
- 更新 operation 状态
- 触发 success callback
🌻3.2 调用流程图
🌻3.3 Cork/Uncork 生命周期图
🌻4. 实战应用案例
#include <pulse/pulseaudio.h>
#include <stdio.h>
void cork_success_cb(
pa_stream *s,
int success,
void *userdata) {
if (success) {
printf("cork 操作成功\n");
} else {
printf("cork 操作失败\n");
}
}
void pause_stream(pa_stream *stream) {
pa_operation *op;
/*
* 暂停 Stream
*/
op = pa_stream_cork(
stream,
1,
cork_success_cb,
NULL);
if (!op) {
printf("pa_stream_cork failed\n");
return;
}
pa_operation_unref(op);
}
void resume_stream(pa_stream *stream) {
pa_operation *op;
/*
* 恢复 Stream
*/
op = pa_stream_cork(
stream,
0,
cork_success_cb,
NULL);
if (!op) {
printf("resume failed\n");
return;
}
pa_operation_unref(op);
}
int main() {
pa_stream *stream;
/*
* 假设 stream 已 connect 成功
*/
pause_stream(stream);
resume_stream(stream);
return 0;
}
🌻5. 源码层核心原理
pa_stream_cork
在 libpulse 中属于:
“异步协议控制接口”。
内部核心流程:
pa_stream_cork()
↓
pa_pstream_send_tagstruct()
↓
发送 cork protocol
↓
server 处理
↓
ACK 返回
本质并不是:
修改本地变量
而是:
真正通知 PulseAudio Server 暂停/恢复数据流。
因此:
它涉及:
- Socket 通信
- native protocol
- operation 异步对象
- server 状态同步
属于:
PulseAudio 的重量级控制接口之一。
🌻6. 一句话总结
pa_stream_cork
本质上是:
“给 PulseAudio Stream 按下暂停/恢复按钮”。
它负责:
- 暂停音频流
- 恢复音频流
- 控制后台功耗
- 实现音频焦点切换
是 PulseAudio 流控制体系中的核心基础接口之一。
更多推荐

所有评论(0)