Linux C OSS音频编程

时间:2023-03-08 16:14:11

在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 ;
}