# HG changeset patch # User Matti Hamalainen # Date 1530314872 -10800 # Node ID c3e88d9343ca584d71b1acf31ef9fbc44e90a63f # Parent b91d54a37b6b6d4bd2934db99734f8e2b0a3730a Move WAV stuff back into mod2wav.c, made no sense to have it elsewhere. diff -r b91d54a37b6b -r c3e88d9343ca src/dmwav.c --- a/src/dmwav.c Sat Jun 30 00:46:46 2018 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* - * DMLib - * -- Wav file writing - * Programmed and designed by Matti 'ccr' Hamalainen - * (C) Copyright 2012 Tecnic Software productions (TNSP) - */ -#include "dmwav.h" -#include "dmfile.h" - - -BOOL dmWriteWAVChunk(FILE * f, DMWaveChunk *ch) -{ - return dm_fwrite_str(f, ch->chunkID, 4) && dm_fwrite_le32(f, ch->chunkSize); -} - - -void dmMakeWAVChunk(DMWaveChunk *ch, const char *chunkID, const Uint32 chunkSize) -{ - memcpy(&(ch->chunkID), (const void *) chunkID, 4); - ch->chunkSize = chunkSize; -} - - -void dmWriteWAVHeader(FILE *outFile, int sampBits, int sampFreq, int sampChn, size_t sampLen) -{ - DMWaveFile wav; - - // PCM WAVE chunk - dmMakeWAVChunk(&wav.chFormat, DM_WAVE_FMT_ID, (2 + 2 + 4 + 4 + 2 + 2)); - - wav.wFormatTag = DM_WAVE_FORMAT_PCM; - wav.nChannels = sampChn; - wav.nSamplesPerSec = sampFreq; - wav.nAvgBytesPerSec = (sampBits * sampChn * sampFreq) / 8; - wav.nBlockAlign = (sampBits * sampChn) / 8; - wav.wBitsPerSample = sampBits; - - // Data chunk - dmMakeWAVChunk(&wav.chData, DM_WAVE_DATA_ID, (sampLen * wav.nBlockAlign)); - - // RIFF header - memcpy(&wav.riffID, (const void *) DM_WAVE_RIFF_ID, 4); - memcpy(&wav.riffType, (const void *) DM_WAVE_WAVE_ID, 4); - wav.fileSize = ((4 + 4 + 4) + wav.chFormat.chunkSize + wav.chData.chunkSize); - - // Write header - dm_fwrite_str(outFile, wav.riffID, sizeof(wav.riffID)); - dm_fwrite_le32(outFile, wav.fileSize); - - dm_fwrite_str(outFile, wav.riffType, sizeof(wav.riffType)); - dmWriteWAVChunk(outFile, &wav.chFormat); - - dm_fwrite_le16(outFile, wav.wFormatTag); - dm_fwrite_le16(outFile, wav.nChannels); - dm_fwrite_le32(outFile, wav.nSamplesPerSec); - dm_fwrite_le32(outFile, wav.nAvgBytesPerSec); - dm_fwrite_le16(outFile, wav.nBlockAlign); - dm_fwrite_le16(outFile, wav.wBitsPerSample); - - dmWriteWAVChunk(outFile, &wav.chData); -} diff -r b91d54a37b6b -r c3e88d9343ca src/dmwav.h --- a/src/dmwav.h Sat Jun 30 00:46:46 2018 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/* - * DMLib - * -- Wav file writing - * Programmed and designed by Matti 'ccr' Hamalainen - * (C) Copyright 2012 Tecnic Software productions (TNSP) - */ -#ifndef DMWAV_H -#define DMWAV_H - -#include "dmlib.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define DM_WAVE_FORMAT_PCM (1) -#define DM_WAVE_RIFF_ID "RIFF" -#define DM_WAVE_WAVE_ID "WAVE" -#define DM_WAVE_FMT_ID "fmt " -#define DM_WAVE_DATA_ID "data" - - -typedef struct -{ - Uint8 chunkID[4]; - Uint32 chunkSize; -} DMWaveChunk; - - -typedef struct -{ - Uint8 riffID[4]; - Uint32 fileSize; - Uint8 riffType[4]; - - DMWaveChunk chFormat; - - Uint16 wFormatTag; - Uint16 nChannels; - Uint32 nSamplesPerSec; - Uint32 nAvgBytesPerSec; - Uint16 nBlockAlign; - Uint16 wBitsPerSample; - - DMWaveChunk chData; - // Data follows here -} DMWaveFile; - - -BOOL dmWriteWAVChunk(FILE * f, DMWaveChunk *ch); -void dmMakeWAVChunk(DMWaveChunk *ch, const char *chunkID, const Uint32 chunkSize); -void dmWriteWAVHeader(FILE *outFile, int sampBits, int sampFreq, int sampChn, size_t sampLen); - - -#ifdef __cplusplus -} -#endif - -#endif // DMWAV_H diff -r b91d54a37b6b -r c3e88d9343ca tools/mod2wav.c --- a/tools/mod2wav.c Sat Jun 30 00:46:46 2018 +0300 +++ b/tools/mod2wav.c Sat Jun 30 02:27:52 2018 +0300 @@ -14,10 +14,44 @@ #include "jssplr.h" #include "dmlib.h" #include "dmargs.h" -#include "dmwav.h" +#include "dmfile.h" #include "dmmutex.h" +#define DM_WAVE_FORMAT_PCM (1) +#define DM_WAVE_RIFF_ID "RIFF" +#define DM_WAVE_WAVE_ID "WAVE" +#define DM_WAVE_FMT_ID "fmt " +#define DM_WAVE_DATA_ID "data" + + +typedef struct +{ + Uint8 chunkID[4]; + Uint32 chunkSize; +} DMWaveChunk; + + +typedef struct +{ + Uint8 riffID[4]; + Uint32 fileSize; + Uint8 riffType[4]; + + DMWaveChunk chFormat; + + Uint16 wFormatTag; + Uint16 nChannels; + Uint32 nSamplesPerSec; + Uint32 nAvgBytesPerSec; + Uint16 nBlockAlign; + Uint16 wBitsPerSample; + + DMWaveChunk chData; + // Data follows here +} DMWaveFile; + + char *optInFilename = NULL, *optOutFilename = NULL; int optOutFormat = JSS_AUDIO_S16, optOutChannels = 2, @@ -123,6 +157,57 @@ } +BOOL dmWriteWAVChunk(FILE * f, DMWaveChunk *ch) +{ + return dm_fwrite_str(f, ch->chunkID, 4) && dm_fwrite_le32(f, ch->chunkSize); +} + + +void dmMakeWAVChunk(DMWaveChunk *ch, const char *chunkID, const Uint32 chunkSize) +{ + memcpy(&(ch->chunkID), (const void *) chunkID, 4); + ch->chunkSize = chunkSize; +} + + +void dmWriteWAVHeader(FILE *outFile, int sampBits, int sampFreq, int sampChn, size_t sampLen) +{ + DMWaveFile wav; + + // PCM WAVE chunk + dmMakeWAVChunk(&wav.chFormat, DM_WAVE_FMT_ID, (2 + 2 + 4 + 4 + 2 + 2)); + + wav.wFormatTag = DM_WAVE_FORMAT_PCM; + wav.nChannels = sampChn; + wav.nSamplesPerSec = sampFreq; + wav.nAvgBytesPerSec = (sampBits * sampChn * sampFreq) / 8; + wav.nBlockAlign = (sampBits * sampChn) / 8; + wav.wBitsPerSample = sampBits; + + // Data chunk + dmMakeWAVChunk(&wav.chData, DM_WAVE_DATA_ID, (sampLen * wav.nBlockAlign)); + + // RIFF header + memcpy(&wav.riffID, (const void *) DM_WAVE_RIFF_ID, 4); + memcpy(&wav.riffType, (const void *) DM_WAVE_WAVE_ID, 4); + wav.fileSize = ((4 + 4 + 4) + wav.chFormat.chunkSize + wav.chData.chunkSize); + + // Write header + dm_fwrite_str(outFile, wav.riffID, sizeof(wav.riffID)); + dm_fwrite_le32(outFile, wav.fileSize); + + dm_fwrite_str(outFile, wav.riffType, sizeof(wav.riffType)); + dmWriteWAVChunk(outFile, &wav.chFormat); + + dm_fwrite_le16(outFile, wav.wFormatTag); + dm_fwrite_le16(outFile, wav.nChannels); + dm_fwrite_le32(outFile, wav.nSamplesPerSec); + dm_fwrite_le32(outFile, wav.nAvgBytesPerSec); + dm_fwrite_le16(outFile, wav.nBlockAlign); + dm_fwrite_le16(outFile, wav.wBitsPerSample); + + dmWriteWAVChunk(outFile, &wav.chData); +} int main(int argc, char *argv[]) { DMResource *inFile = NULL;