Linux C OSS音频编程

在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 ;
}
时间: 2024-11-02 22:06:43

Linux C OSS音频编程的相关文章

linux下ALSA音频驱动软件开发

最近一直忙于Linux下ALSA音频驱动的开,作了一次专题讨论,现将部分内容贴出来大家分享一下.    内容提要 一.音频相关的基础知识 •二.Linux下音频驱动开发模型 •三.socxx+ WM8993驱动实例分析 •四.总结 • 五. Question& Discussion   音频相关的基础知识  ----采样.量化     •1.采样频率 •   常用 32kHz. 44.1kHz. 48kHz. •2.量化精度 •   指对采样数据分析的精度,精度越高,声音就越逼真.常用8位.16

关于linux c语言多线程编程的问题

问题描述 关于linux c语言多线程编程的问题 /* 以生产者和消费者模型问题来阐述Linux线程的控制和通信你 生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品. 缓冲区有N个,是一个环形的缓冲池. */#include #include #define BUFFER_SIZE 16 struct prodcons{ int buffer[BUFFER_SIZE];/*实际存放数据的数组*/ pthread_mutex_t lock;/*互斥体lock,用于对缓冲区的互斥操作*/

Linux GCC 64位编程技巧

                                 linux GCC 64位编程技巧 64位系统的优势? 既然要采用64位系统,首先要知道64位系统的优势所在.对于技术人员来说,完全没有必要去看那些厂家拿出的厚厚的说明书.或者某个研究机构抛出的一堆的数字,64位系统的优势总结起来很简单:内存大.速度快! 内存大 与32位系统相比,64位系统的地址空间大大增大,达到了18PB,18PB究竟是多大呢?说出来有点吓人:4G内存的40亿倍!这么大的空间,不要说内存了,就是整个磁盘的数据都

linux编程-关于Linux的三个编程题,想了半天毫无头绪,感觉Linux编程好复杂。求大家帮助帮助我,谢谢。

问题描述 关于Linux的三个编程题,想了半天毫无头绪,感觉Linux编程好复杂.求大家帮助帮助我,谢谢. 1:子进程每隔一秒向文件写入信息,父进程每隔三秒读出子进程所写的信息并输出到屏幕. 2:模拟shell,设计一个交互式命令处理程序,注意对命令参数和环境参数的处理. 3:编写一个守护进程,实现功能为:每隔一秒,向当前目录下的hello文件里写入一行helloworld. 解决方案 Linux设备驱动编程之复杂设备驱动25岁了,是学linux运维还是编程好呢?求指点下 .. 解决方案二: 楼

Linux中的c++编程&amp;amp;lt;&amp;amp;lt;语法

问题描述 Linux中的c++编程<<语法 请教一下各位:*env << "Usage: " << progName中的<<到底起到什么作用,这是什么语法? 解决方案 <<就是一个输出流操作符,operator 解决方案二: 你的env应该是一个ostream等输出流对象,这个就相当于输出后面的字符串和变量到对应的管道. 解决方案三: Linux的shell编程--语法Linux下C++ Socket编程linux C++ 多

linux网络编程-LINUX下模拟DNS编程,写报文时关于DOMAIN NAME 的格式转换程序

问题描述 LINUX下模拟DNS编程,写报文时关于DOMAIN NAME 的格式转换程序 这段程序要求是转换格式,如www.baidu.com换成3www5baidu3com0 网上有代码 void ChangetoDnsNameFormat(unsigned char* dns,unsigned char* host) { int lock = 0 , i; strcat((char*)host,"."); for(i = 0 ; i < strlen((char*)host)

《Linux设备驱动开发详解 A》一一3.5 Linux下的C编程特点

3.5 Linux下的C编程特点 3.5.1 Linux编码风格 Linux有独特的编码风格,在内核源代码下存在一个文件Documentation/CodingStyle,进行了比较详细的描述. Linux程序的命名习惯和Windows程序的命名习惯及著名的匈牙利命名法有很大的 不同. 在Windows程序中,习惯以如下方式命名宏.变量和函数: #def?ine PI 3.1415926 / 用大写字母代表宏 / int minValue, maxValue; / 变量:第一个单词全小写,其后单

linux C/C++ 多线程编程的问题

问题描述 linux C/C++ 多线程编程的问题 一个进程中开n个线程,这些线程每个都是read()阻塞的. 如何给他们分配均匀的cpu时间片让他们平等的阻塞等待I/O呢? 希望了解这类函数方法以及实现代码.解决的链接也可,谢谢了 解决方案 如果说要直接控制操作系统对于线程的cpu分配恐怕做不到. 你应该是想及时地响应可读事件吧? 建议看看linux下 事件多路分离机制 epool select 之类的,http://blog.csdn.net/hdutigerkin/article/deta

linux能不能通过编程(如c语言)延迟关机?

问题描述 linux能不能通过编程(如c语言)延迟关机? 功能需求中需要在服务器关机或者重启时将程序当前处理的数据输出来,但是,有时数据会非常多,需要三四分钟才可以输出完毕,而关机时间内没办法输出完毕.求问大神有什么解决办法没有,通过编程延迟关机,或者通过更改系统的一些配置,使收到关机信号时,延时几分钟再关闭. 解决方案 shutdown -c取消关机,执行你的程序,执行完了,再shutdown 解决方案二: shutdown -t 后面给你想要等待多久关机 解决方案三: 处理SIGTERM,S