使用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,开源 ...
随机推荐
- Gitlab项目用ssh克隆
Gitlab项目用ssh克隆 1. 新建一个文件夹并用git bash here 打开 2. 在git bash here 输入命令行 ssh-keygen –t rsa –C“邮箱名” 3. ...
- 【Python】重载模块
命令窗口中调试代码,往往需要重载模块已进行最新的代码调试. 主要有两种方式: 1. Python shell 窗口 reload(module) 2. ipython 窗口 %load_ext aut ...
- MAPE 平均绝对百分误差
from fbprophet.diagnostics import performance_metrics df_p = performance_metrics(df_cv) df_p.head() ...
- module.exports和exports
require 用来加载代码,而 exports 和 module.exports 则用来导出代码.但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 e ...
- BZOJ2314 士兵的放置
树形DP,恩然后就不会了... 先写了个错的离谱程序...果然WA了 然后开始乱搞,欸,对了! 令f[i], g[i], h[i]分别表示i号节点自己放士兵,被儿子上的士兵控制,不被儿子上的士兵控制但 ...
- 《转》深入理解Activity启动流程(四)–Activity Task的调度算法
本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--Activity启 ...
- 再谈Spring AOP
1.AOP的基本概念 在进行AOP开发前,先熟悉几个概念: 连接点(Jointpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化.方法执行.方法调用.字段调用或处理异常等等,S ...
- mysql学习--基本使用
一旦安装完毕,MySQL 服务器应该自己主动启动. sudo start mysql #手动的话这样启动 sudo stop mysql #手动停止 当你改动了配置文件后,你须要重新启动 mysqld ...
- python把指定目录下的递归所有目录和文件名转换成小写或大写
cat convert.py #!/usr/bin/env python # -*- coding:utf-8 -*- import os, sys def convert(rootdir, opty ...
- Python download a image (or a file)
http://stackoverflow.com/questions/13137817/how-to-download-image-using-requests import shutil impor ...