头文件
/*
* 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
#include
#include
#include
#include
#include
#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<
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<
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;
}