This is raw.c in view mode; [Download] [Up]
/* * July 5, 1991 * Copyright 1991 Lance Norskog And Sundry Contributors * This source code is freely redistributable and may be used for * any purpose. This copyright notice must be maintained. * Lance Norskog And Sundry Contributors are not responsible for * the consequences of using this software. */ /* * Sound Tools raw format file. * * Includes .ub, .uw, .sb, .sw, and .ul formats at end */ /* * Notes: most of the headerless formats set their handlers to raw * in their startread/write routines. * */ #include "st.h" #include "libst.h" rawstartread(ft) ft_t ft; { } rawstartwrite(ft) ft_t ft; { } /* Read raw file data, and convert it to */ /* the sox internal signed long format. */ rawread(ft, buf, nsamp) ft_t ft; long *buf, nsamp; { register long datum; int done = 0; switch(ft->info.size) { case BYTE: switch(ft->info.style) { case SIGN2: while(done < nsamp) { datum = getc(ft->fp); if (feof(ft->fp)) return done; /* scale signed up to long's range */ *buf++ = LEFT(datum, 24); done++; } return done; case UNSIGNED: while(done < nsamp) { datum = getc(ft->fp); if (feof(ft->fp)) return done; /* Convert to signed */ datum ^= 128; /* scale signed up to long's range */ *buf++ = LEFT(datum, 24); done++; } return done; case ULAW: while(done < nsamp) { datum = getc(ft->fp); if (feof(ft->fp)) return done; datum = st_ulaw_to_linear(datum); /* scale signed up to long's range */ *buf++ = LEFT(datum, 16); done++; } return done; case ALAW: while(done < nsamp) { datum = getc(ft->fp); if (feof(ft->fp)) return done; datum = st_Alaw_to_linear(datum); /* scale signed up to long's range */ *buf++ = LEFT(datum, 16); done++; } return done; } case WORD: switch(ft->info.style) { case SIGN2: while(done < nsamp) { datum = rshort(ft); if (feof(ft->fp)) return done; /* scale signed up to long's range */ *buf++ = LEFT(datum, 16); done++; } return done; case UNSIGNED: while(done < nsamp) { datum = rshort(ft); if (feof(ft->fp)) return done; /* Convert to signed */ datum ^= 0x8000; /* scale signed up to long's range */ *buf++ = LEFT(datum, 16); done++; } return done; case ULAW: fail("No U-Law support for shorts"); return done; case ALAW: fail("No A-Law support for shorts"); return done; } case FLOAT: while(done < nsamp) { datum = dovolume? volume * rfloat(ft) : rfloat(ft); if (feof(ft->fp)) return done; *buf++ = LEFT(datum, 16); done++; } return done; default: fail("Drop through in rawread!"); } fail("Sorry, don't have code to read %s, %s", styles[ft->info.style], sizes[ft->info.size]); } /* Convert the sox internal signed long format */ /* to the raw file data, and write it. */ void rawwrite(ft, buf, nsamp) ft_t ft; long *buf, nsamp; { register int datum; int done = 0; switch(ft->info.size) { case BYTE: switch(ft->info.style) { case SIGN2: while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 24); putc(datum, ft->fp); done++; } return; case UNSIGNED: while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 24); /* Convert to unsigned */ datum ^= 128; putc(datum, ft->fp); done++; } return; case ULAW: while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 16); /* round up to 12 bits of data */ datum += 0x8; /* + 0b1000 */ datum = st_linear_to_ulaw(datum); putc(datum, ft->fp); done++; } return; case ALAW: while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 16); /* round up to 12 bits of data */ datum += 0x8; /* + 0b1000 */ datum = st_linear_to_Alaw(datum); putc(datum, ft->fp); done++; } return; } case WORD: switch(ft->info.style) { case SIGN2: while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 16); wshort(ft, datum); done++; } return; case UNSIGNED: while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 16); /* Convert to unsigned */ datum ^= 0x8000; wshort(ft, datum); done++; } return; case ULAW: fail("No U-Law support for shorts (try -b option ?)"); return; case ALAW: fail("No A-Law support for shorts (try -b option ?)"); return; } case FLOAT: while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 16); wfloat(ft, (double) datum); done++; } return; default: { fail("Drop through in rawwrite!"); } } fail("Sorry, don't have code to write %s, %s", styles[ft->info.style], sizes[ft->info.size]); } /* special raw2 output routine to output just like raw, but if the input file is one channel, duplicate the output forming a 'stereo' output file. This is handy for our AIFF-> raw redbook stereo, since the rate and channel convertions could not be done in only one pass. This accomplishes the channel replication at the tail end. */ /* * This abomination refers to 'informat' directly. * Remove when SOX does multiple effects. */ #ifdef UNNEEDED void raw2write(ft, buf, nsamp) ft_t ft; long *buf, nsamp; { register int datum; int done = 0; switch(ft->info.size) { case BYTE: switch(ft->info.style) { case SIGN2: while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 24); putc(datum, ft->fp); if( informat.info.channels == 1 ) putc(datum, ft->fp); done++; } return; case UNSIGNED: while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 24); /* Convert to unsigned */ datum ^= 128; putc(datum, ft->fp); if( informat.info.channels == 1 ) putc(datum, ft->fp); done++; } return; case ULAW: /* grab table from Posk stuff */ while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 16); /* round up to 12 bits of data */ datum += 0x8; /* + 0b1000 */ datum = st_linear_to_ulaw(datum); putc(datum, ft->fp); if( informat.info.channels == 1 ) putc(datum, ft->fp); done++; } return; case ALAW: while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 16); /* round up to 12 bits of data */ datum += 0x8; /* + 0b1000 */ datum = st_linear_to_Alaw(datum); putc(datum, ft->fp); if( informat.info.channels == 1 ) putc(datum, ft->fp); done++; } return; } case WORD: switch(ft->info.style) { case SIGN2: while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 16); wshort(ft, datum); if( informat.info.channels == 1 ) wshort(ft, datum); done++; } return; case UNSIGNED: while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 16); /* Convert to unsigned */ datum ^= 0x8000; wshort(ft, datum); if( informat.info.channels == 1 ) wshort(ft, datum); done++; } return; case ULAW: fail("No U-Law support for shorts (try -b option ?)"); return; case ALAW: fail("No A-Law support for shorts (try -b option ?)"); return; } case FLOAT: while(done < nsamp) { /* scale signed up to long's range */ datum = RIGHT(*buf++, 16); wfloat(ft, (double) datum); if( informat.info.channels == 1 ) wfloat(ft, (double) datum); done++; } return; default: { fail("Drop through in raw2write!"); } } fail("Sorry, don't have code to write %s, %s", styles[ft->info.style], sizes[ft->info.size]); } #endif /* * Set parameters to the fixed parameters known for this format, * and change format to raw format. */ static rawdefaults(); /* Signed byte */ sbstartread(ft) ft_t ft; { ft->info.size = BYTE; ft->info.style = SIGN2; rawdefaults(ft); } sbstartwrite(ft) ft_t ft; { ft->info.size = BYTE; ft->info.style = SIGN2; rawdefaults(ft); } ubstartread(ft) ft_t ft; { ft->info.size = BYTE; ft->info.style = UNSIGNED; rawdefaults(ft); } ubstartwrite(ft) ft_t ft; { ft->info.size = BYTE; ft->info.style = UNSIGNED; rawdefaults(ft); } uwstartread(ft) ft_t ft; { ft->info.size = WORD; ft->info.style = UNSIGNED; rawdefaults(ft); } uwstartwrite(ft) ft_t ft; { ft->info.size = WORD; ft->info.style = UNSIGNED; rawdefaults(ft); } swstartread(ft) ft_t ft; { ft->info.size = WORD; ft->info.style = SIGN2; rawdefaults(ft); } swstartwrite(ft) ft_t ft; { ft->info.size = WORD; ft->info.style = SIGN2; rawdefaults(ft); } ulstartread(ft) ft_t ft; { ft->info.size = BYTE; ft->info.style = ULAW; rawdefaults(ft); } ulstartwrite(ft) ft_t ft; { ft->info.size = BYTE; ft->info.style = ULAW; rawdefaults(ft); } alstartread(ft) ft_t ft; { ft->info.size = BYTE; ft->info.style = ALAW; rawdefaults(ft); } alstartwrite(ft) ft_t ft; { ft->info.size = BYTE; ft->info.style = ALAW; rawdefaults(ft); } static rawdefaults(ft) ft_t ft; { if (ft->info.rate == 0) ft->info.rate = 8000; if (ft->info.channels == -1) ft->info.channels = 1; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.