`
jiagou
  • 浏览: 2530789 次
文章分类
社区版块
存档分类
最新评论

在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 <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;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics