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()函数来离开该状态.

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).

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
"alsa lib pcm.c:8512"是一个错误信息,它是ALSA(Advanced Linux Sound Architecture)库中的一个错误代码。 ALSA是用于在Linux操作系统上处理音频和声音的软件框架。pcm.c是该库中与PCM(Pulse-code Modulation)音频数据处理相关的文件。当出现"alsa lib pcm.c:8512"错误时,表示在执行PCM音频数据读取或写入操作时发生了错误,具体是在pcm.c文件的第8512行。 要解决这个错误,可以考虑以下几个步骤: 1. 检查设备配置:确保使用正确的音频设备进行读取或写入操作。可以使用命令"aplay -l"和"arecord -l"来列出系统中可用的音频设备。 2. 检查权限:确保当前用户有足够的权限来访问音频设备。可以使用命令"ls -l /dev/snd/"来查看设备文件的权限。 3. 检查设置参数:检查PCM音频处理的设置参数是否正确。可以参考ALSA文档和相应的程序代码来确认参数设置的正确性。 4. 检查驱动和库版本:确保ALSA库和音频驱动程序的版本是兼容的。更新驱动程序或升级ALSA库可能有助于解决一些已知的问题。 5. 查找其他错误信息:在"alsa lib pcm.c:8512"错误之前或之后的错误信息中,可能会提供更多有关问题原因的线索。对这些错误信息进行分析,可能会帮助定位和解决问题。 6. 检查其他系统资源:确保系统上的其他资源,如内存、磁盘空间等,充足且没有其他问题。 如果以上步骤都无法解决问题,建议查看ALSA论坛或咨询相关的技术支持团队,寻求更详细的帮助和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天早晚运动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值