头文件
/* * 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,DirectSound3D dev=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; }