在UBUNTU系统上使用alsa库完成了对外播放的wav文件的案例。

案例代码:

/**
*test.c
*
*注意:这个例子在Ubuntu 12.04.1环境下编译运行成功。
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h> int main(int argc, char *argv[])
{
int i;
int ret;
int buf[128];
unsigned int val;
int dir=0;
char *buffer;
int size;
snd_pcm_uframes_t frames;
snd_pcm_uframes_t periodsize;
snd_pcm_t *playback_handle;//PCM设备句柄pcm.h
snd_pcm_hw_params_t *hw_params;//硬件信息和PCM流配置
if (argc != 2) {
printf("error: alsa_play_test [music name]\n");
exit(1);
}
printf("play song %s by wolf\n", argv[1]);
FILE *fp = fopen(argv[1], "rb");
if(fp == NULL)
return 0;
fseek(fp, 100, SEEK_SET); //1. 打开PCM,最后一个参数为0意味着标准配置
ret = snd_pcm_open(&playback_handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
if (ret < 0) {
perror("snd_pcm_open");
exit(1);
} //2. 分配snd_pcm_hw_params_t结构体
ret = snd_pcm_hw_params_malloc(&hw_params);
if (ret < 0) {
perror("snd_pcm_hw_params_malloc");
exit(1);
}
//3. 初始化hw_params
ret = snd_pcm_hw_params_any(playback_handle, hw_params);
if (ret < 0) {
perror("snd_pcm_hw_params_any");
exit(1);
}
//4. 初始化访问权限
ret = snd_pcm_hw_params_set_access(playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED);
if (ret < 0) {
perror("snd_pcm_hw_params_set_access");
exit(1);
}
//5. 初始化采样格式SND_PCM_FORMAT_U8,8位
ret = snd_pcm_hw_params_set_format(playback_handle, hw_params, SND_PCM_FORMAT_S16_LE);
if (ret < 0) {
perror("snd_pcm_hw_params_set_format");
exit(1);
}
//6. 设置采样率,如果硬件不支持我们设置的采样率,将使用最接近的
//val = 44100,有些录音采样频率固定为8KHz val = 16000;
ret = snd_pcm_hw_params_set_rate_near(playback_handle, hw_params, &val, &dir);
if (ret < 0) {
perror("snd_pcm_hw_params_set_rate_near");
exit(1);
}
//7. 设置通道数量 1
ret = snd_pcm_hw_params_set_channels(playback_handle, hw_params, 1);
if (ret < 0) {
perror("snd_pcm_hw_params_set_channels");
exit(1);
} /* Set period size to 32 frames. */
frames = 32;
periodsize = frames ;
ret = snd_pcm_hw_params_set_buffer_size_near(playback_handle, hw_params, &periodsize);
if (ret < 0)
{
printf("Unable to set buffer size %li : %s\n", frames * 2, snd_strerror(ret)); }
periodsize /= 2; ret = snd_pcm_hw_params_set_period_size_near(playback_handle, hw_params, &periodsize, 0);
if (ret < 0)
{
printf("Unable to set period size %li : %s\n", periodsize, snd_strerror(ret));
} //8. 设置hw_params
ret = snd_pcm_hw_params(playback_handle, hw_params);
if (ret < 0) {
perror("snd_pcm_hw_params");
exit(1);
} /* Use a buffer large enough to hold one period */
snd_pcm_hw_params_get_period_size(hw_params, &frames, &dir); size = frames * 2; /* 2 bytes/sample, 2 channels */
buffer = (char *) malloc(size);
fprintf(stderr,
"size = %d\n",
size); while (1)
{
ret = fread(buffer, 1, size, fp);
if(ret == 0)
{
fprintf(stderr, "end of file on input\n");
break;
}
else if (ret != size)
{
}
//9. 写音频数据到PCM设备
while(ret = snd_pcm_writei(playback_handle, buffer, frames)<0)
{
usleep(2000);
if (ret == -EPIPE)
{
/* EPIPE means underrun */
fprintf(stderr, "underrun occurred\n");
//完成硬件参数设置,使设备准备好
snd_pcm_prepare(playback_handle);
}
else if (ret < 0)
{
fprintf(stderr,
"error from writei: %s\n",
snd_strerror(ret));
}
} }
//10. 关闭PCM设备句柄
snd_pcm_close(playback_handle); return 0;
} //注意:编译的时候应该保持“gcc -o test test.c -L. -lasound”的格式,运行的时候应该保持"./test clip2.wav"这种格式。

