linux dev/dsp 声卡学习笔记

转载 2013年12月02日 09:12:22
      无论是从声卡读取数据,或是向声卡写入数据,事实上都具有特定的格式(format),默认为8位无符号数据、单声道、8KHz采样率,如果默认值无法达到要求,可以通过ioctl系统调用来改变它们。通常说来,在应用程序中打开设备文件/dev/dsp之后,接下去就应该为其设置恰当的格式,然后才能从声卡读取或者写入数据。
 
下面的代码示范了如何以只写方式打开声卡进行放音(playback)操作:

  int handle = open("/dev/dsp", O_WRONLY);

  if (handle == -1) {

  perror("open /dev/dsp");

  return -1;

  }

 

下面的代码示范了怎样设置声卡驱动程序中的内核缓冲区的大小:

  int setting = 0xnnnnssss;

  int result = ioctl(handle, SNDCTL_DSP_SETFRAGMENT, &setting);

  if (result == -1) {

  perror("ioctl buffer size");

  return -1;

  }

 

设置声卡工作时的声道(channel)数目,根据硬件设备和驱动程序的具体情况,可以将其设置为0(单声道,mono)或者1(立体声,stereo)。下面的代码示范了应该怎样设置声道数目:

  int channels = 0; // 0=mono 1=stereo

  int result = ioctl(handle, SNDCTL_DSP_STEREO, &channels);

  if ( result == -1 ) {

  perror("ioctl channel number");

  return -1;

  }

  if (channels != 0) {

  // 只支持立体声

  }

采样格式和采样频率是在进行音频编程时需要考虑的另一个问题,声卡支持的所有采样格式可以在头文件soundcard.h中找到,而通过ioctl系统调用则可以很方便地更改当前所使用的采样格式。下面的代码示范了如何设置声卡的采样格式:

  int format = AFMT_U8;

  int result = ioctl(handle, SNDCTL_DSP_SETFMT, &format);

  if ( result == -1 ) {

  perror("ioctl sample format");

  return -1;

  }

在Linux下进行音频编程时最常用到的几种采样频率是11025Hz、16000Hz、22050Hz、32000Hz和44100Hz。下面的代码示范了如何设置声卡的采样频率:

  int rate = 22050;

  int result = ioctl(handle, SNDCTL_DSP_SPEED, &rate);

  if ( result == -1 ) {

  perror("ioctl sample format");

  return -1;

  }

相关文章推荐

Tomcat 7学习笔记之配置Web界面管…

在捣腾Tomcat 7的时候遇到一个问题,很多人对tomcat自带的web管理工具不是很熟悉,因为一直都是手动修改配置文件。这次有点好奇想看看tomcat的web管理界面,因为之前一直用weblogi...

qtopia 学习笔记

1. 控件位置的确定 控件的位置一般来说是相对其父的其左上角的坐标: QWidget *w = new QWidget(this); QPoint p = w->pos(); int x = p.x(...

ALSA声卡12_从零编写之添加音量控制_学习笔记

1、设置音量时应用程序的调用过程 (1)strace分析: amixer cset numid=1 30 (设置音量) /dev/snd/controlC0 open SNDRV_CTL_...

alsa声卡学习笔记

ALSA由下面几部分组成: 1.       Driver 内核驱动程序,包括硬件相关的和一些公共代码。有近30万行代码,太庞大的了,只选择性的看了core里一些代码。比如粗略的浏览了一遍《Wr...

DSP程序 调试总结

原文地址:调试总结">DSP程序 调试总结作者:fanaishen1.warning: entry point symbol _c_int00 undefined 使用C写DSP时,在rts.lib库...

linux_dev_学习笔记_内存映射nopage()

2012年3月25日  Sunday   1、内核版本号2.6.33.20   2、nopage()实例   1)与上篇中remap_pfn_range()一样在书中的实例的实现也有所不同...

CMMI DEV V1.3学习笔记

  • 2011年05月02日 15:29
  • 654KB
  • 下载

python 语法笔记

[python] view plaincopy i=int(raw_input("i= "))   if i==0:      print 'i=0'   elif i==1...

GCC笔记 (转载)

2008-11-15 13:30) 分类: Linux Programming   The History of GCC 1984年,Richard Stallman发起了自由软件...

Linux 检测网卡和配置网卡信息

1.当前的业务需求,Linux服务器安装了一个新的网卡,需要重启系统检查系统是否识别了第二块网卡; 2.如何检查呢:ifconig -a  eth0      Link encap:Ethe...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux dev/dsp 声卡学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)