標頭檔
/* * SoundPlay.h * 1:需要下載開發openal開發包(Software implementation of the OpenAL API(devlopment files))和alut開發包 * 2:添加標頭檔路徑:/usr/include/AL * 3:添加庫:openal和alut */#ifndef SOUNDPLAY_H_#define SOUNDPLAY_H_#include <al.h>#include <alc.h>#include <alut.h>#include <iostream>#include <stdlib.h>#include <stdio.h>#define numBuffer 4 //可以同時播放4個聲音#define numSource 4 //可以同時播放4個聲音using namespace std;class SoundPlay {public:SoundPlay();virtual ~SoundPlay();void PlaySound(string fileName,int index,float volume);//當index=0:迴圈播放;index!=0:播放1次void SetVolume(int index,float volume);void ReleaseSound(int index);void MusicPause(int index);void MusicContinue(int index);bool CheckPlayState(int i);private:void PlayLongSound(const char* fileName,int index);void OpenDevice();void CloseDevice();string GetALCErrorString(ALenum err);private:ALuint buffers[numBuffer];ALuint sources[numSource];ALCcontext* cc;ALCdevice* dev;bool checkstate;ALenum result;};#endif /* SOUNDPLAY_H_ */
cpp檔案
/* * SoundPlay.cpp */#include "SoundPlay.h"SoundPlay::SoundPlay(){alutInit(NULL,0);if ((result=alGetError()) != AL_NO_ERROR)cout<<"alutInit--"<<result<<endl;OpenDevice();//PlaySound("Media/Music/BGSound1.wav",0,100);}SoundPlay::~SoundPlay(){CloseDevice();}void SoundPlay::OpenDevice(){ALCchar DeviceName[] = "ALSA Software";//ALSA Software,DirectSound3Ddev=alcOpenDevice(DeviceName);cc=alcCreateContext(dev,NULL);alcMakeContextCurrent(cc);}void SoundPlay::CloseDevice(){ALCcontext* context = alcGetCurrentContext();ALCdevice* device = alcGetContextsDevice( context ); alcMakeContextCurrent( NULL );alcDestroyContext( context );alcCloseDevice( device );}void SoundPlay::ReleaseSound(int index){alDeleteSources(1,&sources[index]);alDeleteBuffers(1,&buffers[index]);}void SoundPlay::PlayLongSound(const char* fileName,int index){alGenSources(1,&sources[index]);alGenBuffers(1,&buffers[index]);ALvoid *data;ALsizei size=0,freq=0;ALenum format;ALboolean loop;alutLoadWAVFile((ALbyte *)fileName,&format,&data,&size,&freq,&loop); alBufferData(buffers[index],format,data,size,freq);if ((result=alGetError()) != AL_NO_ERROR)cout<<"PlayLongSound alBufferData errno"<<result<<endl;alutUnloadWAV(format,data,size,freq);alSourcei(sources[index],AL_BUFFER,buffers[index]);//用音源關聯緩衝器if(index==0)alSourcei(sources[index],AL_LOOPING,AL_TRUE);alSourcePlay(sources[index]);}void SoundPlay::PlaySound(string fileName,int index,float volume){alGenSources(1,&sources[index]);alGenBuffers(1,&buffers[index]);ReleaseSound(index);PlayLongSound(fileName.data(),index);alSourcef(sources[index],AL_GAIN,volume);}void SoundPlay::SetVolume(int index,float volume)//volume取值範圍(0~1){alSourcef(sources[index],AL_GAIN,volume);}void SoundPlay::MusicPause(int index){alSourcePause(sources[index]);alSourceStop(sources[index]);}void SoundPlay::MusicContinue(int index){alSourcePlay(sources[index]);}bool SoundPlay::CheckPlayState(int i){ALint state;alGetSourcei(sources[i], AL_SOURCE_STATE, &state);if(state != AL_PLAYING){checkstate=false;return true;}return false;}int main(){SoundPlay sp;sp.PlaySound("Media/Music/BGSound1.wav",0,100);while(1){}return 0;}