diff -ur moc-2.5.0-alpha4_orig/decoder_plugins/sidplay2/sidplay2.cc moc-2.5.0-alpha4/decoder_plugins/sidplay2/sidplay2.cc --- moc-2.5.0-alpha4_orig/decoder_plugins/sidplay2/sidplay2.cc 2007-06-16 13:22:18.000000000 +0200 +++ moc-2.5.0-alpha4/decoder_plugins/sidplay2/sidplay2.cc 2010-09-28 19:25:18.000000000 +0200 @@ -34,6 +34,23 @@ static int playSubTunes; +namespace +{ + int get_current_subtune_begin_time(sidplay2_data *data) + { + if(data->currentSong == data->timeStart) + return 0; + + return data->subtune_end_times[data->currentSong-2]; + } + + int get_current_subtune_length(sidplay2_data *data) + { + return data->subtune_end_times[data->currentSong-1] + - get_current_subtune_begin_time(data); + } +} + static sidplay2_data * make_data() { pthread_mutex_lock(&player_select_mutex); @@ -240,7 +257,7 @@ s2d->songs = st->getInfo().songs; - s2d->sublengths = new int [s2d->songs]; + s2d->subtune_end_times = new int [s2d->songs]; s2d->startSong = st->getInfo().startSong; @@ -276,12 +293,12 @@ dl = minLength; s2d->length += dl; - s2d->sublengths[s-1] = dl; + s2d->subtune_end_times[s-1] = s2d->length; } else { s2d->length += defaultLength; - s2d->sublengths[s-1] = defaultLength; + s2d->subtune_end_times[s-1] = s2d->length; } } @@ -324,8 +341,8 @@ if(data->tune!=NULL) delete data->tune; - if(data->sublengths!=NULL) - delete data->sublengths; + if(data->subtune_end_times!=NULL) + delete data->subtune_end_times; free(data); } @@ -435,9 +452,20 @@ * generic seeking can't be done because the tune has to * be played until the position (needs CPU)... * */ -extern "C" int sidplay2_seek (void *void_data ATTR_UNUSED, int sec ATTR_UNUSED) +extern "C" int sidplay2_seek (void *void_data, int sec) { - return -1; + struct sidplay2_data *data = (struct sidplay2_data *)void_data; + + if (data->currentSong >= data->timeEnd) + { + return -1; + } + + data->player->stop(); + data->currentSong++; + data->tune->selectSong(data->currentSong); + data->player->load(data->tune); + return get_current_subtune_begin_time(data); } extern "C" int sidplay2_decode (void *void_data, char *buf, int buf_len, @@ -447,7 +475,7 @@ int seconds = data->player->time() / data->player->timebase(); - int currentLength = data->sublengths[data->currentSong-1]; + int currentLength = get_current_subtune_length(data); if(seconds >= currentLength) { @@ -458,9 +486,6 @@ data->currentSong++; data->tune->selectSong(data->currentSong); data->player->load(data->tune); - - currentLength = data->sublengths[data->currentSong-1]; - seconds = 0; } sound_params->channels = data->channels; diff -ur moc-2.5.0-alpha4_orig/decoder_plugins/sidplay2/sidplay2.h moc-2.5.0-alpha4/decoder_plugins/sidplay2/sidplay2.h --- moc-2.5.0-alpha4_orig/decoder_plugins/sidplay2/sidplay2.h 2007-04-02 22:00:32.000000000 +0200 +++ moc-2.5.0-alpha4/decoder_plugins/sidplay2/sidplay2.h 2010-09-28 19:25:18.000000000 +0200 @@ -67,7 +67,7 @@ sid2_config_t cfg; ReSIDBuilder *builder; int length; - int *sublengths; + int *subtune_end_times; int songs; int startSong; int currentSong;