Exemplo n.º 1
0
static FLAC__StreamEncoderWriteStatus flac_stream_encoder_write_callback(FLAC__StreamEncoder const * const flac, const FLAC__byte buffer[], size_t const bytes, unsigned const samples, unsigned const current_frame, void * const client_data)
{
  sox_format_t * const ft = (sox_format_t *) client_data;
  (void) flac, (void) samples, (void) current_frame;

  return lsx_writebuf(ft, buffer, bytes) == bytes ? FLAC__STREAM_ENCODER_WRITE_STATUS_OK : FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
}
Exemplo n.º 2
0
/*
 * note! file must be seekable
 */
static int dvms_write_header(sox_format_t * ft, struct dvms_header *hdr)
{
        unsigned char hdrbuf[DVMS_HEADER_LEN];
        unsigned char *pch = hdrbuf;
        unsigned char *pchs = hdrbuf;
        int i;
        unsigned sum;

        memcpy(pch, hdr->Filename, sizeof(hdr->Filename));
        pch += sizeof(hdr->Filename);
        put16_le(&pch, hdr->Id);
        put16_le(&pch, hdr->State);
        put32_le(&pch, (unsigned)hdr->Unixtime);
        put16_le(&pch, hdr->Usender);
        put16_le(&pch, hdr->Ureceiver);
        put32_le(&pch, (unsigned) hdr->Length);
        put16_le(&pch, hdr->Srate);
        put16_le(&pch, hdr->Days);
        put16_le(&pch, hdr->Custom1);
        put16_le(&pch, hdr->Custom2);
        memcpy(pch, hdr->Info, sizeof(hdr->Info));
        pch += sizeof(hdr->Info);
        memcpy(pch, hdr->extend, sizeof(hdr->extend));
        pch += sizeof(hdr->extend);
        for(i = sizeof(hdrbuf), sum = 0; i > /*2*/3; i--) /* Deti bug */
                sum += *pchs++;
        hdr->Crc = sum;
        put16_le(&pch, hdr->Crc);
        if (lsx_seeki(ft, (off_t)0, SEEK_SET) < 0)
        {
                lsx_report("seek failed\n: %s",strerror(errno));
                return (SOX_EOF);
        }
        if (lsx_writebuf(ft, hdrbuf, sizeof(hdrbuf)) != sizeof(hdrbuf))
        {
                lsx_report("%s",strerror(errno));
                return (SOX_EOF);
        }
        return (SOX_SUCCESS);
}
Exemplo n.º 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);
}