summaryrefslogtreecommitdiff
path: root/src/libs/sound/sound.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/sound/sound.c')
-rw-r--r--src/libs/sound/sound.c178
1 files changed, 178 insertions, 0 deletions
diff --git a/src/libs/sound/sound.c b/src/libs/sound/sound.c
new file mode 100644
index 0000000..f2a790e
--- /dev/null
+++ b/src/libs/sound/sound.c
@@ -0,0 +1,178 @@
+//Copyright Paul Reiche, Fred Ford. 1992-2002
+
+/*
+ * 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.
+ */
+
+#include "sound.h"
+#include "sndintrn.h"
+#include "libs/compiler.h"
+#include "libs/inplib.h"
+#include "libs/memlib.h"
+
+
+int musicVolume = NORMAL_VOLUME;
+float musicVolumeScale;
+float sfxVolumeScale;
+float speechVolumeScale;
+TFB_SoundSource soundSource[NUM_SOUNDSOURCES];
+
+
+void
+StopSound (void)
+{
+ int i;
+
+ for (i = FIRST_SFX_SOURCE; i <= LAST_SFX_SOURCE; ++i)
+ {
+ StopSource (i);
+ }
+}
+
+void
+CleanSource (int iSource)
+{
+#define MAX_STACK_BUFFERS 64
+ audio_IntVal processed;
+
+ soundSource[iSource].positional_object = NULL;
+ audio_GetSourcei (soundSource[iSource].handle,
+ audio_BUFFERS_PROCESSED, &processed);
+ if (processed != 0)
+ {
+ audio_Object stack_bufs[MAX_STACK_BUFFERS];
+ audio_Object *bufs;
+
+ if (processed > MAX_STACK_BUFFERS)
+ bufs = (audio_Object *) HMalloc (
+ sizeof (audio_Object) * processed);
+ else
+ bufs = stack_bufs;
+
+ audio_SourceUnqueueBuffers (soundSource[iSource].handle,
+ processed, bufs);
+
+ if (processed > MAX_STACK_BUFFERS)
+ HFree (bufs);
+ }
+ // set the source state to 'initial'
+ audio_SourceRewind (soundSource[iSource].handle);
+}
+
+void
+StopSource (int iSource)
+{
+ audio_SourceStop (soundSource[iSource].handle);
+ CleanSource (iSource);
+}
+
+BOOLEAN
+SoundPlaying (void)
+{
+ int i;
+
+ for (i = 0; i < NUM_SOUNDSOURCES; ++i)
+ {
+ TFB_SoundSample *sample;
+ sample = soundSource[i].sample;
+ if (sample && sample->decoder)
+ {
+ BOOLEAN result;
+ LockMutex (soundSource[i].stream_mutex);
+ result = PlayingStream (i);
+ UnlockMutex (soundSource[i].stream_mutex);
+ if (result)
+ return TRUE;
+ }
+ else
+ {
+ audio_IntVal state;
+ audio_GetSourcei (soundSource[i].handle, audio_SOURCE_STATE, &state);
+ if (state == audio_PLAYING)
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+// for now just spin in a sleep() loop
+// perhaps later change to condvar implementation
+void
+WaitForSoundEnd (COUNT Channel)
+{
+ while (Channel == TFBSOUND_WAIT_ALL ?
+ SoundPlaying () : ChannelPlaying (Channel))
+ {
+ SleepThread (ONE_SECOND / 20);
+ if (QuitPosted) // Don't make users wait for sounds to end
+ break;
+ }
+}
+
+
+// Status: Ignored
+BOOLEAN
+InitSound (int argc, char* argv[])
+{
+ /* Quell compiler warnings */
+ (void)argc;
+ (void)argv;
+ return TRUE;
+}
+
+// Status: Ignored
+void
+UninitSound (void)
+{
+}
+
+void
+SetSFXVolume (float volume)
+{
+ int i;
+ for (i = FIRST_SFX_SOURCE; i <= LAST_SFX_SOURCE; ++i)
+ {
+ audio_Sourcef (soundSource[i].handle, audio_GAIN, volume);
+ }
+}
+
+void
+SetSpeechVolume (float volume)
+{
+ audio_Sourcef (soundSource[SPEECH_SOURCE].handle, audio_GAIN, volume);
+}
+
+DWORD
+FadeMusic (BYTE end_vol, SIZE TimeInterval)
+{
+ if (QuitPosted) // Don't make users wait for fades
+ TimeInterval = 0;
+
+ if (TimeInterval < 0)
+ TimeInterval = 0;
+
+ if (!SetMusicStreamFade (TimeInterval, end_vol))
+ { // fade rejected, maybe due to TimeInterval==0
+ SetMusicVolume (end_vol);
+ return GetTimeCounter ();
+ }
+ else
+ {
+ return GetTimeCounter () + TimeInterval + 1;
+ }
+}
+
+