使用openal与mpg123播放MP3,附带工程文件(转)
使用openal与mpg123播放MP3,附带工程文件
使用openal和mpg123播放MP3文件
使用静态编译,相关文件都在附件里
相关工程文件:openal_mpg123_player.7z
使用visual studio 2010编译,理论上是跨平台的
相关说明请看源代码注释以及mpg123.h和openal文档
/*AUTHOR bowman han
* NOTE this is a test program for mpg123 basic usage
* EMAIL fancycode+blogcn123@gmail.com
* DATA 6/2 2012
* Please DO NOT REMOVE THIS
*/ #include "openal\include\al.h"
#include "openal\include\alc.h"
#include <stdio.h>
#include <Windows.h>
#define NUM_BUFFERS 4
#include "mpg123\mpg123.h"
#include <conio.h> #pragma comment (lib, "./mpg123/libmpg123.lib")
#pragma comment (lib, "./openal/lib/OpenAL32.lib")
int main()
{
ALuint g_Buffers[NUM_BUFFERS];
ALuint uiSource;
ALuint uiBuffer;
ALCdevice * pDevice = NULL;
ALCcontext *pContext = NULL;
ALboolean g_bEAX;
ALenum error, eBufferFormat;
ALint iDataSize, iFrequency;
ALuint ulFormat;
int iLoop,iBuffersProcessed, iTotalBuffersProcessed;
unsigned long ulDataSize = ;
unsigned long ulFrequency = ;
unsigned long ulBufferSize;
unsigned long ulBytesWritten;
long lRate;
int iEncoding, iChannels;
int encoding;
void * pData = NULL;
WAVEFORMATEX *pwfex;
int iState, iQueuedBuffers;
mpg123_handle *mpg123 ;
int iMpg123_error;
//init mpg123 library
if(MPG123_OK != (iMpg123_error = mpg123_init()))
{
printf("failed to init mpg123\n");
return -;
} //open a default mpg123 decoder
mpg123 = mpg123_new(mpg123_decoders()[], &iMpg123_error); //open a openal default device
pDevice = alcOpenDevice(NULL); //select the perfered device if(pDevice){
pContext = alcCreateContext(pDevice, NULL);
alcMakeContextCurrent(pContext);
}else
{
printf("failed to get a openal decice\n");
return -;
} g_bEAX = alIsExtensionPresent("EAX2.0"); //Generate openal Buffers
alGetError(); //clear all error code alGenBuffers(NUM_BUFFERS, g_Buffers); if((error = alGetError()) != AL_NO_ERROR)
{
fprintf(stderr, "alGenBuffers :%s", error);
} alGenSources(, &uiSource); //try to open a mp3 file, modify to your own mp3 files
if(MPG123_OK != (iMpg123_error = mpg123_open(mpg123,"D:\\sound\\320k.mp3")))
{
fprintf(stderr,"error in open mp3 file\n");
return -;
}
//get mp3 format infomation
mpg123_getformat(mpg123, &lRate, &iChannels, &iEncoding); //there only parse stereo mp3 file
if(iChannels ==)
{
ulFormat = alGetEnumValue("AL_FORMAT_STEREO16");
ulBufferSize = lRate; //set buffer to 250ms
ulBufferSize -= (ulBufferSize % ); //set pcm Block align
ulFrequency = lRate; //set pcm sample rate }
else
{
printf("channels info%i\n", iChannels);
return -;
} pData = malloc(ulBufferSize);
//feed data to openal buffer
for(iLoop= ; iLoop < ; iLoop++)
{
mpg123_read(mpg123, (char *)pData, ulBufferSize,&ulBytesWritten);
alBufferData(g_Buffers[iLoop], ulFormat, pData, ulBytesWritten, ulFrequency);
alSourceQueueBuffers(uiSource, , &g_Buffers[iLoop]);
}
alSourcePlay(uiSource);
iTotalBuffersProcessed = ;
printf("playing\n");
//wait for key press
while(!_kbhit())
{
Sleep();
iBuffersProcessed = ;
alGetSourcei(uiSource, AL_BUFFERS_PROCESSED, &iBuffersProcessed); iTotalBuffersProcessed += iBuffersProcessed;
printf("Buffers total Processed %d\r", iTotalBuffersProcessed);
while(iBuffersProcessed)
{
uiBuffer = ;
alSourceUnqueueBuffers(uiSource, , &uiBuffer); mpg123_read(mpg123, (char *)pData, ulBufferSize, &ulBytesWritten);
if(ulBytesWritten)
{
alBufferData(uiBuffer, ulFormat, pData, ulBytesWritten, ulFrequency);
alSourceQueueBuffers(uiSource, , &uiBuffer);
} iBuffersProcessed--; }
alGetSourcei(uiSource, AL_SOURCE_STATE, &iState);
if(iState != AL_PLAYING)
{
alGetSourcei(uiSource, AL_BUFFERS_QUEUED, &iQueuedBuffers); if(iQueuedBuffers)
{
alSourcePlay(uiSource);//buffers have data, play it
}
else
{
//there is no data any more
break;
}
}
}
//close mpg123
mpg123_close(mpg123);
//stop the source and clear the queue
alSourceStop(uiSource);
alSourcei(uiSource, AL_BUFFER, ); free(pData);
pData = NULL; return ;
}
其他一些openAL相关的资料:http://blog.csdn.net/zxc110110/article/details/7188054
使用openal与mpg123播放MP3,附带工程文件(转)的更多相关文章
- VC用MCI播放mp3等音乐文件
VC播放mp3等音乐文件,可以使用MCI.MCI ( Media Control Interface ) ,即媒体控制接口,向基于Windows操作系统的应用程序提供了高层次的控制媒体设备接口的能力. ...
- WinForm中实现播放mp3 、mp4文件
来自:http://www.cnblogs.com/duanchen/p/4445478.html 1.在Vs2012 工具箱右键-->"选择项"-->"Co ...
- 读取SD卡文件夹下的MP3文件和播放MP3文件
首先获取SD卡path路径下的所有的MP3文件,并将文件名和文件大小存入List数组(此代码定义在FileUtils类中): /** * 读取目录中的Mp3文件的名字和大小 */ public Lis ...
- 遭遇flash播放mp3诡异问题
在部分ie10+flash player 播放mp3,播放第二句话时,中断无法正常播放,(客户的机器上),自己公司的机器测试了几个,都没发现这个问题.其它浏览器(chrome,firefox)也没发现 ...
- Android命令行播放MP3音乐
/*************************************************************************** * Android命令行播放MP3音乐 * 说 ...
- ios开发——实用技术篇Swift篇&播放MP3
播放MP3 // MARK: - 播放MP3 /*----- mp3 ------*/ //定时器- func updateTime() { //获取音频播放器播放的进度,单位秒 var cuTime ...
- 在C语言控制台程序中播放MP3音乐
游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...
- ubuntu 13.10 Rhythmbox不能播放mp3 和中文乱码的问题
1.ubuntu 13.10 Rhythmbox不能播放mp3的解决方法 软件中心搜索(ubuntu额外的版权受限软件)不带括号 2.中文乱码问题解决方法: 终端顺序操作 : 1. sudo ged ...
- Ionic2 播放mp3功能实现
在开发app的过程中有需要播放mp3的功能,一直想实现,但苦于具体的困难一直未能实现,经过一段时间的资料查询和测试,最终摸索出来,现记录如下: 1.最重要的是安装第三方插件ionic-audio,开源 ...
随机推荐
- Oracle 9i & 10g编程艺术-深入数据库体系结构-学习笔记(持续更新中)
--20170322 --1.0 --更新表的统计信息begin dbms_stats.set_table_stats(user,'EMP',numrows => 10000);end; beg ...
- 平衡二叉树,AVL树之代码篇
看完了第一篇博客,相信大家对于平衡二叉树的插入调整以及删除调整已经有了一定的了解,下面,我们开始介绍代码部分. 首先,再次提一下使用的结构定义 typedef char KeyType; //关键字 ...
- 改造 Ace Admin 模板的 ace_tree 组件的 folderSelect 样式
*注:我用的Ace Admin版本为1.3.4 Ace Admin 是一个轻量,功能丰富,HTML5.响应式.支持手机及平板电脑上浏览的优秀管理后台模板. 关于tree的使用,html文件夹下tree ...
- Eclipse中配置Solr源码
转自 http://hongweiyi.com/2013/03/configurate-solr-src-in-eclipse/ 1. 下载solr的src包,并解压 2. 解压后,在解压后的根目录执 ...
- EM算法及其应用(一)
EM算法及其应用(一) EM算法及其应用(二): K-means 与 高斯混合模型 EM算法是期望最大化 (Expectation Maximization) 算法的简称,用于含有隐变量的情况下,概率 ...
- 解决Eclipse中新创建的Maven项目不自动创建web.xml文件
1. 通过J2EE tools 2.项目右键-properties-project facets-勾选dynamic web moudle
- 20155313 2016-2017-2 《Java程序设计》第六周学习总结
20155313 2016-2017-2 <Java程序设计>第六周学习总结 教材内容学习 第十章 输入/输出 10.1 InputStream与OutputStream 1.串流设计的概 ...
- ES6必知必会 (八)—— async 函数
async 函数 1.ES2017 标准引入了 async 函数,它是对 Generator 函数的改进 , 我们先看一个读取文件的例子: Generator 写法是这样的 : var fs = re ...
- Centos 6 下安装 erlang 手记
基于openfire的IM项目已经成功上线,接下来的计划准备開始调研 ejabberd. ejabberd 是基于erlang开发的.那么就先从搭建 erlang环境開始吧. 选择的操作系统为Ce ...
- std::function与std::bind 函数指针
function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时. std::function可以绑定到全局函数/类静态成员 ...