Hi Here is another patch regarding time in ogg123 which is more controvercial than the other one I send some days ago. (see attachment) When working with Daisy/SMIL [1] files it would be helpfull if the user could stop play at a specific time. Currently .ogg files are not allowed in the Daisy format but that will hopefully happen one day if I work hard at it. A clip in a Daisy file could look like this: <audio src="sound.ogg" clip-begin="npt=1.399s" clip-end="npt=5.799s" id="qwrt_0002" /> which should result in a command line like this: ogg123 --skip 1.399 --end 5.799 sound.ogg ...easy to handle with a little shell/perl script. If the patch is not accepted we can live with it. After all it is only a few people who might find it usefull - which is a minority group identified as "blind Linux users". 1] http://www.daisy.org/publications/specifications/daisy_202.html#audioformats best regards -- Hamletsgade 4 - 201, DK-2200 København N, Phone: +45 3582 9079 Schou Industries ApS http://schou.dk/ CVR: 26 13 44 39 -------------------------------------------------------------- Please don't call me at all, (E-)mail is sufficient) -- Anne Bezemer -------------- next part -------------- diff -Naur vorbis-tools-1.0.orig/ogg123/cmdline_options.c vorbis-tools-1.0/ogg123/cmdline_options.c --- vorbis-tools-1.0.orig/ogg123/cmdline_options.c Thu Jul 11 04:44:39 2002 +++ vorbis-tools-1.0/ogg123/cmdline_options.c Sun Mar 9 16:28:14 2003 @@ -37,6 +37,7 @@ {"device", required_argument, 0, 'd'}, {"file", required_argument, 0, 'f'}, {"skip", required_argument, 0, 'k'}, + {"end", required_argument, 0, 'K'}, {"delay", required_argument, 0, 'l'}, {"device-option", required_argument, 0, 'o'}, {"prebuffer", required_argument, 0, 'p'}, @@ -50,6 +51,17 @@ {0, 0, 0, 0} }; +double strtotime(char *s) +{ + double time; + + time = strtod(s, &s); + + while (*s == ':') + time = 60 * time + strtod(s + 1, &s); + + return time; +} int parse_cmdline_options (int argc, char **argv, ogg123_options_t *ogg123_opts, @@ -63,7 +75,7 @@ audio_device_t *current; int ret; - while (-1 != (ret = getopt_long(argc, argv, "b:c::d:f:hl:k:o:p:qvVx:y:z@:", + while (-1 != (ret = getopt_long(argc, argv, "b:c::d:f:hl:k:K:o:p:qvVx:y:z@:", long_options, &option_index))) { switch (ret) { @@ -137,7 +149,11 @@ break; case 'k': - ogg123_opts->seekpos = atof(optarg); + ogg123_opts->seekpos = strtotime(optarg); + break; + + case 'K': + ogg123_opts->endpos = strtotime(optarg); break; case 'l': @@ -279,6 +295,7 @@ _(" -f, --file=filename Set the output filename for a previously\n" " specified file device (with -d).\n" " -k n, --skip n Skip the first 'n' seconds\n" + " -K n, --end n End at 'n' second\n" " -o, --device-option=k:v passes special option k with value\n" " v to previously specified device (with -d). See\n" " man page for more info.\n" diff -Naur vorbis-tools-1.0.orig/ogg123/ogg123.c vorbis-tools-1.0/ogg123/ogg123.c --- vorbis-tools-1.0.orig/ogg123/ogg123.c Sat Jul 6 21:12:18 2002 +++ vorbis-tools-1.0/ogg123/ogg123.c Sun Mar 9 16:59:39 2003 @@ -140,6 +140,7 @@ opts->nth = 1; opts->ntimes = 1; opts->seekpos = 0.0; + opts->endpos = 0.0; opts->buffer_size = 128 * 1024; opts->prebuffer = 0.0f; opts->input_buffer_size = 64 * 1024; @@ -250,6 +251,18 @@ print_statistics_action(NULL, pstats_arg); } +double currenttime (stat_format_t *stat_format, + data_source_t *source, + decoder_t *decoder) +{ + print_statistics_arg_t *pstats_arg; + + pstats_arg = new_print_statistics_arg(stat_format, + source->transport->statistics(source), + decoder->format->statistics(decoder)); + + return pstats_arg->decoder_statistics->current_time; +} void print_audio_devices_info(audio_device_t *d) { @@ -473,6 +486,10 @@ if (!format->seek(decoder, options.seekpos, DECODER_SEEK_START)) status_error(_("Could not skip %f seconds of audio."), options.seekpos); } + if (options.seekpos > options.endpos) { + printf("Error: -k > -K\n"); + options.endpos = 0.0; + } /* Main loop: Iterates over all of the logical bitstreams in the file */ while (!eof && !sig_request.exit) { @@ -539,6 +556,12 @@ next_status = status_interval; } else next_status -= ret; + + if (options.endpos > 0.0) + if (options.endpos <= currenttime(stat_format, source, decoder)) { + eof = eos = 1; + break; + } /* Write audio data block to output, skipping or repeating chunks diff -Naur vorbis-tools-1.0.orig/ogg123/ogg123.h vorbis-tools-1.0/ogg123/ogg123.h --- vorbis-tools-1.0.orig/ogg123/ogg123.h Sat Jul 6 21:12:18 2002 +++ vorbis-tools-1.0/ogg123/ogg123.h Sun Mar 9 16:24:55 2003 @@ -30,6 +30,7 @@ int nth; /* Play every nth chunk */ int ntimes; /* Play every chunk n times */ double seekpos; /* Position in file to seek to */ + double endpos; /* Position in file to play to (greater than seekpos) */ long buffer_size; /* Size of audio buffer */ float prebuffer; /* Percent of buffer to fill before playing */