在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. Django 的反向解析与有无名分组

    无名分组(将加括号的正则表达式匹配到的内容当做位置参数自动传递给对应的视图函数) url(r'^test/(\d+)/',views.test), # 匹配一个或多个数字 def test(reque ...

  2. 第15.20节 PyQt(Python+Qt)入门学习:QColumnView的作用及开发中对应Model的使用

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在Qt Designer的Item Views(Model-based)部件中,Colum ...

  3. 极光实验室 第一次考核wp

    第一道题: 上来就让我买flag,用御剑扫目录,发现了这道题有源码index.php.bak!直接下载. <meta charset='UTF-8'> <title>极光实验室 ...

  4. LeetCode初级算法之数组:189 旋转数组

    旋转数组 题目地址:https://leetcode-cn.com/problems/rotate-array/ 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输 ...

  5. hugegraph 数据存取数据解析

    hugegraph 是百度开源的图数据库,支持hbase,mysql,rocksdb等作为存储后端.本文以EDGE 存储,hbase为存储后端,来探索是如何hugegraph是如何存取数据的. 存数据 ...

  6. Docker 安装 Redis 需要注意的地方

    Docker 安装 Redis 需要注意的地方 拉取镜像 docker pull redis 可以使用redis:xxx xxx为版本号,不写默认是latest 启动容器 无配置文件无密码: dock ...

  7. C# 高性能对象映射

    1.之前在使用AutoMapper 框架感觉用着比较不够灵活,而且主要通过表达式树Api 实现对象映射 ,写着比较讨厌,当出现复杂类型和嵌套类型时性能直线下降,甚至不如序列化快. 2.针对AutoMa ...

  8. Mysql性能优化专栏

    1.  最大数据量 Mysql没有对单表的数据量大小做限制,单表的大小取决于操作系统对文件大小的限制. <阿里巴巴Java开发手册>中建议当单表的数据量大小超过500万行或者大于2GB时需 ...

  9. TLS 协议

    一.背景 参与了一个Sofa-RPC开源项目,认领了TLS的任务,记录下这次宝贵的经历,并感谢章哥的信任以及在整个过程中对我的帮助. 负责的部分不难,主要是使用h2(HTTP 2加密)协议,完成RPC ...

  10. JQuery ajax request及Java服务端乱码问题及设置

    今天花了半天功夫才搞定2个乱码问题 1. 原先一直用form提交,现在改作JQuery ajax 提交,发现乱码. 2. window.location url中含有中文提交后,乱码. 第一个问题: ...