+ -
当前位置:首页 → 问答吧 → 关于ubuntu下声音编程的一些问题

关于ubuntu下声音编程的一些问题

时间:2011-12-15

来源:互联网

传统的linux的声音编程是打开/dev下的dsp等声音设备,然后就像类似文件操作一样简单。但ubuntu下却不同,没有dsp这个设备,用的是alsa编程。通过上网查资料,我找到了一些alsa编程的一些资料。但是还有很多不懂的问题,希望大家帮帮忙。最大的问题就是 read(0, buffer, size) 和 write(1, buffer, size)。一个是读入声音,一个是写入声音。(这两个分别是我从录音功能和播放功能下截取出来的)。单独使用都可以 比如 可以./record(录音) >1.raw 或者播放 ./play(播放) <1.raw 。或者让两个同时工作, ./record | ./play 。这么运行的话 就是把说的话给直接播放出来。 但是不理解的是 如果我把这两句写在一个文件里,就不行。 这两个语句意思应该是 读出buffer里的声音数据和把声音数据写入buffer里面吧?

还有就是 如果淡入运行录音功能,而没有把他输出(./record) 屏幕就会一直刷乱码。。。不理解啊。

作者: ssssongbo   发布时间: 2011-12-15

read(0, buffer, size) 是指从声卡的缓存区读取数据,用于录音
write(1, buffer, size)就是把声音放进缓存区,用来放音、保存等。
我用了一块dsp+arm的板子,arm就是用alsa来读取数据然后在dsp中进行处理的,使用alsa库进行的编程,下面是我程序中的一段
rc = snd_pcm_readi(handle, buffer, frames);
if (rc == -EPIPE) 
  {
  /* EPIPE means overrun */
  fprintf(stderr, "overrun occurred\n");
  snd_pcm_prepare(handle);
  } else if (rc < 0) {
  fprintf(stderr,
  "error from read: %s\n",
  snd_strerror(rc));
  } else if (rc != (int)frames) {
  fprintf(stderr, "short read, read %d frames\n", rc);
  }
  rc = write(outfile, buffer, size);
  if (rc != size)
  fprintf(stderr,"short write: wrote %d bytes\n", rc);//outfile是我之前打开的一个文件

作者: xiongmin060102   发布时间: 2011-12-17

热门下载

更多