From 218150a809342983906a5f8d6f3285052a79836a Mon Sep 17 00:00:00 2001 From: gewlitys Date: Thu, 2 Jan 2003 02:02:34 +0000 Subject: [PATCH] Oscilloscope now reacts to music when speech is disabled git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@518 8092fc87-c524-0410-9efc-e669fe64eaf9 --- sc2/ChangeLog | 1 + sc2/src/sc2code/libs/sound/openal/music.c | 3 +- .../sc2code/libs/sound/openal/trackplayer.c | 188 +++++++++++++----- 3 files changed, 136 insertions(+), 56 deletions(-) diff --git a/sc2/ChangeLog b/sc2/ChangeLog index eb75f2dd0..9db9c9462 100644 --- a/sc2/ChangeLog +++ b/sc2/ChangeLog @@ -1,4 +1,5 @@ 0.2: +- Oscilloscope now reacts to music when speech is disabled (OpenAL) -Mika - Rewritten input code (better and adds joystick/pad support), from slayne - Biadapt scaling for pure mode, from fOSSiL - Saving user data in "%APPDATA%/Application Data" on windows - SvdB diff --git a/sc2/src/sc2code/libs/sound/openal/music.c b/sc2/src/sc2code/libs/sound/openal/music.c index 05e919686..a0b535ee3 100644 --- a/sc2/src/sc2code/libs/sound/openal/music.c +++ b/sc2/src/sc2code/libs/sound/openal/music.c @@ -34,7 +34,8 @@ PLRPlaySong (MUSIC_REF MusicRef, BOOLEAN Continuous, BYTE Priority) if (pmus) { LockMutex (soundSource[MUSIC_SOURCE].stream_mutex); - PlayStream ((*pmus), MUSIC_SOURCE, Continuous, AL_FALSE); + PlayStream ((*pmus), MUSIC_SOURCE, Continuous, + speechVolumeScale == 0.0f ? AL_TRUE : AL_FALSE); UnlockMutex (soundSource[MUSIC_SOURCE].stream_mutex); curMusicRef = MusicRef; diff --git a/sc2/src/sc2code/libs/sound/openal/trackplayer.c b/sc2/src/sc2code/libs/sound/openal/trackplayer.c index a0a5c0312..5edd21859 100644 --- a/sc2/src/sc2code/libs/sound/openal/trackplayer.c +++ b/sc2/src/sc2code/libs/sound/openal/trackplayer.c @@ -65,7 +65,8 @@ advance_track (int channel_finished) if (tcur < tct) { LockMutex (soundSource[SPEECH_SOURCE].stream_mutex); - PlayStream (track_clip[tcur].sample, SPEECH_SOURCE, FALSE, TRUE); + PlayStream (track_clip[tcur].sample, SPEECH_SOURCE, AL_FALSE, + speechVolumeScale == 0.0f ? AL_FALSE : AL_TRUE); UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex); do_subtitles (0); } @@ -262,71 +263,148 @@ FastForward () int GetSoundData (void *data) { - LockMutex (soundSource[SPEECH_SOURCE].stream_mutex); - - if (soundSource[SPEECH_SOURCE].sample && soundSource[SPEECH_SOURCE].sample->decoder && - PlayingStream (SPEECH_SOURCE) && soundSource[SPEECH_SOURCE].sbuffer && - soundSource[SPEECH_SOURCE].sbuf_size > 0) + if (speechVolumeScale != 0.0f) { - float played_time = (GetTimeCounter () - soundSource[SPEECH_SOURCE].start_time) / - (float)ONE_SECOND; - int played_data = (int) (played_time * (float)soundSource[SPEECH_SOURCE]. - sample->decoder->frequency * 2.0f); - int delta = played_data - soundSource[SPEECH_SOURCE].total_decoded; - unsigned int pos, i; - UBYTE *scopedata = (UBYTE *) data; - UBYTE *sbuffer = soundSource[SPEECH_SOURCE].sbuffer; + // speech is enabled - assert (soundSource[SPEECH_SOURCE].sample->decoder->frequency == 11025); - assert (soundSource[SPEECH_SOURCE].sample->decoder->format == AL_FORMAT_MONO16); - - if (delta < 0) + LockMutex (soundSource[SPEECH_SOURCE].stream_mutex); + if (soundSource[SPEECH_SOURCE].sample && soundSource[SPEECH_SOURCE].sample->decoder && + PlayingStream (SPEECH_SOURCE) && soundSource[SPEECH_SOURCE].sbuffer && + soundSource[SPEECH_SOURCE].sbuf_size > 0) { - //fprintf (stderr, "GetSoundData(): something's messed with timing, delta %d\n", delta); - delta = 0; - } - else if (delta > (int)(soundSource[SPEECH_SOURCE].sbuf_size * 2)) - { - //fprintf (stderr, "GetSoundData(): something's messed with timing, delta %d\n", delta); - delta = 0; - } - - //fprintf (stderr, "played_data %d total_decoded %d delta %d\n", played_data, soundSource[SPEECH_SOURCE].total_decoded, delta); + float played_time = (GetTimeCounter () - soundSource[SPEECH_SOURCE].start_time) / + (float)ONE_SECOND; + int played_data = (int) (played_time * (float)soundSource[SPEECH_SOURCE]. + sample->decoder->frequency * 2.0f); + int delta = played_data - soundSource[SPEECH_SOURCE].total_decoded; + unsigned int pos, i; + UBYTE *scopedata = (UBYTE *) data; + UBYTE *sbuffer = soundSource[SPEECH_SOURCE].sbuffer; - pos = soundSource[SPEECH_SOURCE].sbuf_start + delta; - if (pos % 2 == 1) - pos++; + assert (soundSource[SPEECH_SOURCE].sample->decoder->frequency == 11025); + assert (soundSource[SPEECH_SOURCE].sample->decoder->format == AL_FORMAT_MONO16); - assert (pos >= 0); - - for (i = 0; i < RADAR_WIDTH; ++i) - { - SWORD s; - - for (;;) + if (delta < 0) { - if (pos >= soundSource[SPEECH_SOURCE].sbuf_size) - pos = pos - soundSource[SPEECH_SOURCE].sbuf_size; - else - break; + //fprintf (stderr, "GetSoundData(): something's messed with timing, delta %d\n", delta); + delta = 0; + } + else if (delta > (int)(soundSource[SPEECH_SOURCE].sbuf_size * 2)) + { + //fprintf (stderr, "GetSoundData(): something's messed with timing, delta %d\n", delta); + delta = 0; } - s = *(SWORD*) (&sbuffer[pos]); - s = (s / 1260) + (RADAR_HEIGHT >> 1); - if (s < 0) - s = 0; - else if (s >= RADAR_HEIGHT) - s = RADAR_HEIGHT - 1; - scopedata[i] = (UBYTE) s; + //fprintf (stderr, "played_data %d total_decoded %d delta %d\n", played_data, soundSource[SPEECH_SOURCE].total_decoded, delta); - pos += 2; + pos = soundSource[SPEECH_SOURCE].sbuf_start + delta; + if (pos % 2 == 1) + pos++; + + assert (pos >= 0); + + for (i = 0; i < RADAR_WIDTH; ++i) + { + SWORD s; + + for (;;) + { + if (pos >= soundSource[SPEECH_SOURCE].sbuf_size) + pos = pos - soundSource[SPEECH_SOURCE].sbuf_size; + else + break; + } + + s = *(SWORD*) (&sbuffer[pos]); + s = (s / 1260) + (RADAR_HEIGHT >> 1); + if (s < 0) + s = 0; + else if (s >= RADAR_HEIGHT) + s = RADAR_HEIGHT - 1; + scopedata[i] = (UBYTE) s; + + pos += 2; + } + + UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex); + return 1; } - UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex); - return 1; + } + else if (musicVolumeScale != 0.0f) + { + // speech is disabled but music is not so process it instead + + LockMutex (soundSource[MUSIC_SOURCE].stream_mutex); + if (soundSource[MUSIC_SOURCE].sample && soundSource[MUSIC_SOURCE].sample->decoder && + PlayingStream (MUSIC_SOURCE) && soundSource[MUSIC_SOURCE].sbuffer && + soundSource[MUSIC_SOURCE].sbuf_size > 0) + { + float played_time = (GetTimeCounter () - soundSource[MUSIC_SOURCE].start_time) / + (float)ONE_SECOND; + int played_data = (int) (played_time * (float)soundSource[MUSIC_SOURCE]. + sample->decoder->frequency * 4.0f); + int delta = played_data - soundSource[MUSIC_SOURCE].total_decoded; + unsigned int pos, i, step; + UBYTE *scopedata = (UBYTE *) data; + UBYTE *sbuffer = soundSource[MUSIC_SOURCE].sbuffer; + + assert (soundSource[MUSIC_SOURCE].sample->decoder->frequency >= 11025); + assert (soundSource[MUSIC_SOURCE].sample->decoder->format == AL_FORMAT_STEREO16); + + step = soundSource[MUSIC_SOURCE].sample->decoder->frequency / 11025 * 16; + if (step % 2 == 1) + step++; + + if (delta < 0) + { + //fprintf (stderr, "GetSoundData(): something's messed with timing, delta %d\n", delta); + delta = 0; + } + else if (delta > (int)(soundSource[MUSIC_SOURCE].sbuf_size * 2)) + { + //fprintf (stderr, "GetSoundData(): something's messed with timing, delta %d\n", delta); + delta = 0; + } + + //fprintf (stderr, "played_data %d total_decoded %d delta %d\n", played_data, soundSource[MUSIC_SOURCE].total_decoded, delta); + + pos = soundSource[MUSIC_SOURCE].sbuf_start + delta; + if (pos % 2 == 1) + pos++; + + assert (pos >= 0); + + for (i = 0; i < RADAR_WIDTH; ++i) + { + SWORD s; + + for (;;) + { + if (pos >= soundSource[MUSIC_SOURCE].sbuf_size) + pos = pos - soundSource[MUSIC_SOURCE].sbuf_size; + else + break; + } + + s = (*(SWORD*)(&sbuffer[pos])) + (*(SWORD*)(&sbuffer[pos + 2])); + + s = (s / 1260) + (RADAR_HEIGHT >> 1); + if (s < 0) + s = 0; + else if (s >= RADAR_HEIGHT) + s = RADAR_HEIGHT - 1; + scopedata[i] = (UBYTE) s; + + pos += step; + } + + UnlockMutex (soundSource[MUSIC_SOURCE].stream_mutex); + return 1; + } + UnlockMutex (soundSource[MUSIC_SOURCE].stream_mutex); } - UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex); return 0; } @@ -337,8 +415,8 @@ GetSoundInfo (int *length, int *offset) LockMutex (soundSource[SPEECH_SOURCE].stream_mutex); if (soundSource[SPEECH_SOURCE].sample && soundSource[SPEECH_SOURCE].sample->decoder) { - *length = (int) (soundSource[SPEECH_SOURCE].sample->decoder->length * (float)ONE_SECOND); - *offset = (int) (GetTimeCounter () - soundSource[SPEECH_SOURCE].start_time); + *length = (int) (soundSource[SPEECH_SOURCE].sample->decoder->length * (float)ONE_SECOND); + *offset = (int) (GetTimeCounter () - soundSource[SPEECH_SOURCE].start_time); } else {