在linux下也可以写一个类似麦克风和喇叭这样的应用程序,只要打开/dev/dsp这个设备驱动,对该设备read读操作相当于录音,对这个设备write写操作相当于放音。
对于以下出现的一些参数我就不多说了,百度很多,大家可以自行查找,关于音频编程还有很多,alsa和OSS混合编程是目前用得最多的,如果对这方面有兴趣的可以深入研究。
以下是当时我在学习这方面知识的时候写的一个测试程序:
测试的结果就是当对着麦克风说话时,喇叭会放出声音,前提是你的linux系统需要安装/dev/dsp这个驱动。
按照这个原理,你应该有能力可以写一个类似千千静听这样的MP3播放器的软件了!去试试吧!
#include <stdio.h> #include <sys/ioctl.h> #include <fcntl.h> #include <unistd.h> // /usr/include/linux/videodev2.h //v4l2接口 // /usr/include/linux/soundcard.h //声卡 #include <linux/soundcard.h> #define SIZE 44100*2*2*5 int main(void) { int fd ; fd = open("/dev/dsp" , O_RDWR); if(-1 == fd ) { perror("Open SoundCard Fail ... \n"); return -1 ; } //speex 声音压缩库 //ALSA 声音解码库 //读取声卡参数 //rate 采样率 channels 声道 bits 量化位数 int rate , channels , bits ; char buffer[SIZE] = {0}; //将声卡配置成MP3标准 //采样率 rate = 44100 ; //通道数 channels = 2 ; //量化位数 bits = 16 ; if(ioctl(fd , SOUND_PCM_WRITE_RATE , &rate) < 0) perror("write soundcard rate fail"); if(ioctl(fd , SOUND_PCM_WRITE_CHANNELS, &channels) < 0) perror("write soundcard channels fail"); if(ioctl(fd , SOUND_PCM_WRITE_BITS ,&bits ) < 0) perror("write soundcard bits fail"); //读取参数 if(ioctl(fd , SOUND_PCM_READ_RATE , &rate) <0) perror("read soundcard rate fail"); if(ioctl(fd , SOUND_PCM_READ_CHANNELS, &channels) <0) perror("read soundcard channels fail"); if(ioctl(fd , SOUND_PCM_READ_BITS , &bits) <0) perror("read soundcard bits fail"); printf("rate:%d channels:%d bits:%d \n" , rate , channels , bits ); int ret ; while(1) { printf("recording ... \n"); ret = read(fd , buffer , SIZE); printf("playing ... \n"); write(fd , buffer , ret); } close(fd); return 0 ; }