cdr.c
来自「linux下录音程序」· C语言 代码 · 共 150 行
C
150 行
/* * CD-R format handler * * 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. * Lance Norskog And Sundry Contributors are not responsible for * the consequences of using this software. * * This code automatically handles endianness differences * * cbagwell (cbagwell@sprynet.com) - 20 April 1998 * * Changed endianness handling. Seemed to be reversed (since format * is in big endian) and made it so that user could always override * swapping no matter what endian machine they are one. * * Fixed bug were trash could be appended to end of file for certain * endian machines. * */#include "st.h"#define SECTORSIZE (2352 / 2)/* Private data for SKEL file */typedef struct cdrstuff { LONG samples; /* number of samples written */} *cdr_t;LONG rawread(P3(ft_t, LONG *, LONG));void rawwrite(P3(ft_t, LONG *, LONG));/* * Do anything required before you start reading samples. * Read file header. * Find out sampling rate, * size and style of samples, * mono/stereo/quad. */void cdrstartread(ft) ft_t ft;{ int littlendian = 1; char *endptr; endptr = (char *) &littlendian; /* CDR is in Big Endian format. Swap whats read in on */ /* Little Endian machines. */ if (*endptr) { ft->swap = ft->swap ? 0 : 1; } ft->info.rate = 44100L; ft->info.size = WORD; ft->info.style = SIGN2; ft->info.channels = 2; ft->comment = NULL;}/* * Read up to len samples from file. * Convert to signed longs. * Place in buf[]. * Return number of samples read. */LONG cdrread(ft, buf, len) ft_t ft;LONG *buf, len;{ return rawread(ft, buf, len);}/* * Do anything required when you stop reading samples. * Don't close input file! */void cdrstopread(ft) ft_t ft;{}void cdrstartwrite(ft) ft_t ft;{ cdr_t cdr = (cdr_t) ft->priv; int littlendian = 1; char *endptr; endptr = (char *) &littlendian; /* CDR is in Big Endian format. Swap whats written out on */ /* Little Endian Machines. */ if (*endptr) { ft->swap = ft->swap ? 0 : 1; } cdr->samples = 0; ft->info.rate = 44100L; ft->info.size = WORD; ft->info.style = SIGN2; ft->info.channels = 2;}void cdrwrite(ft, buf, len) ft_t ft;LONG *buf, len;{ cdr_t cdr = (cdr_t) ft->priv; cdr->samples += len; rawwrite(ft, buf, len);}/* * A CD-R file needs to be padded to SECTORSIZE, which is in terms of * samples. We write -32768 for each sample to pad it out. */void cdrstopwrite(ft) ft_t ft;{ cdr_t cdr = (cdr_t) ft->priv; int padsamps = SECTORSIZE - (cdr->samples % SECTORSIZE); short zero; zero = 0; if (padsamps == SECTORSIZE) { return; } while (padsamps > 0) { wshort(ft, zero); padsamps--; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?