#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/soundcard.h>
/* 下面的三个参数是跟具体文件相关
* cmd: file 音频文件
* [file pass.wav] =>> pass.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 44100 Hz
*  1. 16位
*  2. mono为当声道=1, Stereo为立体声=2
*  3. 44100HZ为频率这个大家都知道,及一秒钟采集或者播放音频的bit数量。
*/
#define RATE 44100
#define SIZE 16
#define CHANNELS 1 // 1表示单声道,2为立体/* 缓冲区 */
unsigned char buff[RATE * SIZE * CHANNELS / ]; //buff里面正好放一秒钟的音频 int main()
{
int fd;
int wavfd; /* wav文件的描述符 */
int arg; /* ioctl参数 */
int ret; /* 返回值 */
/* 打开dsp音频设备 */
fd = open("/dev/dsp", O_WRONLY);
if (fd < ) {
printf("open of /dev/dsp failed");
exit();
}
wavfd = open("pass.wav",O_RDONLY);
if (wavfd < ) {
printf("open of wav failed");
close(fd);
exit();
} /* 设置bit */
arg = SIZE;
ret = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
if (ret == -)
perror("SOUND_PCM_WRITE_BITS ioctl failed");
if (arg != SIZE)
perror("unable to set sample size"); /* 设置channels */
arg = CHANNELS;
ret = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if (ret == -)
perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
if (arg != CHANNELS)
perror("unable to set number of channels"); /* 设置rate */
arg = RATE;
ret = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
if (ret == -)
perror("SOUND_PCM_WRITE_WRITE ioctl failed"); /* 从wav文件中读buff大小的内容,然后写入/dev/dsp中,直到文件结束 */
  /* Q:这里我试验时播放了两次,不知道啥情况,如果大家也遇到了请指教。*/
while ((ret = read(wavfd, buff, sizeof(buff))) > ) {
//printf("read size = %d\n", ret);
write(fd, buff, sizeof(buff));
/* 下面的代码用于在更改播放文件的参数时,播放掉缓冲区内的内容 */
ret = ioctl(fd, SOUND_PCM_SYNC, );
if (ret == -)
perror("SOUND_PCM_SYNC ioctl failed");
} close(fd);
close(wavfd);
} 下面是封装的接口可以直接拿过来使用: void play_audio(int rate, int bits, int channels, char *filename)
{
int fd;
int wavfd; /* wav文件的描述符 */
int arg; /* ioctl arg */
int ret; /* return value */ unsigned char buff[rate * bits * channels / ]; //buff里面正好放一秒钟的音频
/* open device */
fd = open("/dev/dsp", O_WRONLY);
if (fd < ) {
printf("open of /dev/dsp failed");
exit();
}
wavfd = open(filename, O_RDONLY);
if (wavfd < ) {
printf("open of wav failed");
close(fd);
exit();
} /* set bits */
arg = bits;
ret = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
if (ret == -)
perror("SOUND_PCM_WRITE_BITS ioctl failed");
if (arg != SIZE)
perror("unable to set sample size"); /* set channels */
arg = channels;
ret = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if (ret == -)
perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
if (arg != CHANNELS)
perror("unable to set number of channels"); /* set rate */
arg = rate;
ret = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
if (ret == -)
perror("SOUND_PCM_WRITE_WRITE ioctl failed"); /* 从wav文件中读buff大小的内容,然后写入/dev/dsp中,直到文件结束 */
while ((ret = read(wavfd, buff, sizeof(buff))) > ) {
printf("read size = %d\n", ret);
write(fd, buff, sizeof(buff));
/* 下面的代码用于在更改播放文件的参数时,播放掉缓冲区内的内容 */
ret = ioctl(fd, SOUND_PCM_SYNC, );
if (ret == -)
perror("SOUND_PCM_SYNC ioctl failed");
} close(fd);
close(wavfd);
}

linux dsp 播放音频文件的更多相关文章

  1. 关于Window Server2008 服务器上无法播放音频文件的解决方案

    在偌大的百度当中查找我所需要的资源信息,但网络上所描述的都不能解决,发生此类问题的人很多,但是都没有得到准确的解决方法!经个人各方面的尝试,其实非常简单的解决了无法播放音频文件的问题,如果各位今后也遇 ...

  2. ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件

    原文:ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件 先看效果图,然后上代码: <UserControl x:Class= ...

  3. .NET winform播放音频文件

    前提:最近要求做一个在winform端做一个音频文件播放的功能,至此,总结最近搜寻的相关资料. 一.微软提供了三种方式来播放音频文件 1.通过System.Media.SoundPlayer来播放 2 ...

  4. C#调用mciSendString播放音频文件

    mciSendString函数是一个WinAPI,主要用来向MCI(Media Control Interface)设备发送字符串命令. 一.函数的声明如下: private static exter ...

  5. Unity 播放音频文件

    Unity 播放音频文件参考代码: public void Play(string strSoundName, float autoDestroyTime = 0f, bool bLoop = fal ...

  6. Qt 播放音频文件

    Qt播放音频文件的方法有好多中,简单介绍几种 不过一下几种方式都需要在Qt工程文件中添加 QT       += multimedia 第一 QMediaPlayer类 可以播放MP3文件,同时使用也 ...

  7. h5 audio播放音频文件

    h5 audio播放音频文件 注:下面html中样式及不相关的内容去掉了 第一个例子 播放没有防盗链的外网音频文件是可以的 <!doctype html> <html> < ...

  8. jquery自动播放音频文件

    使用jquery自动播放音频文件 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  9. Linux下压缩音频文件

    安装工具 sudo apt-get install lame 具体用法可以查看帮助  lame --help 通过更改音频文件的帧数 可以让文件变小  但是音质也会随之下降 现在比较多的mp3文件是1 ...

随机推荐

  1. perl随记(1)

    chmod 755 test,改变文件权限,rwx 421 chomp,如果字符串结尾有换行符,chomp 可以去掉它 正则表达式量词:*表示有或无,+表示1或多,?表示0或1 my,局部变量,只在定 ...

  2. 使用第三方工具覆写Object中方法

    我们在实际开发中,经常需要覆写Object中的equals,hashcode,toString方法,其实编写这些代码并不是很难,但很枯燥和乏味. 下面推荐Google的Guava jar包来覆写上面的 ...

  3. 查看python selenium的api

    打开命令行工具,doc中输入: python -m pydoc -p 然后在浏览器中访问http://localhost:4567/,此时应该可以看到python中所有的Modules 按ctrl+f ...

  4. android 自动化压力测试-monkey 1 实践

    Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进行压力测试.Monkey ...

  5. Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) C - Bear and Colors

    题目链接: http://codeforces.com/contest/673/problem/C 题解: 枚举所有的区间,维护一下每种颜色出现的次数,记录一下出现最多且最小的就可以了. 暴力n*n. ...

  6. 【CentOS】Eclipse中svn插件使用

    目录: 1.安装 2.使用 3.错误 1.安装 svn插件地址: Subclipse 1.6.x Update Site - http://subclipse.tigris.org/update_1. ...

  7. bzoj 2599 数分治 点剖分

    具体可以见漆子超的论文 /**************************************************************     Problem:     User: B ...

  8. 第k短路

    poj 2449 模板题  A*+spfa #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  9. 【bzoj1011】[HNOI2008]遥远的行星

    1011: [HNOI2008]遥远的行星 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 3711  Solved ...

  10. HTML页面加载和解析流程详细介绍

    浏览器加载和渲染html的顺序 1. IE下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的. 2. 在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元 ...