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