/********************************************************************************* * Close WAV file. * Update chunk sizes so it can be read by audio applications. */ int Audio_WAV_CloseWriter(WAV_Writer *writer) { unsigned char buffer[4]; unsigned char *bufferPtr; int numWritten; int riffSize; /* Go back to beginning of file and update DATA size */ int result = fseek(writer->fid, writer->dataSizeOffset, SEEK_SET); if (result < 0) return result; bufferPtr = buffer; WriteLongLE(&bufferPtr, writer->dataSize); numWritten = fwrite(buffer, 1, sizeof( buffer), writer->fid); if (numWritten != sizeof(buffer)) return -1; /* Update RIFF size */ result = fseek(writer->fid, 4, SEEK_SET); if (result < 0) return result; riffSize = writer->dataSize + (WAV_HEADER_SIZE - 8); bufferPtr = buffer; WriteLongLE(&bufferPtr, riffSize); numWritten = fwrite(buffer, 1, sizeof(buffer), writer->fid); if (numWritten != sizeof(buffer)) return -1; fclose(writer->fid); writer->fid = NULL; return writer->dataSize; }
void CEDPacket::WriteLongEDString(LPCTSTR psz, BOOL bUnicode) { DWORD nLen; if ( bUnicode ) { nLen = GetStringLenUTF8( psz ); WriteLongLE( nLen ); WriteStringUTF8( psz, FALSE ); } else { nLen = GetStringLen( psz ); WriteLongLE( nLen ); WriteString( psz, FALSE ); } ASSERT( nLen <= 0xFFFF ); }
/********************************************************************************* * Open named file and write WAV header to the file. * The header includes the DATA chunk type and size. * Returns number of bytes written to file or negative error code. */ int Audio_WAV_OpenWriter(WAV_Writer *writer, const char *fileName, int frameRate, int samplesPerFrame) { unsigned int bytesPerSecond; unsigned char header[WAV_HEADER_SIZE]; unsigned char *addr = header; int numWritten; writer->dataSize = 0; writer->dataSizeOffset = 0; writer->fid = fopen(fileName, "wb"); if (writer->fid == NULL) { return -1; } /* Write RIFF header. */ WriteChunkType(&addr, RIFF_ID); /* Write RIFF size as zero for now. Will patch later. */ WriteLongLE(&addr, 0); /* Write WAVE form ID. */ WriteChunkType(&addr, WAVE_ID); /* Write format chunk based on AudioSample structure. */ WriteChunkType(&addr, FMT_ID); WriteLongLE(&addr, 16); WriteShortLE(&addr, WAVE_FORMAT_PCM); bytesPerSecond = frameRate * samplesPerFrame * sizeof(int16_t); WriteShortLE(&addr, (int16_t) samplesPerFrame); WriteLongLE(&addr, frameRate); WriteLongLE(&addr, bytesPerSecond); WriteShortLE(&addr, (int16_t) (samplesPerFrame * sizeof(int16_t))); /* bytesPerBlock */ WriteShortLE(&addr, (int16_t) 16); /* bits per sample */ /* Write ID and size for 'data' chunk. */ WriteChunkType(&addr, DATA_ID); /* Save offset so we can patch it later. */ writer->dataSizeOffset = static_cast<int>(addr - header); WriteLongLE(&addr, 0); numWritten = fwrite(header, 1, sizeof(header), writer->fid ); if (numWritten != sizeof(header)) return -1; return numWritten; }