简介: CSDN博客专家、《Android系统多媒体进阶实战》作者

博主新书推荐:《Android系统多媒体进阶实战》🚀
Android Audio工程师专栏地址: Audio工程师进阶系列原创干货持续更新中……】🚀
Android多媒体专栏地址: 多媒体系统工程师系列原创干货持续更新中……】🚀
专题一 二:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀
专题三:Android14 Binder之HIDL与AIDL通信实战课 🚀
专题四:Android15快速自定义与集成音效实战课 🚀
专题五:Android15音频策略实战课 🚀
专题六:Android15音频性能实战课(无声/杂音/断音/爆音实战案例) 🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

🌻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 会彻底断开 Stream
  • cork 只是临时暂停数据流动

因此:

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 调用流程图

1

0

Application
应用程序

调用 pa_stream_cork

libpulse 创建 pa_operation

发送 cork 协议命令

PulseAudio Server

b 参数

暂停 Stream

恢复 Stream

停止数据传输

恢复数据传输

返回 ACK

触发 success callback

🌻3.3 Cork/Uncork 生命周期图

Stream READY

调用 pa_stream_cork b=1

PA_STREAM_CORKED

停止数据流

应用暂停状态

调用 pa_stream_cork b=0

恢复数据流

继续播放

🌻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 流控制体系中的核心基础接口之一。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