日期:2014-05-16 浏览次数:20759 次
#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 22050 /* 采样频率 */ #define SIZE 8 /* 量化位数 */ #define CHANNELS 1 /* 声道数目 */ /* 用于保存数字音频数据的内存缓冲区 */ unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8]; int openDsp(int rd){ int fd; /* 声音设备的文件描述符 */ int arg; /* 用于ioctl调用的参数 */ int status; /* 系统调用的返回值 */ /* 打开声音设备 */ if(rd==0) fd= open("/dev/dsp",O_RDONLY); else fd= open("/dev/dsp",O_WRONLY); 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 = 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"); return fd; } int main() { int status; /* 循环,直到按下Control-C */ while (1) { memset(buf,0,sizeof(buf)); int fdread=openDsp(0); printf("Say something:\n"); status = read(fdread, buf, sizeof(buf)); /* 录音 */ if (status != sizeof(buf)) perror("read wrong number of bytes"); status=close(fdread); if(status==-1){ perror("close Read Dsp wrong"); exit(1); } int fdwrite=openDsp(1); printf("You said:\n"); status = write(fdwrite, buf, sizeof(buf)); /* 回放 */ if (status != sizeof(buf)) perror("wrote wrong number of bytes"); /* 在继续录音前等待回放结束 */ status = ioctl(fdwrite, SOUND_PCM_SYNC, 0); if (status == -1) perror("SOUND_PCM_SYNC ioctl failed"); status=close(fdwrite); if(status==-1){ perror("rclose Write Dsp wrong"); exit(1); } } return 0; }