Support for running without .ogg files being present.

This also moves all subtitle-page splitting into trackplayer.  The final stage
is to remove all of this code from do_sutitles (since it is no longer being
used).


git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@706 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
ghaushe
2003-02-07 03:31:25 +00:00
parent d5c3b119d1
commit d73e8ded19
6 changed files with 189 additions and 53 deletions
+1
View File
@@ -1,4 +1,5 @@
Changes towards version 0.2: Changes towards version 0.2:
- Support for running without voice .ogg files present -PBlue
- Slider should now work correctly everywhere -PhracturedBlue - Slider should now work correctly everywhere -PhracturedBlue
- Added 'nosound' driver and --sound=openal|mixsdl|none - Added 'nosound' driver and --sound=openal|mixsdl|none
option; -a option has been removed -fOSSiL option; -a option has been removed -fOSSiL
+67 -6
View File
@@ -37,6 +37,7 @@ MIKMODAPI extern struct MDRIVER drv_openal;
static char *decoder_info_wav = "Wav"; static char *decoder_info_wav = "Wav";
static char *decoder_info_mod = "MikMod"; static char *decoder_info_mod = "MikMod";
static char *decoder_info_ogg = "Ogg Vorbis"; static char *decoder_info_ogg = "Ogg Vorbis";
static char *decoder_info_nul = "None";
TFB_DecoderFormats decoder_formats; TFB_DecoderFormats decoder_formats;
@@ -151,17 +152,45 @@ void SoundDecoder_Uninit (void)
} }
TFB_SoundDecoder* SoundDecoder_Load (char *filename, uint32 buffer_size, TFB_SoundDecoder* SoundDecoder_Load (char *filename, uint32 buffer_size,
uint32 startTime, uint32 runTime) uint32 startTime, sint32 runTime)
{ {
int i; int i;
i = strlen (filename) - 3;
if (!file_exists (filename)) if (!file_exists (filename))
{ {
fprintf (stderr, "SoundDecoder_Load(): %s doesn't exist\n", filename); if (runTime)
return NULL; {
TFB_SoundDecoder *decoder;
runTime = abs (runTime);
decoder = (TFB_SoundDecoder *) HMalloc (sizeof (TFB_SoundDecoder));
decoder->buffer = HCalloc (buffer_size);
decoder->buffer_size = buffer_size;
decoder->frequency = 11025;
decoder->looping = false;
decoder->error = SOUNDDECODER_OK;
decoder->length = (float)(runTime / 1000.0);
decoder->start_sample = 0;
decoder->end_sample = (unsigned long)(decoder->length * decoder->frequency);
decoder->format = decoder_formats.mono16;
decoder->pos = 0;
decoder->decoder_info = decoder_info_nul;
decoder->type = SOUNDDECODER_NULL;
decoder->filename = (char *) HMalloc (strlen (filename) + 1);
strcpy (decoder->filename, filename);
decoder->data = NULL;
return decoder;
}
else
{
fprintf (stderr, "SoundDecoder_Load(): %s doesn't exist\n", filename);
return NULL;
}
} }
i = strlen (filename) - 3;
if (!strcmp (&filename[i], "wav")) if (!strcmp (&filename[i], "wav"))
{ {
TFB_SoundDecoder *decoder; TFB_SoundDecoder *decoder;
@@ -278,7 +307,7 @@ TFB_SoundDecoder* SoundDecoder_Load (char *filename, uint32 buffer_size,
decoder->looping = false; decoder->looping = false;
decoder->error = SOUNDDECODER_OK; decoder->error = SOUNDDECODER_OK;
decoder->length = (float) ov_time_total (vf, -1) - (startTime / 1000.0f); decoder->length = (float) ov_time_total (vf, -1) - (startTime / 1000.0f);
if (runTime && runTime / 1000.0 < decoder->length) if (runTime > 0 && runTime / 1000.0 < decoder->length)
decoder->length = (float)(runTime / 1000.0); decoder->length = (float)(runTime / 1000.0);
decoder->start_sample = decoder->frequency * startTime / 1000; decoder->start_sample = decoder->frequency * startTime / 1000;
@@ -400,7 +429,7 @@ uint32 SoundDecoder_Decode (TFB_SoundDecoder *decoder)
fprintf (stderr, "SoundDecoder_Decode(): error decoding %s, code %d\n", decoder->filename, rc); fprintf (stderr, "SoundDecoder_Decode(): error decoding %s, code %d\n", decoder->filename, rc);
return decoded_bytes; return decoded_bytes;
} }
if (rc == 0 || close_on_done && buffer_size == decoded_bytes + rc) if (rc == 0 || (close_on_done && buffer_size == (decoded_bytes + rc)))
{ {
if (close_on_done) if (close_on_done)
{ {
@@ -437,6 +466,24 @@ uint32 SoundDecoder_Decode (TFB_SoundDecoder *decoder)
//fprintf (stderr, "SoundDecoder_Decode(): decoded %d bytes from %s\n", decoded_bytes, decoder->filename); //fprintf (stderr, "SoundDecoder_Decode(): decoded %d bytes from %s\n", decoded_bytes, decoder->filename);
return decoded_bytes; return decoded_bytes;
} }
case SOUNDDECODER_NULL:
{
uint32 max_bytes;
max_bytes = decoder->end_sample * 2;
if (max_bytes - decoder->pos <= decoder->buffer_size)
{
uint32 bufsize = max_bytes - decoder->pos;
decoder->pos = max_bytes;
decoder->error = SOUNDDECODER_EOF;
return (bufsize);
}
else
{
decoder->pos += decoder->buffer_size;
decoder->error = SOUNDDECODER_OK;
return (decoder->buffer_size);
}
}
case SOUNDDECODER_BUF: case SOUNDDECODER_BUF:
decoder->buffer = (char *)decoder->data + decoder->pos; decoder->buffer = (char *)decoder->data + decoder->pos;
decoder->error = SOUNDDECODER_EOF; decoder->error = SOUNDDECODER_EOF;
@@ -552,6 +599,12 @@ uint32 SoundDecoder_DecodeAll (TFB_SoundDecoder *decoder)
return decoded_bytes; return decoded_bytes;
break; break;
} }
case SOUNDDECODER_NULL:
{
decoder->error = SOUNDDECODER_OK;
return (decoder->end_sample * 2);
break;
}
default: default:
{ {
fprintf (stderr, "SoundDecoder_DecodeAll(): unknown type %d\n", decoder->type); fprintf (stderr, "SoundDecoder_DecodeAll(): unknown type %d\n", decoder->type);
@@ -617,6 +670,11 @@ void SoundDecoder_Seek (TFB_SoundDecoder *decoder, uint32 seekTime)
decoder->error = SOUNDDECODER_OK; decoder->error = SOUNDDECODER_OK;
return; return;
} }
case SOUNDDECODER_NULL:
decoder->pos = seekTime * decoder->frequency * 2 / 1000;
decoder->error = SOUNDDECODER_OK;
return;
default: default:
{ {
fprintf (stderr, "SoundDecoder_Seek(): unknown type %d\n", decoder->type); fprintf (stderr, "SoundDecoder_Seek(): unknown type %d\n", decoder->type);
@@ -658,6 +716,8 @@ void SoundDecoder_Free (TFB_SoundDecoder *decoder)
} }
case SOUNDDECODER_BUF: case SOUNDDECODER_BUF:
break; break;
case SOUNDDECODER_NULL:
break;
default: default:
{ {
fprintf (stderr, "SoundDecoder_Free(): unknown type %d\n", decoder->type); fprintf (stderr, "SoundDecoder_Free(): unknown type %d\n", decoder->type);
@@ -691,6 +751,7 @@ float SoundDecoder_GetTime (TFB_SoundDecoder *decoder)
} }
case SOUNDDECODER_OGG: case SOUNDDECODER_OGG:
case SOUNDDECODER_BUF: case SOUNDDECODER_BUF:
case SOUNDDECODER_NULL:
{ {
//fprintf (stderr, "SoundDecoder_GetTime not supported for mod\n"); //fprintf (stderr, "SoundDecoder_GetTime not supported for mod\n");
return ( return (
@@ -74,6 +74,7 @@ enum
SOUNDDECODER_WAV, SOUNDDECODER_WAV,
SOUNDDECODER_MOD, SOUNDDECODER_MOD,
SOUNDDECODER_OGG, SOUNDDECODER_OGG,
SOUNDDECODER_NULL,
SOUNDDECODER_BUF, SOUNDDECODER_BUF,
}; };
@@ -82,7 +83,7 @@ extern TFB_DecoderFormats decoder_formats;
sint32 SoundDecoder_Init (int flags, TFB_DecoderFormats* formats); sint32 SoundDecoder_Init (int flags, TFB_DecoderFormats* formats);
void SoundDecoder_Uninit (void); void SoundDecoder_Uninit (void);
TFB_SoundDecoder* SoundDecoder_Load (char *filename, uint32 buffer_size, TFB_SoundDecoder* SoundDecoder_Load (char *filename, uint32 buffer_size,
uint32 startTime, uint32 runTime); uint32 startTime, sint32 runTime);
uint32 SoundDecoder_Decode (TFB_SoundDecoder *decoder); uint32 SoundDecoder_Decode (TFB_SoundDecoder *decoder);
uint32 SoundDecoder_DecodeAll (TFB_SoundDecoder *decoder); uint32 SoundDecoder_DecodeAll (TFB_SoundDecoder *decoder);
float SoundDecoder_GetTime (TFB_SoundDecoder *decoder); float SoundDecoder_GetTime (TFB_SoundDecoder *decoder);
+3
View File
@@ -73,6 +73,7 @@ create_soundchain (TFB_SoundDecoder *decoder, float startTime)
chain->start_time = startTime; chain->start_time = startTime;
chain->tag.buf_name = 0; chain->tag.buf_name = 0;
chain->tag.type = 0; chain->tag.type = 0;
chain->tag.data = 0;
return (chain); return (chain);
} }
@@ -85,6 +86,8 @@ destroy_soundchain (TFB_SoundChain *chain)
chain->next = chain->next->next; chain->next = chain->next->next;
if (tmp_chain->decoder) if (tmp_chain->decoder)
SoundDecoder_Free (tmp_chain->decoder); SoundDecoder_Free (tmp_chain->decoder);
if (tmp_chain->tag.data)
HFree (tmp_chain->tag.data);
HFree (tmp_chain); HFree (tmp_chain);
} }
SoundDecoder_Free (chain->decoder); SoundDecoder_Free (chain->decoder);
+2 -1
View File
@@ -38,7 +38,8 @@ typedef struct
{ {
TFBSound_Object buf_name; TFBSound_Object buf_name;
int type; int type;
void *value; uint32 value;
void *data;
void (*callback) (); void (*callback) ();
} TFB_SoundTag; } TFB_SoundTag;
+114 -45
View File
@@ -15,6 +15,7 @@
*/ */
#include <assert.h> #include <assert.h>
#include <ctype.h>
#include "sound.h" #include "sound.h"
#include "libs/sound/trackplayer.h" #include "libs/sound/trackplayer.h"
@@ -22,11 +23,11 @@ extern int do_subtitles (UNICODE *pStr, UNICODE *TimeStamp, int method);
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 int 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 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;
#define MAX_CLIPS 50 #define MAX_CLIPS 50
#define is_sample_playing(samp) (((samp)->read_chain_ptr && (samp)->play_chain_ptr) ||\ #define is_sample_playing(samp) (((samp)->read_chain_ptr && (samp)->play_chain_ptr) ||\
@@ -34,7 +35,6 @@ static int track_pos_changed = 0; // set whenever ff, frev is enabled
static TFB_SoundSample *sound_sample = NULL; static TFB_SoundSample *sound_sample = NULL;
static TFB_SoundChain *first_chain = NULL; //first decoder in linked list static TFB_SoundChain *first_chain = NULL; //first decoder in linked list
static TFB_SoundChain *last_chain = NULL; //last decoder in linked list static TFB_SoundChain *last_chain = NULL; //last decoder in linked list
static UNICODE *TrackTextArray[MAX_CLIPS]; //storage for subtitlle text
static Mutex track_mutex; //protects tcur and tct static Mutex track_mutex; //protects tcur and tct
void recompute_track_pos (TFB_SoundSample *sample, void recompute_track_pos (TFB_SoundSample *sample,
TFB_SoundChain *first_chain, sint32 offset); TFB_SoundChain *first_chain, sint32 offset);
@@ -55,7 +55,7 @@ JumpTrack (int abort)
PauseStream (SPEECH_SOURCE); PauseStream (SPEECH_SOURCE);
cur_time = GetTimeCounter(); cur_time = GetTimeCounter();
soundSource[SPEECH_SOURCE].start_time = soundSource[SPEECH_SOURCE].start_time =
(sint32)cur_time - total_length;; (sint32)cur_time - total_length;
track_pos_changed = 1; track_pos_changed = 1;
sound_sample->play_chain_ptr = last_chain; sound_sample->play_chain_ptr = last_chain;
recompute_track_pos(sound_sample, first_chain, total_length); recompute_track_pos(sound_sample, first_chain, total_length);
@@ -136,12 +136,13 @@ PlayingTrack ()
// return ((COUNT)~0); // return ((COUNT)~0);
if (sound_sample && is_sample_playing (sound_sample)) if (sound_sample && is_sample_playing (sound_sample))
{ {
int last_track, last_page; int last_track;
UNICODE *last_page;
LockMutex (track_mutex); LockMutex (track_mutex);
last_track = tcur; last_track = tcur;
last_page = cur_page; last_page = cur_page;
UnlockMutex (track_mutex); UnlockMutex (track_mutex);
if (do_subtitles (TrackTextArray[last_track], (void *)last_page, 1) || if (do_subtitles (last_page, (void *)0, 1) ||
(no_voice && ++tcur < tct && do_subtitles (0, (void *)~0, 1))) (no_voice && ++tcur < tct && do_subtitles (0, (void *)~0, 1)))
{ {
return (tcur + 1); return (tcur + 1);
@@ -163,16 +164,10 @@ PlayingTrack ()
void void
StopTrack () StopTrack ()
{ {
int i;
LockMutex (soundSource[SPEECH_SOURCE].stream_mutex); LockMutex (soundSource[SPEECH_SOURCE].stream_mutex);
StopStream (SPEECH_SOURCE); StopStream (SPEECH_SOURCE);
UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex); UnlockMutex (soundSource[SPEECH_SOURCE].stream_mutex);
for (i = 0; i < tct; i++)
{
HFree (TrackTextArray[i]);
TrackTextArray[i] = 0;
}
if (first_chain) if (first_chain)
{ {
destroy_soundchain (first_chain); destroy_soundchain (first_chain);
@@ -201,25 +196,28 @@ DoTrackTag (TFB_SoundTag *tag)
LockMutex (track_mutex); LockMutex (track_mutex);
if (tag->callback) if (tag->callback)
tag->callback (); tag->callback ();
tcur = ((int)tag->value) >> 8; tcur = tag->value;
cur_page = ((int)tag->value) & 0xFF; cur_page = (UNICODE *)tag->data;
UnlockMutex (track_mutex); UnlockMutex (track_mutex);
} }
} }
int void
GetTimeStamps(UNICODE *TimeStamps, uint32 *time_stamps) GetTimeStamps(UNICODE *TimeStamps, sint32 *time_stamps)
{ {
int pos; int pos;
int num = 0; int num = 0;
while (*TimeStamps && (pos = wstrcspn (TimeStamps, ",\n"))) while (*TimeStamps && (pos = wstrcspn (TimeStamps, ",\n")))
{ {
UNICODE valStr[10]; UNICODE valStr[10];
uint32 val;
wstrncpy (valStr, TimeStamps, pos); wstrncpy (valStr, TimeStamps, pos);
valStr[pos] = '\0'; valStr[pos] = '\0';
*time_stamps = wstrtoul(valStr,NULL,10); val = wstrtoul(valStr,NULL,10);
if (*time_stamps) if (val)
{ {
printf ("guessed: %d measured: %d\n",*time_stamps, val);
*time_stamps = (sint32)val;
num++; num++;
time_stamps++; time_stamps++;
} }
@@ -227,8 +225,71 @@ GetTimeStamps(UNICODE *TimeStamps, uint32 *time_stamps)
if (*TimeStamps) if (*TimeStamps)
TimeStamps++; TimeStamps++;
} }
*time_stamps = 0; }
return (num);
#define TEXT_SPEED 70
UNICODE **
SplitSubPages (UNICODE *text, sint32 *timestamp, int *num_pages)
{
UNICODE **split_text = NULL;
int pos = 0, ellips = 0;
COUNT page = 0;
while (text[pos])
{
if (text[pos] == '\n' || text[pos] == '\r')
{
if (! split_text)
split_text = (UNICODE **) HMalloc (sizeof (UNICODE *) * (page + 1));
else
split_text = (UNICODE **) HRealloc (split_text,
sizeof (UNICODE *) * (page + 1));
if (!ispunct (text[pos - 1]) && !isspace (text[pos - 1]))
{
split_text[page] = HMalloc (sizeof (UNICODE) * (pos + ellips + 4));
if (ellips)
wstrcpy (split_text[page], "..");
wstrncpy (split_text[page] + ellips, text, pos);
wstrcpy (split_text[page] + ellips + pos, "...");
timestamp[page] = - pos * TEXT_SPEED;
ellips = 2;
text = text + pos + 1;
pos = 0;
page ++;
}
else
{
split_text[page] = HMalloc (sizeof (UNICODE) * (pos + ellips + 1));
if (ellips)
wstrcpy (split_text[page], "..");
wstrncpy (split_text[page] + ellips, text, pos);
*(split_text[page] + ellips + pos) = 0;
timestamp[page] = - pos * TEXT_SPEED;
ellips = 0;
text = text + pos + 1;
pos = 0;
page ++;
}
}
else
pos++;
}
if (pos)
{
if (! split_text)
split_text = (UNICODE **) HMalloc (sizeof (UNICODE *) * (page + 1));
else
split_text = (UNICODE **) HRealloc (split_text,
sizeof (UNICODE *) * (page + 1));
split_text[page] = HMalloc (sizeof (UNICODE) * (pos + ellips + 1));
if (ellips)
wstrcpy (split_text[page], "..");
wstrncpy (split_text[page] + ellips, text, pos);
*(split_text[page] + ellips + pos) = 0;
timestamp[page] = - pos * TEXT_SPEED;
page ++;
}
*num_pages = page;
return (split_text);
} }
// decodes several tracks into one and adds it to queue // decodes several tracks into one and adds it to queue
@@ -267,7 +328,7 @@ SpliceMultiTrack (UNICODE *TrackNames[], UNICODE *TrackText)
fprintf (stderr, "SpliceMultiTrack(): loading...\n"); fprintf (stderr, "SpliceMultiTrack(): loading...\n");
for (tracks = 0; *TrackNames && tracks < MAX_MULTI_TRACKS; TrackNames++, tracks++) for (tracks = 0; *TrackNames && tracks < MAX_MULTI_TRACKS; TrackNames++, tracks++)
{ {
track_decs[tracks] = SoundDecoder_Load (*TrackNames, 32768, 0, 0); track_decs[tracks] = SoundDecoder_Load (*TrackNames, 32768, 0, - 3 * TEXT_SPEED);
if (track_decs[tracks]) if (track_decs[tracks])
{ {
fprintf (stderr, " track: %s, decoder: %s, rate %d format %x\n", fprintf (stderr, " track: %s, decoder: %s, rate %d format %x\n",
@@ -301,16 +362,18 @@ SpliceMultiTrack (UNICODE *TrackNames[], UNICODE *TrackText)
if (tct) if (tct)
{ {
int slen1; int slen1;
slen1 = wstrlen (TrackTextArray[tct - 1]); slen1 = wstrlen ((UNICODE *)last_tag->data);
TrackTextArray[tct - 1] = HRealloc (TrackTextArray[tct - 1], slen1 + slen + 1); last_tag->data = HRealloc ((UNICODE *)last_tag->data, slen1 + slen + 1);
wstrcpy (&TrackTextArray[tct - 1][slen1], TrackText); wstrcpy (&((UNICODE *)last_tag->data)[slen1], TrackText);
} }
else else
{ {
TrackTextArray[tct] = HMalloc (slen + 1); begin_chain->tag.data = HMalloc (slen + 1);
wstrcpy (TrackTextArray[tct++], TrackText); wstrcpy ((UNICODE *)begin_chain->tag.data, TrackText);
last_tag = &begin_chain->tag;
tct++;
begin_chain->tag.type = MIX_BUFFER_TAG_TEXT; begin_chain->tag.type = MIX_BUFFER_TAG_TEXT;
begin_chain->tag.value = (void *)((tct - 1) << 8); begin_chain->tag.value = tct - 1;
} }
no_page_break = 1; no_page_break = 1;
@@ -326,6 +389,7 @@ void
SpliceTrack (UNICODE *TrackName, UNICODE *TrackText, UNICODE *TimeStamp, void (*cb) ()) SpliceTrack (UNICODE *TrackName, UNICODE *TrackText, UNICODE *TimeStamp, void (*cb) ())
{ {
unsigned long startTime; unsigned long startTime;
UNICODE **split_text = NULL;
if (TrackText) if (TrackText)
{ {
if (TrackName == 0) if (TrackName == 0)
@@ -335,43 +399,45 @@ SpliceTrack (UNICODE *TrackName, UNICODE *TrackText, UNICODE *TimeStamp, void (*
int slen1, slen2; int slen1, slen2;
UNICODE *oTT; UNICODE *oTT;
oTT = TrackTextArray[tct - 1]; oTT = (UNICODE *)last_tag->data;
slen1 = wstrlen (oTT); slen1 = wstrlen (oTT);
slen2 = wstrlen (TrackText); slen2 = wstrlen (TrackText);
TrackTextArray[tct - 1] = HRealloc (oTT, slen1 + slen2 + 1); last_tag->data = HRealloc (oTT, slen1 + slen2 + 1);
wstrcpy (&TrackTextArray[tct - 1][slen1], TrackText); wstrcpy (&((UNICODE *)last_tag->data)[slen1], TrackText);
} }
} }
else else
{ {
int num_pages, page_counter; int num_pages, page_counter;
uint32 time_stamps[50]; sint32 time_stamps[50];
split_text = SplitSubPages (TrackText, time_stamps, &num_pages);
if (! split_text)
{
fprintf (stderr, "SpliceTrack(): Failed to parse sutitles\n");
return;
}
if (no_page_break && tct) if (no_page_break && tct)
{ {
int slen1, slen2; int slen1, slen2;
UNICODE *oTT; UNICODE *oTT;
oTT = TrackTextArray[tct - 1]; oTT = (UNICODE *)last_tag->data;
slen1 = wstrlen (oTT); slen1 = wstrlen (oTT);
slen2 = wstrlen (TrackText); slen2 = wstrlen (split_text[0]);
TrackTextArray[tct - 1] = HRealloc (oTT, slen1 + slen2 + 1); last_tag->data = HRealloc (oTT, slen1 + slen2 + 1);
wstrcpy (&TrackTextArray[tct - 1][slen1], TrackText); wstrcpy (&((UNICODE *)last_tag->data)[slen1], split_text[0]);
HFree (split_text[0]);
} }
else else
{ tct++;
TrackTextArray[tct] = HMalloc (sizeof (UNICODE) * (wstrlen (TrackText) + 1));
wstrcpy (TrackTextArray[tct++], TrackText);
}
if (TimeStamp) if (TimeStamp)
num_pages = GetTimeStamps (TimeStamp, time_stamps); GetTimeStamps (TimeStamp, time_stamps);
else
num_pages = 0;
fprintf (stderr, "SpliceTrack(): loading %s\n", TrackName); fprintf (stderr, "SpliceTrack(): loading %s\n", TrackName);
startTime = 0; startTime = 0;
for (page_counter = 0; page_counter <= num_pages; page_counter++) for (page_counter = 0; page_counter < num_pages; page_counter++)
{ {
if (! sound_sample) if (! sound_sample)
{ {
@@ -396,7 +462,7 @@ SpliceTrack (UNICODE *TrackName, UNICODE *TrackText, UNICODE *TimeStamp, void (*
last_chain->next = create_soundchain (decoder, sound_sample->length); last_chain->next = create_soundchain (decoder, sound_sample->length);
last_chain = last_chain->next; last_chain = last_chain->next;
} }
startTime += time_stamps[page_counter]; startTime += abs (time_stamps[page_counter]);
// fprintf (stderr, "page (%d of %d): %d\n",page_counter, num_pages, startTime); // fprintf (stderr, "page (%d of %d): %d\n",page_counter, num_pages, startTime);
if (last_chain->decoder) if (last_chain->decoder)
@@ -410,8 +476,11 @@ SpliceTrack (UNICODE *TrackName, UNICODE *TrackText, UNICODE *TimeStamp, void (*
if (! no_page_break) if (! no_page_break)
{ {
last_chain->tag.type = MIX_BUFFER_TAG_TEXT; last_chain->tag.type = MIX_BUFFER_TAG_TEXT;
last_chain->tag.value = (void *)(((tct - 1) << 8) | page_counter); // last_chain->tag.value = (void *)(((tct - 1) << 8) | page_counter);
last_chain->tag.value = tct - 1;
last_chain->tag.data = (void *)split_text[page_counter];
last_chain->tag.callback = cb; last_chain->tag.callback = cb;
last_tag = &last_chain->tag;
} }
no_page_break = 0; no_page_break = 0;
} }