shithub: sox

ref: 39b71fb516bf18304e0561d316ce2ce82814a4dd
dir: /src/cdr.c/

View raw version
/*
 * CD Digital Audio format handler: pads to integer number of CDDA sectors
 *
 * David Elliott, Sony Microsystems -  July 5, 1991
 *
 * Copyright 1991 David Elliott And Sundry Contributors
 * This source code is freely redistributable and may be used for
 * any purpose.  This copyright notice must be maintained. 
 * David Elliott And Sundry Contributors are not responsible for 
 * the consequences of using this software.
 */

#include "sox_i.h"

#define SECTOR_SIZE   (2352 / 2)
#define samples       (*(sox_size_t *)ft->priv)

static int start(sox_format_t * ft) 
{
  ft->signal.rate = 44100;
  ft->signal.size = SOX_SIZE_16BIT;
  ft->signal.encoding = SOX_ENCODING_SIGN2;
  ft->signal.channels = 2;

  if (ft->mode == 'r' && ft->seekable) /* Need length for seeking */
    ft->length = sox_filelength(ft)/SOX_SIZE_16BIT;
  
  return SOX_SUCCESS;
}

static sox_size_t write(
    sox_format_t * ft, const sox_sample_t *buf, sox_size_t len) 
{
  samples += len;
  return sox_rawwrite(ft, buf, len);
}

static int stopwrite(sox_format_t * ft) 
{
  sox_size_t i = samples % SECTOR_SIZE;

  if (i) while (i++ < SECTOR_SIZE)     /* Pad with silence to multiple */
    sox_writew(ft, 0);                 /* of SECTOR_SIZE samples. */

  return SOX_SUCCESS;
}

const sox_format_handler_t *sox_cdr_format_fn(void);
const sox_format_handler_t *sox_cdr_format_fn(void)
{
  static const char * names[] = {"cdda", "cdr", NULL};

  static sox_format_handler_t handler = {
    names, SOX_FILE_BIG_END,
    start, sox_rawread, NULL,
    start, write, stopwrite,
    sox_rawseek
  };

  return &handler;
}