linux dsp 播放音频文件

#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 / 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);
}
时间: 2024-10-08 10:49:56

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

Android 使用系统的Activity播放音频文件 intent

Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File("/sdcard/record.wav")), "audio"); startActivity(intent); 这里可以播放wav.amr.MP3等

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

原文:ArcGIS API for Silverlight 当DataGrid选中项时,地图聚焦弹出窗口,并可以播放音频文件 先看效果图,然后上代码: <UserControl x:Class="MapClient.PicMusic" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx

Unity 播放音频文件

Unity 播放音频文件参考代码: 1 public void Play(string strSoundName, float autoDestroyTime = 0f, bool bLoop = false, float fPerTime = 1f) 2 { 3 if (!strSoundName.Equals("")) 4 { 5 //设置背景音乐 6 AudioClip clip = Resources.Load<AudioClip>(strSoundName); 7

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

在偌大的百度当中查找我所需要的资源信息,但网络上所描述的都不能解决,发生此类问题的人很多,但是都没有得到准确的解决方法!经个人各方面的尝试,其实非常简单的解决了无法播放音频文件的问题,如果各位今后也遇到此类问题,可按照我的方式处理: 若是3gp文件,在服务器IIS的MIME类型中直接添加扩展名为“.3gp” MIME类型为“video/3gpp” 若是mp4文件,在服务器IIS的MIME类型中直接添加扩展名为“.mp4” MIME类型为“video/mp4” 以此类推 此方法能彻底解决视频播放问

使用audio标签播放音频文件

HTML5定义了一个新的元素用来指定标准的方式来插入音频文件到web页面中:<audio>标签.使用audio标签可以控制音频的播放与停止,循环播放与播放次数设置,以及播放位置等等. 例如:<audio id="a"  preload="metadata"  src="flash/1.mp3"  controls = "controls"></audio> 使用audio标签播放音频文件

ios为了用户隐私安全,禁止自动播放音频文件的解决办法(微信端)

ios为了用户隐私安全,禁止自动播放音频文件 //通过参数给音频设置id和路径 utils = { playAudio: function (id, src) { var audio = $('#' + id); if (audio.attr('src') == undefined) { audio.attr('src', src); } //audio[0].play(); function audioAutoPlay() { audio[0].play(); document.addEven

Qt 播放音频文件

Qt播放音频文件的方法有好多中,简单介绍几种 不过一下几种方式都需要在Qt工程文件中添加 QT += multimedia 第一 QMediaPlayer类 可以播放MP3文件,同时使用也是最简单的了,具体代码 { player = new QMediaPlayer; connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64))); player->setMedia(QUrl::fromL

C#调用mciSendString播放音频文件

mciSendString函数是一个WinAPI,主要用来向MCI(Media Control Interface)设备发送字符串命令. 一.函数的声明如下: private static extern long mciSendString( string command, //MCI命令字符串 string returnString, //存放反馈信息的缓冲区 int returnSize, //缓冲区的长度 IntPtr hwndCallback //回调窗口的句柄,一般为NULL ); 二

VC++中MCI播放音频文件 【转】

MCI播放mp3音频文件例程 源文件中需要包含头文件 Mmsystem.h,在Project->Settings->Link->Object/libray module中加入库 Winmm.lib.或添加代码#pragma   comment(lib, "winmm.lib") MCI_OPEN_PARMS op; void CMCIDlg::OnPlay() {  // TODO: Add your control notification handler code