嵌入式音频框架alsa学习之pcm状态

cpp 复制代码
/** PCM state */
typedef enum _snd_pcm_state {
	/** Open */
	SND_PCM_STATE_OPEN = 0,
	/** Setup installed */ 
	SND_PCM_STATE_SETUP,
	/** Ready to start */
	SND_PCM_STATE_PREPARED,
	/** Running */
	SND_PCM_STATE_RUNNING,
	/** Stopped: underrun (playback) or overrun (capture) detected */
	SND_PCM_STATE_XRUN,
	/** Draining: running (playback) or stopped (capture) */
	SND_PCM_STATE_DRAINING,
	/** Paused */
	SND_PCM_STATE_PAUSED,
	/** Hardware is suspended */
	SND_PCM_STATE_SUSPENDED,
	/** Hardware is disconnected */
	SND_PCM_STATE_DISCONNECTED,
	SND_PCM_STATE_LAST = SND_PCM_STATE_DISCONNECTED,
	/** Private - used internally in the library - do not use*/
	SND_PCM_STATE_PRIVATE1 = 1024
} snd_pcm_state_t;

1. SND_PCM_STATE_OPEN

  • 含义:PCM 设备已打开,但尚未配置任何硬件参数(如采样率、格式等)。
  • 触发场景 :调用 snd_pcm_open() 打开设备后的初始状态。

2. SND_PCM_STATE_SETUP

  • 含义 :硬件参数已安装(通过 snd_pcm_hw_params() 设置),但尚未准备好传输数据。
  • 触发场景 :调用 snd_pcm_hw_params() 成功配置参数后进入此状态。

3. SND_PCM_STATE_PREPARED

  • 含义:设备已准备好开始传输数据(如播放或录制),但尚未开始运行。
  • 触发场景 :调用 snd_pcm_prepare() 后进入此状态,此时可以安全地启动数据传输。

4. SND_PCM_STATE_RUNNING

  • 含义:设备正在活跃地处理数据(例如正在播放音频或录制输入)。
  • 触发场景 :调用 snd_pcm_start() 后,设备开始运行。

5. SND_PCM_STATE_XRUN

  • 含义 :发生了 underrun(播放时缓冲区数据不足) 或 overrun(录制时缓冲区已满),导致设备停止。
  • 触发场景 :
    • 播放场景:应用程序未及时填充数据,导致缓冲区耗尽。
    • 录制场景:应用程序未及时读取数据,导致缓冲区溢出。
  • 处理方式 :需调用 snd_pcm_prepare() 或 snd_pcm_recover() 恢复设备。

6. SND_PCM_STATE_DRAINING

  • 含义:设备正在排空缓冲区中剩余的数据(仅适用于播放模式)。
  • 触发场景 :调用 snd_pcm_drain() 后,设备停止新数据写入,但会继续播放缓冲区中的剩余数据。

7. SND_PCM_STATE_PAUSED

  • 含义:设备被显式暂停(例如用户手动暂停播放)。
  • 触发场景 :调用 snd_pcm_pause() 并设置暂停标志为 1。

8. SND_PCM_STATE_SUSPENDED

  • 含义:硬件因系统事件(如进入省电模式)被挂起。
  • 触发场景:系统电源管理事件(如休眠)导致设备暂停。

9. SND_PCM_STATE_DISCONNECTED

  • 含义:物理设备已断开连接(例如 USB 音频设备被拔出)。
  • 触发场景:硬件被物理移除或断开。

10. SND_PCM_STATE_PRIVATE1

  • 含义:ALSA 库内部使用的私有状态,开发者无需关注。
  • 用途:用于 ALSA 内部实现,用户代码中不应依赖此状态。

状态转换示意图

复制代码
OPEN → SETUP → PREPARED → RUNNING → (XRUN/DRAINING/PAUSED/SUSPENDED) → ... → DISCONNECTED

常见问题

Q1: 如何检测并处理 XRUN 状态?
  • 调用 snd_pcm_state() 检查状态,若为 XRUN,需恢复设备:

    复制代码
    if (snd_pcm_state(pcm_handle) == SND_PCM_STATE_XRUN) {
        snd_pcm_prepare(pcm_handle);  // 或 snd_pcm_recover()
    }
Q2: DRAINING 和 PAUSED 的区别?
  • DRAINING:设备正在播放剩余数据(仅播放模式)。
  • PAUSED:设备完全停止,不会继续处理数据,需显式恢复。
Q3: 如何强制停止设备?
  • 调用 snd_pcm_drop() 立即停止设备并丢弃缓冲区数据,状态回到 SETUP。
相关推荐
差不多的周周2 小时前
《骨架上下文:基于零镜头骨架的动作识别的骨架侧上下文提示学习》论文核心部分详解
学习
音视频牛哥2 小时前
四足机器人如何做好智慧电力巡检?从低延迟图传到可信巡检数据闭环
音视频·四足机器人·智慧电力巡检·whip whep·机器人巡检·工业音视频巡检·智能电力巡检技术方案
Century_Dragon3 小时前
从挂图到VR:汽修专业的一堂新能源原理课可以怎么上~
学习
美狐美颜sdk3 小时前
直播APP接入美颜SDK后出现卡顿怎么办?从性能瓶颈寻找解决方案
android·人工智能·音视频·美颜sdk·直播美颜sdk
知识分享小能手3 小时前
C++ 学习教程,从入门到精通,C++对象和类 — 详细知识点总结(10)
开发语言·c++·学习
美狐美颜SDK开放平台4 小时前
直播APP开发实战:从摄像头调用到视频美颜sdk集成
android·人工智能·计算机视觉·音视频·直播美颜sdk
New农民工4 小时前
倒立摆训练秘籍:理解训练参数
学习
L@ncor5 小时前
第五章 基于低代码平台的智能体搭建 · 学习笔记(Coze / Dify / FastGPT / n8n)
笔记·学习·低代码·agent·prompt工程
迪丽热爱5 小时前
多媒体应用20-903(补)
学习
2601_962381135 小时前
历史视频朝代更替动效怎么做?把 AE 关键帧换成 AI 分镜动画的实战拆解
人工智能·nginx·音视频