rework music looping a little so that eg 'cd play' does not loop, like vanilla
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5658 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
73af4c8bf1
commit
2d1699985f
2 changed files with 29 additions and 22 deletions
|
@ -178,15 +178,7 @@ sfx_t *Media_NextTrack(int musicchannelnum, float *starttime)
|
||||||
sfx_t *s = NULL;
|
sfx_t *s = NULL;
|
||||||
if (bgmvolume.value <= 0 || mastervolume.value <= 0)
|
if (bgmvolume.value <= 0 || mastervolume.value <= 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
media_fadeout = false; //it has actually ended now, at least on one device. don't fade the new track too...
|
||||||
if (media_fadeout)
|
|
||||||
{
|
|
||||||
if (S_Music_Playing(musicchannelnum))
|
|
||||||
return NULL; //can't pick a new track until they've all stopped.
|
|
||||||
|
|
||||||
//okay, it has actually stopped everywhere.
|
|
||||||
}
|
|
||||||
media_fadeout = false; //it has actually ended now
|
|
||||||
|
|
||||||
Q_strncpyz(media_currenttrack, "", sizeof(media_currenttrack));
|
Q_strncpyz(media_currenttrack, "", sizeof(media_currenttrack));
|
||||||
#ifdef HAVE_JUKEBOX
|
#ifdef HAVE_JUKEBOX
|
||||||
|
@ -254,9 +246,15 @@ sfx_t *Media_NextTrack(int musicchannelnum, float *starttime)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (*media_playtrack)
|
if (*media_playtrack || *media_loopingtrack)
|
||||||
{
|
{
|
||||||
Q_strncpyz(media_currenttrack, media_playtrack, sizeof(media_currenttrack));
|
if (*media_playtrack)
|
||||||
|
{
|
||||||
|
Q_strncpyz(media_currenttrack, media_playtrack, sizeof(media_currenttrack));
|
||||||
|
*media_playtrack = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Q_strncpyz(media_currenttrack, media_loopingtrack, sizeof(media_currenttrack));
|
||||||
#ifdef HAVE_JUKEBOX
|
#ifdef HAVE_JUKEBOX
|
||||||
Q_strncpyz(media_friendlyname, "", sizeof(media_friendlyname));
|
Q_strncpyz(media_friendlyname, "", sizeof(media_friendlyname));
|
||||||
media_playlistcurrent = MEDIA_GAMEMUSIC;
|
media_playlistcurrent = MEDIA_GAMEMUSIC;
|
||||||
|
@ -290,7 +288,7 @@ static qboolean Media_Changed (unsigned int mediatype)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//returns the new volume the sample should be at, to support crossfading.
|
//returns the new volume the sample should be at, to support fading.
|
||||||
//if we return < 0, the mixer will know to kill whatever is currently playing, ready for a new track.
|
//if we return < 0, the mixer will know to kill whatever is currently playing, ready for a new track.
|
||||||
//this is on the main thread with the mixer locked, its safe to do stuff, but try not to block
|
//this is on the main thread with the mixer locked, its safe to do stuff, but try not to block
|
||||||
float Media_CrossFade(int musicchanel, float vol, float time)
|
float Media_CrossFade(int musicchanel, float vol, float time)
|
||||||
|
|
|
@ -3442,18 +3442,27 @@ void S_UpdateAmbientSounds (soundcardinfo_t *sc)
|
||||||
if (!chan->sfx)
|
if (!chan->sfx)
|
||||||
{
|
{
|
||||||
float time = 0;
|
float time = 0;
|
||||||
sfx_t *newmusic = Media_NextTrack(i-MUSIC_FIRST, &time);
|
sfx_t *newmusic;
|
||||||
if (newmusic && newmusic->loadstate != SLS_FAILED)
|
if (!S_Music_Playing(i-MUSIC_FIRST))
|
||||||
{
|
{
|
||||||
chan->sfx = newmusic;
|
newmusic = Media_NextTrack(i-MUSIC_FIRST, &time);
|
||||||
chan->rate = 1<<PITCHSHIFT;
|
if (newmusic && newmusic->loadstate != SLS_FAILED)
|
||||||
chan->pos = (int)(time * sc->sn.speed) * chan->rate;
|
{ //okay, now we know which track we're meant to be playing, all devices can play it at once.
|
||||||
changed = CUR_EVERYTHING;
|
soundcardinfo_t *sc2;
|
||||||
|
for (sc2 = sndcardinfo; sc2; sc2=sc2->next)
|
||||||
|
{
|
||||||
|
channel_t *chan = &sc2->channel[i];
|
||||||
|
chan->sfx = newmusic;
|
||||||
|
chan->rate = 1<<PITCHSHIFT;
|
||||||
|
chan->pos = (int)(time * sc->sn.speed) * chan->rate;
|
||||||
|
changed = CUR_EVERYTHING;
|
||||||
|
|
||||||
chan->master_vol = bound(0, 1, 255);
|
chan->master_vol = bound(0, 1, 255);
|
||||||
chan->vol[0] = chan->vol[1] = chan->vol[2] = chan->vol[3] = chan->vol[4] = chan->vol[5] = chan->master_vol;
|
chan->vol[0] = chan->vol[1] = chan->vol[2] = chan->vol[3] = chan->vol[4] = chan->vol[5] = chan->master_vol;
|
||||||
if (sc->ChannelUpdate)
|
if (sc->ChannelUpdate)
|
||||||
sc->ChannelUpdate(sc, chan, changed);
|
sc->ChannelUpdate(sc, chan, changed);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (chan->sfx)
|
if (chan->sfx)
|
||||||
|
|
Loading…
Reference in a new issue