cleanup of do_subtitles More work is still needed as add_text gets called
way too frequently, but do_subtitles is quite manageable now. git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@707 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
+17
-171
@@ -1214,7 +1214,7 @@ SpewPhrases (COUNT wait_track)
|
|||||||
if (InputState & (DEVICE_BUTTON2 | DEVICE_EXIT))
|
if (InputState & (DEVICE_BUTTON2 | DEVICE_EXIT))
|
||||||
{
|
{
|
||||||
SetSliderImage (SetAbsFrameIndex (ActivityFrame, 8));
|
SetSliderImage (SetAbsFrameIndex (ActivityFrame, 8));
|
||||||
JumpTrack (TRUE);
|
JumpTrack ();
|
||||||
CommData.AlienFrame = F;
|
CommData.AlienFrame = F;
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
}
|
}
|
||||||
@@ -1962,148 +1962,38 @@ RaceCommunication (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//method == 0 parses pTimeStamp, and self-times the subtitles
|
|
||||||
//method == 1 expects pTimeStamp to explicitly set the page to draw
|
|
||||||
int
|
int
|
||||||
do_subtitles (UNICODE *pStr, UNICODE *pTimeStamp, int method)
|
do_subtitles (UNICODE *pStr)
|
||||||
{
|
{
|
||||||
static DWORD TimeOut;
|
static UNICODE *last_page = NULL;;
|
||||||
static unsigned long *cur_sub_ts;
|
|
||||||
int disable_timer = 0;
|
|
||||||
int cur_page = -1;
|
|
||||||
static int last_page = -1;
|
|
||||||
static UNICODE *lastPStr = 0;
|
|
||||||
int NextPage = 0;
|
|
||||||
|
|
||||||
// TODO: proper disabling of subtitles, this one prolly isn't 'safe'
|
// TODO: proper disabling of subtitles, this one prolly isn't 'safe'
|
||||||
if (optSubtitles == FALSE)
|
if (optSubtitles == FALSE)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (pStr == 0)
|
if (pStr == 0)
|
||||||
return (subtitle_state = NEXT_SUBTITLE);
|
return (subtitle_state = DONE_SUBTITLE);
|
||||||
else if (pStr == (void *)~0)
|
else if (pStr == (void *)~0)
|
||||||
{
|
{
|
||||||
if (subtitle_state <= NEXT_SUBTITLE)
|
|
||||||
return (subtitle_state);
|
|
||||||
TimeOut = 0;
|
|
||||||
NextPage = 1;
|
|
||||||
subtitle_state = WAIT_SUBTITLE;
|
subtitle_state = WAIT_SUBTITLE;
|
||||||
}
|
}
|
||||||
if (method)
|
else
|
||||||
disable_timer = 1;
|
|
||||||
else if (! method)
|
|
||||||
{
|
{
|
||||||
if (last_page == -1)
|
if (last_page == pStr)
|
||||||
last_page++;
|
return (subtitle_state);
|
||||||
cur_page = last_page;
|
subtitle_state = READ_SUBTITLE;
|
||||||
|
ColorChange = TRUE;
|
||||||
|
// fprintf (stderr, "changed page to: %d\n", cur_page);
|
||||||
}
|
}
|
||||||
if (method == 1 && pStr != (void *)~0 && pTimeStamp != (void *)~0)
|
last_page = pStr;
|
||||||
{
|
|
||||||
cur_page = (int)pTimeStamp;
|
|
||||||
if (cur_page != last_page || lastPStr != pStr) {
|
|
||||||
if (lastPStr != pStr)
|
|
||||||
subtitle_state = NEXT_SUBTITLE;
|
|
||||||
else
|
|
||||||
subtitle_state = READ_SUBTITLE;
|
|
||||||
ColorChange = TRUE;
|
|
||||||
// fprintf (stderr, "changed page to: %d\n", cur_page);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lastPStr = pStr;
|
|
||||||
last_page = cur_page;
|
|
||||||
|
|
||||||
switch (subtitle_state)
|
switch (subtitle_state)
|
||||||
{
|
{
|
||||||
static DWORD silence_length;
|
|
||||||
#define MODERATE_SPEED 16
|
|
||||||
static BYTE speed_array[] =
|
|
||||||
{
|
|
||||||
0,
|
|
||||||
12,
|
|
||||||
MODERATE_SPEED,
|
|
||||||
24,
|
|
||||||
32,
|
|
||||||
};
|
|
||||||
static UNICODE alien_phrase_buf[4096];
|
|
||||||
static int page_break_pos[50];
|
|
||||||
|
|
||||||
case NEXT_SUBTITLE:
|
|
||||||
{
|
|
||||||
UNICODE ch;
|
|
||||||
COUNT numchars;
|
|
||||||
int cur_pos = 0;
|
|
||||||
UNICODE *s;
|
|
||||||
static unsigned long subtitle_frames_ts[50];
|
|
||||||
|
|
||||||
if (! disable_timer)
|
|
||||||
cur_page = last_page = 0;
|
|
||||||
page_break_pos[cur_pos++] = 0;
|
|
||||||
CommData.AlienTextTemplate.pStr = alien_phrase_buf;
|
|
||||||
numchars = 0;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
++numchars;
|
|
||||||
if ((ch = *pStr++) == '\n' || ch == '\r')
|
|
||||||
{
|
|
||||||
if (!ispunct (pStr[-2]) && !isspace (pStr[-2]))
|
|
||||||
{
|
|
||||||
*CommData.AlienTextTemplate.pStr++ = '.';
|
|
||||||
*CommData.AlienTextTemplate.pStr++ = '.';
|
|
||||||
*CommData.AlienTextTemplate.pStr++ = '.';
|
|
||||||
*CommData.AlienTextTemplate.pStr++ = ch;
|
|
||||||
*CommData.AlienTextTemplate.pStr++ = '.';
|
|
||||||
*CommData.AlienTextTemplate.pStr++ = '.';
|
|
||||||
ch = '.';
|
|
||||||
page_break_pos[cur_pos++] = numchars + 3;
|
|
||||||
numchars += 6;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
page_break_pos[cur_pos++] = numchars;
|
|
||||||
}
|
|
||||||
} while ((*CommData.AlienTextTemplate.pStr++ = ch));
|
|
||||||
subtitle_frames_ts[0] = 0;
|
|
||||||
if (! method)
|
|
||||||
{
|
|
||||||
if (s = pTimeStamp)
|
|
||||||
{
|
|
||||||
int pos;
|
|
||||||
cur_sub_ts = subtitle_frames_ts;
|
|
||||||
while (*s && (pos = wstrcspn (s, ",")))
|
|
||||||
{
|
|
||||||
UNICODE valStr[10];
|
|
||||||
wstrncpy (valStr, s, pos);
|
|
||||||
valStr[pos] = '\0';
|
|
||||||
*cur_sub_ts++ = wstrtoul(valStr,NULL,10);
|
|
||||||
s += pos;
|
|
||||||
if (*s)
|
|
||||||
s++;
|
|
||||||
}
|
|
||||||
*cur_sub_ts = 0;
|
|
||||||
TimeOut = GetTimeCounter ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cur_sub_ts = subtitle_frames_ts;
|
|
||||||
|
|
||||||
CommData.AlienTextTemplate.pStr = alien_phrase_buf;
|
|
||||||
CommData.AlienTextTemplate.CharCount = 0;
|
|
||||||
#if 0
|
|
||||||
if (pES->phrase_buf_index >= 4 && CommData.AlienTextTemplate.pStr[-4] == '\r')
|
|
||||||
{
|
|
||||||
CommData.AlienTextTemplate.pStr -= 3;
|
|
||||||
CommData.AlienTextTemplate.pStr[-1] = '\n';
|
|
||||||
}
|
|
||||||
pES->phrase_buf_index += numchars - 1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
/* fall through */
|
|
||||||
case READ_SUBTITLE:
|
case READ_SUBTITLE:
|
||||||
{
|
{
|
||||||
DWORD talk_length;
|
|
||||||
TEXT t;
|
TEXT t;
|
||||||
BYTE read_speed;
|
|
||||||
CONTEXT OldContext;
|
CONTEXT OldContext;
|
||||||
|
|
||||||
CommData.AlienTextTemplate.pStr = alien_phrase_buf + page_break_pos[cur_page];
|
CommData.AlienTextTemplate.pStr = pStr;
|
||||||
t = CommData.AlienTextTemplate;
|
t = CommData.AlienTextTemplate;
|
||||||
|
|
||||||
OldContext = SetContext (TaskContext);
|
OldContext = SetContext (TaskContext);
|
||||||
@@ -2111,58 +2001,14 @@ do_subtitles (UNICODE *pStr, UNICODE *pTimeStamp, int method)
|
|||||||
SetContext (OldContext);
|
SetContext (OldContext);
|
||||||
|
|
||||||
CommData.AlienTextTemplate.CharCount = t.pStr - CommData.AlienTextTemplate.pStr;
|
CommData.AlienTextTemplate.CharCount = t.pStr - CommData.AlienTextTemplate.pStr;
|
||||||
|
subtitle_state = WAIT_SUBTITLE;
|
||||||
if (*cur_sub_ts)
|
|
||||||
{
|
|
||||||
// We found subtitle timestamps, let's use them
|
|
||||||
// timestamps are stored as time per frame in milliseconds
|
|
||||||
talk_length = *cur_sub_ts++ * ONE_SECOND /1000;
|
|
||||||
silence_length = 0;
|
|
||||||
TimeOut += talk_length;
|
|
||||||
//fprintf (stderr, "Sound length is %d\n", talk_length);
|
|
||||||
}
|
|
||||||
else if (! disable_timer)
|
|
||||||
{
|
|
||||||
read_speed = speed_array[GLOBAL (glob_flags) & READ_SPEED_MASK];
|
|
||||||
talk_length = 3 * ONE_SECOND * CommData.AlienTextTemplate.CharCount / MODERATE_SPEED;
|
|
||||||
if (read_speed)
|
|
||||||
{
|
|
||||||
silence_length = ONE_SECOND
|
|
||||||
* (CommData.AlienTextTemplate.CharCount + MODERATE_SPEED) / read_speed;
|
|
||||||
if (silence_length < talk_length)
|
|
||||||
talk_length = silence_length;
|
|
||||||
silence_length -= talk_length;
|
|
||||||
}
|
|
||||||
TimeOut = GetTimeCounter () + talk_length;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
TimeOut = 0;
|
|
||||||
silence_length = 0;
|
|
||||||
}
|
|
||||||
subtitle_state = SPACE_SUBTITLE;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SPACE_SUBTITLE:
|
|
||||||
if (! NextPage && (disable_timer || GetTimeCounter () < TimeOut))
|
|
||||||
break;
|
|
||||||
TimeOut += silence_length;
|
|
||||||
subtitle_state = WAIT_SUBTITLE;
|
|
||||||
/* fall through */
|
|
||||||
case WAIT_SUBTITLE:
|
case WAIT_SUBTITLE:
|
||||||
if (speed_array[GLOBAL (glob_flags) & READ_SPEED_MASK] == 0 || NextPage || (! disable_timer && GetTimeCounter () >= TimeOut))
|
{
|
||||||
{
|
subtitle_state = DONE_SUBTITLE;
|
||||||
// if (NextPage)
|
ColorChange = TRUE;
|
||||||
// fprintf (stderr, "Switching pages\n");
|
}
|
||||||
NextPage = 0;
|
|
||||||
if (! disable_timer)
|
|
||||||
last_page++;
|
|
||||||
if (CommData.AlienTextTemplate.pStr[CommData.AlienTextTemplate.CharCount - 1] == '\n')
|
|
||||||
subtitle_state = READ_SUBTITLE;
|
|
||||||
else
|
|
||||||
subtitle_state = DONE_SUBTITLE;
|
|
||||||
ColorChange = TRUE;
|
|
||||||
}
|
|
||||||
case DONE_SUBTITLE:
|
case DONE_SUBTITLE:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,13 +19,12 @@
|
|||||||
#include "sound.h"
|
#include "sound.h"
|
||||||
#include "libs/sound/trackplayer.h"
|
#include "libs/sound/trackplayer.h"
|
||||||
|
|
||||||
extern int do_subtitles (UNICODE *pStr, UNICODE *TimeStamp, int method);
|
extern int do_subtitles (UNICODE *pStr);
|
||||||
|
|
||||||
static int tct; //total number of subtitle tracks
|
static int tct; //total number of subtitle tracks
|
||||||
static int tcur; //currently playing subtitle track
|
static int tcur; //currently playing subtitle track
|
||||||
static UNICODE *cur_page = 0; //current page of subtitle track
|
static UNICODE *cur_page = 0; //current page of subtitle track
|
||||||
static int no_page_break = 0;
|
static int no_page_break = 0;
|
||||||
static int no_voice;
|
|
||||||
static int track_pos_changed = 0; // set whenever ff, frev is enabled
|
static int track_pos_changed = 0; // set whenever ff, frev is enabled
|
||||||
static TFB_SoundTag *last_tag = NULL;
|
static TFB_SoundTag *last_tag = NULL;
|
||||||
|
|
||||||
@@ -44,7 +43,7 @@ void recompute_track_pos (TFB_SoundSample *sample,
|
|||||||
//track has finished playing
|
//track has finished playing
|
||||||
//Question: Should 'abort' call StopTrack?
|
//Question: Should 'abort' call StopTrack?
|
||||||
void
|
void
|
||||||
JumpTrack (int abort)
|
JumpTrack (void)
|
||||||
{
|
{
|
||||||
if (sound_sample)
|
if (sound_sample)
|
||||||
{
|
{
|
||||||
@@ -63,16 +62,6 @@ JumpTrack (int abort)
|
|||||||
PlayingTrack();
|
PlayingTrack();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
no_voice = 1;
|
|
||||||
do_subtitles ((void *)~0, (void *)~0, 1);
|
|
||||||
|
|
||||||
if (abort)
|
|
||||||
{
|
|
||||||
LockMutex (track_mutex);
|
|
||||||
tcur = tct;
|
|
||||||
UnlockMutex(track_mutex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//advance to the next track and start playing
|
//advance to the next track and start playing
|
||||||
@@ -90,10 +79,6 @@ PlayTrack (void)
|
|||||||
track_pos_changed = 0;
|
track_pos_changed = 0;
|
||||||
UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex);
|
UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
no_voice = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResumeTrack should resume a paused track, or start a stopped track, and do nothing
|
// ResumeTrack should resume a paused track, or start a stopped track, and do nothing
|
||||||
@@ -115,7 +100,7 @@ ResumeTrack ()
|
|||||||
ResumeStream (SPEECH_SOURCE);
|
ResumeStream (SPEECH_SOURCE);
|
||||||
UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex);
|
UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex);
|
||||||
}
|
}
|
||||||
else if (!no_voice && ! playing)
|
else if (! playing)
|
||||||
{
|
{
|
||||||
UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex);
|
UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex);
|
||||||
PlayTrack ();
|
PlayTrack ();
|
||||||
@@ -142,12 +127,11 @@ PlayingTrack ()
|
|||||||
last_track = tcur;
|
last_track = tcur;
|
||||||
last_page = cur_page;
|
last_page = cur_page;
|
||||||
UnlockMutex (track_mutex);
|
UnlockMutex (track_mutex);
|
||||||
if (do_subtitles (last_page, (void *)0, 1) ||
|
if (do_subtitles (last_page))
|
||||||
(no_voice && ++tcur < tct && do_subtitles (0, (void *)~0, 1)))
|
|
||||||
{
|
{
|
||||||
return (tcur + 1);
|
return (tcur + 1);
|
||||||
}
|
}
|
||||||
else if (sound_sample)
|
else
|
||||||
{
|
{
|
||||||
COUNT result;
|
COUNT result;
|
||||||
|
|
||||||
@@ -184,8 +168,7 @@ StopTrack ()
|
|||||||
}
|
}
|
||||||
tct = tcur = 0;
|
tct = tcur = 0;
|
||||||
cur_page = 0;
|
cur_page = 0;
|
||||||
no_voice = 0;
|
do_subtitles ((void *)~0);
|
||||||
do_subtitles ((void *)~0, (void *)~0, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -628,7 +611,6 @@ FastForward_Page ()
|
|||||||
}
|
}
|
||||||
UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex);
|
UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex);
|
||||||
}
|
}
|
||||||
//no_voice = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// processes sound data to oscilloscope
|
// processes sound data to oscilloscope
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
void ResumeTrack();
|
void ResumeTrack();
|
||||||
void PauseTrack();
|
void PauseTrack();
|
||||||
COUNT PlayingTrack();
|
COUNT PlayingTrack();
|
||||||
void JumpTrack(int abort);
|
void JumpTrack();
|
||||||
void FastForward_Smooth();
|
void FastForward_Smooth();
|
||||||
void FastForward_Page();
|
void FastForward_Page();
|
||||||
void FastReverse_Smooth();
|
void FastReverse_Smooth();
|
||||||
|
|||||||
Reference in New Issue
Block a user