易网时代-编程资源站
Welcome
微信登录
编程资源
图片资源库
蚂蚁家优选
PDF转换器
软件资源
软件开发
、
小程序制作
、
系统集成与运维
、
空间租用
、
硬件开发
、
视频监控
、
技术咨询与支持
——联系电话:0311-88999002/88999003
首页
/
操作系统
/
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 <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;
}
收藏该网址
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图