Example #1
0
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);
}
Example #2
0
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);
}
Example #3
0
/*-----------------------------------------------------------------
 * 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);
}