- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在嵌入式系统上使用ALSA捕获时,我仍然遇到问题。
使用snddevices
脚本后,我现在可以从库中打开设备。但是在每次调用大约10秒钟后,应用程序在Input/output error
调用上返回错误消息EIO
(readi
)。
尝试停止设备后,整个系统将死机并需要硬重置。
我无法确定ALSA是否在系统上正确安装。启动时,会提到ALSA驱动程序。这是version 1.0.18.rc3
。如何测试ALSA和/或设备是否正确安装?
这是我的测试代码,请告诉我内部是否有错误。我不确定frame
大小和period
ist是否设置正确(我对音频处理了解不多),我不确定是否必须使用interleaved
或non-interleaved
捕获还是无关紧要。
#include <alsa/asoundlib.h>
const char* print_pcm_state(snd_pcm_state_t state)
{
switch(state)
{
case SND_PCM_STATE_OPEN: return("SND_PCM_STATE_OPEN");
case SND_PCM_STATE_SETUP: return("SND_PCM_STATE_SETUP");
case SND_PCM_STATE_PREPARED: return("SND_PCM_STATE_PREPARED");
case SND_PCM_STATE_RUNNING: return("SND_PCM_STATE_RUNNING");
case SND_PCM_STATE_XRUN: return("SND_PCM_STATE_XRUN");
case SND_PCM_STATE_DRAINING: return("SND_PCM_STATE_DRAINING");
case SND_PCM_STATE_PAUSED: return("SND_PCM_STATE_PAUSED");
case SND_PCM_STATE_SUSPENDED: return("SND_PCM_STATE_SUSPENDED");
case SND_PCM_STATE_DISCONNECTED: return("SND_PCM_STATE_DISCONNECTED");
}
return "UNKNOWN STATE";
}
int main(int argc, char* argv[])
{
int rc; int err;
// pcm state
snd_pcm_state_t pcm_state;
// handle
snd_pcm_t *handle;
// hardware to open
char *pcm_name;
pcm_name = strdup("hw:0,0");
// parameters
snd_pcm_hw_params_t *params;
/* Open PCM device for playback. */
rc = snd_pcm_open(&handle, pcm_name, SND_PCM_STREAM_CAPTURE, 0);
if (rc < 0)
{
printf("unable to open pcm device: %s\n", snd_strerror(rc));
exit(1);
}
// Allocate a hardware parameters object.
// rc = snd_pcm_hw_params_alloca(¶ms); // original from a sample code, didn't compile?!?
rc = snd_pcm_hw_params_malloc(¶ms);
if(rc<0)
{
printf("cannot allocate hardware parameter structure (%s) ...\n", snd_strerror(rc));
}
/* Fill it in with default values. */
rc = snd_pcm_hw_params_any(handle, params);
if(rc<0)
{
printf("Error: (%s) ...\n", snd_strerror(rc));
}
bool interleaved = true;
// Set the desired hardware parameters.
if (interleaved)
{
// Interleaved mode
if ((rc = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0)
{
printf("cannot set access type (%s) ...\n", snd_strerror(rc));
return rc;
}
printf("access type = SND_PCM_ACCESS_RW_INTERLEAVED\n");
}
else
{
if ((rc = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_NONINTERLEAVED)) < 0)
{
printf("cannot set access type (%s) ...\n", snd_strerror(rc));
return rc;
}
printf("access type = SND_PCM_ACCESS_RW_NONINTERLEAVED\n");
}
// Signed 16-bit little-endian format
if ((rc = snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE)) < 0) {
printf("cannot set sample format (%s) ...\n", snd_strerror(rc));
return 1;
}
// TODO: channel number important - will a bad channel number crash the whole capturing?
int nChannels = 2;
if ((rc = snd_pcm_hw_params_set_channels(handle, params, nChannels)) < 0) {
printf("cannot set channel count (%s) ...\n", snd_strerror(rc));
return 1;
}
// TODO: right?
unsigned int wanted_rate = 22000;
unsigned int exact_rate = wanted_rate;
if ((rc = snd_pcm_hw_params_set_rate_near(handle, params, &exact_rate, 0)) < 0) {
printf("cannot set sample rate (%s) ...\n", snd_strerror(rc));
return 1;
}
if (wanted_rate != exact_rate)
{
printf("The rate %i Hz is not supported by your hardware.\n"
"==> Using %i Hz instead.\n", wanted_rate, exact_rate);
}
// TODO: what about these parts? What are those "frames" and what are the "periods"?
// must this be set according to the hardware?!?
snd_pcm_uframes_t frames = 640;
int periods = 8;
// Set number of periods. Periods used to be called fragments.
if (snd_pcm_hw_params_set_periods(handle, params, periods, 0) < 0) {
printf("Error setting periods.\n");
return 1;
}
if ((err = snd_pcm_hw_params_set_period_size_near(handle, params, &frames, 0)) < 0) {
fprintf(stderr, "Init: cannot set period_size (%s) ...\n", snd_strerror(err));
return err;
}
// TODO: is this the size needed for a single read-call?
snd_pcm_uframes_t buff_size = 0;
err = snd_pcm_hw_params_get_buffer_size(params, &buff_size);
if (err < 0) {
printf("Unable to get buffer size for playback: %s\n", snd_strerror(err));
return err;
}
printf("needed buffersize: %i \n", (int)buff_size);
pcm_state = snd_pcm_state(handle);
printf("0.m State: %s\n", print_pcm_state(pcm_state));
// what's this?
snd_pcm_sw_params_t* swparams_c;
// snd_pcm_hw_params will call PREPARE internally!
if ((err = snd_pcm_hw_params(handle, params)) < 0) {
fprintf(stderr, "Init: cannot set parameters (%s) ...\n", snd_strerror(err));
return err;
}
pcm_state = snd_pcm_state(handle);
printf("0.n State: %s\n", print_pcm_state(pcm_state));
printf("capture\n");
// test: start device:
/*
err = snd_pcm_start(handle);
if(err < 0)
{
fprintf (stderr, "cannot start device (%s)\n",
snd_strerror (err));
exit (1);
}
*/
//state
pcm_state = snd_pcm_state(handle);
printf("1. State: %s\n", print_pcm_state(pcm_state));
// Is this ok?!?
//short buf[100*2048];
//short buf[5120*1024]; // seg-fault?!?
short buf[5120];
// only try to read a single time
int i=0;
for (i = 0; i < 1; ++i) {
if(interleaved)
{
if ((err = snd_pcm_readi (handle, buf, frames)) < 0)
// if ((err = snd_pcm_writei (handle, buf, 1)) < 0) // ioctl error
{
printf("EBADFD %i -> EPIPE %i -> ESTRPIPE %i\n",EBADFD,EPIPE,ESTRPIPE);
if(err == -EBADFD)
printf("-EBADFD: PCM is not in the right state (SND_PCM_STATE_PREPARED or SND_PCM_STATE_RUNNING) \n");
if(err == -EPIPE) printf("-EPIPE: an overrun occurred \n");
if(err == -ESTRPIPE) printf("-ESTRPIPE: a suspend event occurred (stream is suspended and waiting for an application recovery)\n");
fprintf (stderr, "error %i : interleaved read from audio interface failed (%s)\n",
err, snd_strerror (err));
pcm_state = snd_pcm_state(handle);
printf("1.1 State: %s\n", print_pcm_state(pcm_state));
exit (1);
}
}
else
{
// TODO: is it hardware dependent whether I can exlusively use readi or readn?
// how does a readn call have to look like? needs multiple buffers?!?
printf("non-interleaved capture not implemented\n");
//if ((err = snd_pcm_readn (handle, buf, frames)) != frames) {
// fprintf (stderr, "non-interleaved read from audio interface failed (%s)\n",
// snd_strerror (err));
// exit (1);
//}
}
}
pcm_state = snd_pcm_state(handle);
printf("2. State: %s\n", print_pcm_state(pcm_state));
printf("close\n");
snd_pcm_close (handle);
pcm_state = snd_pcm_state(handle);
printf("3. State: %s\n", print_pcm_state(pcm_state));
printf("finish\n");
return 0;
}
~ # ./audioTest
access type = SND_PCM_ACCESS_RW_INTERLEAVED
The rate 22000 Hz is not supported by your hardware.
==> Using 16000 Hz instead.
needed buffersize: 5120
0.m State: SND_PCM_STATE_OPEN
hello, alsa~.
0.n State: SND_PCM_STATE_PREPARED
capture
1. State: SND_PCM_STATE_PREPARED
EBADFD 77 -> EPIPE 32 -> ESTRPIPE 86
error -5 : interleaved read from audio interface failed (Input/output error)
1.1 State: SND_PCM_STATE_RUNNING
capture
打印之前添加另一个参数化块(取自引用实现):
{
snd_pcm_uframes_t boundary = 0;
snd_pcm_sw_params_alloca(&swparams_c);
/* get the current swparams */
err = snd_pcm_sw_params_current(handle, swparams_c);
if (err < 0) {
printf("Unable to determine current swparams_c: %s\n", snd_strerror(err));
return err;
}
// what's this? necessary?
/*
//err = snd_pcm_sw_params_set_tstamp_mode(handle, swparams_c, SND_PCM_TSTAMP_ENABLE);
err = snd_pcm_sw_params_set_tstamp_mode(handle, swparams_c, SND_PCM_TSTAMP_MMAP);
if (err < 0) {
printf("Unable to set tstamp mode : %s\n", snd_strerror(err));
return err;
}
*/
err = snd_pcm_sw_params_set_avail_min(handle, swparams_c, frames);
if (err < 0) {
printf("Unable to call snd_pcm_sw_params_set_avail_min(): %s\n", snd_strerror(err));
return err;
}
err = snd_pcm_sw_params_set_start_threshold(handle, swparams_c, (buff_size / frames) * frames);
if (err < 0) {
printf("Unable to call snd_pcm_sw_params_set_start_threshold(): %s\n", snd_strerror(err));
return err;
}
err = snd_pcm_sw_params_get_boundary(swparams_c, &boundary);
if (err < 0) {
printf("Unable to call snd_pcm_sw_params_get_boundary(): %s\n", snd_strerror(err));
return err;
}
err = snd_pcm_sw_params_set_stop_threshold(handle, swparams_c, boundary);
if (err < 0) {
printf("Unable to call snd_pcm_sw_params_set_stop_threshold(): %s\n", snd_strerror(err));
return err;
}
/* align all transfers to 1 sample */
err = snd_pcm_sw_params_set_xfer_align(handle, swparams_c, 1);
if (err < 0) {
printf("Unable to set transfer align for playback: %s\n", snd_strerror(err));
return err;
}
/* write the sw parameters */
err = snd_pcm_sw_params(handle, swparams_c);
if (err < 0) {
printf("Unable to set swparams_c : %s\n", snd_strerror(err));
return err;
}
}
error -5 : interleaved read from audio interface failed (Input/output error)
2.1 State: SND_PCM_STATE_PREPARED
最佳答案
第二种情况(设置软件参数)不是未定义行为,也不是BUG。实际上是预期行为。当状态为PREPARED时,读取少于start_threshold
帧会导致阻塞线程。 另一个线程可能开始捕获。该补丁已还原(请参阅this commit):
ALSA: pcm: Comment why read blocks when PCM is not running
This avoids bringing back the problem introduced by 62ba568f7aef ("ALSA: pcm: Return 0 when size < start_threshold in capture") and fixed in 00a399cad1a0 ("ALSA: pcm: Revert capture stream behavior change in blocking mode"), which prevented the user from starting capture from another thread.
start_threshold
设置为
1
。该设备在首次读取时启动。但是,似乎还有另一个超时导致EIO。如果我在ALSA核心中发现问题,我将在此处发布更新。无论如何,可能不是设备驱动程序发出了中断并导致系统死机。
关于c++ - 嵌入式系统上的ALSA-就绪-输入/输出错误和卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33219594/
我有这个代码: System.err.print("number of terms = "); System.out.println(allTerms.size()); System.err
我有以下问题:在操作系统是 Linux 的情况下和在操作系统是 MacOs 的情况下,我必须执行不同的操作。 所以我创建了以下 Ant 脚本目标: /u
我正在调用 system("bash ../tools/bashScript\"This is an argument!\"&"),然后我正在调用 close(socketFD) 直接在 system
使用最初生成的随机元素来约束随机数组的连续元素是否有效。 例如:我想生成一组 10 个 addr、size 对来模拟典型的内存分配例程并具有如下类: class abc; rand bit[5:0
我正在创建一个必须使用system(const char*)函数来完成一些“繁重工作”的应用程序,并且我需要能够为用户提供粗略的进度百分比。例如,如果操作系统正在为您移动文件,它会为您提供一个进度条,
我即将编写一些项目经理、开发人员和业务分析师会使用的标准/指南和模板。目标是更好地理解正在开发或已经开发的解决方案。 其中一部分是提供有关记录解决方案的标准/指南。例如。记录解决/满足业务案例/用户需
在开发使用压缩磁盘索引或磁盘文件的应用程序时,其中部分索引或文件被重复访问(为了论证,让我们说一些类似于 Zipfian 分布的东西),我想知道什么时候足够/更好地依赖操作系统级缓存(例如,Debia
我们编写了一个 powershell 脚本,用于处理来自内部系统的图像并将其发送到另一个系统。现在,业务的另一部分希望加入其中,对数据进行自己的处理,并将其推送到另一个系统。打听了一下,公司周围有几个
我正在尝试朗姆酒我的应用程序,但我收到以下错误:System.Web.HttpUnhandledException:引发了“System.Web.HttpUnhandledException”类型的异
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
所以我在其他程序中没有收到此错误,但我在这个程序中收到了它。 这个程序是一个我没有收到错误的示例。 #include int main() { system("pause"); } // en
我在 c# System.URI.FormatExption 中遇到问题 为了清楚起见,我使用的是 Segseuil 的 Matlab 方法,并且它返回一个图片路径 result。我想为其他用户保存此
我正在尝试像这样设置文本框的背景色: txtCompanyName.BackColor = Drawing.Color.WhiteSmoke; 它不喜欢它,因为它要我在前面添加系统,例如: txtCo
请帮助我解决 System.StackOverflowException我想用 .aspx 将记录写入数据库我使用 4 层架构来实现这一切都正常但是当我编译页面然后它显示要插入数据的字段时,当我将数据
我使用了一些通常由系统调用的API。 因此,我将 android:sharedUserId="android.uid.system" 添加到 manifest.xml, 并使用来自 GIT 的 And
我正在尝试创建一个小型应用程序,它需要对/system 文件夹进行读/写访问(它正在尝试删除一个文件,并创建一个新文件来代替它)。我可以使用 adb 毫无问题地重新挂载该文件夹,如果我这样做,我的应用
我想从没有 su 的系统 priv-app 将/system 重新挂载为 RW。如何以编程方式执行此操作?只会用 Runtime.getruntime().exec() 执行一个 shell 命令吗
我正在尝试制作一个带有登录系统的程序我对此很陌生,但我已经连续工作 8 个小时试图解决这个问题。这是我得到的错误代码 + ServerVersion 'con.ServerVersion' threw
当我“构建并运行”Code::Blocks 中的程序时,它运行得非常好!但是当我从“/bin”文件夹手动运行它时,当它试图用 system() 调用“temp.bat”时,它会重置。这是为什么?它没有
我想使用 system/pipe 命令来执行具有特殊字符的命令。下面是示例代码。通过系统/管道执行命令后,它通过改变特殊字符来改变命令。我很惊讶地看到系统命令正在更改作为命令传递的文本。 run(ch
我是一名优秀的程序员,十分优秀!