]> git.lizzy.rs Git - plan9front.git/commitdiff
audio/mp3dec: add -s SECONDS option
authorSigrid <ftrvxmtrx@gmail.com>
Wed, 12 Aug 2020 08:43:46 +0000 (10:43 +0200)
committerSigrid <ftrvxmtrx@gmail.com>
Wed, 12 Aug 2020 08:43:46 +0000 (10:43 +0200)
sys/man/1/audio
sys/src/cmd/audio/mp3dec/main.c

index 5bbe072a590f38e3b616f32b0e9fd0be13e7f13a..511182c98dd7443fcaa0c72be5526d0b79d97713 100644 (file)
@@ -4,6 +4,9 @@ mp3dec, mp3enc, oggdec, oggenc, flacdec, sundec, wavdec, pcmconv, mixfs \- decod
 .SH SYNOPSIS
 .B audio/mp3dec
 [
+.B -s
+.I seconds
+] [
 .B -d
 ]
 .br
index ee90ce0bd91ab0ca5edebf172fa435d2f5d43369..20d2d077404aff9777650f9cfea6c251ec060141 100644 (file)
@@ -7,6 +7,7 @@
 
 /* Current input file */
 vlong offset;
+double seekto = 0.0, curpos = 0.0;
 int debug = 0;
 int ifd = -1;
 
@@ -29,6 +30,22 @@ input(void *, struct mad_stream *stream)
        return MAD_FLOW_CONTINUE;
 }
 
+static enum mad_flow
+header(void *, struct mad_header const* header)
+{
+       if(seekto > 0 && (header->duration.seconds > 0 || header->duration.fraction > 0)){
+               double dur = header->duration.seconds + (double)header->duration.fraction / MAD_TIMER_RESOLUTION;
+               seekto -= dur;
+               if(seekto > 0){
+                       curpos += dur;
+                       return MAD_FLOW_IGNORE;
+               }
+               fprint(2, "time: %g\n", curpos);
+               seekto = 0;
+       }
+       return MAD_FLOW_CONTINUE;
+}
+
 static enum mad_flow
 output(void *, struct mad_header const* header, struct mad_pcm *pcm)
 {
@@ -39,6 +56,9 @@ output(void *, struct mad_header const* header, struct mad_pcm *pcm)
        int i, j, n;
        uchar *p;
 
+       if(seekto > 0)
+               return MAD_FLOW_CONTINUE;
+
        /* start converter if format changed */
        if(rate != pcm->samplerate || chans != pcm->channels){
                int pid, pfd[2];
@@ -145,11 +165,15 @@ main(int argc, char **argv)
        case 'd':
                debug++;
                break;
+       case 's':
+               seekto = atof(EARGF(usage()));
+               if(seekto >= 0.0)
+                       break;
        default:
                usage();
        }ARGEND
 
-       mad_decoder_init(&decoder, nil, input, nil, nil, output, error, nil);
+       mad_decoder_init(&decoder, nil, input, header, nil, output, error, nil);
        mad_decoder_run(&decoder, MAD_DECODER_MODE_SYNC);
        mad_decoder_finish(&decoder);