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; }
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; }
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); }