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驱动还有待改善。
分享到:
相关推荐
本文在 Fedora 5 Linux 下实现了一个基于 libmad 的 MP3 流媒体播放器。此 流媒体播放器可以播放基于 HTTP 1.1 协议传输的 MP3 流媒体数据。 基本原理是:从 HTTP 服务器获得 MP3 媒体信息,然后通过网络传输把 MP3...
本文章是关于采用libmad+libao实现最简单的mp3播放器。
基于libmad的MP3播放器
可移植ok6410 的mp3播放器,基于alsa和libmad库,内含编译好的库和播放器以及源代码,解压后可直接运行,和以移植好的mplayer官方播放器(可快进 暂停 时间轴 音量控制等)
在Linux环境下移植libmad库,用C语言自制的能播放mp3歌曲的一个小测试程序,鼠标左击是上一首,鼠标右击是下一首,由于上传文件大小的限制,没有添加歌曲,需要在解压后的文件夹下添加三首歌,歌曲的名字改为:1.mp3...
用libmad库来播放mp3音乐,内有音乐播放代码和libmad库的使用说明书。
简单的MP3播放器示例,libmad解码,支持专辑图片显示,支持FFT显示,支持Lrc歌词显示,只能播放本地mp3
wince下基于libmad的mp3解码库
linux下mp3播放器的源代码,需要使用libmad库
目前,网络上绝大都数关于MP3播放器的例子,大都采用vs1003这颗硬件解码芯片或者使用AT89C51SND1C这颗含有内部音频解码电路的NB单片机,软件音频解码的例子少之又少。我花了些时间、精力,研究了目前linux领域很常用...
libmad 链接库
STM32软解MP3的移植工程,艰难找到了两种解码库libmad 和 helix。资料里面也有具体的资料,请大家支持
libmad解码mp3 sdl2pcm播放.rar
基于Qtopia Core的MP3播放器在ARM - Linux 平台上的设计与实现 汪英1 余展然2 彭楚武2 (11长沙通信职业技术学院, 湖南长沙 410015; 21湖南大学电气与信息工程学院, 湖南长沙 410082) [摘 要] 介绍了嵌入式GU I...
毕业设计将设计一个基于嵌入式 Linux 的 MP3 播放器,系统硬件采用基于 ARM 架构的开发板。 论文首先介绍了嵌入式操作系统的最新发展、嵌入式 Linux、ARM 的特点 以及 Qt 等的相关知识。重点介绍了如何使用开源...
著名的libmad-mp3解码库,欢迎大家使用下载,好东西呀。-Famous libmad-mp3 decoder library, welcome everyone to use the download, you good things.
经过我一个多星期的仔细研究,总于成功在wm平台上用libmad播放mp3. 网上的大侠都说方法,没一个具体例子。我愿意与大家共同分享我的经验,期望认识更多朋友。
用libmad库和GTK编写的一个mp3播放程序
在此狂贬那群网上转帖不看帖的人,没有一个关于完善libmad实现播放器的真正代码。本人上传的代码虽然粗糙,不过除了歌词和音量没有实现,随机播放没有认真做,其他的都已经完成。hijklmn这几个键是播放相关,b结束...