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

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

  1. Linux音频编程指南

    Linux音频编程指南 虽然目前Linux的优势主要体现在网络服务方面,但事实上同样也有着非常丰富的媒体功能,本文就是以多媒体应用中最基本的声音为对象,介绍如何在Linux平台下开发实际的音频应用程序 ...

  2. 【Linux系统编程应用】Linux音频编程基础(一)【转】

    转自:https://blog.csdn.net/dengjin20104042056/article/details/52435290 一.数字音频 音频信号是一种连续变化的模拟信号,但计算机只能处 ...

  3. Linux音频编程指南(转)

    转自: http://www.ibm.com/developerworks/cn/linux/l-audio/ Linux音频编程指南 虽然目前Linux的优势主要体现在网络服务方面,但事实上同样也有 ...

  4. Linux音频编程(一)ALSA介绍

    Linux下的音频编程中有OSS和ALSA,本篇文章将对ALSA进行相关介绍.ALSA提供一系列基于命令行的工具集,比如混音器(mixer),音频文件播放器(aplay),以及控制特定声卡特定属性的工 ...

  5. Linux音频编程(二)声卡介绍

    一.声卡 1.声卡是audio interface,它含有hardware buffer,而这个hardware buffer是在声卡里面,不是内存.声卡的缓存是环状的,则ALSA中是将数据分成连续的 ...

  6. linux 音频编程

    http://blog.csdn.net/sea918/article/details/7249216   1.音频开发模型: OSS(open sound system)  linux/unix 平 ...

  7. Linux音频编程

    1. 背景 在<Jasper语音助理介绍>中, 介绍了Linux音频系统, 本文主要介绍了Linux下音频编程相关内容. 音频编程主要包括播放(Playback)和录制(Record), ...

  8. Linux设备驱动开发详解-Note(5)---Linux 内核及内核编程(1)

    Linux 内核及内核编程(1) 成于坚持,败于止步 Linux 2.6 内核的特点 Linux 2.6 相对于 Linux 2.4 有相当大的改进,主要体现在如下几个方面. 1.新的调度器 2.6 ...

  9. 嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得

    **************************************************************************************************** ...

随机推荐

  1. webpack dev server 和 sublime text 配合时需要注意的地方

    参考:https://webpack.js.org/guides/development/ Adjusting Your Text Editor Some text editors have a &q ...

  2. JS——2048(支持触屏及键盘操作)

    <html> <head> <title>2048</title> <style type="text/css"> ta ...

  3. 初识RecyclerView

    初识RecyclerView 效果图 RecyclerView与ListView对比(官方) RecyclerView 小组件比 ListView 更高级且更具灵活性. 此小组件是一个用于显示庞大数据 ...

  4. Android Studio 如何打JAR包

    Android Studio 如何打JAR包 在eclipse中我们知道如何将一个项目导出为jar包,供其它项目使用.  在AS中可以通过修改gradle才处理.  我们新建一个项目MakeJar,在 ...

  5. Programming In Scala笔记-第十五章、Case Classes和模式匹配

    本章主要分析case classes和模式匹配(pattern matching). 一.简单例子 接下来首先以一个包含case classes和模式匹配的例子来展开本章内容. 下面的例子中将模拟实现 ...

  6. Swift下多个Storyboard的项目结构

    我是个比较喜欢用storyboard和xib的人.我个人的习惯就是,能用storyboard的一定不用代码手工撸.当然自己业余个人写的项目,基本上一个storyboard就搞定了.但涉及到多人合作下时 ...

  7. 凸函数与Jensen不等式

    这个是在凸优化里面看的,在EM算法中看有用到,所以用latex写了篇回忆用的小短文,现在不会把latex产生的pdf怎么转变成放到这里的内容. 所以我选择直接贴图. 这个pdf可以在我的资源里找到.  ...

  8. SSO 基于CAS实现单点登录 实例解析(二)

    本文目录: 概述 演示环境 部署CAS-Server相关的Tomcat 部署CAS-Client相关的Tomcat 测试验证SSO 第一: 本demo在一个机器上实现(三个虚拟主机),来看SSO单点登 ...

  9. 二维码扫描&集合排序

    一.二维码扫描机制 二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧妙地利用构 ...

  10. 线程在Linux中的实现

          早在以前,我们就知道,CPU调度的基本单位是线程,而进程是拥有资源的基本单位,进程是用进程描述符表示的,那么线程是怎么实现和表示的呢?       线程机制是现代编程技术中常用的一种抽象概 ...