This repository has been archived on 2025-05-24. You can view files and clone it, but cannot push or open issues or pull requests.
Files
libcdio-osx/src/cd-paranoia/header.c
2008-04-11 15:44:00 +00:00

135 lines
3.7 KiB
C

/*
$Id: header.c,v 1.2 2008/04/11 15:44:00 karl Exp $
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 1998 Monty xiphmont@mit.edu
and Heiko Eissfeldt heiko@escape.colossus.de
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/** \file header.h
* \brief WAV, AIFF and AIFC header-writing routines.
*/
#include "header.h"
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
static void PutNum(long num,int f,int endianness,int bytes){
int i;
unsigned char c;
if(!endianness)
i=0;
else
i=bytes-1;
while(bytes--){
c=(num>>(i<<3))&0xff;
if(write(f,&c,1)==-1){
perror("Could not write to output.");
exit(1);
}
if(endianness)
i--;
else
i++;
}
}
/** Writes WAV headers */
void
WriteWav(int f, long int bytes)
{
/* quick and dirty */
write(f,"RIFF",4); /* 0-3 */
PutNum(bytes+44-8,f,0,4); /* 4-7 */
write(f,"WAVEfmt ",8); /* 8-15 */
PutNum(16,f,0,4); /* 16-19 */
PutNum(1,f,0,2); /* 20-21 */
PutNum(2,f,0,2); /* 22-23 */
PutNum(44100,f,0,4); /* 24-27 */
PutNum(44100*2*2,f,0,4); /* 28-31 */
PutNum(4,f,0,2); /* 32-33 */
PutNum(16,f,0,2); /* 34-35 */
write(f,"data",4); /* 36-39 */
PutNum(bytes,f,0,4); /* 40-43 */
}
/** Writes AIFF headers */
void
WriteAiff(int f, long int bytes)
{
long size=bytes+54;
long frames=bytes/4;
/* Again, quick and dirty */
write(f,"FORM",4); /* 4 */
PutNum(size-8,f,1,4); /* 8 */
write(f,"AIFF",4); /* 12 */
write(f,"COMM",4); /* 16 */
PutNum(18,f,1,4); /* 20 */
PutNum(2,f,1,2); /* 22 */
PutNum(frames,f,1,4); /* 26 */
PutNum(16,f,1,2); /* 28 */
write(f,"@\016\254D\0\0\0\0\0\0",10); /* 38 (44.100 as a float) */
write(f,"SSND",4); /* 42 */
PutNum(bytes+8,f,1,4); /* 46 */
PutNum(0,f,1,4); /* 50 */
PutNum(0,f,1,4); /* 54 */
}
/** Writes AIFC headers */
void
WriteAifc(int f, long bytes)
{
long size=bytes+86;
long frames=bytes/4;
/* Again, quick and dirty */
write(f,"FORM",4); /* 4 */
PutNum(size-8,f,1,4); /* 8 */
write(f,"AIFC",4); /* 12 */
write(f,"FVER",4); /* 16 */
PutNum(4,f,1,4); /* 20 */
PutNum(2726318400UL,f,1,4); /* 24 */
write(f,"COMM",4); /* 28 */
PutNum(38,f,1,4); /* 32 */
PutNum(2,f,1,2); /* 34 */
PutNum(frames,f,1,4); /* 38 */
PutNum(16,f,1,2); /* 40 */
write(f,"@\016\254D\0\0\0\0\0\0",10); /* 50 (44.100 as a float) */
write(f,"NONE",4); /* 54 */
PutNum(14,f,1,1); /* 55 */
write(f,"not compressed",14); /* 69 */
PutNum(0,f,1,1); /* 70 */
write(f,"SSND",4); /* 74 */
PutNum(bytes+8,f,1,4); /* 78 */
PutNum(0,f,1,4); /* 82 */
PutNum(0,f,1,4); /* 86 */
}