alsa pcm接口之pcm设备的状态STATE

应用和库之间的协作 :

ALSA pcm api设计使用状态来确定应用程序和库之间的通信阶段,实际的状态可以被决定通过使用snd_pcm_state调用,下面列举出来状态:
SND_PCM_STATE_OPEN :

表示pcm设备被打开的状态,使用了snd_pcm_open()之后进入该状态,并且让snd_pcm_hw_params()调用失败后,这个状态强制应用需要调用snd_pcm_hw_params函数去设置正确的参数.
SND_PCM_STATE_SETUP :

表示pcm设备已经接受了通信参数,并且等待snd_pcm_prepare()函数调用去准备硬件去选择操作(playback或capture).
SND_PCM_STATE_PREPARED :

表示pcm设备正在准备中,应用程序使用调用snd_pcm_start函数,去read或write数据去开始操作.
SND_PCM_STATE_RUNNING :

表示pcm设备已经开始并且运行中,表示正在处理音频样本samples,stream可以停止通过调用snd_pcm_drop()或snd_pcm_drain()函数.
SND_PCM_STATE_XRUN :

表示pcm设备到达overrun(capture)或underrun(playback),你可以使用通过-EPIPE返回的错误码(snd_pcm_writei或snd_pcm_writen()或snd_pcm_readi()或snd_pcm_readn()这些函数返回的)去决定是否检查实际的状态通过snd_pcm_state调用,推荐使用snd_pcm_recover()去恢复状态,并且你同样可以使用snd_pcm_prepare()或snd_pcm_drop()或snd_pcm_drain调用.
SND_PCM_STATED_PAUSED

表示pcm设备处于该状态当应用程序调用了snd_pcm_pause()函数直到pause处理完成,并不是所有硬件支持该特性,应用程序应该检查兼容性通过使用snd_pcm_hw_params_can_pause()函数.
SND_PCM_STATE_DISCONNECTED :

表示pcm物理上断开,处于这个状态不处理任何IO调用.
SND_PCM_STATE_DRAINING :

表示pcm设备处于该状态当应用程序调用snd_pcm_drain()函数当在capture模式下,

直到所有的数据通过IO路径(snd_pcm_readi()或snd_pcm_readn)从内部ring buffer读取上来了,之后设备维持在这个状态.
SND_PCM_STATE_SUSPENDED :

表示Pcm设备处于该状态被电源管理系统调用,stream可以被恢复通过snd_pcm_resume调用,并且应用需要通过snd_pcm_hw_params_can_resume函数检查兼容性,并不是所有硬件支持该特性,在其他情况下,可以调用snd_pcm_prepare()函数,snd_pcm_drop()函数,snd_pcm_drain()函数来离开该状态.

c 复制代码
enum snd_pcm_state_t
{
  SND_PCM_STATE_OPEN = 0,
  SND_PCM_STATE_SETUP,
  SND_PCM_STATE_PREPARED,
  SND_PCM_STATE_RUNNING,
  SND_PCM_STATE_XRUN,
  SND_PCM_STATE_DRAINING,
  SND_PCM_STATE_PAUSED,
  SND_PCM_STATE_SUSPENDED,
  SND_PCM_STATE_DISCONNECTED,
  SND_PCM_STATE_LAST=SND_PCM_STATE_DISCONNECTED,
  SND_PCM_STATE_PRIVATE1 = 1024
};


Managing the stream state :

下面的函数直接或间接影响stream状态:

snd_pcm_hw_params:

snd_pcm_hw_params函数成功运行让stream状态进入SND_PCM_STATE_SETUP状态,

否则进入SND_PCM_STATE_OPEN状态,但它进入了SETUP状态,这个函数自动会调用snd_pcm_prepare()函数然后进入到PREPARED状态.

snd_pcm_prepare:

这个snd_pcm_prepare函数调用让状态从SND_PCM_STATE_SETUP进入到SND_PCM_STATE_PREPARED.

snd_pcm_start:

调用该函数成功后进入到SND_PCM_STATE_RUNNING状态.

snd_pcm_drop:

调用该函数进入到SND_PCM_STATE_SETUP状态.

snd_pcm_drain:

调用该函数如果ringbuffer中还有数据进入到SND_PCM_STATE_DRAINING状态,否则进入到SND_PCM_STATE_SETUP状态.

snd_pcm_drain:

调用该函数进入到SND_PCM_STATE_PAUSED或SND_PCM_STATE_RUNNING.
snd_pcm_writei,snd_pcm_writen :
snd_pcm_writei,snd_pcm_writen 函数将会有条件开始stream ,然后进入到SND_PCM_STATE_RUNNING状态,依赖的条件是软件参数中start threshold(start threshold software parameter) .
snd_pcm_readi,snd_pcm_readn :
snd_pcm_readi,snd_pcm_read 函数将会有条件开始stream ,然后进入到SND_PCM_STATE_RUNNING状态,依赖的条件是软件参数中start threshold(start threshold software parameter).

相关推荐
STQY燊桐启元(深圳)电子科技3 天前
耐高温工况专项适配:相变陶瓷片如何突破高温工业设备散热瓶颈
经验分享·笔记·pcm
STQY燊桐启元(深圳)电子科技3 天前
工业物联网网关散热升级,相变陶瓷片解决微型设备积温过热难题
经验分享·笔记·pcm
STQY燊桐启元(深圳)电子科技4 天前
大功率储能PCS散热升级,ST-PCM180氮化铝相变陶瓷适配高密度热管理
经验分享·笔记·pcm
STQY燊桐启元(深圳)电子科技6 天前
免涂硅脂新时代,ST‑PCMTC96 与 ST‑PCM180 相变陶瓷片重构功率器件热管理
经验分享·笔记·重构·pcm
折枝吖10 天前
音视频开发-PCM 原理与 AI 模块实战
音视频·pcm
程序员老陆1 个月前
FFmpeg6 在 Windows 打开麦克风并录成 PCM:不走 Qt Multimedia,也不碰 WASAPI
windows·ffmpeg·音视频·pcm
PGCCC1 个月前
PostgreSQL 数据库认证体系技术解析:PCA / PCP / PCM 三级能力模型与考纲拆解
数据库·postgresql·pcm
砚凝霜1 个月前
软考网络工程师|第 2 章 信道延迟、传输介质、数据编码、数字调制、PCM 完整备考笔记
网络·笔记·pcm
Curvatureflight3 个月前
浏览器音频采集实践:麦克风权限、降噪、回声消除与 PCM 转换
前端·javascript·音视频·信息与通信·web·pcm
REDcker3 个月前
PCM与音量详解
pcm