/* ================= S_StartBackgroundTrack ================= */ void S_StartBackgroundTrack( const char *introTrack, const char *mainTrack, int position ) { S_StopBackgroundTrack(); if( !dma.initialized ) return; // check for special symbols if( introTrack && *introTrack == '*' ) introTrack = NULL; if( mainTrack && *mainTrack == '*' ) mainTrack = NULL; if(( !introTrack || !*introTrack ) && ( !mainTrack || !*mainTrack )) return; if( !introTrack ) introTrack = mainTrack; if( !*introTrack ) return; if( !mainTrack || !*mainTrack ) s_bgTrack.loopName[0] = '\0'; else Q_strncpy( s_bgTrack.loopName, mainTrack, sizeof( s_bgTrack.loopName )); // open stream s_bgTrack.stream = FS_OpenStream( va( "media/%s", introTrack )); Q_strncpy( s_bgTrack.current, introTrack, sizeof( s_bgTrack.current )); Q_memset( &musicfade, 0, sizeof( musicfade )); // clear any soundfade s_bgTrack.source = cls.key_dest; if( position != 0 ) { // restore message, update song position FS_SetStreamPos( s_bgTrack.stream, position ); } S_CheckLerpingState(); }
/* ================= S_StartBackgroundTrack ================= */ void S_StartBackgroundTrack( const char *introTrack, const char *mainTrack ) { S_StopBackgroundTrack(); if(( !introTrack || !*introTrack ) && ( !mainTrack || !*mainTrack )) return; if( !introTrack ) { introTrack = ""; } if( !mainTrack || !*mainTrack ) { mainTrack = introTrack; } if( !*introTrack ) return; if( mainTrack ) { com.snprintf( s_bgTrack.loopName, sizeof( s_bgTrack.loopName ), "media/%s", mainTrack ); } else s_bgTrack.loopName[0] = 0; S_StartStreaming(); // close the background track, but DON'T reset s_rawend // if restarting the same back ground track if( s_bgTrack.stream ) { FS_CloseStream( s_bgTrack.stream ); s_bgTrack.stream = NULL; } // open stream s_bgTrack.stream = FS_OpenStream( va( "media/%s", introTrack )); }
/* ================= S_StreamBackgroundTrack ================= */ void S_StreamBackgroundTrack( void ) { int bufferSamples; int fileSamples; byte raw[MAX_RAW_SAMPLES]; int r, fileBytes; if( !dma.initialized ) return; if( !s_bgTrack.stream ) return; if( s_listener.streaming ) return; // we are playing movie or somewhat // don't bother playing anything if musicvolume is 0 if( !s_musicvolume->value || s_listener.paused || s_listener.stream_paused ) return; if( !cl.background ) { // pause music by source type if( s_bgTrack.source == key_game && cls.key_dest == key_menu ) return; if( s_bgTrack.source == key_menu && cls.key_dest != key_menu ) return; } else if( cls.key_dest == key_console ) return; // see how many samples should be copied into the raw buffer if( s_rawend < soundtime ) s_rawend = soundtime; while( s_rawend < soundtime + MAX_RAW_SAMPLES ) { wavdata_t *info = FS_StreamInfo( s_bgTrack.stream ); bufferSamples = MAX_RAW_SAMPLES - (s_rawend - soundtime); // decide how much data needs to be read from the file fileSamples = bufferSamples * ((float)info->rate / SOUND_DMA_SPEED ); if( fileSamples <= 1 ) return; // no more samples need // our max buffer size fileBytes = fileSamples * ( info->width * info->channels ); if( fileBytes > sizeof( raw )) { fileBytes = sizeof( raw ); fileSamples = fileBytes / ( info->width * info->channels ); } // read r = FS_ReadStream( s_bgTrack.stream, fileBytes, raw ); if( r < fileBytes ) { fileBytes = r; fileSamples = r / ( info->width * info->channels ); } if( r > 0 ) { // add to raw buffer S_StreamRawSamples( fileSamples, info->rate, info->width, info->channels, raw ); } else { // loop if( s_bgTrack.loopName[0] ) { FS_FreeStream( s_bgTrack.stream ); s_bgTrack.stream = FS_OpenStream( va( "media/%s", s_bgTrack.loopName )); Q_strncpy( s_bgTrack.current, s_bgTrack.loopName, sizeof( s_bgTrack.current )); if( !s_bgTrack.stream ) return; S_CheckLerpingState(); } else { S_StopBackgroundTrack(); return; } } } }