使用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,附带工程文件(转)的更多相关文章

  1. VC用MCI播放mp3等音乐文件

    VC播放mp3等音乐文件,可以使用MCI.MCI ( Media Control Interface ) ,即媒体控制接口,向基于Windows操作系统的应用程序提供了高层次的控制媒体设备接口的能力. ...

  2. WinForm中实现播放mp3 、mp4文件

    来自:http://www.cnblogs.com/duanchen/p/4445478.html 1.在Vs2012 工具箱右键-->"选择项"-->"Co ...

  3. 读取SD卡文件夹下的MP3文件和播放MP3文件

    首先获取SD卡path路径下的所有的MP3文件,并将文件名和文件大小存入List数组(此代码定义在FileUtils类中): /** * 读取目录中的Mp3文件的名字和大小 */ public Lis ...

  4. 遭遇flash播放mp3诡异问题

    在部分ie10+flash player 播放mp3,播放第二句话时,中断无法正常播放,(客户的机器上),自己公司的机器测试了几个,都没发现这个问题.其它浏览器(chrome,firefox)也没发现 ...

  5. Android命令行播放MP3音乐

    /*************************************************************************** * Android命令行播放MP3音乐 * 说 ...

  6. ios开发——实用技术篇Swift篇&播放MP3

    播放MP3 // MARK: - 播放MP3 /*----- mp3 ------*/ //定时器- func updateTime() { //获取音频播放器播放的进度,单位秒 var cuTime ...

  7. 在C语言控制台程序中播放MP3音乐

    游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...

  8. ubuntu 13.10 Rhythmbox不能播放mp3 和中文乱码的问题

    1.ubuntu 13.10 Rhythmbox不能播放mp3的解决方法 软件中心搜索(ubuntu额外的版权受限软件)不带括号 2.中文乱码问题解决方法: 终端顺序操作 : 1.  sudo ged ...

  9. Ionic2 播放mp3功能实现

    在开发app的过程中有需要播放mp3的功能,一直想实现,但苦于具体的困难一直未能实现,经过一段时间的资料查询和测试,最终摸索出来,现记录如下: 1.最重要的是安装第三方插件ionic-audio,开源 ...

随机推荐

  1. windowplayer播放列表属性

    ArrayList a = new ArrayList(); a.Add("c:\\kugou\\林宇中 - 干物女.mp3"); a.Add("c:\\kugou\\海 ...

  2. ssh隧道(通过跳板机)连接mysql

    案例: A服务器   B服务器   C服务器mysql 现在mysql服务器C只能通过内网访问,B服务器就能通过内网连接访问到mysql A服务器无法直接连接C服务器mysql,所以要通过跳板机(跳板 ...

  3. 微任务、宏任务与Event-Loop

    首先,JavaScript是一个单线程的脚本语言.所以就是说在一行代码执行的过程中,必然不会存在同时执行的另一行代码,就像使用alert()以后进行疯狂console.log,如果没有关闭弹框,控制台 ...

  4. BOM之JavaScript常用事件

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  5. BigDecimal 、BigInteger

    package com.BigDecimal; public class BigDecimalDemo { /* * 下面的运算的结果出乎我们的意料,有些准确,有些不准确 * 这是为什么呢? * 我们 ...

  6. 让黑白的SecureCRT彩色起来

    让黑白的SecureCRT彩色起来,如图仿真设置如下:  

  7. [BZOJ3470]Freda’s Walk

    bzoj description 雨后的Poetic Island空气格外清新,于是Freda和Rainbow出来散步. Poetic Island的交通可以看作一张\(n\)个点.\(m\)边的有向 ...

  8. 【Xamarin】Visual Studio 2013 Xamarin for Android开发环境搭建与配置&Genymotion

    Xamarin Xamarin是基于Mono的平台. Xamarin旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发. 下载资源 1,进入Xamarin官方网 ...

  9. centos 6.5 单实例搭建 ELK

    2018-07-02     21:32:33 ELK 单实例搭建 环境搭建 1.1我的系统版本 Distributor ID: CentOS Description:     CentOS rele ...

  10. FreeFileSync 4.2 发布,文件夹比较和同步工具

    FreeFileSync 是一款开源的文件夹比较和同步工具,可用于 Win 和 Lin 平台,最近发布了 4.2 版本. FreeFileSync 采用双面板设计,使用方法很简单: 在左面版和右面版上 ...