]> git.jsancho.org Git - lugaru.git/blobdiff - Source/openal_wrapper.cpp
Slightly squash unpack stuff
[lugaru.git] / Source / openal_wrapper.cpp
index 82ba31f568696baa95b565da476ae56fa10d9b05..c3849a859f9cb7fce9042030e639301e17a4a957 100644 (file)
@@ -26,6 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include <string.h>
 
 #include "openal_wrapper.h"
+#include "Sounds.h"
 
 // NOTE:
 // FMOD uses a Left Handed Coordinate system, OpenAL uses a Right Handed
@@ -264,14 +265,14 @@ AL_API void OPENAL_Close()
     initialized = false;
 }
 
-AL_API OPENAL_SAMPLE *OPENAL_GetCurrentSample(int channel)
+static OPENAL_SAMPLE *OPENAL_GetCurrentSample(int channel)
 {
     if (!initialized) return NULL;
     if ((channel < 0) || (channel >= num_channels)) return NULL;
     return impl_channels[channel].sample;
 }
 
-AL_API signed char OPENAL_GetPaused(int channel)
+static signed char OPENAL_GetPaused(int channel)
 {
     if (!initialized) return false;
     if ((channel < 0) || (channel >= num_channels)) return false;
@@ -283,7 +284,7 @@ AL_API signed char OPENAL_GetPaused(int channel)
     return((state == AL_PAUSED) ? true : false);
 }
 
-AL_API unsigned int OPENAL_GetLoopMode(int channel)
+static unsigned int OPENAL_GetLoopMode(int channel)
 {
     if (!initialized) return 0;
     if ((channel < 0) || (channel >= num_channels)) return 0;
@@ -294,7 +295,7 @@ AL_API unsigned int OPENAL_GetLoopMode(int channel)
     return OPENAL_LOOP_OFF;
 }
 
-AL_API signed char OPENAL_IsPlaying(int channel)
+static signed char OPENAL_IsPlaying(int channel)
 {
     if (!initialized) return false;
     if ((channel < 0) || (channel >= num_channels)) return false;
@@ -303,7 +304,7 @@ AL_API signed char OPENAL_IsPlaying(int channel)
     return((state == AL_PLAYING) ? true : false);
 }
 
-AL_API int OPENAL_PlaySoundEx(int channel, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused)
+static int OPENAL_PlaySoundEx(int channel, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused)
 {
     if (!initialized) return -1;
     if (sptr == NULL) return -1;
@@ -486,7 +487,7 @@ AL_API void OPENAL_Sample_Free(OPENAL_SAMPLE *sptr)
     }
 }
 
-AL_API signed char OPENAL_Sample_SetMode(OPENAL_SAMPLE *sptr, unsigned int mode)
+static signed char OPENAL_Sample_SetMode(OPENAL_SAMPLE *sptr, unsigned int mode)
 {
     if (!initialized) return false;
     if ((mode != OPENAL_LOOP_NORMAL) && (mode != OPENAL_LOOP_OFF)) return false;
@@ -591,18 +592,18 @@ AL_API void OPENAL_Stream_Close(OPENAL_STREAM *stream)
     OPENAL_Sample_Free((OPENAL_SAMPLE *) stream);
 }
 
-AL_API OPENAL_SAMPLE *OPENAL_Stream_GetSample(OPENAL_STREAM *stream)
+static OPENAL_SAMPLE *OPENAL_Stream_GetSample(OPENAL_STREAM *stream)
 {
     if (!initialized) return NULL;
     return (OPENAL_SAMPLE *) stream;
 }
 
-AL_API int OPENAL_Stream_PlayEx(int channel, OPENAL_STREAM *stream, OPENAL_DSPUNIT *dsp, signed char startpaused)
+static int OPENAL_Stream_PlayEx(int channel, OPENAL_STREAM *stream, OPENAL_DSPUNIT *dsp, signed char startpaused)
 {
     return OPENAL_PlaySoundEx(channel, (OPENAL_SAMPLE *) stream, dsp, startpaused);
 }
 
-AL_API signed char OPENAL_Stream_Stop(OPENAL_STREAM *stream)
+static signed char OPENAL_Stream_Stop(OPENAL_STREAM *stream)
 {
     if (!initialized) return false;
     for (int i = 0; i < num_channels; i++)
@@ -632,5 +633,59 @@ AL_API signed char OPENAL_SetOutput(int outputtype)
     return true;
 }
 
+extern int channels[100];
+
+extern "C" void PlaySoundEx(int chan, OPENAL_SAMPLE *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused)
+{
+       const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]);
+       if (currSample && currSample == samp[chan])
+       {
+               if (OPENAL_GetPaused(channels[chan]))
+               {
+                       OPENAL_StopSound(channels[chan]);
+                       channels[chan] = OPENAL_FREE;
+               }
+               else if (OPENAL_IsPlaying(channels[chan]))
+               {
+                       int loop_mode = OPENAL_GetLoopMode(channels[chan]);
+                       if (loop_mode & OPENAL_LOOP_OFF)
+                       {
+                               channels[chan] = OPENAL_FREE;
+                       }
+               }
+       }
+       else
+       {
+               channels[chan] = OPENAL_FREE;
+       }
+
+       channels[chan] = OPENAL_PlaySoundEx(channels[chan], sptr, dsp, startpaused);
+       if (channels[chan] < 0)
+       {
+               channels[chan] = OPENAL_PlaySoundEx(OPENAL_FREE, sptr, dsp, startpaused);
+       }
+}
+
+extern "C" void PlayStreamEx(int chan, OPENAL_STREAM *sptr, OPENAL_DSPUNIT *dsp, signed char startpaused)
+{
+       const OPENAL_SAMPLE * currSample = OPENAL_GetCurrentSample(channels[chan]);
+       if (currSample && currSample == OPENAL_Stream_GetSample(sptr))
+       {
+                       OPENAL_StopSound(channels[chan]);
+                       OPENAL_Stream_Stop(sptr);
+       }
+       else
+       {
+               OPENAL_Stream_Stop(sptr);
+               channels[chan] = OPENAL_FREE;
+       }
+
+       channels[chan] = OPENAL_Stream_PlayEx(channels[chan], sptr, dsp, startpaused);
+       if (channels[chan] < 0)
+       {
+               channels[chan] = OPENAL_Stream_PlayEx(OPENAL_FREE, sptr, dsp, startpaused);
+       }
+}
+
 #endif