使用openal与mpg123播放MP3,附带工程文件

使用openal和mpg123播放MP3文件

使用静态编译,相关文件都在附件里

相关工程文件:openal_mpg123_player.7z

使用visual studio 2010编译,理论上是跨平台的

相关说明请看源代码注释以及mpg123.h和openal文档

  1. /*AUTHOR bowman han
  2. * NOTE this is a test program for mpg123 basic usage
  3. * EMAIL fancycode+blogcn123@gmail.com
  4. * DATA 6/2 2012
  5. * Please DO NOT REMOVE THIS
  6. */
  7.  
  8. #include "openal\include\al.h"
  9. #include "openal\include\alc.h"
  10. #include <stdio.h>
  11. #include <Windows.h>
  12. #define NUM_BUFFERS 4
  13. #include "mpg123\mpg123.h"
  14. #include <conio.h>
  15.  
  16. #pragma comment (lib, "./mpg123/libmpg123.lib")
  17. #pragma comment (lib, "./openal/lib/OpenAL32.lib")
  18. int main()
  19. {
  20. ALuint g_Buffers[NUM_BUFFERS];
  21. ALuint uiSource;
  22. ALuint uiBuffer;
  23. ALCdevice * pDevice = NULL;
  24. ALCcontext *pContext = NULL;
  25. ALboolean g_bEAX;
  26. ALenum error, eBufferFormat;
  27. ALint iDataSize, iFrequency;
  28. ALuint ulFormat;
  29. int iLoop,iBuffersProcessed, iTotalBuffersProcessed;
  30. unsigned long ulDataSize = ;
  31. unsigned long ulFrequency = ;
  32. unsigned long ulBufferSize;
  33. unsigned long ulBytesWritten;
  34. long lRate;
  35. int iEncoding, iChannels;
  36. int encoding;
  37. void * pData = NULL;
  38. WAVEFORMATEX *pwfex;
  39. int iState, iQueuedBuffers;
  40. mpg123_handle *mpg123 ;
  41. int iMpg123_error;
  42. //init mpg123 library
  43. if(MPG123_OK != (iMpg123_error = mpg123_init()))
  44. {
  45. printf("failed to init mpg123\n");
  46. return -;
  47. }
  48.  
  49. //open a default mpg123 decoder
  50. mpg123 = mpg123_new(mpg123_decoders()[], &iMpg123_error);
  51.  
  52. //open a openal default device
  53. pDevice = alcOpenDevice(NULL); //select the perfered device
  54.  
  55. if(pDevice){
  56. pContext = alcCreateContext(pDevice, NULL);
  57. alcMakeContextCurrent(pContext);
  58. }else
  59. {
  60. printf("failed to get a openal decice\n");
  61. return -;
  62. }
  63.  
  64. g_bEAX = alIsExtensionPresent("EAX2.0");
  65.  
  66. //Generate openal Buffers
  67. alGetError(); //clear all error code
  68.  
  69. alGenBuffers(NUM_BUFFERS, g_Buffers);
  70.  
  71. if((error = alGetError()) != AL_NO_ERROR)
  72. {
  73. fprintf(stderr, "alGenBuffers :%s", error);
  74. }
  75.  
  76. alGenSources(, &uiSource);
  77.  
  78. //try to open a mp3 file, modify to your own mp3 files
  79. if(MPG123_OK != (iMpg123_error = mpg123_open(mpg123,"D:\\sound\\320k.mp3")))
  80. {
  81. fprintf(stderr,"error in open mp3 file\n");
  82. return -;
  83. }
  84. //get mp3 format infomation
  85. mpg123_getformat(mpg123, &lRate, &iChannels, &iEncoding);
  86.  
  87. //there only parse stereo mp3 file
  88. if(iChannels ==)
  89. {
  90. ulFormat = alGetEnumValue("AL_FORMAT_STEREO16");
  91. ulBufferSize = lRate; //set buffer to 250ms
  92. ulBufferSize -= (ulBufferSize % ); //set pcm Block align
  93. ulFrequency = lRate; //set pcm sample rate
  94.  
  95. }
  96. else
  97. {
  98. printf("channels info%i\n", iChannels);
  99. return -;
  100. }
  101.  
  102. pData = malloc(ulBufferSize);
  103. //feed data to openal buffer
  104. for(iLoop= ; iLoop < ; iLoop++)
  105. {
  106. mpg123_read(mpg123, (char *)pData, ulBufferSize,&ulBytesWritten);
  107. alBufferData(g_Buffers[iLoop], ulFormat, pData, ulBytesWritten, ulFrequency);
  108. alSourceQueueBuffers(uiSource, , &g_Buffers[iLoop]);
  109. }
  110. alSourcePlay(uiSource);
  111. iTotalBuffersProcessed = ;
  112. printf("playing\n");
  113. //wait for key press
  114. while(!_kbhit())
  115. {
  116. Sleep();
  117. iBuffersProcessed = ;
  118. alGetSourcei(uiSource, AL_BUFFERS_PROCESSED, &iBuffersProcessed);
  119.  
  120. iTotalBuffersProcessed += iBuffersProcessed;
  121. printf("Buffers total Processed %d\r", iTotalBuffersProcessed);
  122. while(iBuffersProcessed)
  123. {
  124. uiBuffer = ;
  125. alSourceUnqueueBuffers(uiSource, , &uiBuffer);
  126.  
  127. mpg123_read(mpg123, (char *)pData, ulBufferSize, &ulBytesWritten);
  128. if(ulBytesWritten)
  129. {
  130. alBufferData(uiBuffer, ulFormat, pData, ulBytesWritten, ulFrequency);
  131. alSourceQueueBuffers(uiSource, , &uiBuffer);
  132. } iBuffersProcessed--;
  133.  
  134. }
  135. alGetSourcei(uiSource, AL_SOURCE_STATE, &iState);
  136. if(iState != AL_PLAYING)
  137. {
  138. alGetSourcei(uiSource, AL_BUFFERS_QUEUED, &iQueuedBuffers);
  139.  
  140. if(iQueuedBuffers)
  141. {
  142. alSourcePlay(uiSource);//buffers have data, play it
  143. }
  144. else
  145. {
  146. //there is no data any more
  147. break;
  148. }
  149. }
  150. }
  151. //close mpg123
  152. mpg123_close(mpg123);
  153. //stop the source and clear the queue
  154. alSourceStop(uiSource);
  155. alSourcei(uiSource, AL_BUFFER, );
  156.  
  157. free(pData);
  158. pData = NULL;
  159.  
  160. return ;
  161. }