gcc -o test wav.c -lasound

Linux音频编程--使用ALSA库播放wav文件的更多相关文章

  1. Linux音频编程

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

  2. Linux音频编程指南

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

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

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

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

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

  5. python 播放 wav 文件

    未使用其他库, 只是使用 pywin32 调用系统底层 API 播放 wav 文件. # Our raison d'etre - playing sounds import pywintypes im ...

  6. 如何播放 WAV 文件?

    from http://www.vckbase.com/index.php/wv/434 平时,你在多媒体软件的设计中是怎样处理声音文件的呢?使用Windows 提供的API函数 sndPlaySou ...

  7. C#播放wav文件

    C#使用HWQPlayer类播放wav文件 类的代码: using System.IO; using System.Runtime.InteropServices; namespace HoverTr ...

  8. WinAPI: sndPlaySound - 播放 wav 文件

    WinAPI: sndPlaySound - 播放 wav 文件 //声明: sndPlaySound(   lpszSoundName: PChar; {声音文件}   uFlags: UINT{播 ...

  9. LINUX学习笔记——LINUX下EXP命令全库备份数据库文件

    LINUX下EXP命令全库备份数据库文件 1)建立备份目录,目录操作权限授权给Oracle用户 mkdir /backup  --创建backup文件夹 cd  /   --进入cd语句 ls  -l ...

随机推荐

  1. Integer中的奇妙位运算

    Integer中的奇妙位运算 参考资料 https://segmentfault.com/a/1190000015763941 highestOneBit(int i) 函数的作用是获得传入参数的最高 ...

  2. linux下gdb命令大全

    感谢国内的ACM同行们的支持,今年应该会是难忘的一年,谢谢大家的帮助啦 gdb命令如下,记全!!!

  3. moviepy音视频剪辑:headblur的参数r_blur卷积核以及fx、fy、r_zone的功能作用及用途

    ☞ ░ 前往老猿Python博文目录 ░ 在moviepy1.03版本中,headblur的调用语法为:headblurbak(clip,fx,fy,r_zone,r_blur=None) 其中参数f ...

  4. 题解 CF504E 【Misha and LCP on Tree】

    PullShit 倍增和树剖的差距!!! 一个 TLE, 一个 luogu 最优解第三!!! 放个对比图(上面倍增,下面轻重链剖分): 不过这是两只 log 非正解... Solution \(LCP ...

  5. BJWC2011 禁忌

    题目链接 题解 多模式匹配首先建 AC 自动机,看到 \(len \le 10^9\) 想到矩阵乘法优化. 朴素 DP 关于分割的最大值,可以贪心,只要走到一个能匹配串的点立刻返回根继续匹配就行,一定 ...

  6. 20分钟带你掌握JavaScript Promise和 Async/Await

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://www.freecodecamp.org/news/learn-promise-a ...

  7. Day5 - 07 函数的参数-参数组合

    现在我们学完了位置参数.默认参数.可变参数.关键字参数.命名关键字参数五种参数类型.在Python中定义函数,可以使用这五种参数进行组合.但是参数定义的顺序必须是:必选参数.默认参数.可变参数.命名关 ...

  8. svn工具包+安装教程+使用ip访问

    SVN使用 简介: SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.  Server界面 1: 安装这两个文 ...

  9. collectd+infludb+grafana实现tomcat JVM监控

    前提条件:已安装好java环境,tomcat,influxdb和collectd.本文暂不提供以上内容的安装步骤 系统环境:centos7 原理:开启tomcat的jmx端口,使用collectd的c ...

  10. Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=Mypc, access=WRITE, inode="/":fan:supergroup:drwxr-xr-x

    在window上编程提示没有写Hadoop的权限 Exception in thread "main" org.apache.hadoop.security.AccessContr ...