我看到过一个铁子,,收藏了:
一下是转载~~~~~~可能对你有所帮助
------------------------------------------------------------------------------------
为什么总是设备忙?对声卡 设备文件读写,实现录音放音的程序~
 
 Qt下,音频编程,运行如下程序,声卡文件总是busy
通过检测声卡,能够正常发声后,再运行程序,提示 wrote wrong number of bytes
即是 不能回放
我可以确定,程序是好的,为什么声卡文件总是busy?
直接对设备文件读写,效率应该比较高的呀
附源程序:
/*
 * sound.c
 */
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/soundcard.h>
#define LENGTH 3   /* 存储秒数 */
#define RATE 8000   /* 采样频率 */
#define SIZE 8     /* 量化位数 */
#define CHANNELS 1 /* 声道数目 */
/* 用于保存数字音频数据的内存缓冲区 */
unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8];
int main()
{
 int fd;    /* 声音设备的文件描述符 */
 int arg;    /* 用于ioctl调用的参数 */
 int status;   /* 系统调用的返回值 */
 /* 打开声音设备 */
 fd = open("/dev/dsp", O_RDWR);
 if (fd < 0) {
   perror("open of /dev/dsp failed");
   exit(1);
 }
 /* 设置采样时的量化位数 */
 arg = SIZE;
 status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
 if (status == -1)
   perror("SOUND_PCM_WRITE_BITS ioctl failed");
 if (arg != SIZE)
   perror("unable to set sample size");
 /* 设置采样时的声道数目 */
 arg = CHANNELS; 
 status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
 if (status == -1)
   perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
 if (arg != CHANNELS)
   perror("unable to set number of channels");
 /* 设置采样时的采样频率 */
 arg = RATE;
 status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
 if (status == -1)
   perror("SOUND_PCM_WRITE_WRITE ioctl failed");
 /* 循环,直到按下Control-C */
 while (1) {
   printf("Say something:\n");
   status = read(fd, buf, sizeof(buf)); /* 录音 */
   if (status != sizeof(buf))
     perror("read wrong number of bytes");
   printf("You said:\n");
   status = write(fd, buf, sizeof(buf)); /* 回放 */
   if (status != sizeof(buf))
     perror("wrote wrong number of bytes");
   /* 在继续录音前等待回放结束 */
   status = ioctl(fd, SOUND_PCM_SYNC, 0); 
   if (status == -1)
     perror("SOUND_PCM_SYNC ioctl failed");
 }
}