Mercurial > hg > aim92
diff tools/edwave.c @ 0:5242703e91d3 tip
Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author | tomwalters |
---|---|
date | Fri, 20 May 2011 15:19:45 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/edwave.c Fri May 20 15:19:45 2011 +0100 @@ -0,0 +1,163 @@ +/* + edwave.c Edit a given range of a wave in binary short (16-bit) numbers. + -------- Write results on the stdout. + + The `range' option sets the start and duration of the process. + Its arguments are of the form: range=a-b (where start=a and duration=b-a+1) + or: range=a (where start=a and duration=1 ) + The arguments can be in time units (ms, s) or samples (no units), and both + "min" (start of file) and "max" (end of file) are recognised. + Samples in a file are numbered 0,1,2,...,max. + + The `operation' option sets the edit operation: + extract = output the part of the input which is inclusively within + the given range. + delete = output the part of the input which is NOT inclusively + within the given range. + + These operation types can be given in unambiguous abreviated form. + +*/ + + +#include <stdio.h> +#include <math.h> +#include "options.h" +#include "strmatch.h" +#include "units.h" + +char applic[] = "Edit a given range of a wave." ; + +static char *helpstr, *debugstr, *sampstr, *rangestr, *opstr, *typestr, *sizestr ; + +static Options option[] = { + { "help" , "off" , &helpstr , "help" , DEBUG }, + { "debug" , "off" , &debugstr , "debugging switch" , DEBUG }, + { "samplerate", "20kHz" , &sampstr , "samplerate " , VAL }, + { "range" , "min-max" , &rangestr , "inclusive time range wrt start" , VAL }, + { "operation" , "extract" , &opstr , "edit operation: {extract, delete}" , VAL }, + { "type" , "short" , &typestr , "datatype" , VAL }, + { "size" , "off" , &sizestr , "print wave size {s, ms}" , VAL }, + ( char * ) 0 } ; + + +int samplerate ; +int type ; /* datatype index */ + + +main(argc, argv) +int argc; +char **argv; +{ + FILE *fp ; + int i, n ; + int a, b ; + float y ; + + fp = openopts( option, argc, argv ) ; + if ( !isoff( helpstr ) ) + helpopts( helpstr, argv[0], applic, option ) ; + + samplerate = to_Hz( sampstr, 0 ) ; + + if ( ( type = typeindex( typestr ) ) < 0 ) { + fprintf( stderr, "edwave: bad type [%s]\n", typestr ) ; + exit( 1 ) ; + } + + if ( range( rangestr, &a, &b, samplerate ) == 0 ) { + fprintf(stderr,"edwave: bad range \n" ) ; + exit( 1 ) ; + } + n = b-a+1 ; + + if ( ison( debugstr ) ) { + fprintf( stderr, "range=%s a=%d b=%d n=%d\n", rangestr,a,b,n ) ; + exit( 0 ) ; + } + + if ( !isoff( sizestr ) ) { + for ( i = 0 ; readitem( &y, type, 1, fp ) ; i++ ) + ; + if ( isstr( sizestr, "s" ) ) printf( "%.3f\n", (float)i/samplerate ) ; + else if ( isstr( sizestr, "ms" ) ) printf( "%.1f\n", ((float)i/samplerate)*1000. ) ; + else if ( ison( sizestr ) ) printf( "%d\n", i ) ; /* samples */ + else { + fprintf( stderr,"edwave: unknown units for size [%s]\n", sizestr ) ; + exit( 1 ) ; + } + } + + else if ( a == (-1) ) /* special case of range=max */ + edmax( fp ) ; + + else if ( iststr( opstr, "extract" ) ) { + + if ( ( i = seektype( a, type, fp ) ) < a ) { + fprintf( stderr,"edwave: eof after %d items \n", i ) ; + exit( 1 ) ; + } + for ( i = 0 ; ( b < 0 || i < n ) && readitem( &y, type, 1, fp ) ; i++ ) + writeitem( &y, type, 1, stdout ) ; + if ( i < n && b >= 0 ) { + fprintf( stderr,"edwave: eof after %d items \n", a+i ) ; + exit( 1 ) ; + } + } + + else if ( iststr( opstr, "delete" ) ) { + for ( i = 0 ; i < a && readitem( &y, type, 1, fp ) ; i++ ) + writeitem( &y, type, 1, stdout ) ; + if ( i < a ) { + fprintf( stderr,"edwave: eof after %d items \n", i ) ; + exit( 1 ) ; + } + if ( ( i = seektype( n, type, fp ) ) < n ) { + fprintf( stderr,"edwave: eof after %d items \n", a+i ) ; + exit( 1 ) ; + } + while ( readitem( &y, type, 1, fp ) ) + writeitem( &y, type, 1, stdout ) ; + } + + else { + fprintf( stderr, "edwave: unknown operation [%s]\n", opstr ) ; + exit( 1 ) ; + } + + fclose( fp ) ; +} + + +/* +Special case of range=max or range=max-max +*/ + +edmax( fp ) +FILE *fp ; +{ + float x, y ; + + if ( iststr( opstr, "extract" ) ) { + while ( readitem( &y, type, 1, fp ) ) + x = y ; + writeitem( &x, type, 1, stdout ) ; + } + + else if ( iststr( opstr, "delete" ) ) { + + if ( readitem( &x, type, 1, fp ) && readitem( &y, type, 1, fp ) ) { + do { + writeitem( &x, type, 1, stdout ) ; + x = y ; + } while ( readitem( &y, type, 1, fp ) ) ; + } + } + + else { + fprintf( stderr, "edwave: unknown operation [%s]\n", opstr ) ; + exit( 1 ) ; + } + + fclose( fp ) ; +}