其他一些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. Gitlab项目用ssh克隆

    Gitlab项目用ssh克隆 1.  新建一个文件夹并用git bash here 打开 2.  在git bash here 输入命令行 ssh-keygen –t rsa –C“邮箱名” 3.  ...

  2. 【Python】重载模块

    命令窗口中调试代码,往往需要重载模块已进行最新的代码调试. 主要有两种方式: 1. Python shell 窗口 reload(module) 2. ipython 窗口 %load_ext aut ...

  3. MAPE 平均绝对百分误差

    from fbprophet.diagnostics import performance_metrics df_p = performance_metrics(df_cv) df_p.head() ...

  4. module.exports和exports

    require 用来加载代码,而 exports 和 module.exports 则用来导出代码.但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 e ...

  5. BZOJ2314 士兵的放置

    树形DP,恩然后就不会了... 先写了个错的离谱程序...果然WA了 然后开始乱搞,欸,对了! 令f[i], g[i], h[i]分别表示i号节点自己放士兵,被儿子上的士兵控制,不被儿子上的士兵控制但 ...

  6. 《转》深入理解Activity启动流程(四)–Activity Task的调度算法

    本文原创作者:Cloud Chou. 出处:本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--Activity启 ...

  7. 再谈Spring AOP

    1.AOP的基本概念 在进行AOP开发前,先熟悉几个概念: 连接点(Jointpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化.方法执行.方法调用.字段调用或处理异常等等,S ...

  8. mysql学习--基本使用

    一旦安装完毕,MySQL 服务器应该自己主动启动. sudo start mysql #手动的话这样启动 sudo stop mysql #手动停止 当你改动了配置文件后,你须要重新启动 mysqld ...

  9. python把指定目录下的递归所有目录和文件名转换成小写或大写

    cat convert.py #!/usr/bin/env python # -*- coding:utf-8 -*- import os, sys def convert(rootdir, opty ...

  10. Python download a image (or a file)

    http://stackoverflow.com/questions/13137817/how-to-download-image-using-requests import shutil impor ...