openalとmpg 123を使ってMP 3を放送して、工事のファイルを付け加えます.

14052 ワード

openalとmpg 123を使ってMP 3を放送して、工事のファイルを付け加えます。
openalとmpg 123を使ってMP 3ファイルを再生します.
静的コンパイルを使用して、関連ファイルはすべて添付ファイルにあります.
関連プロジェクトファイル:openal.mpg 123_plyer.7 z
Visual studio 2010を使ってコンパイルします.理論的にはクロスプラットフォームです.
関連説明はソースコードのコメントとmpg 123.hとopenal文書を見てください.
/*AUTHOR bowman han
* NOTE  this is a test program for mpg123 basic usage
* EMAIL  [email protected]
* 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 = 0;
    unsigned long ulFrequency = 0;
    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
"); return -1; } //open a default mpg123 decoder mpg123 = mpg123_new(mpg123_decoders()[0], &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
"); return -2; } 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(1, &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
"); return -1; } //get mp3 format infomation mpg123_getformat(mpg123, &lRate, &iChannels, &iEncoding); //there only parse stereo mp3 file if(iChannels ==2) { ulFormat = alGetEnumValue("AL_FORMAT_STEREO16"); ulBufferSize = lRate; //set buffer to 250ms ulBufferSize -= (ulBufferSize % 4); //set pcm Block align ulFrequency = lRate; //set pcm sample rate } else { printf("channels info%i
", iChannels); return -3; } pData = malloc(ulBufferSize); //feed data to openal buffer for(iLoop= 0; iLoop < 4; iLoop++) { mpg123_read(mpg123, (char *)pData, ulBufferSize,&ulBytesWritten); alBufferData(g_Buffers[iLoop], ulFormat, pData, ulBytesWritten, ulFrequency); alSourceQueueBuffers(uiSource, 1, &g_Buffers[iLoop]); } alSourcePlay(uiSource); iTotalBuffersProcessed = 0; printf("playing
"); //wait for key press while(!_kbhit()) { Sleep(20); iBuffersProcessed = 0; alGetSourcei(uiSource, AL_BUFFERS_PROCESSED, &iBuffersProcessed); iTotalBuffersProcessed += iBuffersProcessed; printf("Buffers total Processed %d\r", iTotalBuffersProcessed); while(iBuffersProcessed) { uiBuffer = 0; alSourceUnqueueBuffers(uiSource, 1, &uiBuffer); mpg123_read(mpg123, (char *)pData, ulBufferSize, &ulBytesWritten); if(ulBytesWritten) { alBufferData(uiBuffer, ulFormat, pData, ulBytesWritten, ulFrequency); alSourceQueueBuffers(uiSource, 1, &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, 0); free(pData); pData = NULL; return 0; }
 他のopenAL関連の資料:http://blog.csdn.net/zxc110110/article/details/7188054