LinuxCOSS音訊程式設計

morixinguan發表於2016-07-06

在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 ... 
");
		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 
" , 
	rate , channels , bits );


	int ret ; 

	while(1)
	{
		printf("recording ... 
");
		ret = read(fd , buffer , SIZE);
		printf("playing ... 
");
		write(fd , buffer , ret);

	}

	close(fd);


	return 0 ;
}


相關文章