/*------------------------------------------------------------------------
 *
 * Copyright (c) 1997-1998 by Cornell University.
 * 
 * See the file "license.txt" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 *------------------------------------------------------------------------
 */
#include <dvmbasic.h>
#include <dvmwave.h>

void ReadWave (filename, hdr, audio, inbs)
    char *filename;
    WaveHdr **hdr;
    Audio **audio;
    BitStream **inbs;
{
    FILE *inf;
    int res, bytes, samples, offset, left;
    BitParser *inbp;

    inf = fopen(filename, "rb");
    if (inf == NULL) {
	fprintf(stderr, "unable to open %s for reading.\n", filename);
	exit(1);
    }
    *inbs = BitStreamNew(100);
    inbp = BitParserNew();
    BitParserWrap(inbp, *inbs);

    BitStreamFileRead(*inbs, inf, 0);
    *hdr = WaveHdrNew();
    WaveHdrParse(inbp, *hdr);
    
    res = WaveHdrGetBitsPerSample(*hdr);
    bytes = WaveHdrGetDataLen(*hdr);
    samples = (bytes << 3)/res;
    offset = BitParserTell(inbp);
    
    BitStreamShift(*inbs, offset);
    BitStreamResize(*inbs, bytes);
    BitParserWrap(inbp, *inbs);
    BitParserSeek(inbp, 0);

    left = BitStreamBytesLeft(*inbs, 0);
    BitStreamFileRead(*inbs, inf, left);
    
    if (res == 8) {
	*audio = BitStreamCastToAudio8(*inbs, 0, samples);
    } else {
	*audio = BitStreamCastToAudio16(*inbs, 0, samples);
    }
    fclose(inf);
    BitParserFree(inbp);
}

void WriteWave (hdr, audio, name) 
    WaveHdr *hdr;
    Audio *audio;
    char *name;
{
    FILE *outf;
    BitStream *hdrbs, *outbs;
    BitParser *hdrbp;
    int res;
    
    outf = fopen(name, "wb");
    hdrbs = BitStreamNew(100);
    hdrbp = BitParserNew();
    
    BitParserWrap(hdrbp, hdrbs);
    WaveHdrEncode(hdr, hdrbp);
    BitStreamFileWrite(hdrbs, outf, 0);
    
    res = WaveHdrGetBitsPerSample(hdr);
    if (res ==  8) {
	outbs = Audio8CastToBitStream(audio);
    } else {
	outbs = Audio16CastToBitStream(audio);
    }

    BitStreamFileWrite(outbs, outf, 0);
    fclose(outf);
    BitParserFree(hdrbp);
    BitStreamFree(hdrbs);
    BitStreamFree(outbs);
}