`
duyouhua1214
  • 浏览: 236882 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

采用libmad编写最简单的mp3播放器

 
阅读更多
libmad库中附带minimad,hige level API example,minimad执行使用minimad,再加上一些音频参数设置,即可实现一个简单的mp3播放程序;
首先:在minimad.c中加入以下代码,

# include <stdio.h>
# include <unistd.h>
# include <sys/stat.h>
# include <sys/mman.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>
# include "mad.h"
#undef putchar

int soundfd;
int writedsp(int c) {
return write(soundfd, (char *)&c, 1);
}

void set_dsp()
{
int rate = 441000;;                /* 采样频率 44.1KHz*/
int format = AFMT_S16_LE; /*     量化位数 16      */
int channels = 2;                 /*     声道数 2           */

soundfd
= open ( "/dev/dsp", O_WRONLY);
ioctl(soundfd, SNDCTL_DSP_SPEED,
&rate);
ioctl(soundfd, SNDCTL_DSP_SETFMT,
&format);
ioctl(soundfd, SNDCTL_DSP_CHANNELS,
&channels);
}


修改minimad代码如下:
1.在main函数中解码前调用set_dsp(),解码结束后close(soundfd);

int main(int argc, char *argv[])
{
struct stat stat;
void *fdm;

if (argc != 1)
    return 1;

if (fstat(STDIN_FILENO, &stat) == -1 ||
      stat.st_size == 0)
    return 2;

fdm = mmap(0, stat.st_size, PROT_READ, MAP_SHARED, STDIN_FILENO, 0);
if (fdm == MAP_FAILED)
    return 3;

set_dsp(); //here

decode(fdm, stat.st_size);

if (munmap(fdm, stat.st_size) == -1)
    return 4;

close(soundfd); //here

return 0;
}

2.修改output函数中的putchar为writedsp:
enum mad_flow output(void *data,
             struct mad_header const *header,
             struct mad_pcm *pcm)
{
unsigned int nchannels, nsamples;
mad_fixed_t const *left_ch, *right_ch;

/* pcm->samplerate contains the sampling frequency */

nchannels = pcm->channels;
nsamples = pcm->length;
left_ch   = pcm->samples[0];
right_ch = pcm->samples[1];

while (nsamples--) {
    signed int sample;

    /* output sample(s) in 16-bit signed little-endian PCM */

    sample = scale(*left_ch++);
    writedsp((sample >> 0) & 0xff);
    writedsp((sample >> 8) & 0xff);

    if (nchannels == 2) {
      sample = scale(*right_ch++);
      writedsp((sample >> 0) & 0xff);
      writedsp((sample >> 8) & 0xff);
    }
}

return MAD_FLOW_CONTINUE;
}


播放命令:
#./minimad <music.mp3

结果:DBM上运行顺畅,而开发板上很卡,估计是AC97驱动还有待改善。

 

分享到:
评论

相关推荐

    采用libmad+libao实现最简单的mp3播放器

    文章《采用libmad+libao实现最简单的mp3播放器》主要介绍如何使用libmad和libao这两个跨平台的音频库来编写一个简单的MP3播放器程序。在这部分中,我们将详细解析文章中所提及的关键知识点,包括libmad和libao库的...

    libmad_MP3解码_

    1. **高效性**:libmad采用优化的C语言编写,运行速度快,内存占用低,特别适合资源有限的环境。 2. **精确性**:libmad严格按照MPEG标准进行解码,能够正确处理各种编码异常和错误,确保输出的音频质量。 3. **API...

    mp3软解码(libmad)

    libmad全称为“MPEG audio decoder library”,它能够将压缩的MP3音频数据转换成原始的PCM(脉冲编码调制)音频流,供播放器进一步处理。这个库是由C语言编写的,因此可以跨平台运行,包括各种嵌入式设备,如智能...

    libmad-0.15.1b.rar

    《libmad:高效MPEG音频解码库的深度解析》 libmad,全称为libmad MPEG audio decoder,是一个开源的、...无论是对个人开发者还是专业团队,它都提供了一种可靠的解决方案,使得处理和播放MP3音频变得更加简单和便捷。

    基于mini2440的嵌入式madplay mp3播放器

    后者则是针对mini2440开发板上的物理按键进行的驱动编写,确保用户可以通过按键来控制MP3播放器。 "madplay移植到arm板.doc"文档详细记录了madplay移植到ARM板上的过程,包括编译环境设置、配置修改、依赖库安装等...

    libmad库,支持MPEG-1(Layer Ⅰ,Layer Ⅱ和Layer Ⅲ)解码

    libmad库常用于各种音频播放器、媒体转换工具、游戏引擎以及任何需要处理MP3音频的软件开发中。它的存在极大地简化了处理MP3文件的开发工作,使得开发者可以专注于更高级别的功能实现。 综上所述,libmad库是一个...

    用C++的MFC做一个MP3

    在本文中,我们将深入探讨如何使用C++的Microsoft Foundation Class (MFC) 库来创建一个简单的MP3播放器。MFC是微软提供的一套面向对象的类库,它简化了Windows应用程序的开发,提供了丰富的控件和界面元素,使得...

    lcd.zip_AVR128_MP3 UART

    在本项目中,AVR128被用作MP3播放器的核心处理器。MP3播放功能的实现涉及音频解码,这通常需要特定的硬件加速器或者软件库来处理复杂的音频压缩格式。开发者可能使用了开源的音频库,例如MadPlayer或libmad,这些库...

    DIY MP3学习板

    3. **文件系统**:如果使用了外部存储,可能需要实现简单的文件系统,以便读取和管理MP3文件。 4. **音频处理库**:如libmad,用于解码MP3音频流。 通过这个项目,学习者不仅可以掌握LPC900系列单片机的使用,还能...

    linux2.6.14内核移植到CVT2410上的详细过程

    最后,编写一个简单的 helloworld 程序,验证整个移植过程是否成功。 #### 第六部分:移植 mkfs.ext2 命令 mkfs.ext2 是用于创建 ext2 文件系统的工具。对于 CVT2410 来说,可能需要将这个工具移植到根文件系统中...

    vc++ 应用源码包_5

    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...

    vc++ 开发实例源码包

    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...

    vc++ 应用源码包_1

    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...

    vc++ 应用源码包_2

    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...

    vc++ 应用源码包_6

    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...

    vc++ 应用源码包_3

    内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 ...

Global site tag (gtag.js) - Google Analytics