当前位置: 首页 > 工具软件 > OpenAL > 使用案例 >

openal for linux,在Linux下使用Openal来播放声音类

权承
2023-12-01

头文件

/*

* 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;

}

 类似资料: