在Linux下使用Openal來播放聲音類

來源:互聯網
上載者:User

標頭檔

/* * 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,DirectSound3Ddev=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;}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.