decoder/sidplay: support seeking
This commit is contained in:
parent
cde9408bd8
commit
430b5b0490
1
NEWS
1
NEWS
|
@ -17,6 +17,7 @@ ver 0.16 (20??/??/??)
|
||||||
- mpg123: new decoder plugin based on libmpg123
|
- mpg123: new decoder plugin based on libmpg123
|
||||||
- sidplay: support sub-tunes
|
- sidplay: support sub-tunes
|
||||||
- sidplay: implemented songlength database
|
- sidplay: implemented songlength database
|
||||||
|
- sidplay: support seeking
|
||||||
* encoders:
|
* encoders:
|
||||||
- twolame: new encoder plugin based on libtwolame
|
- twolame: new encoder plugin based on libtwolame
|
||||||
* output:
|
* output:
|
||||||
|
|
|
@ -198,6 +198,9 @@ sidplay_file_decode(struct decoder *decoder, const char *path_fs)
|
||||||
int song_num=get_song_num(path_fs);
|
int song_num=get_song_num(path_fs);
|
||||||
tune.selectSong(song_num);
|
tune.selectSong(song_num);
|
||||||
|
|
||||||
|
int song_len=get_song_length(path_fs);
|
||||||
|
if(song_len==-1) song_len=default_songlength;
|
||||||
|
|
||||||
/* initialize the player */
|
/* initialize the player */
|
||||||
|
|
||||||
sidplay2 player;
|
sidplay2 player;
|
||||||
|
@ -259,10 +262,12 @@ sidplay_file_decode(struct decoder *decoder, const char *path_fs)
|
||||||
struct audio_format audio_format;
|
struct audio_format audio_format;
|
||||||
audio_format_init(&audio_format, 48000, 16, 2);
|
audio_format_init(&audio_format, 48000, 16, 2);
|
||||||
|
|
||||||
decoder_initialized(decoder, &audio_format, false, -1);
|
decoder_initialized(decoder, &audio_format, true, (float)song_len);
|
||||||
|
|
||||||
/* .. and play */
|
/* .. and play */
|
||||||
|
|
||||||
|
float data_time=0;
|
||||||
|
int timebase=player.timebase();
|
||||||
enum decoder_command cmd;
|
enum decoder_command cmd;
|
||||||
do {
|
do {
|
||||||
char buffer[4096];
|
char buffer[4096];
|
||||||
|
@ -273,8 +278,34 @@ sidplay_file_decode(struct decoder *decoder, const char *path_fs)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
cmd = decoder_data(decoder, NULL, buffer, nbytes,
|
cmd = decoder_data(decoder, NULL, buffer, nbytes,
|
||||||
0, 0, NULL);
|
data_time, 0, NULL);
|
||||||
} while (cmd == DECODE_COMMAND_NONE);
|
|
||||||
|
data_time=player.time()/timebase;
|
||||||
|
|
||||||
|
if(cmd==DECODE_COMMAND_SEEK) {
|
||||||
|
int target_time=decoder_seek_where(decoder);
|
||||||
|
|
||||||
|
/* can't rewind so return to zero and seek forward */
|
||||||
|
if(target_time<data_time) {
|
||||||
|
player.stop();
|
||||||
|
data_time=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ignore data until target time is reached */
|
||||||
|
while(data_time<target_time) {
|
||||||
|
nbytes=player.play(buffer, sizeof(buffer));
|
||||||
|
if(nbytes==0)
|
||||||
|
break;
|
||||||
|
data_time=player.time()/timebase;
|
||||||
|
}
|
||||||
|
|
||||||
|
decoder_command_finished(decoder);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(song_len && data_time>=(float)song_len)
|
||||||
|
break;
|
||||||
|
|
||||||
|
} while (cmd != DECODE_COMMAND_STOP);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct tag *
|
static struct tag *
|
||||||
|
|
Loading…
Reference in New Issue