removed SDL_mixer sound module

git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@616 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
avolkov
2003-01-30 20:29:19 +00:00
parent 4d39b079dd
commit a3b093f1b8
6 changed files with 1 additions and 820 deletions
+1 -4
View File
@@ -1,12 +1,9 @@
if [ "$uqm_SOUNDMODULE" = openal ]; then
uqm_SUBDIRS="openal decoders"
uqm_CFLAGS="$uqm_CFLAGS -DSOUNDMODULE_OPENAL"
elif [ "$uqm_SOUNDMODULE" = mixsdl ]; then
else # mixsdl
uqm_SUBDIRS="mixsdl decoders"
uqm_CFLAGS="$uqm_CFLAGS -DSOUNDMODULE_MIXSDL"
else
uqm_SUBDIRS="sdl"
uqm_CFLAGS="$uqm_CFLAGS -DSOUNDMODULE_SDL"
fi
uqm_CFILES="fileinst.c resinst.c sound_common.c sound.c sfx.c music.c stream.c trackplayer.c"
-1
View File
@@ -1 +0,0 @@
uqm_CFILES="modfuncs.c play.c sound.c trackplayer.c"
-231
View File
@@ -1,231 +0,0 @@
//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.
*/
#ifdef SOUNDMODULE_SDL
#include <fcntl.h>
#include "libs/strings/strintrn.h"
#include "libs/sound/sndintrn.h"
#include "libs/graphics/sdl/sdl_common.h"
#include "libs/sound/sound_common.h"
#include "options.h"
#ifdef WIN32
#include <io.h>
#endif
#include <SDL_mixer.h>
MEM_HANDLE
_GetSoundBankData (FILE *fp, DWORD length)
{
#ifdef WIN32
int omode;
#endif
int snd_ct, n;
DWORD opos;
char CurrentLine[1024], filename[1024];
#define MAX_FX 256
Mix_Chunk *sndfx[MAX_FX];
STRING_TABLE Snd;
opos = ftell (fp);
{
char *s1, *s2;
extern char *_cur_resfile_name;
if (_cur_resfile_name == 0
|| (((s2 = 0), (s1 = strrchr (_cur_resfile_name, '/')) == 0)
&& (s2 = strrchr (_cur_resfile_name, '\\')) == 0))
n = 0;
else
{
if (s2 > s1)
s1 = s2;
n = s1 - _cur_resfile_name + 1;
strncpy (filename, _cur_resfile_name, n);
}
}
#ifdef WIN32
omode = _setmode (fileno (fp), O_TEXT);
#endif
snd_ct = 0;
while (fgets (CurrentLine, sizeof (CurrentLine), fp) && snd_ct < MAX_FX)
{
if
(
sscanf(CurrentLine, "%s", &filename[n]) == 1 &&
(sndfx[snd_ct] = Mix_LoadWAV (filename))
)
{
++snd_ct;
}
else
{
fprintf (stderr, "_GetSoundBankData: Bad file!\n");
}
if (ftell (fp) - opos >= length)
break;
}
#ifdef WIN32
_setmode (fileno (fp), omode);
#endif
Snd = 0;
if (snd_ct && (Snd = AllocStringTable (
sizeof (STRING_TABLE_DESC)
+ (sizeof (DWORD) * snd_ct)
+ (sizeof (sndfx[0]) * snd_ct)
)))
{
STRING_TABLEPTR fxTab;
LockStringTable (Snd, &fxTab);
if (fxTab == 0)
{
while (snd_ct--)
Mix_FreeChunk (sndfx[snd_ct]);
FreeStringTable (Snd);
Snd = 0;
}
else
{
DWORD *offs, StringOffs;
fxTab->StringCount = snd_ct;
fxTab->flags = 0;
offs = fxTab->StringOffsets;
StringOffs = sizeof (STRING_TABLE_DESC) + (sizeof (DWORD) * snd_ct);
memcpy ((BYTE *)fxTab + StringOffs, sndfx, sizeof (sndfx[0]) * snd_ct);
do
{
*offs++ = StringOffs;
StringOffs += sizeof (sndfx[0]);
} while (snd_ct--);
UnlockStringTable (Snd);
}
}
return ((MEM_HANDLE)Snd);
}
BOOLEAN
_ReleaseSoundBankData (MEM_HANDLE Snd)
{
STRING_TABLEPTR fxTab;
LockStringTable (Snd, &fxTab);
if (fxTab)
{
int snd_ct;
Mix_Chunk **sptr;
snd_ct = fxTab->StringCount;
sptr = (Mix_Chunk **)((BYTE *)fxTab + fxTab->StringOffsets[0]);
while (snd_ct--)
{
Mix_FreeChunk (*sptr);
*sptr++ = 0;
}
UnlockStringTable (Snd);
FreeStringTable (Snd);
return (TRUE);
}
return (FALSE);
}
MEM_HANDLE
_GetMusicData (FILE *fp, DWORD length)
{
MEM_HANDLE h;
extern char *_cur_resfile_name;
h = 0;
if (_cur_resfile_name && (h = AllocMusicData (sizeof (void *))))
{
char filename[1000];
Mix_Music **pmus;
LockMusicData (h, &pmus);
strcpy (filename, _cur_resfile_name);
switch (optWhichMusic)
{
default:
case OPT_3DO:
{
char threedoname[1000];
strcpy (threedoname, filename);
strcpy (&threedoname[strlen (threedoname)-3], "ogg");
if (fileExists (threedoname))
{
strcpy (filename, threedoname);
}
break;
}
case OPT_PC:
{
break;
}
}
fprintf (stderr, "_GetMusicData(): loading %s\n", filename);
if (pmus == 0 || (*pmus = Mix_LoadMUS (filename)) == 0)
{
UnlockMusicData (h);
mem_release (h);
h = 0;
}
UnlockMusicData (h);
}
(void) fp; /* satisfy compiler (unused parameter) */
(void) length; /* satisfy compiler (unused parameter) */
return (h);
}
BOOLEAN
_ReleaseMusicData (MEM_HANDLE handle)
{
Mix_Music **pmus;
LockMusicData (handle, &pmus);
if (pmus == 0)
return (FALSE);
Mix_FreeMusic (*pmus);
UnlockMusicData (handle);
mem_release (handle);
return (TRUE);
}
BOOLEAN
DestroySound(SOUND_REF target)
{
return (_ReleaseSoundBankData (target));
}
#endif
-96
View File
@@ -1,96 +0,0 @@
//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.
*/
#ifdef SOUNDMODULE_SDL
#include "libs/sound/sndintrn.h"
#include "libs/graphics/sdl/sdl_common.h"
#include "libs/sound/sound_common.h"
#include <SDL_mixer.h>
static MUSIC_REF curMusicRef;
void
PLRPlaySong (MUSIC_REF MusicRef, BOOLEAN Continuous, BYTE Priority)
{
Mix_Music **pmus;
LockMusicData (MusicRef, &pmus);
if (pmus)
{
PLRStop (curMusicRef);
curMusicRef = MusicRef;
Mix_PlayMusic (*pmus, Continuous ? -1 : 1);
}
(void) Priority; /* Satisfy compiler because of unused variable */
}
void
PLRStop (MUSIC_REF MusicRef)
{
if (MusicRef == curMusicRef || MusicRef == (MUSIC_REF)~0)
{
Mix_HaltMusic ();
UnlockMusicData (curMusicRef);
curMusicRef = 0;
}
}
BOOLEAN
PLRPlaying (MUSIC_REF MusicRef)
{
if (curMusicRef && (MusicRef == curMusicRef || MusicRef == (MUSIC_REF)~0))
{
if (Mix_PlayingMusic ())
return (TRUE);
PLRStop (curMusicRef);
}
return (FALSE);
}
void
PLRPause (MUSIC_REF MusicRef)
{
if (MusicRef == curMusicRef || MusicRef == (MUSIC_REF)~0)
{
// Mix_FadeOutMusic (1 * 1000);
Mix_PauseMusic ();
}
}
void
PLRResume (MUSIC_REF MusicRef)
{
if (MusicRef == curMusicRef || MusicRef == (MUSIC_REF)~0)
{
// Mix_FadeInMusic (1 * 1000);
Mix_ResumeMusic ();
}
}
BOOLEAN
DestroyMusic (MUSIC_REF MusicRef)
{
return (FreeMusicData (MusicRef));
}
#endif
-244
View File
@@ -1,244 +0,0 @@
//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.
*/
#ifdef SOUNDMODULE_SDL
#include "libs/graphics/sdl/sdl_common.h"
#include "libs/sound/sound_common.h"
#include <SDL_mixer.h>
#ifdef WIN32
#pragma comment (lib, "SDL_mixer.lib")
#endif
int
TFB_InitSound (int driver, int flags)
{
char SoundcardName[256];
int audio_rate, audio_channels, audio_bufsize;
Uint16 audio_format;
SDL_version compile_version;
fprintf (stderr, "Initializing SDL audio subsystem.\n");
if ((SDL_InitSubSystem(SDL_INIT_AUDIO)) == -1)
{
fprintf (stderr, "Couldn't initialize audio subsystem: %s\n", SDL_GetError());
exit(-1);
}
fprintf (stderr, "SDL audio subsystem initialized.\n");
if (flags & TFB_SOUNDFLAGS_HQAUDIO)
{
audio_rate = 44100;
audio_channels = 2;
audio_bufsize = 2048;
}
else if (flags & TFB_SOUNDFLAGS_LQAUDIO)
{
audio_rate = 22050;
audio_channels = 2;
audio_bufsize = 1024;
}
else
{
audio_rate = 44100;
audio_channels = 2;
audio_bufsize = 2048;
}
fprintf (stderr, "Initializing SDL_mixer.\n");
if (Mix_OpenAudio(audio_rate, AUDIO_S16, audio_channels, audio_bufsize))
{
fprintf (stderr, "Unable to open audio: %s\n", Mix_GetError());
exit (-1);
}
fprintf (stderr, "SDL_mixer initialized.\n");
atexit (TFB_UninitSound);
SDL_AudioDriverName (SoundcardName, sizeof (SoundcardName));
Mix_QuerySpec (&audio_rate, &audio_format, &audio_channels);
fprintf (stderr, " opened %s at %d Hz %d bit %s, %d bytes audio buffer\n",
SoundcardName, audio_rate, audio_format & 0xFF,
audio_channels > 1 ? "stereo" : "mono", audio_bufsize);
MIX_VERSION (&compile_version);
fprintf (stderr, " compiled with SDL_mixer version: %d.%d.%d\n",
compile_version.major,
compile_version.minor,
compile_version.patch);
fprintf (stderr, " running with SDL_mixer version: %d.%d.%d\n",
Mix_Linked_Version()->major,
Mix_Linked_Version()->minor,
Mix_Linked_Version()->patch);
return 0;
}
void
TFB_UninitSound (void)
{
Mix_CloseAudio ();
}
//Status: Unimplemented
void
StopSound()
// So does this stop ALL sound? How about music?
{
Mix_HaltChannel (-1);
}
int _music_volume = (MAX_VOLUME + 1) >> 1;
// Status: Unimplemented
void
SetMusicVolume(COUNT Volume) //Volume calibration... [0,255]?
{
Mix_VolumeMusic ((_music_volume = Volume) * SDL_MIX_MAXVOLUME /
MAX_VOLUME);
}
//Status: Unimplemented
BOOLEAN
SoundPlaying()
{
return (Mix_Playing (-1) != 0);
}
int
GetSoundData (char* data)
{
return 0;
}
// Status: Unimplemented
int
GetSoundInfo (int length)
// Umm... How does it know which sound?
{
//fprintf (stderr, "Unimplemented function activated: GetSoundInfo()\n");
return 0;
}
// Status: Unimplemented
BOOLEAN
ChannelPlaying(COUNT WhichChannel)
// SDL will have a nice interface for this, I hope.
{
// fprintf (stderr, "Unimplemented function activated: ChannelPlaying()\n");
return ((BOOLEAN) Mix_Playing (WhichChannel));
}
// Status: Unimplemented
void
PlayChannel(
COUNT channel,
PVOID sample,
COUNT sample_length,
COUNT loop_begin,
COUNT loop_length,
unsigned char priority
) // This one's important.
{
Mix_Chunk* Chunk;
Chunk=*(Mix_Chunk**)sample;
Mix_PlayChannel (
channel, //-1 would be easiest
Chunk,
0
);
}
//Status: Unimplemented
void
StopChannel(COUNT channel, unsigned char Priority) // Easy w/ SDL.
{
Mix_HaltChannel (channel);
}
// Status: Maybe Implemented
PBYTE
GetSampleAddress (SOUND sound)
// I might be prototyping this wrong, type-wise.
{
return ((PBYTE)GetSoundAddress (sound));
}
// Status: Unimplemented
COUNT
GetSampleLength (SOUND sound)
{
COUNT ret;
Mix_Chunk *Chunk;
Chunk = (Mix_Chunk *) sound;
ret = 0; // Chunk->alen;
// fprintf (stderr, "Maybe Implemented function activated: GetSampleLength()\n");
return(ret);
}
// Status: Unimplemented
void
SetChannelRate (COUNT channel, DWORD rate_hz, unsigned char priority)
// in hz
{
// fprintf (stderr, "Unimplemented function activated: SetChannelRate()\n");
}
// Status: Unimplemented
COUNT
GetSampleRate (SOUND sound)
{
COUNT ret;
// fprintf (stderr, "Unimplemented function activated: GetSampleRate()\n");
ret=0;
return(ret);
}
// Status: Unimplemented
void
SetChannelVolume (COUNT channel, COUNT volume, BYTE priority)
// I wonder what this whole priority business is...
// I can probably ignore it.
{
// fprintf (stderr, "Unimplemented function activated: SetChannelVolume()\n");
}
//Status: Ignored
BOOLEAN
InitSound (int argc, char* argv[])
// Odd things to pass the InitSound function...
{
BOOLEAN ret;
// fprintf (stderr, "Unimplemented function activated: InitSound()\n");
ret = TRUE;
return (ret);
}
// Status: Unimplemented
void
UninitSound () //Maybe I should call StopSound() first?
{
// fprintf (stderr, "Unimplemented function activated: UninitSound()\n");
}
#endif
@@ -1,244 +0,0 @@
//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.
*/
#ifdef SOUNDMODULE_SDL
#include "libs/graphics/sdl/sdl_common.h"
#include "libs/sound/sound_common.h"
#include "libs/sound/trackplayer.h"
#include <SDL_mixer.h>
#define VOICE_CHANNEL 0
extern int do_subtitles (UNICODE *pStr, UNICODE *pTimeStamp, int method);
static int tct, tcur, no_voice;
#define MAX_CLIPS 50
static struct
{
int text_spliced;
UNICODE *text;
UNICODE *timestamp;
Mix_Chunk *chunk;
} track_clip[MAX_CLIPS];
void
JumpTrack (int abort)
{
Mix_ChannelFinished (0);
if (track_clip[tcur].chunk)
Mix_HaltChannel (VOICE_CHANNEL);
no_voice = 1;
do_subtitles ((void *)~0, 0, 0);
if (abort)
tcur = tct;
}
static void
advance_track (int channel_finished)
{
if (channel_finished <= VOICE_CHANNEL)
{
if (channel_finished == VOICE_CHANNEL)
++tcur;
if (tcur < tct)
{
Mix_PlayChannel (VOICE_CHANNEL, track_clip[tcur].chunk, 0);
do_subtitles ((void *)~0, 0, 0);
do_subtitles (0, 0, 0);
}
else if (channel_finished == VOICE_CHANNEL)
{
--tcur;
no_voice = 1;
}
}
}
void
ResumeTrack ()
{
if (tcur < tct)
{
if (Mix_Playing /* Mix_Paused */ (VOICE_CHANNEL))
Mix_Resume (VOICE_CHANNEL);
else if (!no_voice)
{
if (tcur == 0)
Mix_ChannelFinished (advance_track);
advance_track (-1);
}
}
}
COUNT
PlayingTrack ()
{
if (tcur < tct)
{
if (do_subtitles (track_clip[tcur].text, track_clip[tcur].timestamp, 0)
|| (no_voice && ++tcur < tct && do_subtitles (0, 0, 0)))
return (tcur + 1);
else if (track_clip[tcur].chunk)
return (Mix_Playing (VOICE_CHANNEL) ? (COUNT)(tcur + 1) : 0);
}
return (0);
}
void
StopTrack ()
{
Mix_ChannelFinished (0);
Mix_HaltChannel (VOICE_CHANNEL);
while (tct--)
{
if (track_clip[tct].text_spliced)
{
track_clip[tct].text_spliced = 0;
HFree (track_clip[tct].text);
track_clip[tct].text = 0;
}
if (track_clip[tct].chunk)
{
Mix_FreeChunk (track_clip[tct].chunk);
track_clip[tct].chunk = 0;
}
}
tct = tcur = 0;
no_voice = 0;
do_subtitles (0, 0, 0);
}
void
SpliceMultiTrack (UNICODE *TrackNames[], UNICODE *TrackText)
{
if (TrackText)
{
if (tct)
{
int slen1, slen2;
UNICODE *oTT;
oTT = track_clip[tct - 1].text;
slen1 = wstrlen (oTT);
slen2 = wstrlen (TrackText);
if (track_clip[tct - 1].text_spliced)
track_clip[tct - 1].text = HRealloc (oTT, slen1 + slen2 + 1);
else
{
track_clip[tct - 1].text = HMalloc (slen1 + slen2 + 1);
wstrcpy (track_clip[tct - 1].text, oTT);
track_clip[tct - 1].text_spliced = 1;
}
wstrcpy (&track_clip[tct - 1].text[slen1], TrackText);
}
}
}
void
SpliceTrack (UNICODE *TrackName, UNICODE *TrackText, UNICODE *TimeStamp)
{
if (TrackText)
{
if (TrackName == 0)
{
if (tct)
{
int slen1, slen2;
UNICODE *oTT;
oTT = track_clip[tct - 1].text;
slen1 = wstrlen (oTT);
slen2 = wstrlen (TrackText);
if (track_clip[tct - 1].text_spliced)
track_clip[tct - 1].text = HRealloc (oTT, slen1 + slen2 + 1);
else
{
track_clip[tct - 1].text = HMalloc (slen1 + slen2 + 1);
wstrcpy (track_clip[tct - 1].text, oTT);
track_clip[tct - 1].text_spliced = 1;
}
wstrcpy (&track_clip[tct - 1].text[slen1], TrackText);
}
}
else if (tct < MAX_CLIPS)
{
fprintf(stderr, "SpliceTrack(): loading %s\n", TrackName);
track_clip[tct].chunk = Mix_LoadWAV (TrackName);
if (!track_clip[tct].chunk)
{
fprintf (stderr, "SpliceTrack(): Mix_LoadWAV failed for %s: %s\n",
TrackName, Mix_GetError());
}
track_clip[tct].text = TrackText;
track_clip[tct].text_spliced = 0;
track_clip[tct].timestamp = TimeStamp;
++tct;
}
}
}
void
PauseTrack ()
{
if (tcur < tct && track_clip[tcur].chunk)
Mix_Pause (VOICE_CHANNEL);
}
void
FastReverse_Page ()
{
JumpTrack (0);
no_voice = 0;
tcur = 0;
ResumeTrack ();
}
void
FastReverse_Smooth ()
{
JumpTrack (0);
no_voice = 0;
tcur = 0;
ResumeTrack ();
}
void
FastForward_Page ()
{
JumpTrack (0);
// no_voice = 0;
}
void
FastForward_Smooth ()
{
JumpTrack (0);
// no_voice = 0;
}
#endif