mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-28 06:53:40 +00:00
- Adjusted the noise debug table so that fractional volume levels do not
run into the adjacent columns. - Added a NullSoundRenderer so that most of the checks against a NULL GSnd can be removed. - Fixed: Looping sounds must always successfully allocate a channel, even if it's only a pre-evicted channel. SVN r1058 (trunk)
This commit is contained in:
parent
ac32bd72bb
commit
601a6ad04c
11 changed files with 251 additions and 202 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
June 30, 2008
|
||||||
|
- Adjusted the noise debug table so that fractional volume levels do not
|
||||||
|
run into the adjacent columns.
|
||||||
|
- Added a NullSoundRenderer so that most of the checks against a NULL GSnd
|
||||||
|
can be removed.
|
||||||
|
- Fixed: Looping sounds must always successfully allocate a channel, even if
|
||||||
|
it's only a pre-evicted channel.
|
||||||
|
|
||||||
June 30, 2008 (Changes by Graf Zahl)
|
June 30, 2008 (Changes by Graf Zahl)
|
||||||
- Added A_ClearReFire code pointer for weapons. Preferably A_WeaponReady should
|
- Added A_ClearReFire code pointer for weapons. Preferably A_WeaponReady should
|
||||||
reset this counter but that can't be done due to unwanted side effects with
|
reset this counter but that can't be done due to unwanted side effects with
|
||||||
|
|
|
@ -668,7 +668,7 @@ void D_Display ()
|
||||||
NoWipe = 10;
|
NoWipe = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (snd_drawoutput && GSnd != NULL)
|
if (snd_drawoutput)
|
||||||
{
|
{
|
||||||
GSnd->DrawWaveDebug(snd_drawoutput);
|
GSnd->DrawWaveDebug(snd_drawoutput);
|
||||||
}
|
}
|
||||||
|
|
|
@ -774,13 +774,10 @@ static void S_ClearSoundData()
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (GSnd != NULL)
|
S_StopAllChannels();
|
||||||
|
for (i = 0; i < S_sfx.Size(); ++i)
|
||||||
{
|
{
|
||||||
S_StopAllChannels();
|
GSnd->UnloadSound(&S_sfx[i]);
|
||||||
for (i = 0; i < S_sfx.Size(); ++i)
|
|
||||||
{
|
|
||||||
GSnd->UnloadSound(&S_sfx[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
S_sfx.Clear();
|
S_sfx.Clear();
|
||||||
|
|
||||||
|
|
115
src/s_sound.cpp
115
src/s_sound.cpp
|
@ -150,9 +150,9 @@ void S_NoiseDebug (void)
|
||||||
screen->DrawText (CR_GOLD, 120, y, "y", TAG_DONE);
|
screen->DrawText (CR_GOLD, 120, y, "y", TAG_DONE);
|
||||||
screen->DrawText (CR_GOLD, 170, y, "z", TAG_DONE);
|
screen->DrawText (CR_GOLD, 170, y, "z", TAG_DONE);
|
||||||
screen->DrawText (CR_GOLD, 220, y, "vol", TAG_DONE);
|
screen->DrawText (CR_GOLD, 220, y, "vol", TAG_DONE);
|
||||||
screen->DrawText (CR_GOLD, 250, y, "dist", TAG_DONE);
|
screen->DrawText (CR_GOLD, 260, y, "dist", TAG_DONE);
|
||||||
screen->DrawText (CR_GOLD, 290, y, "chan", TAG_DONE);
|
screen->DrawText (CR_GOLD, 300, y, "chan", TAG_DONE);
|
||||||
screen->DrawText (CR_GOLD, 330, y, "flags", TAG_DONE);
|
screen->DrawText (CR_GOLD, 340, y, "flags", TAG_DONE);
|
||||||
y += 8;
|
y += 8;
|
||||||
|
|
||||||
if (Channels == NULL)
|
if (Channels == NULL)
|
||||||
|
@ -187,7 +187,7 @@ void S_NoiseDebug (void)
|
||||||
screen->DrawText(color, 70, y, "---", TAG_DONE); // X
|
screen->DrawText(color, 70, y, "---", TAG_DONE); // X
|
||||||
screen->DrawText(color, 120, y, "---", TAG_DONE); // Y
|
screen->DrawText(color, 120, y, "---", TAG_DONE); // Y
|
||||||
screen->DrawText(color, 170, y, "---", TAG_DONE); // Z
|
screen->DrawText(color, 170, y, "---", TAG_DONE); // Z
|
||||||
screen->DrawText(color, 250, y, "---", TAG_DONE); // Distance
|
screen->DrawText(color, 260, y, "---", TAG_DONE); // Distance
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -209,21 +209,21 @@ void S_NoiseDebug (void)
|
||||||
FVector3 sound(ox, oy, oz);
|
FVector3 sound(ox, oy, oz);
|
||||||
sound /= FRACUNIT;
|
sound /= FRACUNIT;
|
||||||
sprintf (temp, "%.0f", (sound - listener).Length());
|
sprintf (temp, "%.0f", (sound - listener).Length());
|
||||||
screen->DrawText (color, 250, y, temp, TAG_DONE);
|
screen->DrawText (color, 260, y, temp, TAG_DONE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
screen->DrawText (color, 250, y, "---", TAG_DONE);
|
screen->DrawText (color, 260, y, "---", TAG_DONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Volume
|
// Volume
|
||||||
sprintf (temp, "%g", chan->Volume);
|
sprintf (temp, "%.2g", chan->Volume);
|
||||||
screen->DrawText (color, 220, y, temp, TAG_DONE);
|
screen->DrawText (color, 220, y, temp, TAG_DONE);
|
||||||
|
|
||||||
// Channel
|
// Channel
|
||||||
sprintf (temp, "%d", chan->EntChannel);
|
sprintf (temp, "%d", chan->EntChannel);
|
||||||
screen->DrawText (color, 290, y, temp, TAG_DONE);
|
screen->DrawText (color, 300, y, temp, TAG_DONE);
|
||||||
|
|
||||||
// Flags
|
// Flags
|
||||||
sprintf (temp, "%s3%sZ%sI%sM%sN%sA%sL%sE",
|
sprintf (temp, "%s3%sZ%sI%sM%sN%sA%sL%sE",
|
||||||
|
@ -235,7 +235,7 @@ void S_NoiseDebug (void)
|
||||||
(chan->ChanFlags & CHAN_AREA) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK,
|
(chan->ChanFlags & CHAN_AREA) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK,
|
||||||
(chan->ChanFlags & CHAN_LOOP) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK,
|
(chan->ChanFlags & CHAN_LOOP) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK,
|
||||||
(chan->ChanFlags & CHAN_EVICTED) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK);
|
(chan->ChanFlags & CHAN_EVICTED) ? TEXTCOLOR_GREEN : TEXTCOLOR_BLACK);
|
||||||
screen->DrawText (color, 330, y, temp, TAG_DONE);
|
screen->DrawText (color, 340, y, temp, TAG_DONE);
|
||||||
|
|
||||||
y += 8;
|
y += 8;
|
||||||
if (chan->PrevChan == &Channels)
|
if (chan->PrevChan == &Channels)
|
||||||
|
@ -314,23 +314,11 @@ void S_Shutdown ()
|
||||||
{
|
{
|
||||||
FSoundChan *chan, *next;
|
FSoundChan *chan, *next;
|
||||||
|
|
||||||
if (GSnd != NULL)
|
while (Channels != NULL)
|
||||||
{
|
{
|
||||||
while (Channels != NULL)
|
GSnd->StopSound(Channels);
|
||||||
{
|
|
||||||
GSnd->StopSound(Channels);
|
|
||||||
}
|
|
||||||
GSnd->UpdateSounds();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (chan = Channels; chan != NULL; chan = next)
|
|
||||||
{
|
|
||||||
next = chan->NextChan;
|
|
||||||
delete chan;
|
|
||||||
}
|
|
||||||
Channels = NULL;
|
|
||||||
}
|
}
|
||||||
|
GSnd->UpdateSounds();
|
||||||
for (chan = FreeChannels; chan != NULL; chan = next)
|
for (chan = FreeChannels; chan != NULL; chan = next)
|
||||||
{
|
{
|
||||||
next = chan->NextChan;
|
next = chan->NextChan;
|
||||||
|
@ -660,7 +648,7 @@ static FSoundChan *S_StartSound (fixed_t *pt, AActor *mover, sector_t *sec,
|
||||||
float pos[3];
|
float pos[3];
|
||||||
float vel[3];
|
float vel[3];
|
||||||
|
|
||||||
if (sound_id <= 0 || volume <= 0 || GSnd == NULL)
|
if (sound_id <= 0 || volume <= 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
org_id = sound_id;
|
org_id = sound_id;
|
||||||
|
@ -736,7 +724,9 @@ static FSoundChan *S_StartSound (fixed_t *pt, AActor *mover, sector_t *sec,
|
||||||
|
|
||||||
// If this is a singular sound, don't play it if it's already playing.
|
// If this is a singular sound, don't play it if it's already playing.
|
||||||
if (sfx->bSingular && S_CheckSingular(sound_id))
|
if (sfx->bSingular && S_CheckSingular(sound_id))
|
||||||
return NULL;
|
{
|
||||||
|
chanflags |= CHAN_EVICTED;
|
||||||
|
}
|
||||||
|
|
||||||
// If the sound is unpositioned or comes from the listener, it is
|
// If the sound is unpositioned or comes from the listener, it is
|
||||||
// never limited.
|
// never limited.
|
||||||
|
@ -748,7 +738,17 @@ static FSoundChan *S_StartSound (fixed_t *pt, AActor *mover, sector_t *sec,
|
||||||
// If this sound doesn't like playing near itself, don't play it if
|
// If this sound doesn't like playing near itself, don't play it if
|
||||||
// that's what would happen.
|
// that's what would happen.
|
||||||
if (near_limit > 0 && S_CheckSoundLimit(sfx, pos, near_limit))
|
if (near_limit > 0 && S_CheckSoundLimit(sfx, pos, near_limit))
|
||||||
|
{
|
||||||
|
chanflags |= CHAN_EVICTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the sound is blocked and not looped, return now. If the sound
|
||||||
|
// is blocked and looped, pretend to play it so that it can
|
||||||
|
// eventually play for real.
|
||||||
|
if ((chanflags & (CHAN_EVICTED | CHAN_LOOP)) == CHAN_EVICTED)
|
||||||
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// Make sure the sound is loaded.
|
// Make sure the sound is loaded.
|
||||||
sfx = S_LoadSound(sfx);
|
sfx = S_LoadSound(sfx);
|
||||||
|
@ -817,14 +817,29 @@ static FSoundChan *S_StartSound (fixed_t *pt, AActor *mover, sector_t *sec,
|
||||||
pitch = NORM_PITCH;
|
pitch = NORM_PITCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attenuation > 0)
|
if (chanflags & CHAN_EVICTED)
|
||||||
|
{
|
||||||
|
chan = NULL;
|
||||||
|
}
|
||||||
|
else if (attenuation > 0)
|
||||||
{
|
{
|
||||||
chan = GSnd->StartSound3D (sfx, volume, attenuation, pitch, basepriority, pos, vel, sec, channel, chanflags, NULL);
|
chan = GSnd->StartSound3D (sfx, volume, attenuation, pitch, basepriority, pos, vel, sec, channel, chanflags, NULL);
|
||||||
chanflags |= CHAN_IS3D | CHAN_JUSTSTARTED;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
chan = GSnd->StartSound (sfx, volume, pitch, chanflags, NULL);
|
chan = GSnd->StartSound (sfx, volume, pitch, chanflags, NULL);
|
||||||
|
}
|
||||||
|
if (chan == NULL && (chanflags & CHAN_LOOP))
|
||||||
|
{
|
||||||
|
chan = S_GetChannel(NULL);
|
||||||
|
chanflags |= CHAN_EVICTED;
|
||||||
|
}
|
||||||
|
if (attenuation > 0)
|
||||||
|
{
|
||||||
|
chanflags |= CHAN_IS3D | CHAN_JUSTSTARTED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
chanflags |= CHAN_LISTENERZ | CHAN_JUSTSTARTED;
|
chanflags |= CHAN_LISTENERZ | CHAN_JUSTSTARTED;
|
||||||
}
|
}
|
||||||
if (chan != NULL)
|
if (chan != NULL)
|
||||||
|
@ -844,6 +859,7 @@ static FSoundChan *S_StartSound (fixed_t *pt, AActor *mover, sector_t *sec,
|
||||||
chan->NearLimit = near_limit;
|
chan->NearLimit = near_limit;
|
||||||
chan->Pitch = pitch;
|
chan->Pitch = pitch;
|
||||||
chan->Priority = basepriority;
|
chan->Priority = basepriority;
|
||||||
|
chan->DistanceScale = attenuation;
|
||||||
if (mover != NULL)
|
if (mover != NULL)
|
||||||
{
|
{
|
||||||
mover->SoundChans |= 1 << channel;
|
mover->SoundChans |= 1 << channel;
|
||||||
|
@ -888,6 +904,11 @@ void S_RestartSound(FSoundChan *chan)
|
||||||
|
|
||||||
// If this sound doesn't like playing near itself, don't play it if
|
// If this sound doesn't like playing near itself, don't play it if
|
||||||
// that's what would happen.
|
// that's what would happen.
|
||||||
|
if (chan->NearLimit > 0 && S_CheckSoundLimit(&S_sfx[chan->SoundID], pos, chan->NearLimit))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ochan = GSnd->StartSound3D(sfx, chan->Volume, chan->DistanceScale, chan->Pitch,
|
ochan = GSnd->StartSound3D(sfx, chan->Volume, chan->DistanceScale, chan->Pitch,
|
||||||
chan->Priority, pos, vel, chan->Sector, chan->EntChannel, chan->ChanFlags, chan);
|
chan->Priority, pos, vel, chan->Sector, chan->EntChannel, chan->ChanFlags, chan);
|
||||||
}
|
}
|
||||||
|
@ -1079,10 +1100,6 @@ void S_StopSound (AActor *ent, int channel)
|
||||||
|
|
||||||
void S_StopAllChannels ()
|
void S_StopAllChannels ()
|
||||||
{
|
{
|
||||||
if (GSnd == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
SN_StopAllSequences();
|
SN_StopAllSequences();
|
||||||
while (Channels != NULL)
|
while (Channels != NULL)
|
||||||
{
|
{
|
||||||
|
@ -1101,7 +1118,7 @@ void S_StopAllChannels ()
|
||||||
|
|
||||||
void S_RelinkSound (AActor *from, AActor *to)
|
void S_RelinkSound (AActor *from, AActor *to)
|
||||||
{
|
{
|
||||||
if (from == NULL || GSnd == NULL)
|
if (from == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (FSoundChan *chan = Channels; chan != NULL; chan = chan->NextChan)
|
for (FSoundChan *chan = Channels; chan != NULL; chan = chan->NextChan)
|
||||||
|
@ -1197,10 +1214,7 @@ void S_PauseSound (bool notmusic)
|
||||||
I_PauseSong (mus_playing.handle);
|
I_PauseSong (mus_playing.handle);
|
||||||
MusicPaused = true;
|
MusicPaused = true;
|
||||||
}
|
}
|
||||||
if (GSnd != NULL)
|
GSnd->SetSfxPaused (true);
|
||||||
{
|
|
||||||
GSnd->SetSfxPaused (true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -1217,10 +1231,7 @@ void S_ResumeSound ()
|
||||||
I_ResumeSong (mus_playing.handle);
|
I_ResumeSong (mus_playing.handle);
|
||||||
MusicPaused = false;
|
MusicPaused = false;
|
||||||
}
|
}
|
||||||
if (GSnd != NULL)
|
GSnd->SetSfxPaused (false);
|
||||||
{
|
|
||||||
GSnd->SetSfxPaused (false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -1243,7 +1254,7 @@ void S_EvictAllChannels()
|
||||||
if (!(chan->ChanFlags & CHAN_EVICTED))
|
if (!(chan->ChanFlags & CHAN_EVICTED))
|
||||||
{
|
{
|
||||||
chan->ChanFlags |= CHAN_EVICTED;
|
chan->ChanFlags |= CHAN_EVICTED;
|
||||||
if (GSnd != NULL && chan->SysChannel != NULL)
|
if (chan->SysChannel != NULL)
|
||||||
{
|
{
|
||||||
GSnd->StopSound(chan);
|
GSnd->StopSound(chan);
|
||||||
}
|
}
|
||||||
|
@ -1295,11 +1306,6 @@ void S_RestoreEvictedChannel(FSoundChan *chan)
|
||||||
|
|
||||||
void S_RestoreEvictedChannels()
|
void S_RestoreEvictedChannels()
|
||||||
{
|
{
|
||||||
if (GSnd == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Restart channels in the same order they were originally played.
|
// Restart channels in the same order they were originally played.
|
||||||
S_RestoreEvictedChannel(Channels);
|
S_RestoreEvictedChannel(Channels);
|
||||||
}
|
}
|
||||||
|
@ -1317,9 +1323,6 @@ void S_UpdateSounds (void *listener_p)
|
||||||
|
|
||||||
I_UpdateMusic();
|
I_UpdateMusic();
|
||||||
|
|
||||||
if (GSnd == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// [RH] Update music and/or playlist. I_QrySongPlaying() must be called
|
// [RH] Update music and/or playlist. I_QrySongPlaying() must be called
|
||||||
// to attempt to reconnect to broken net streams and to advance the
|
// to attempt to reconnect to broken net streams and to advance the
|
||||||
// playlist when the current song finishes.
|
// playlist when the current song finishes.
|
||||||
|
@ -1441,10 +1444,7 @@ void S_SerializeSounds(FArchive &arc)
|
||||||
{
|
{
|
||||||
FSoundChan *chan;
|
FSoundChan *chan;
|
||||||
|
|
||||||
if (GSnd != NULL)
|
GSnd->Sync(true);
|
||||||
{
|
|
||||||
GSnd->Sync(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arc.IsStoring())
|
if (arc.IsStoring())
|
||||||
{
|
{
|
||||||
|
@ -1490,11 +1490,8 @@ void S_SerializeSounds(FArchive &arc)
|
||||||
S_RestoreEvictedChannels();
|
S_RestoreEvictedChannels();
|
||||||
}
|
}
|
||||||
DSeqNode::SerializeSequences(arc);
|
DSeqNode::SerializeSequences(arc);
|
||||||
if (GSnd != NULL)
|
GSnd->Sync(false);
|
||||||
{
|
GSnd->UpdateSounds();
|
||||||
GSnd->Sync(false);
|
|
||||||
GSnd->UpdateSounds();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
|
@ -1486,7 +1486,6 @@ FSoundChan *FMODSoundRenderer::StartSound3D(sfxinfo_t *sfx, float vol, float dis
|
||||||
HandleChannelDelay(chan, reuse_chan, freq);
|
HandleChannelDelay(chan, reuse_chan, freq);
|
||||||
chan->setPaused(false);
|
chan->setPaused(false);
|
||||||
FSoundChan *schan = CommonChannelSetup(chan, reuse_chan);
|
FSoundChan *schan = CommonChannelSetup(chan, reuse_chan);
|
||||||
schan->DistanceScale = distscale;
|
|
||||||
return schan;
|
return schan;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -97,11 +97,8 @@ CUSTOM_CVAR (Float, snd_musicvolume, 0.5f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
|
||||||
self = 1.f;
|
self = 1.f;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (GSnd != NULL)
|
// Set general music volume.
|
||||||
{
|
GSnd->SetMusicVolume(clamp<float>(self * relative_volume, 0, 1));
|
||||||
// Set general music volume.
|
|
||||||
GSnd->SetMusicVolume(clamp<float>(self * relative_volume, 0, 1));
|
|
||||||
}
|
|
||||||
// For music not implemented through the digital sound system,
|
// For music not implemented through the digital sound system,
|
||||||
// let them know about the change.
|
// let them know about the change.
|
||||||
if (currSong != NULL)
|
if (currSong != NULL)
|
||||||
|
@ -263,10 +260,6 @@ void *I_RegisterURLSong (const char *url)
|
||||||
{
|
{
|
||||||
StreamSong *song;
|
StreamSong *song;
|
||||||
|
|
||||||
if (GSnd == NULL)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
song = new StreamSong(url, 0, 0);
|
song = new StreamSong(url, 0, 0);
|
||||||
if (song->IsValid())
|
if (song->IsValid())
|
||||||
{
|
{
|
||||||
|
@ -328,73 +321,70 @@ void *I_RegisterSong (const char *filename, char *musiccache, int offset, int le
|
||||||
// Check for MUS format
|
// Check for MUS format
|
||||||
if (id == MAKE_ID('M','U','S',0x1a))
|
if (id == MAKE_ID('M','U','S',0x1a))
|
||||||
{
|
{
|
||||||
if (GSnd != NULL)
|
/* MUS are played as:
|
||||||
|
- OPL:
|
||||||
|
- if explicitly selected by $mididevice
|
||||||
|
- when snd_mididevice is -3 and no midi device is set for the song
|
||||||
|
|
||||||
|
Timidity:
|
||||||
|
- if explicitly selected by $mididevice
|
||||||
|
- when snd_mididevice is -2 and no midi device is set for the song
|
||||||
|
|
||||||
|
FMod:
|
||||||
|
- if explicitly selected by $mididevice
|
||||||
|
- when snd_mididevice is -1 and no midi device is set for the song
|
||||||
|
- as fallback when both OPL and Timidity failed unless snd_mididevice is >= 0
|
||||||
|
|
||||||
|
MMAPI (Win32 only):
|
||||||
|
- if explicitly selected by $mididevice (non-Win32 redirects this to FMOD)
|
||||||
|
- when snd_mididevice is >= 0 and no midi device is set for the song
|
||||||
|
- as fallback when both OPL and Timidity failed and snd_mididevice is >= 0
|
||||||
|
*/
|
||||||
|
if ((snd_mididevice == -3 && device == MDEV_DEFAULT) || device == MDEV_OPL)
|
||||||
{
|
{
|
||||||
/* MUS are played as:
|
info = new MUSSong2 (file, musiccache, len, MIDI_OPL);
|
||||||
- OPL:
|
}
|
||||||
- if explicitly selected by $mididevice
|
else if (device == MDEV_TIMIDITY || (device == MDEV_DEFAULT && snd_mididevice == -2))
|
||||||
- when snd_mididevice is -3 and no midi device is set for the song
|
{
|
||||||
|
info = new TimiditySong (file, musiccache, len);
|
||||||
|
}
|
||||||
|
else if (snd_mididevice == -4 && device == MDEV_DEFAULT)
|
||||||
|
{
|
||||||
|
info = new MUSSong2(file, musiccache, len, MIDI_Timidity);
|
||||||
|
}
|
||||||
|
if (info != NULL && !info->IsValid())
|
||||||
|
{
|
||||||
|
delete info;
|
||||||
|
info = NULL;
|
||||||
|
device = MDEV_DEFAULT;
|
||||||
|
}
|
||||||
|
if (info == NULL && (snd_mididevice == -1 || device == MDEV_FMOD) && device != MDEV_MMAPI)
|
||||||
|
{
|
||||||
|
TArray<BYTE> midi;
|
||||||
|
bool midi_made = false;
|
||||||
|
|
||||||
Timidity:
|
if (file == NULL)
|
||||||
- if explicitly selected by $mididevice
|
|
||||||
- when snd_mididevice is -2 and no midi device is set for the song
|
|
||||||
|
|
||||||
FMod:
|
|
||||||
- if explicitly selected by $mididevice
|
|
||||||
- when snd_mididevice is -1 and no midi device is set for the song
|
|
||||||
- as fallback when both OPL and Timidity failed unless snd_mididevice is >= 0
|
|
||||||
|
|
||||||
MMAPI (Win32 only):
|
|
||||||
- if explicitly selected by $mididevice (non-Win32 redirects this to FMOD)
|
|
||||||
- when snd_mididevice is >= 0 and no midi device is set for the song
|
|
||||||
- as fallback when both OPL and Timidity failed and snd_mididevice is >= 0
|
|
||||||
*/
|
|
||||||
if ((snd_mididevice == -3 && device == MDEV_DEFAULT) || device == MDEV_OPL)
|
|
||||||
{
|
{
|
||||||
info = new MUSSong2 (file, musiccache, len, MIDI_OPL);
|
midi_made = ProduceMIDI((BYTE *)musiccache, midi);
|
||||||
}
|
}
|
||||||
else if (device == MDEV_TIMIDITY || (device == MDEV_DEFAULT && snd_mididevice == -2))
|
else
|
||||||
{
|
{
|
||||||
info = new TimiditySong (file, musiccache, len);
|
BYTE *mus = new BYTE[len];
|
||||||
}
|
size_t did_read = fread(mus, 1, len, file);
|
||||||
else if ((snd_mididevice == -4 && device == MDEV_DEFAULT) && GSnd != NULL)
|
if (did_read == (size_t)len)
|
||||||
{
|
|
||||||
info = new MUSSong2(file, musiccache, len, MIDI_Timidity);
|
|
||||||
}
|
|
||||||
if (info != NULL && !info->IsValid())
|
|
||||||
{
|
|
||||||
delete info;
|
|
||||||
info = NULL;
|
|
||||||
device = MDEV_DEFAULT;
|
|
||||||
}
|
|
||||||
if (info == NULL && (snd_mididevice == -1 || device == MDEV_FMOD) && device != MDEV_MMAPI)
|
|
||||||
{
|
|
||||||
TArray<BYTE> midi;
|
|
||||||
bool midi_made = false;
|
|
||||||
|
|
||||||
if (file == NULL)
|
|
||||||
{
|
{
|
||||||
midi_made = ProduceMIDI((BYTE *)musiccache, midi);
|
midi_made = ProduceMIDI(mus, midi);
|
||||||
}
|
}
|
||||||
else
|
fseek(file, -(long)did_read, SEEK_CUR);
|
||||||
|
delete[] mus;
|
||||||
|
}
|
||||||
|
if (midi_made)
|
||||||
|
{
|
||||||
|
info = new StreamSong((char *)&midi[0], -1, midi.Size());
|
||||||
|
if (!info->IsValid())
|
||||||
{
|
{
|
||||||
BYTE *mus = new BYTE[len];
|
delete info;
|
||||||
size_t did_read = fread(mus, 1, len, file);
|
info = NULL;
|
||||||
if (did_read == (size_t)len)
|
|
||||||
{
|
|
||||||
midi_made = ProduceMIDI(mus, midi);
|
|
||||||
}
|
|
||||||
fseek(file, -(long)did_read, SEEK_CUR);
|
|
||||||
delete[] mus;
|
|
||||||
}
|
|
||||||
if (midi_made)
|
|
||||||
{
|
|
||||||
info = new StreamSong((char *)&midi[0], -1, midi.Size());
|
|
||||||
if (!info->IsValid())
|
|
||||||
{
|
|
||||||
delete info;
|
|
||||||
info = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -408,7 +398,6 @@ void *I_RegisterSong (const char *filename, char *musiccache, int offset, int le
|
||||||
// Check for MIDI format
|
// Check for MIDI format
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
if (id == MAKE_ID('M','T','h','d'))
|
if (id == MAKE_ID('M','T','h','d'))
|
||||||
{
|
{
|
||||||
// This is a midi file
|
// This is a midi file
|
||||||
|
@ -432,15 +421,15 @@ void *I_RegisterSong (const char *filename, char *musiccache, int offset, int le
|
||||||
- when snd_mididevice is >= 0 and no midi device is set for the song
|
- when snd_mididevice is >= 0 and no midi device is set for the song
|
||||||
- as fallback when Timidity failed and snd_mididevice is >= 0
|
- as fallback when Timidity failed and snd_mididevice is >= 0
|
||||||
*/
|
*/
|
||||||
if ((device == MDEV_OPL || (snd_mididevice == -3 && device == MDEV_DEFAULT)) && GSnd != NULL)
|
if (device == MDEV_OPL || (snd_mididevice == -3 && device == MDEV_DEFAULT))
|
||||||
{
|
{
|
||||||
info = new MIDISong2 (file, musiccache, len, MIDI_OPL);
|
info = new MIDISong2 (file, musiccache, len, MIDI_OPL);
|
||||||
}
|
}
|
||||||
else if ((device == MDEV_TIMIDITY || (snd_mididevice == -2 && device == MDEV_DEFAULT)) && GSnd != NULL)
|
else if (device == MDEV_TIMIDITY || (snd_mididevice == -2 && device == MDEV_DEFAULT))
|
||||||
{
|
{
|
||||||
info = new TimiditySong (file, musiccache, len);
|
info = new TimiditySong (file, musiccache, len);
|
||||||
}
|
}
|
||||||
else if ((snd_mididevice == -4 && device == MDEV_DEFAULT) && GSnd != NULL)
|
else if (snd_mididevice == -4 && device == MDEV_DEFAULT)
|
||||||
{
|
{
|
||||||
info = new MIDISong2(file, musiccache, len, MIDI_Timidity);
|
info = new MIDISong2(file, musiccache, len, MIDI_Timidity);
|
||||||
}
|
}
|
||||||
|
@ -523,7 +512,7 @@ void *I_RegisterSong (const char *filename, char *musiccache, int offset, int le
|
||||||
// smaller than this can't possibly be a valid music file if it hasn't
|
// smaller than this can't possibly be a valid music file if it hasn't
|
||||||
// been identified already, so don't even bother trying to load it.
|
// been identified already, so don't even bother trying to load it.
|
||||||
// Of course MIDIs shorter than 1024 bytes should pass.
|
// Of course MIDIs shorter than 1024 bytes should pass.
|
||||||
if (info == NULL && GSnd != NULL && (len >= 1024 || id == MAKE_ID('M','T','h','d')))
|
if (info == NULL && (len >= 1024 || id == MAKE_ID('M','T','h','d')))
|
||||||
{
|
{
|
||||||
// Let FMOD figure out what it is.
|
// Let FMOD figure out what it is.
|
||||||
if (file != NULL)
|
if (file != NULL)
|
||||||
|
|
|
@ -107,6 +107,111 @@ CUSTOM_CVAR (Float, snd_sfxvolume, 1.f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG|CVAR_NOIN
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class NullSoundRenderer : public SoundRenderer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void SetSfxVolume (float volume)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void SetMusicVolume (float volume)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void LoadSound (sfxinfo_t *sfx)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void UnloadSound (sfxinfo_t *sfx)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
unsigned int GetMSLength(sfxinfo_t *sfx)
|
||||||
|
{
|
||||||
|
// Return something that isn't 0. This is only used by some
|
||||||
|
// ambient sounds to specify a default minimum period.
|
||||||
|
return 250;
|
||||||
|
}
|
||||||
|
float GetOutputRate()
|
||||||
|
{
|
||||||
|
return 11025; // Lies!
|
||||||
|
}
|
||||||
|
|
||||||
|
// Streaming sounds.
|
||||||
|
SoundStream *CreateStream (SoundStreamCallback callback, int buffbytes, int flags, int samplerate, void *userdata)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
SoundStream *OpenStream (const char *filename, int flags, int offset, int length)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Starts a sound. (No, not really.)
|
||||||
|
FSoundChan *StartSound (sfxinfo_t *sfx, float vol, int pitch, int chanflags, FSoundChan *reuse_chan)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
FSoundChan *StartSound3D (sfxinfo_t *sfx, float vol, float distscale, int pitch, int priority, float pos[3], float vel[3], sector_t *sector, int channum, int chanflags, FSoundChan *reuse_chan)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stops a sound channel.
|
||||||
|
void StopSound (FSoundChan *chan)
|
||||||
|
{
|
||||||
|
if (chan != NULL)
|
||||||
|
{
|
||||||
|
S_ReturnChannel(chan);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns position of sound on this channel, in samples.
|
||||||
|
unsigned int GetPosition(FSoundChan *chan)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Synchronizes following sound startups.
|
||||||
|
void Sync (bool sync)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pauses or resumes all sound effect channels.
|
||||||
|
void SetSfxPaused (bool paused)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pauses or resumes *every* channel, including environmental reverb.
|
||||||
|
void SetInactive(bool inactive)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Updates the volume, separation, and pitch of a sound channel.
|
||||||
|
void UpdateSoundParams3D (FSoundChan *chan, float pos[3], float vel[3])
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateListener ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void UpdateSounds ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsValid ()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void PrintStatus ()
|
||||||
|
{
|
||||||
|
Printf("Null sound module active.\n");
|
||||||
|
}
|
||||||
|
void PrintDriversList ()
|
||||||
|
{
|
||||||
|
Printf("Null sound module uses no drivers.\n");
|
||||||
|
}
|
||||||
|
FString GatherStats ()
|
||||||
|
{
|
||||||
|
return "Null sound module has no stats.";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void I_InitSound ()
|
void I_InitSound ()
|
||||||
{
|
{
|
||||||
|
@ -115,6 +220,7 @@ void I_InitSound ()
|
||||||
|
|
||||||
if (nosound)
|
if (nosound)
|
||||||
{
|
{
|
||||||
|
GSnd = new NullSoundRenderer;
|
||||||
I_InitMusic ();
|
I_InitMusic ();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -124,7 +230,7 @@ void I_InitSound ()
|
||||||
if (!GSnd->IsValid ())
|
if (!GSnd->IsValid ())
|
||||||
{
|
{
|
||||||
delete GSnd;
|
delete GSnd;
|
||||||
GSnd = NULL;
|
GSnd = new NullSoundRenderer;
|
||||||
Printf (TEXTCOLOR_RED"Sound init failed. Using nosound.\n");
|
Printf (TEXTCOLOR_RED"Sound init failed. Using nosound.\n");
|
||||||
}
|
}
|
||||||
I_InitMusic ();
|
I_InitMusic ();
|
||||||
|
@ -143,14 +249,7 @@ void I_ShutdownSound (void)
|
||||||
|
|
||||||
CCMD (snd_status)
|
CCMD (snd_status)
|
||||||
{
|
{
|
||||||
if (GSnd == NULL)
|
GSnd->PrintStatus ();
|
||||||
{
|
|
||||||
Printf ("sound is not active\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GSnd->PrintStatus ();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CCMD (snd_reset)
|
CCMD (snd_reset)
|
||||||
|
@ -169,26 +268,12 @@ CCMD (snd_reset)
|
||||||
|
|
||||||
CCMD (snd_listdrivers)
|
CCMD (snd_listdrivers)
|
||||||
{
|
{
|
||||||
if (GSnd != NULL)
|
GSnd->PrintDriversList ();
|
||||||
{
|
|
||||||
GSnd->PrintDriversList ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Printf ("Sound is inactive.\n");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ADD_STAT (sound)
|
ADD_STAT (sound)
|
||||||
{
|
{
|
||||||
if (GSnd != NULL)
|
return GSnd->GatherStats ();
|
||||||
{
|
|
||||||
return GSnd->GatherStats ();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return "No sound";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SoundRenderer::SoundRenderer ()
|
SoundRenderer::SoundRenderer ()
|
||||||
|
|
|
@ -1117,18 +1117,15 @@ input_mod::input_mod(DUH *myduh)
|
||||||
written = 0;
|
written = 0;
|
||||||
length = 0;
|
length = 0;
|
||||||
start_order = 0;
|
start_order = 0;
|
||||||
if (GSnd != NULL)
|
if (mod_samplerate != 0)
|
||||||
{
|
{
|
||||||
if (mod_samplerate != 0)
|
srate = mod_samplerate;
|
||||||
{
|
}
|
||||||
srate = mod_samplerate;
|
else
|
||||||
}
|
{
|
||||||
else
|
srate = (int)GSnd->GetOutputRate();
|
||||||
{
|
}
|
||||||
srate = (int)GSnd->GetOutputRate();
|
m_Stream = GSnd->CreateStream(read, 32*1024, SoundStream::Float, srate, this);
|
||||||
}
|
|
||||||
m_Stream = GSnd->CreateStream(read, 32*1024, SoundStream::Float, srate, this);
|
|
||||||
}
|
|
||||||
delta = 65536.0 / srate;
|
delta = 65536.0 / srate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1343,9 +1340,5 @@ FString input_mod::GetStats()
|
||||||
|
|
||||||
extern "C" short *DUMBCALLBACK dumb_decode_vorbis(int outlen, const void *oggstream, int sizebytes)
|
extern "C" short *DUMBCALLBACK dumb_decode_vorbis(int outlen, const void *oggstream, int sizebytes)
|
||||||
{
|
{
|
||||||
if (GSnd == NULL)
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return GSnd->DecodeSample(outlen, oggstream, sizebytes, CODEC_Vorbis);
|
return GSnd->DecodeSample(outlen, oggstream, sizebytes, CODEC_Vorbis);
|
||||||
}
|
}
|
||||||
|
|
|
@ -269,12 +269,6 @@ void TimiditySong::PrepTimidity ()
|
||||||
pipeSize = (timidity_pipe * timidity_frequency / 1000)
|
pipeSize = (timidity_pipe * timidity_frequency / 1000)
|
||||||
<< (timidity_stereo + !timidity_8bit);
|
<< (timidity_stereo + !timidity_8bit);
|
||||||
|
|
||||||
if (GSnd == NULL)
|
|
||||||
{ // Can't pipe if using no sound.
|
|
||||||
pipeSize = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pipeSize != 0)
|
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// Round pipe size up to nearest power of 2 to try and avoid partial
|
// Round pipe size up to nearest power of 2 to try and avoid partial
|
||||||
|
|
|
@ -50,14 +50,7 @@ StreamSong::~StreamSong ()
|
||||||
|
|
||||||
StreamSong::StreamSong (const char *filename_or_data, int offset, int len)
|
StreamSong::StreamSong (const char *filename_or_data, int offset, int len)
|
||||||
{
|
{
|
||||||
if (GSnd != NULL)
|
m_Stream = GSnd->OpenStream (filename_or_data, SoundStream::Loop, offset, len);
|
||||||
{
|
|
||||||
m_Stream = GSnd->OpenStream (filename_or_data, SoundStream::Loop, offset, len);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_Stream = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StreamSong::IsPlaying ()
|
bool StreamSong::IsPlaying ()
|
||||||
|
|
|
@ -275,10 +275,7 @@ int I_PlayMovie (const char *name)
|
||||||
goto bomb3;
|
goto bomb3;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GSnd != NULL)
|
GSnd->MovieDisableSound ();
|
||||||
{
|
|
||||||
GSnd->MovieDisableSound ();
|
|
||||||
}
|
|
||||||
returnSound = true;
|
returnSound = true;
|
||||||
|
|
||||||
CheckIfVideo ();
|
CheckIfVideo ();
|
||||||
|
@ -390,10 +387,7 @@ bomb2:
|
||||||
|
|
||||||
if (returnSound)
|
if (returnSound)
|
||||||
{
|
{
|
||||||
if (GSnd != NULL)
|
GSnd->MovieResumeSound ();
|
||||||
{
|
|
||||||
GSnd->MovieResumeSound ();
|
|
||||||
}
|
|
||||||
C_FlushDisplay ();
|
C_FlushDisplay ();
|
||||||
}
|
}
|
||||||
if (runningFull)
|
if (runningFull)
|
||||||
|
|
Loading…
Reference in a new issue