#include

#include

#include

#include

#include

#include

#include

/* 下面的三个参数是跟具体文件相关

* 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 / 8]; //buff里面正好放一秒钟的音频

int main()

{

int fd;

int wavfd; /* wav文件的描述符 */

int arg; /* ioctl参数 */

int ret; /* 返回值 */

/* 打开dsp音频设备 */

fd = open("/dev/dsp", O_WRONLY);

if (fd < 0) {

printf("open of /dev/dsp failed");

exit(1);

}

wavfd = open("pass.wav",O_RDONLY);

if (wavfd < 0) {

printf("open of wav failed");

close(fd);

exit(1);

}

/* 设置bit */

arg = SIZE;

ret = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);

if (ret == -1)

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 == -1)

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 == -1)

perror("SOUND_PCM_WRITE_WRITE ioctl failed");

/* 从wav文件中读buff大小的内容,然后写入/dev/dsp中,直到文件结束 */

/* Q:这里我试验时播放了两次,不知道啥情况,如果大家也遇到了请指教。*/

while ((ret = read(wavfd, buff, sizeof(buff))) > 0) {

//printf("read size = %d\n", ret);

write(fd, buff, sizeof(buff));

/* 下面的代码用于在更改播放文件的参数时,播放掉缓冲区内的内容 */

ret = ioctl(fd, SOUND_PCM_SYNC, 0);

if (ret == -1)

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 / 8]; //buff里面正好放一秒钟的音频

/* open device */

fd = open("/dev/dsp", O_WRONLY);

if (fd < 0) {

printf("open of /dev/dsp failed");

exit(1);

}

wavfd = open(filename, O_RDONLY);

if (wavfd < 0) {

printf("open of wav failed");

close(fd);

exit(1);

}

/* set bits */

arg = bits;

ret = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);

if (ret == -1)

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 == -1)

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 == -1)

perror("SOUND_PCM_WRITE_WRITE ioctl failed");

/* 从wav文件中读buff大小的内容,然后写入/dev/dsp中,直到文件结束 */

while ((ret = read(wavfd, buff, sizeof(buff))) > 0) {

printf("read size = %d\n", ret);

write(fd, buff, sizeof(buff));

/* 下面的代码用于在更改播放文件的参数时,播放掉缓冲区内的内容 */

ret = ioctl(fd, SOUND_PCM_SYNC, 0);

if (ret == -1)

perror("SOUND_PCM_SYNC ioctl failed");

}

close(fd);

close(wavfd);

}

linux 音频文件播放文件管理,linux dsp 播放音频文件相关推荐

  1. Linux下 用cmp工具备份,Linux常用命令梳理——文件管理(一)

    由于本人目前仍是萌新一枚,所以<Linux常用命令梳理>系列仅依照个人目前掌握的知识,对一部分命令进行梳理,目的是为了对之前学到的知识进行巩固.当然了,如果机缘巧合被大家看到了,也欢迎各位 ...

  2. linux中的ul命令,linux lin命令

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...

  3. java 上传mp3文件大小,Java获取音频文件(MP3)的播放时长

    最近的一个项目需要按照时间播放mp3文件,例如,播放10分钟的不同音乐. 这就意味着我得事先知道mp3文件的播放时长,以决定播放几遍这个文件. 方案一:Java的方式 找第三方的库,真的感谢这些提供j ...

  4. linux一键电影网站脚本,Linux下HTML5播放器一键生成脚本

    原创内容,转载请注明出处: https://www.myzhenai.com.cn/post/2394.html https://www.myzhenai.com/thread-17969-1-1.h ...

  5. linux系统万能播放器下载,360万能播放器Linux版

    360万能播放器Linux版是一款十分不错的播放器,它可以帮助用户轻松播放出各种格式的音视频文件,所以喜欢看视频的用户,快来下载试试吧! 软件介绍 360万能播放器Linux版是一款在Linux系统上 ...

  6. linux安装音乐软件教程,Linux上好用的五款音乐播放器

    Jack Wallen 盘点他***的五款 Linux 音乐播放器. 不管你做什么,你都有时会来一点背景音乐.不管你是开发.运维或是一个典型的电脑用户,享受美妙的音乐都可能是你在电脑上最想做的事情之一 ...

  7. Linux|智能家居嵌入式系统之音乐播放

    嵌入式实验 引语 内容介绍 案例展示 原理 代码 结果展示 引语 记录学习路程,抛砖引玉.如有更好的算法或者出现错误,欢迎指点. 内容介绍 1.理解触摸屏的工作原理 2.掌握触摸屏获取坐标的方法 3. ...

  8. linux终端音乐播放器,Linux终端音乐播放器cmus攻略: 操作歌单

    cmus是一款开源的终端音乐播放器.它小巧快速,而又功能强大.cmus支持Ogg/Vorbis.MP3.FLAC.Musepack.WavPack.WMA.WAV.AAC.MP4等格式,包含Gaple ...

  9. 如何安装整个linux系统中所需要的mp3播放库插件? 可以在安装rpmfusion仓库后直接通过dnf install进行按照就可以了...

    在vi的界面中, 前面的数字, 表示一行. 而对于中文而言, 并不一定是"一个文本行"就是一行, 而是以 回车(硬回车)为标志, 来判定一行的. 而dd, yy等也是以" ...

最新文章

  1. java培训分享:学习Java需要什么软件
  2. 前端用html5还是html4,Web前端面试题第四道—Html5与html4的异同
  3. 要有被打断仍能够继续学习的能力
  4. Java连接open fire_java – 为什么我不能连接到openfire服务器?
  5. 有向图最长路径算法_算法数据结构 | 三个步骤完成强连通分量分解的Kosaraju算法...
  6. id和instancetype的区别
  7. Kafka的配置文件详细描述
  8. Web安全通讯之JWT的Java实现
  9. 教你如何从0到1实现组件化架构
  10. R语言do.call函数简单说明
  11. java8 32位脱机安装_java8离线安装包32位 官方最新版
  12. 将微信数据提取为exel表格(2022年版)免root 保姆级教程
  13. https 抓包解密
  14. 【Dart语言第5篇】运算符
  15. C# Revit二次开发基础/核心编程---建筑建模-标高和轴网
  16. 无线路由器不启用dhcp服务器,360路由器怎么关闭DHCP服务器? | 192路由网
  17. python学习第五节:用面向对象实现friendbook
  18. 物流企业竞争优势及竞争力体系的构建 (zt)
  19. 说说自己理解的web架构
  20. 设计灵感|极简优雅排版!干净简洁的排版设计

热门文章

  1. 如何通过OpenFace实现人脸识别框架
  2. 最简单的React和Redux整合的例子
  3. Scala _04Scala字符串
  4. leetcode 334. Increasing Triplet Subsequence | 334. 递增的三元子序列(一种较trick的解法)
  5. leetcode 274, 275. H-Index I, II(H 指数问题合集,线性查找/二分查找)
  6. javascript中的模块系统
  7. JDK14性能管理工具:jstack使用介绍
  8. Kafka单机、集群模式安装详解(一)
  9. package.json mysql_package.json入门
  10. PooledDirectByteBuf源码分析