diff options
Diffstat (limited to 'src/libs/sound/sound.c')
-rw-r--r-- | src/libs/sound/sound.c | 178 |
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; + } +} + + |