Example #1
0
static int stopwrite(sox_format_t * ft)
{
  size_t const sector_num_samples = 588 * ft->signal.channels;
  size_t i = ft->olength % sector_num_samples;

  if (i) while (i++ < sector_num_samples)    /* Pad with silence to multiple */
    lsx_writew(ft, 0);                       /* of 1/75th of a second. */
  return SOX_SUCCESS;
}
Example #2
0
static int write_header(sox_format_t * ft)
{
  char * comment  = lsx_cat_comments(ft->oob.comments);
  size_t len      = min(FIXED_HDR - 26, strlen(comment)) + 1; /* null-terminated */
  size_t info_len = max(4, (len + 3) & ~3u); /* Minimum & multiple of 4 bytes */
  int i = ft->encoding.reverse_bytes == MACHINE_IS_BIGENDIAN? 0 : 2;
  sox_bool error  = sox_false
  ||lsx_writechars(ft, id[i].str, sizeof(id[i].str))
  ||lsx_writef(ft, ft->signal.rate)
  ||lsx_writedw(ft, ft->signal.channels)
  ||lsx_writedw(ft, ft_enc(ft->encoding.bits_per_sample, ft->encoding.encoding))
  ||lsx_writew(ft, SF_COMMENT)
  ||lsx_writew(ft, (unsigned) info_len)
  ||lsx_writechars(ft, comment, len)
  ||lsx_padbytes(ft, FIXED_HDR - 20 - len);
  free(comment);
  return error? SOX_EOF: SOX_SUCCESS;
}
Example #3
0
static int startwrite(sox_format_t * ft)
{
    priv_t * avr = (priv_t *)ft->priv;
    int rc;

    if (!ft->seekable) {
        lsx_fail_errno(ft,SOX_EOF,"AVR: file is not seekable");
        return(SOX_EOF);
    }

    rc = lsx_rawstartwrite (ft);
    if (rc)
        return rc;

    /* magic */
    lsx_writes(ft, AVR_MAGIC);

    /* name */
    lsx_writeb(ft, 0);
    lsx_writeb(ft, 0);
    lsx_writeb(ft, 0);
    lsx_writeb(ft, 0);
    lsx_writeb(ft, 0);
    lsx_writeb(ft, 0);
    lsx_writeb(ft, 0);
    lsx_writeb(ft, 0);

    /* mono */
    if (ft->signal.channels == 1) {
        lsx_writew (ft, 0);
    }
    else if (ft->signal.channels == 2) {
        lsx_writew (ft, 0xffff);
    }
    else {
        lsx_fail_errno(ft,SOX_EFMT,"AVR: number of channels not supported");
        return(0);
    }

    /* rez */
    if (ft->encoding.bits_per_sample == 8) {
        lsx_writew (ft, 8);
    }
    else if (ft->encoding.bits_per_sample == 16) {
        lsx_writew (ft, 16);
    }
    else {
        lsx_fail_errno(ft,SOX_EFMT,"AVR: unsupported sample resolution");
        return(SOX_EOF);
    }

    /* sign */
    if (ft->encoding.encoding == SOX_ENCODING_SIGN2) {
        lsx_writew (ft, 0xffff);
    }
    else if (ft->encoding.encoding == SOX_ENCODING_UNSIGNED) {
        lsx_writew (ft, 0);
    }
    else {
        lsx_fail_errno(ft,SOX_EFMT,"AVR: unsupported encoding");
        return(SOX_EOF);
    }

    /* loop */
    lsx_writew (ft, 0xffff);

    /* midi */
    lsx_writew (ft, 0xffff);

    /* rate */
    lsx_writedw(ft, (unsigned)(ft->signal.rate + .5));

    /* size */
    /* Don't know the size yet. */
    lsx_writedw (ft, 0);

    /* lbeg */
    lsx_writedw (ft, 0);

    /* lend */
    /* Don't know the size yet, so we can't set lend, either. */
    lsx_writedw (ft, 0);

    /* res1 */
    lsx_writew (ft, 0);

    /* res2 */
    lsx_writew (ft, 0);

    /* res3 */
    lsx_writew (ft, 0);

    /* ext */
    lsx_writebuf(ft, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", sizeof(avr->ext));

    /* user */
    lsx_writebuf(ft,
                 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
                 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
                 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
                 "\0\0\0\0", sizeof (avr->user));

    return(SOX_SUCCESS);
}