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

头文件

/*

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

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值