summaryrefslogtreecommitdiff
path: root/src/libs/sound/audiocore.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/sound/audiocore.c')
-rw-r--r--src/libs/sound/audiocore.c272
1 files changed, 272 insertions, 0 deletions
diff --git a/src/libs/sound/audiocore.c b/src/libs/sound/audiocore.c
new file mode 100644
index 0000000..440f63f
--- /dev/null
+++ b/src/libs/sound/audiocore.c
@@ -0,0 +1,272 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/* Audio Core API (derived from OpenAL)
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "audiocore.h"
+#include "sound.h"
+#include "libs/log.h"
+
+static audio_Driver audiodrv;
+
+/* The globals that control the sound drivers. */
+int snddriver, soundflags;
+
+volatile bool audio_inited = false;
+
+/*
+ * Declarations for driver init funcs
+ */
+
+#ifdef HAVE_OPENAL
+sint32 openAL_Init (audio_Driver *driver, sint32 flags);
+#endif
+sint32 mixSDL_Init (audio_Driver *driver, sint32 flags);
+sint32 noSound_Init (audio_Driver *driver, sint32 flags);
+
+
+/*
+ * Initialization
+ */
+
+sint32
+initAudio (sint32 driver, sint32 flags)
+{
+ sint32 ret;
+
+#ifdef HAVE_OPENAL
+ if (driver == audio_DRIVER_MIXSDL)
+ ret = mixSDL_Init (&audiodrv, flags);
+ else if (driver == audio_DRIVER_OPENAL)
+ ret = openAL_Init (&audiodrv, flags);
+ else
+ ret = noSound_Init (&audiodrv, flags);
+#else
+ if (driver == audio_DRIVER_OPENAL)
+ {
+ log_add (log_Warning, "OpenAL driver not compiled in, so using MixSDL");
+ driver = audio_DRIVER_MIXSDL;
+ }
+ if (driver == audio_DRIVER_MIXSDL)
+ ret = mixSDL_Init (&audiodrv, flags);
+ else
+ ret = noSound_Init (&audiodrv, flags);
+#endif
+
+ if (ret != 0)
+ {
+ log_add (log_Fatal, "Sound driver initialization failed.\n"
+ "This may happen when a soundcard is "
+ "not present or not available.\n"
+ "NOTICE: Try running UQM with '--sound=none' option");
+ exit (EXIT_FAILURE);
+ }
+
+ SetSFXVolume (sfxVolumeScale);
+ SetSpeechVolume (speechVolumeScale);
+ SetMusicVolume (musicVolume);
+
+ audio_inited = true;
+
+ return ret;
+}
+
+void
+unInitAudio (void)
+{
+ if (!audio_inited)
+ return;
+
+ audio_inited = false;
+ audiodrv.Uninitialize ();
+}
+
+
+/*
+ * General
+ */
+
+sint32
+audio_GetError (void)
+{
+ return audiodrv.GetError ();
+}
+
+
+/*
+ * Sources
+ */
+
+void
+audio_GenSources (uint32 n, audio_Object *psrcobj)
+{
+ audiodrv.GenSources (n, psrcobj);
+}
+
+void
+audio_DeleteSources (uint32 n, audio_Object *psrcobj)
+{
+ audiodrv.DeleteSources (n, psrcobj);
+}
+
+bool
+audio_IsSource (audio_Object srcobj)
+{
+ return audiodrv.IsSource (srcobj);
+}
+
+void
+audio_Sourcei (audio_Object srcobj, audio_SourceProp pname,
+ audio_IntVal value)
+
+{
+ audiodrv.Sourcei (srcobj, audiodrv.EnumLookup[pname], value);
+}
+
+void
+audio_Sourcef (audio_Object srcobj, audio_SourceProp pname,
+ float value)
+{
+ audiodrv.Sourcef (srcobj, audiodrv.EnumLookup[pname], value);
+}
+
+void
+audio_Sourcefv (audio_Object srcobj, audio_SourceProp pname,
+ float *value)
+{
+ audiodrv.Sourcefv (srcobj, audiodrv.EnumLookup[pname], value);
+}
+
+void
+audio_GetSourcei (audio_Object srcobj, audio_SourceProp pname,
+ audio_IntVal *value)
+{
+ audiodrv.GetSourcei (srcobj, audiodrv.EnumLookup[pname], value);
+}
+
+void
+audio_GetSourcef (audio_Object srcobj, audio_SourceProp pname,
+ float *value)
+{
+ audiodrv.GetSourcef (srcobj, audiodrv.EnumLookup[pname], value);
+}
+
+void
+audio_SourceRewind (audio_Object srcobj)
+{
+ audiodrv.SourceRewind (srcobj);
+}
+
+void
+audio_SourcePlay (audio_Object srcobj)
+{
+ audiodrv.SourcePlay (srcobj);
+}
+
+void
+audio_SourcePause (audio_Object srcobj)
+{
+ audiodrv.SourcePause (srcobj);
+}
+
+void
+audio_SourceStop (audio_Object srcobj)
+{
+ audiodrv.SourceStop (srcobj);
+}
+
+void
+audio_SourceQueueBuffers (audio_Object srcobj, uint32 n,
+ audio_Object* pbufobj)
+{
+ audiodrv.SourceQueueBuffers (srcobj, n, pbufobj);
+}
+
+void
+audio_SourceUnqueueBuffers (audio_Object srcobj, uint32 n,
+ audio_Object* pbufobj)
+{
+ audiodrv.SourceUnqueueBuffers (srcobj, n, pbufobj);
+}
+
+
+/*
+ * Buffers
+ */
+
+void
+audio_GenBuffers (uint32 n, audio_Object *pbufobj)
+{
+ audiodrv.GenBuffers (n, pbufobj);
+}
+
+void
+audio_DeleteBuffers (uint32 n, audio_Object *pbufobj)
+{
+ audiodrv.DeleteBuffers (n, pbufobj);
+}
+
+bool
+audio_IsBuffer (audio_Object bufobj)
+{
+ return audiodrv.IsBuffer (bufobj);
+}
+
+void
+audio_GetBufferi (audio_Object bufobj, audio_BufferProp pname,
+ audio_IntVal *value)
+{
+ audiodrv.GetBufferi (bufobj, audiodrv.EnumLookup[pname], value);
+}
+
+void
+audio_BufferData (audio_Object bufobj, uint32 format, void* data,
+ uint32 size, uint32 freq)
+{
+ audiodrv.BufferData (bufobj, audiodrv.EnumLookup[format], data, size,
+ freq);
+}
+
+bool
+audio_GetFormatInfo (uint32 format, int *channels, int *sample_size)
+{
+ switch (format)
+ {
+ case audio_FORMAT_MONO8:
+ *channels = 1;
+ *sample_size = sizeof (uint8);
+ return true;
+
+ case audio_FORMAT_STEREO8:
+ *channels = 2;
+ *sample_size = sizeof (uint8);
+ return true;
+
+ case audio_FORMAT_MONO16:
+ *channels = 1;
+ *sample_size = sizeof (sint16);
+ return true;
+
+ case audio_FORMAT_STEREO16:
+ *channels = 2;
+ *sample_size = sizeof (sint16);
+ return true;
+ }
+ return false;
+}