static int startread(sox_format_t * ft) { char magic[4]; float rate; uint32_t channels, ft_encoding; unsigned i, bits_per_sample; sox_encoding_t encoding; uint16_t code, size; if (lsx_readchars(ft, magic, sizeof(magic))) return SOX_EOF; for (i = 0; id[i].desc && memcmp(magic, id[i].str, sizeof(magic)); ++i); if (!id[i].desc) { lsx_fail_errno(ft, SOX_EHDR, "sf: can't find IRCAM identifier"); return SOX_EOF; } lsx_report("found %s identifier", id[i].desc); ft->encoding.reverse_bytes = id[i].reverse_bytes; if (lsx_readf(ft, &rate) || lsx_readdw(ft, &channels) || lsx_readdw(ft, &ft_encoding)) return SOX_EOF; if (!(encoding = sox_enc(ft_encoding, &bits_per_sample))) { lsx_fail_errno(ft, SOX_EFMT, "sf: unsupported encoding %#x)", ft_encoding); return SOX_EOF; } do { if (lsx_readw(ft, &code) || lsx_readw(ft, &size)) return SOX_EOF; if (code == SF_COMMENT) { char * buf = lsx_calloc(1, (size_t)size + 1); /* +1 ensures null-terminated */ if (lsx_readchars(ft, buf, (size_t) size) != SOX_SUCCESS) { free(buf); return SOX_EOF; } sox_append_comments(&ft->oob.comments, buf); free(buf); } else if (lsx_skipbytes(ft, (size_t) size)) return SOX_EOF; } while (code); if (lsx_skipbytes(ft, FIXED_HDR - (size_t)lsx_tell(ft))) return SOX_EOF; return lsx_check_read_params(ft, channels, rate, encoding, bits_per_sample, (uint64_t)0, sox_true); }
static int startread(sox_format_t * ft) { priv_t * avr = (priv_t *)ft->priv; int rc; lsx_reads(ft, avr->magic, (size_t)4); if (strncmp (avr->magic, AVR_MAGIC, (size_t)4)) { lsx_fail_errno(ft,SOX_EHDR,"AVR: unknown header"); return(SOX_EOF); } lsx_readbuf(ft, avr->name, sizeof(avr->name)); lsx_readw (ft, &(avr->mono)); if (avr->mono) { ft->signal.channels = 2; } else { ft->signal.channels = 1; } lsx_readw (ft, &(avr->rez)); if (avr->rez == 8) { ft->encoding.bits_per_sample = 8; } else if (avr->rez == 16) { ft->encoding.bits_per_sample = 16; } else { lsx_fail_errno(ft,SOX_EFMT,"AVR: unsupported sample resolution"); return(SOX_EOF); } lsx_readw (ft, &(avr->sign)); if (avr->sign) { ft->encoding.encoding = SOX_ENCODING_SIGN2; } else { ft->encoding.encoding = SOX_ENCODING_UNSIGNED; } lsx_readw (ft, &(avr->loop)); lsx_readw (ft, &(avr->midi)); lsx_readdw (ft, &(avr->rate)); /* * No support for AVRs created by ST-Replay, * Replay Proffesional and PRO-Series 12. * * Just masking the upper byte out. */ ft->signal.rate = (avr->rate & 0x00ffffff); lsx_readdw (ft, &(avr->size)); lsx_readdw (ft, &(avr->lbeg)); lsx_readdw (ft, &(avr->lend)); lsx_readw (ft, &(avr->res1)); lsx_readw (ft, &(avr->res2)); lsx_readw (ft, &(avr->res3)); lsx_readbuf(ft, avr->ext, sizeof(avr->ext)); lsx_readbuf(ft, avr->user, sizeof(avr->user)); rc = lsx_rawstartread (ft); if (rc) return rc; return(SOX_SUCCESS); }
/*----------------------------------------------------------------- * startread() -- start reading a VOC file *-----------------------------------------------------------------*/ static int startread(sox_format_t * ft) { int rtn = SOX_SUCCESS; char header[20]; priv_t * v = (priv_t *) ft->priv; unsigned short sbseek; int rc; int ii; /* for getting rid of lseek */ unsigned char uc; if (lsx_readbuf(ft, header, (size_t)20) != 20) { lsx_fail_errno(ft, SOX_EHDR, "unexpected EOF in VOC header"); return (SOX_EOF); } if (strncmp(header, "Creative Voice File\032", (size_t)19)) { lsx_fail_errno(ft, SOX_EHDR, "VOC file header incorrect"); return (SOX_EOF); } /* read the offset to data, from start of file */ /* after this read we have read 20 bytes of header + 2 */ lsx_readw(ft, &sbseek); /* ANN: read to skip the header, instead of lseek */ /* this should allow use with pipes.... */ for (ii = 22; ii < sbseek; ii++) lsx_readb(ft, &uc); v->rate = -1; v->block_remaining = 0; v->total_size = 0; /* ANN added */ v->extended = 0; /* read until we get the format information.... */ rc = getblock(ft); if (rc) return rc; /* get rate of data */ if (v->rate == -1) { lsx_fail_errno(ft, SOX_EOF, "Input .voc file had no sound!"); return (SOX_EOF); } /* setup word length of data */ /* ANN: Check VOC format and map to the proper libSoX format value */ switch (v->format) { case VOC_FMT_LIN8U: /* 0 8 bit unsigned linear PCM */ ft->encoding.encoding = SOX_ENCODING_UNSIGNED; v->size = 8; break; case VOC_FMT_CRLADPCM4: /* 1 Creative 8-bit to 4-bit ADPCM */ ft->encoding.encoding = SOX_ENCODING_CL_ADPCM; v->size = 4; break; case VOC_FMT_CRLADPCM3: /* 2 Creative 8-bit to 3-bit ADPCM */ ft->encoding.encoding = SOX_ENCODING_CL_ADPCM; v->size = 3; break; case VOC_FMT_CRLADPCM2: /* 3 Creative 8-bit to 2-bit ADPCM */ ft->encoding.encoding = SOX_ENCODING_CL_ADPCM; v->size = 2; break; case VOC_FMT_LIN16: /* 4 16-bit signed PCM */ ft->encoding.encoding = SOX_ENCODING_SIGN2; v->size = 16; break; case VOC_FMT_ALAW: /* 6 CCITT a-Law 8-bit PCM */ ft->encoding.encoding = SOX_ENCODING_ALAW; v->size = 8; break; case VOC_FMT_MU255: /* 7 CCITT u-Law 8-bit PCM */ ft->encoding.encoding = SOX_ENCODING_ULAW; v->size = 8; break; case VOC_FMT_CRLADPCM4A: /*0x200 Creative 16-bit to 4-bit ADPCM */ ft->encoding.encoding = SOX_ENCODING_CL_ADPCM16; v->size = 4; break; default: lsx_fail("Unknown VOC format %d", v->format); rtn = SOX_EOF; break; } ft->encoding.bits_per_sample = v->size; /* setup number of channels */ if (ft->signal.channels == 0) ft->signal.channels = v->channels; return (SOX_SUCCESS); }