From: <wjp...@us...> - 2008-02-17 17:58:27
|
Revision: 5058 http://gemrb.svn.sourceforge.net/gemrb/?rev=5058&view=rev Author: wjpalenstijn Date: 2008-02-17 09:58:19 -0800 (Sun, 17 Feb 2008) Log Message: ----------- Slightly modified patch from zefklop: remove dependency of MVEPlayer on OpenAL, moving the required functionality to OpenALAudio Modified Paths: -------------- gemrb/branches/openal/gemrb/plugins/Core/Audio.h gemrb/branches/openal/gemrb/plugins/MVEPlayer/MVEPlay.cpp gemrb/branches/openal/gemrb/plugins/MVEPlayer/MVEPlay.h gemrb/branches/openal/gemrb/plugins/MVEPlayer/Makefile.am gemrb/branches/openal/gemrb/plugins/MVEPlayer/libmve.h gemrb/branches/openal/gemrb/plugins/MVEPlayer/mve_play.cpp gemrb/branches/openal/gemrb/plugins/MVEPlayer/mvelib.cpp gemrb/branches/openal/gemrb/plugins/MVEPlayer/mvelib.h gemrb/branches/openal/gemrb/plugins/NullSound/NullSnd.cpp gemrb/branches/openal/gemrb/plugins/NullSound/NullSnd.h gemrb/branches/openal/gemrb/plugins/OpenALAudio/AmbientMgrAL.cpp gemrb/branches/openal/gemrb/plugins/OpenALAudio/OpenALAudio.cpp gemrb/branches/openal/gemrb/plugins/OpenALAudio/OpenALAudio.h Modified: gemrb/branches/openal/gemrb/plugins/Core/Audio.h =================================================================== --- gemrb/branches/openal/gemrb/plugins/Core/Audio.h 2008-02-17 17:18:33 UTC (rev 5057) +++ gemrb/branches/openal/gemrb/plugins/Core/Audio.h 2008-02-17 17:58:19 UTC (rev 5058) @@ -60,11 +60,14 @@ virtual int StreamFile(const char* fileName ) = 0; virtual void UpdateListenerPos(int XPos, int YPos ) = 0; virtual void GetListenerPos(int &XPos, int &YPos ) = 0; - virtual bool ReleaseAmbientStream(int stream, bool HardStop=false ) = 0; - virtual int SetupAmbientStream( ieWord x, ieWord y, ieWord z, - ieWord gain, bool point ) = 0; + virtual bool ReleaseStream(int stream, bool HardStop=false ) = 0; + virtual int SetupNewStream( ieWord x, ieWord y, ieWord z, + ieWord gain, bool point, bool Ambient) = 0; virtual int QueueAmbient(int stream, const char* sound) = 0; virtual void SetAmbientStreamVolume(int stream, int volume) = 0; + virtual void QueueBuffer(int stream, unsigned short bits, + int channels, short* memory, int size, int samplerate) = 0; + protected: AmbientMgr* ambim; Modified: gemrb/branches/openal/gemrb/plugins/MVEPlayer/MVEPlay.cpp =================================================================== --- gemrb/branches/openal/gemrb/plugins/MVEPlayer/MVEPlay.cpp 2008-02-17 17:18:33 UTC (rev 5057) +++ gemrb/branches/openal/gemrb/plugins/MVEPlayer/MVEPlay.cpp 2008-02-17 17:58:19 UTC (rev 5058) @@ -153,6 +153,7 @@ MVE_ioCallbacks( fileRead ); MVE_sfCallbacks( showFrame ); MVE_palCallbacks( setPalette ); + MVE_audioCallbacks( setAudioStream, freeAudioStream, queueBuffer ) ; int w,h; @@ -214,3 +215,25 @@ //movie libs palette into our array memcpy( g_palette + start * 3, p + start * 3, count * 3 ); } + +int MVEPlay::setAudioStream() +{ + ieDword volume ; + core->GetDictionary()->Lookup( "Volume Movie", volume) ; + return core->GetAudioDrv()->SetupNewStream(0, 0, 0, volume, + false, false) ; +} + +void MVEPlay::freeAudioStream(int stream) +{ + core->GetAudioDrv()->ReleaseStream(stream); +} + +void MVEPlay::queueBuffer(int stream, unsigned short bits, + int channels, short* memory, + int size, int samplerate) +{ + core->GetAudioDrv()->QueueBuffer(stream, bits, channels, + memory, size, samplerate) ; +} + Modified: gemrb/branches/openal/gemrb/plugins/MVEPlayer/MVEPlay.h =================================================================== --- gemrb/branches/openal/gemrb/plugins/MVEPlayer/MVEPlay.h 2008-02-17 17:18:33 UTC (rev 5057) +++ gemrb/branches/openal/gemrb/plugins/MVEPlayer/MVEPlay.h 2008-02-17 17:58:19 UTC (rev 5058) @@ -40,6 +40,11 @@ unsigned int dsty); static void setPalette(unsigned char* p, unsigned start, unsigned count); static int pollEvents(); + static int setAudioStream(); + static void freeAudioStream(int stream); + static void queueBuffer(int stream, unsigned short bits, + int channels, short* memory, + int size, int samplerate); public: MVEPlay(void); ~MVEPlay(void); Modified: gemrb/branches/openal/gemrb/plugins/MVEPlayer/Makefile.am =================================================================== --- gemrb/branches/openal/gemrb/plugins/MVEPlayer/Makefile.am 2008-02-17 17:18:33 UTC (rev 5057) +++ gemrb/branches/openal/gemrb/plugins/MVEPlayer/Makefile.am 2008-02-17 17:58:19 UTC (rev 5058) @@ -1,6 +1,6 @@ plugin_LTLIBRARIES = libMVEPlayer.la INCLUDES = $(all_includes) -libMVEPlayer_la_LDFLAGS = -module -version-info 0:0:0 @LIBPTHREAD@ @OPENAL_LIBS@ +libMVEPlayer_la_LDFLAGS = -module -version-info 0:0:0 @LIBPTHREAD@ libMVEPlayer_la_METASOURCES = AUTO libMVEPlayer_la_SOURCES = \ MVEPlay.cpp \ Modified: gemrb/branches/openal/gemrb/plugins/MVEPlayer/libmve.h =================================================================== --- gemrb/branches/openal/gemrb/plugins/MVEPlayer/libmve.h 2008-02-17 17:18:33 UTC (rev 5057) +++ gemrb/branches/openal/gemrb/plugins/MVEPlayer/libmve.h 2008-02-17 17:58:19 UTC (rev 5058) @@ -33,9 +33,17 @@ typedef void (*mve_cb_SetPalette)(unsigned char* p, unsigned int start, unsigned int count); +typedef int (*mve_cb_CreateAudioStream)(); +typedef void (*mve_cb_FreeAudioStream)(int stream); +typedef void (*mve_cb_QueueBuffer)(int stream, unsigned short bits, + int channels, short* memory,int size, int samplerate); + void MVE_ioCallbacks(mve_cb_Read io_read); void MVE_memCallbacks(mve_cb_Alloc mem_alloc, mve_cb_Free mem_free); void MVE_sfCallbacks(mve_cb_ShowFrame showframe); void MVE_palCallbacks(mve_cb_SetPalette setpalette); +void MVE_audioCallbacks(mve_cb_CreateAudioStream createaudiostream, + mve_cb_FreeAudioStream freeaudiostream, + mve_cb_QueueBuffer queuebuffer); #endif /* _LIBMVE_H */ Modified: gemrb/branches/openal/gemrb/plugins/MVEPlayer/mve_play.cpp =================================================================== --- gemrb/branches/openal/gemrb/plugins/MVEPlayer/mve_play.cpp 2008-02-17 17:18:33 UTC (rev 5057) +++ gemrb/branches/openal/gemrb/plugins/MVEPlayer/mve_play.cpp 2008-02-17 17:58:19 UTC (rev 5058) @@ -20,16 +20,6 @@ # include <windows.h> #endif -#if defined(AUDIO) -# ifndef _WIN32 -# include <AL/al.h> -# include <AL/alc.h> -# else -# include <al.h> -# include <alc.h> -# endif -#endif - #include "mvelib.h" #include "mve_audio.h" @@ -247,9 +237,10 @@ #ifdef AUDIO static int audiobuf_created = 0; -static ALuint mve_audio_source = 0; -static ALenum mve_audio_format; -static ALsizei mve_audio_samplerate; +static int mve_audio_source = 0; +static unsigned short mve_audio_samplerate; +static int mve_audio_bitsize = 0; +static int mve_audio_channels = 0 ; static int mve_audio_playing = 0; static int mve_audio_canplay = 0; static int mve_audio_compressed = 0; @@ -260,34 +251,15 @@ #endif -static void free_audio_source() -{ - if (!alIsSource( mve_audio_source ) ) - return; - // destroy the buffers - alSourceStop( mve_audio_source ); - ALint nbuffers; - ALuint *buffers; - - alGetSourcei( mve_audio_source, AL_BUFFERS_PROCESSED, &nbuffers ); - buffers = (ALuint *) mve_alloc( nbuffers * sizeof(ALuint) ); - alSourceUnqueueBuffers( mve_audio_source, nbuffers, buffers ); - alDeleteBuffers( nbuffers, buffers ); - mve_free( buffers ); - - alDeleteSources( 1, &mve_audio_source ); -} - static int create_audiobuf_handler(unsigned char /*major*/, unsigned char minor, unsigned char* data, int /*len*/) { #ifdef AUDIO int flags; int desired_buffer; - - int stereo; - int bitsize; int compressed; + int stereo; + int bitsize ; if (!mve_audio_enabled) { return 1; @@ -303,6 +275,8 @@ mve_audio_samplerate = get_ushort( data + 4 ); desired_buffer = get_int( data + 6 ); + mve_audio_channels = ( flags & MVE_AUDIO_FLAGS_STEREO ) ? 2 : 1; + mve_audio_bitsize = ( flags & MVE_AUDIO_FLAGS_16BIT ) ? 16 : 8; stereo = ( flags & MVE_AUDIO_FLAGS_STEREO ) ? 1 : 0; bitsize = ( flags & MVE_AUDIO_FLAGS_16BIT ) ? 1 : 0; @@ -316,40 +290,19 @@ // it's actually four bytes per sample in stereo 16-bit mve_audio_memory = ( short * ) mve_alloc( desired_buffer * (1 << (stereo + bitsize)) ); - if (bitsize == 1) { - mve_audio_format = ( stereo ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16 ); - } else { - mve_audio_format = ( stereo ? AL_FORMAT_STEREO8 : AL_FORMAT_MONO8 ); - } - fprintf( stderr, "creating audio source\n" ); fprintf( stderr, "sample rate = %d, stereo = %d, bitsize = %d, compressed = %d\n", - mve_audio_samplerate, stereo, bitsize ? 16 : 8, compressed ); + mve_audio_samplerate, stereo, mve_audio_bitsize, compressed ); - free_audio_source(); + mve_freeaudiostream(mve_audio_source); mve_audio_source = 0; - alGenSources( 1, &mve_audio_source ); - ALenum error = alGetError(); - if ( error != AL_NO_ERROR) { + mve_audio_source = mve_createaudiostream(); + if ( mve_audio_source == -1 ) { fprintf( stderr, " failure\n"); + mve_audio_canplay = 0 ; } - - ALfloat SourcePos[] = { - 0.0f, 0.0f, 0.0f - }; - ALfloat SourceVel[] = { - 0.0f, 0.0f, 0.0f - }; - - alSourcef( mve_audio_source, AL_PITCH, 1.0f ); - alSourcef( mve_audio_source, AL_GAIN, 0.01f * mve_audio_volume ); - alSourcefv( mve_audio_source, AL_POSITION, SourcePos ); - alSourcefv( mve_audio_source, AL_VELOCITY, SourceVel ); - alSourcei( mve_audio_source, AL_LOOPING, 0 ); - alSourcei( mve_audio_source, AL_SOURCE_RELATIVE, 1 ); - fprintf( stderr, " success\n" ); mve_audio_canplay = 1; @@ -359,24 +312,6 @@ return 1; } -static int play_audio_handler(unsigned char /*major*/, unsigned char /*minor*/, - unsigned char* /*data*/, int /*len*/) -{ -#ifdef AUDIO - if (mve_audio_canplay && - !mve_audio_playing) { - - // we can play even if the queue is empty - // openal won't even start playing (it's a legal nop) - // and playing will be resumed at a buffer refill - // as though a buffer underrun has happened - alSourcePlay( mve_audio_source ); - mve_audio_playing = 1; - } -#endif - return 1; -} - static int audio_data_handler(unsigned char major, unsigned char /*minor*/, unsigned char* data, int /*len*/) { @@ -386,15 +321,6 @@ int nsamp; if (mve_audio_canplay) { - ALuint buffer = 0; - ALint processed; - alGetSourcei( mve_audio_source, AL_BUFFERS_PROCESSED, &processed ); - if (0 == processed) { // do we have to create a new buffer? - alGenBuffers( 1, &buffer ); - } else { - alSourceUnqueueBuffers( mve_audio_source, 1, &buffer ); - } - chan = get_ushort( data + 2 ); nsamp = get_ushort( data + 4 ); if (chan & selected_chan) { @@ -405,33 +331,23 @@ // short * memory = (short *) mve_alloc( nsamp ); mveaudio_uncompress( mve_audio_memory, data, -1 ); /* XXX */ - alBufferData( buffer, mve_audio_format, mve_audio_memory, nsamp, mve_audio_samplerate ); + mve_queuebuffer( mve_audio_source, mve_audio_bitsize, + mve_audio_channels, mve_audio_memory, + nsamp, mve_audio_samplerate ); } else { nsamp -= 8; data += 8; - alBufferData( buffer, mve_audio_format, data, nsamp, mve_audio_samplerate ); + mve_queuebuffer(mve_audio_source, mve_audio_bitsize, + mve_audio_channels, (short*) data, + nsamp, mve_audio_samplerate ); } } else { memset(mve_audio_memory,0, nsamp); - alBufferData( buffer, mve_audio_format, mve_audio_memory, nsamp, mve_audio_samplerate ); + mve_queuebuffer(mve_audio_source, mve_audio_bitsize, + mve_audio_channels, mve_audio_memory, + nsamp, mve_audio_samplerate ); } - alSourceQueueBuffers( mve_audio_source, 1, &buffer ); - - ALenum state; - alGetSourcei( mve_audio_source, AL_SOURCE_STATE, &state ); - - if (AL_STOPPED == state) { // it seems we have a buffer underrun; press play to continue... - mve_audio_underruns ++; - fprintf( stderr, "\nbuffer underrun\n" ); - alSourcePlay( mve_audio_source ); - } - - ALint queued, processed; - alGetSourcei( mve_audio_source, AL_BUFFERS_QUEUED, &queued ); - alGetSourcei( mve_audio_source, AL_BUFFERS_PROCESSED, &processed ); - fprintf(stderr, "audio buffers: %d queued, %d processed\r", queued, processed); - } } #endif @@ -644,6 +560,15 @@ mve_setpalette = setpalette; } +void MVE_audioCallbacks(mve_cb_CreateAudioStream createaudiostream, + mve_cb_FreeAudioStream freeaudiostream, + mve_cb_QueueBuffer queuebuffer) +{ + mve_createaudiostream = createaudiostream; + mve_freeaudiostream = freeaudiostream; + mve_queuebuffer = queuebuffer; +} + int MVE_rmPrepMovie(void* src, int x, int y, int /*track*/) { int i; @@ -670,7 +595,6 @@ mve_set_handler( mve, MVE_OPCODE_CREATETIMER, create_timer_handler ); mve_set_handler( mve, MVE_OPCODE_INITAUDIOBUFFERS, create_audiobuf_handler ); - mve_set_handler( mve, MVE_OPCODE_STARTSTOPAUDIO, play_audio_handler ); mve_set_handler( mve, MVE_OPCODE_INITVIDEOBUFFERS, create_videobuf_handler ); @@ -692,7 +616,7 @@ g_framesToDrop = 0; g_framesDropped = 0; - + return 0; } @@ -740,7 +664,7 @@ timer_created = 0; #ifdef AUDIO - free_audio_source(); + //free_audio_source(); if (mve_audio_memory) { mve_free( mve_audio_memory ); mve_audio_memory = NULL; Modified: gemrb/branches/openal/gemrb/plugins/MVEPlayer/mvelib.cpp =================================================================== --- gemrb/branches/openal/gemrb/plugins/MVEPlayer/mvelib.cpp 2008-02-17 17:18:33 UTC (rev 5057) +++ gemrb/branches/openal/gemrb/plugins/MVEPlayer/mvelib.cpp 2008-02-17 17:58:19 UTC (rev 5058) @@ -18,6 +18,9 @@ mve_cb_Free mve_free; mve_cb_ShowFrame mve_showframe; mve_cb_SetPalette mve_setpalette; +mve_cb_CreateAudioStream mve_createaudiostream; +mve_cb_FreeAudioStream mve_freeaudiostream; +mve_cb_QueueBuffer mve_queuebuffer; /* * private utility functions Modified: gemrb/branches/openal/gemrb/plugins/MVEPlayer/mvelib.h =================================================================== --- gemrb/branches/openal/gemrb/plugins/MVEPlayer/mvelib.h 2008-02-17 17:18:33 UTC (rev 5057) +++ gemrb/branches/openal/gemrb/plugins/MVEPlayer/mvelib.h 2008-02-17 17:58:19 UTC (rev 5058) @@ -11,6 +11,9 @@ extern mve_cb_Free mve_free; extern mve_cb_ShowFrame mve_showframe; extern mve_cb_SetPalette mve_setpalette; +extern mve_cb_CreateAudioStream mve_createaudiostream; +extern mve_cb_FreeAudioStream mve_freeaudiostream; +extern mve_cb_QueueBuffer mve_queuebuffer; /* * structure for maintaining info on a MVEFILE stream Modified: gemrb/branches/openal/gemrb/plugins/NullSound/NullSnd.cpp =================================================================== --- gemrb/branches/openal/gemrb/plugins/NullSound/NullSnd.cpp 2008-02-17 17:18:33 UTC (rev 5057) +++ gemrb/branches/openal/gemrb/plugins/NullSound/NullSnd.cpp 2008-02-17 17:58:19 UTC (rev 5058) @@ -86,7 +86,7 @@ y = YPos; } -int NullSnd::SetupAmbientStream(ieWord, ieWord, ieWord, ieWord, bool) +int NullSnd::SetupNewStream(ieWord, ieWord, ieWord, ieWord, bool, bool) { return -1; } @@ -96,7 +96,7 @@ return -1; } -bool NullSnd::ReleaseAmbientStream(int, bool) +bool NullSnd::ReleaseStream(int, bool) { return true; } @@ -106,3 +106,9 @@ } +void NullSnd::QueueBuffer(int, unsigned short, int, short*, int, int) +{ + +} + + Modified: gemrb/branches/openal/gemrb/plugins/NullSound/NullSnd.h =================================================================== --- gemrb/branches/openal/gemrb/plugins/NullSound/NullSnd.h 2008-02-17 17:18:33 UTC (rev 5057) +++ gemrb/branches/openal/gemrb/plugins/NullSound/NullSnd.h 2008-02-17 17:58:19 UTC (rev 5058) @@ -38,12 +38,14 @@ void ResetMusics(); void UpdateListenerPos(int XPos, int YPos); void GetListenerPos(int& XPos, int& YPos); - void UpdateVolume(unsigned int) {} ; + void UpdateVolume(unsigned int) {} - int SetupAmbientStream(ieWord x, ieWord y, ieWord z, ieWord gain, bool point); + int SetupNewStream(ieWord x, ieWord y, ieWord z, ieWord gain, bool point, bool Ambient); int QueueAmbient(int stream, const char* sound); - bool ReleaseAmbientStream(int stream, bool hardstop); + bool ReleaseStream(int stream, bool hardstop); void SetAmbientStreamVolume(int stream, int gain); + void QueueBuffer(int stream, unsigned short bits, int channels, + short* memory, int size, int samplerate); public: Modified: gemrb/branches/openal/gemrb/plugins/OpenALAudio/AmbientMgrAL.cpp =================================================================== --- gemrb/branches/openal/gemrb/plugins/OpenALAudio/AmbientMgrAL.cpp 2008-02-17 17:18:33 UTC (rev 5057) +++ gemrb/branches/openal/gemrb/plugins/OpenALAudio/AmbientMgrAL.cpp 2008-02-17 17:58:19 UTC (rev 5058) @@ -179,7 +179,7 @@ AmbientMgrAL::AmbientSource::~AmbientSource() { if (stream >= 0) { - core->GetAudioDrv()->ReleaseAmbientStream(stream, true); + core->GetAudioDrv()->ReleaseStream(stream, true); stream = -1; } } @@ -197,7 +197,7 @@ if (stream >= 0) { // release the stream without immediately stopping it - core->GetAudioDrv()->ReleaseAmbientStream(stream, false); + core->GetAudioDrv()->ReleaseStream(stream, false); } return UINT_MAX; } @@ -218,7 +218,7 @@ if (! (ambient->getFlags() & IE_AMBI_MAIN) && !isHeard( listener )) { // we are out of range if (delay > 500) { // release stream if we're inactive for a while - core->GetAudioDrv()->ReleaseAmbientStream(stream); + core->GetAudioDrv()->ReleaseStream(stream); } return delay; } @@ -228,7 +228,7 @@ if (stream < 0) { // we need to allocate a stream - stream = core->GetAudioDrv()->SetupAmbientStream(ambient->getOrigin().x, ambient->getOrigin().y, ambient->getHeight(), ambient->getGain(), (ambient->getFlags() & IE_AMBI_POINT)); + stream = core->GetAudioDrv()->SetupNewStream(ambient->getOrigin().x, ambient->getOrigin().y, ambient->getHeight(), ambient->getGain(), (ambient->getFlags() & IE_AMBI_POINT), true); if (stream == -1) { // no streams available... @@ -281,7 +281,7 @@ void AmbientMgrAL::AmbientSource::hardStop() { if (stream >= 0) { - core->GetAudioDrv()->ReleaseAmbientStream(stream, true); + core->GetAudioDrv()->ReleaseStream(stream, true); stream = -1; } } Modified: gemrb/branches/openal/gemrb/plugins/OpenALAudio/OpenALAudio.cpp =================================================================== --- gemrb/branches/openal/gemrb/plugins/OpenALAudio/OpenALAudio.cpp 2008-02-17 17:18:33 UTC (rev 5057) +++ gemrb/branches/openal/gemrb/plugins/OpenALAudio/OpenALAudio.cpp 2008-02-17 17:58:19 UTC (rev 5058) @@ -89,9 +89,9 @@ } alutContext = context; - //1 for speech, 1 or movie... - int sources = CountAvailableSources(MAX_STREAMS+2); - num_streams = sources - 2; + //1 for speech + int sources = CountAvailableSources(MAX_STREAMS+1); + num_streams = sources - 1; if (num_streams < MAX_STREAMS) { printMessage( "OpenAL","Allocated fewer streams than desired. ", YELLOW ); @@ -172,16 +172,13 @@ DataStream* stream = core->GetResourceMgr()->GetResource(ResRef, IE_WAV_CLASS_ID); if (!stream) return 0; - for (int i=0;i<RETRY;i++) { - alGenBuffers(1, &Buffer); - if ( alGetError()==AL_NO_ERROR ) - break; - else { - printMessage("OpenAL", "Unable to attach buffer", WHITE ); - printStatus("ERROR", YELLOW); - delete stream; - return 0; - } + + alGenBuffers(1, &Buffer); + if ( alGetError() != AL_NO_ERROR ) { + printMessage("OpenAL", "Unable to create buffer", WHITE ); + printStatus("ERROR", YELLOW); + delete stream; + return 0; } SoundMgr* acm = (SoundMgr*) core->GetInterface(IE_WAV_CLASS_ID); @@ -296,7 +293,7 @@ alGenSources( 1, &Source ); if (alGetError() != AL_NO_ERROR) { //failed to generate new sound source - printMessage( "OpenAL", "Unable to attach a source", WHITE ); + printMessage( "OpenAL", "Unable to create a source", WHITE ); printStatus( "ERROR", YELLOW ); return 0; } @@ -465,7 +462,7 @@ YPos = (int) listen[1]; } -bool OpenALAudioDriver::ReleaseAmbientStream(int stream, bool HardStop) +bool OpenALAudioDriver::ReleaseStream(int stream, bool HardStop) { if (streams[stream].free || !streams[stream].locked) return false; @@ -488,8 +485,9 @@ return true; } -int OpenALAudioDriver::SetupAmbientStream( ieWord x, ieWord y, ieWord z, - ieWord gain, bool point ) +//This one is used for movies and ambients. +int OpenALAudioDriver::SetupNewStream( ieWord x, ieWord y, ieWord z, + ieWord gain, bool point, bool Ambient ) { // Find a free (or finished) stream for this sound int stream = -1; @@ -515,7 +513,7 @@ streams[stream].Buffer = 0; streams[stream].Source = source; streams[stream].free = false; - streams[stream].ambient = true; + streams[stream].ambient = Ambient; streams[stream].locked = true; return stream; @@ -688,3 +686,30 @@ } return 0; } + +//This one is used for movies, might be useful for others ? +void OpenALAudioDriver::QueueBuffer(int stream, unsigned short bits, + int channels, short* memory, + int size, int samplerate) +{ + ALuint Buffer ; + + alGenBuffers(1, &Buffer) ; + if ( alGetError() != AL_NO_ERROR ) { + printMessage("OpenAL", "Unable to create buffer", WHITE ) ; + printStatus("ERROR", YELLOW) ; + return; + } + + alBufferData(Buffer, GetFormatEnum(channels, bits), memory, size, samplerate) ; + + alSourceQueueBuffers(streams[stream].Source, 1, &Buffer ) ; + + ALenum state ; + alGetSourcei(streams[stream].Source, AL_SOURCE_STATE, &state) ; + + if(state != AL_PLAYING ) + alSourcePlay(streams[stream].Source) ; + + return ; +} Modified: gemrb/branches/openal/gemrb/plugins/OpenALAudio/OpenALAudio.h =================================================================== --- gemrb/branches/openal/gemrb/plugins/OpenALAudio/OpenALAudio.h 2008-02-17 17:18:33 UTC (rev 5057) +++ gemrb/branches/openal/gemrb/plugins/OpenALAudio/OpenALAudio.h 2008-02-17 17:58:19 UTC (rev 5058) @@ -89,11 +89,14 @@ int StreamFile( const char* filename ); void UpdateListenerPos(int XPos, int YPos ); void GetListenerPos( int &XPos, int &YPos ); - bool ReleaseAmbientStream(int stream, bool HardStop); - int SetupAmbientStream( ieWord x, ieWord y, ieWord z, - ieWord gain, bool point ); + bool ReleaseStream(int stream, bool HardStop); + int SetupNewStream( ieWord x, ieWord y, ieWord z, + ieWord gain, bool point, bool Ambient ); int QueueAmbient(int stream, const char* sound); void SetAmbientStreamVolume(int stream, int volume); + void QueueBuffer(int stream, unsigned short bits, + int channels, short* memory, + int size, int samplerate) ; private: ALCcontext *alutContext; ALuint MusicSource; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |