/*++ Copyright (c) 1995 Microsoft Corporation Module Name: cddump.c Abstract: dump cd tracks to wav files Environment: User mode only Revision History: 05-26-98 : Created --*/ #include #include #include "wav.h" ULONG32 DumpWavHeader( HANDLE OutFile, ULONG32 Samples, ULONG32 SamplesPerSecond, USHORT Channels, USHORT BitsPerSample ) { WAV_HEADER_CHUNK Header; ULONG32 temp; Header.ChunkId = ChunkIdRiff; Header.RiffType = RiffTypeWav; Header.Format.ChunkId = ChunkIdFormat; Header.Format.ChunkSize = sizeof(WAV_FORMAT_CHUNK) - (sizeof(ULONG)*2); Header.Format.FormatTag = FormatTagUncompressed; Header.Format.BitsPerSample = BitsPerSample; temp = (BitsPerSample+7)/8; // temp = bytes per sample rounded up Header.Format.Channels = Channels; temp *= Channels; // temp = bytes for all channels if (temp > (USHORT)-1) { fprintf(stderr, "Bytes for all channels exceeds MAXUSHORT, not a valid " "option for WAV file\n"); return -1; } Header.Format.BlockAlign = (USHORT)temp; Header.Format.SamplesPerSec = SamplesPerSecond; Header.Format.AvgBytesPerSec = temp * SamplesPerSecond; temp *= Samples; // temp = number of total bytes temp *= 2; // unknown why this is needed. Header.Data.ChunkSize = temp; Header.Data.ChunkId = ChunkIdData; Header.ChunkSize = temp + sizeof(WAV_HEADER_CHUNK); // 54 if (!WriteFile( OutFile, &Header, sizeof(Header), &temp, NULL ) ) { fprintf(stderr, "Unable to write header\n" ); return -1; } return 0; } VOID ReadWavHeader( HANDLE InFile ) { WAV_HEADER_CHUNK Header; ULONG temp; if (!ReadFile(InFile, &Header, sizeof(Header), &temp, NULL) || temp != sizeof(Header) ) { fprintf(stderr, "Unable to read header %x\n", GetLastError()); return; } if (Header.ChunkId != ChunkIdRiff) { printf("ChunkId is not RIFF (%x)\n", Header.ChunkId); return; } if (Header.RiffType != RiffTypeWav) { printf("RiffType is not RiffTypeWav (%x)\n", Header.RiffType); return; } if (Header.Format.ChunkId != ChunkIdFormat) { printf("Format.ChunkId is not ChunkIdFormat (%x)\n", Header.Format.ChunkId); return; } if (Header.Format.ChunkSize != sizeof(WAV_FORMAT_CHUNK) - (2*sizeof(ULONG))) { printf("Format.ChunkSize is not %x (%x)\n", sizeof(WAV_FORMAT_CHUNK) - (2*sizeof(ULONG)), Header.Format.ChunkSize); return; } if (Header.Format.FormatTag != FormatTagUncompressed) { printf("Format. is not Uncompressed (%x)\n", Header.Format.FormatTag); return; } if (Header.Data.ChunkId != ChunkIdData) { printf("Data.ChunkId is not ChunkIdData (%x)\n", Header.Data.ChunkId); return; } printf("Uncompressed RIFF/Wav File\n"); printf("\t%2d bits per sample\n", Header.Format.BitsPerSample); printf("\t%2d channels\n", Header.Format.Channels); printf("\t%2d samples per second\n", Header.Format.SamplesPerSec); printf("\t%2d average bytes per second\n", Header.Format.AvgBytesPerSec); printf("Total data available to player: %d\n", Header.Data.ChunkSize); temp = Header.Data.ChunkSize / Header.Format.AvgBytesPerSec; printf("\t%d seconds of audio\n", temp ); return; }