使用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,开源 ...
随机推荐
- MyBatis Generator配置文件context元素的defaultModelType属性
MyBatis Generator配置文件context元素的defaultModelType属性 MyBatis Generator配置文件context元素有一个defaultModelType属 ...
- bzoj2163
题解: 拆点网络流 然后用总和-最大流 代码: #include<iostream> #include<cstring> #include<cstdio> #inc ...
- JS中的phototype详解
作者:轩脉刃 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原型法的主要思想是,现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展.我们称B的原型为A. 2 ...
- Java 反射机制介绍
参考文章:http://www.cnblogs.com/skywang12345/p/3345205.html Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还 ...
- 中国的 Python 量化交易工具链有哪些
摘抄自知乎:https://www.zhihu.com/question/28557233 如题,提问的范围限于适合中国大陆金融市场使用的工具链,所以IbPy和Quotopian之类主要面向欧美市场的 ...
- 回测框架pybacktest简介(二)
pybacktest 的疑点 第(一)节“教程”原文,是用 ipython notebook 写成,程序代码是一些片段组成. 为了阅读方便,合并在一起. 本文转载于:http://blog.csdn. ...
- I.MX6 Linux U-boot 环境变量解析
/********************************************************************************** * I.MX6 Linux U- ...
- Loj 114 k大异或和
Loj 114 k大异或和 构造线性基时有所变化.试图构造一个线性基,使得从高到低位走,异或上一个非 \(0\) 的数,总能变大. 构造时让任意两个 \(bas\) 上有值的 \(i,j\) ,满足 ...
- ppt修改默认字体
首先,在文本框中输入文字,选中文字设置为自己需要的效果,比如文字字体设置为微软雅黑,大小设置为24,颜色设置为水绿色. 鼠标移动到到输入文本框的边上,此时鼠标形状会变成十字形,单击右键,在弹出 ...
- C# Socket笔记
看到这个题目,是不是很眼熟?在博客园里搜下,保证会发现关于这个东东的文章实在是太多了~~~真得是没有写得必要,而且我也有点懒得去琢磨字句.(看到这,肯定得来个转折的了,不然就看不到下文了,不是吗)但是 ...