/* *------------------------------------------------------------------------- * file_io.cpp Wav/Raw I/O methods * $Id: file_io.cpp 1.2 2000/07/18 09:45:41Z JA Exp $ *------------------------------------------------------------------------- * * Copyright (C) 1999-2000 Algo Vision Systems GmbH * * This file is part of the Algo Vision platform independent software * library. * All rights reserved. Copying, compilation, modification, distribution * or any other use whatsoever of this material is strictly prohibited * except in accordance with a Software License Agreement with * Algo Vision. * *------------------------------------------------------------------------- */ #include "stdio.h" #include "stdlib.h" #include "string.h" #include "avwaveio.h" /******************************************************************************/ /* C definitions /******************************************************************************/ void WavInit(struct _sWAV *pObj, UINT32 nSamplesPerSec, UINT16 nBits, UINT16 nChannels, UINT16 format) { WavSetFormat(pObj, nSamplesPerSec, nBits, nChannels, format); pObj->m_FileType = FILETYPE_RAW; pObj->m_FileSize = 0; pObj->m_HeaderSize = 0; pObj->m_DataSize = 0; pObj->pHndWavFile = 0; pObj->m_numSamples = 0; } /******************************************************************************/ UINT32 WavSetFormat(struct _sWAV *pObj, UINT32 nSamplesPerSec, UINT16 nBits, UINT16 nChannels, UINT16 format) { pObj->m_Format.wFormatTag = format; pObj->m_Format.nChannels = nChannels; pObj->m_Format.wBitsPerSample = nBits; pObj->m_Format.nBlockAlign = (nChannels * nBits)/ 8; pObj->m_Format.nSamplesPerSec = nSamplesPerSec; pObj->m_Format.nAvgBytesPerSec = (UINT32)pObj->m_Format.nBlockAlign * nSamplesPerSec; pObj->m_Format.cbSize = 0; return 0; } /******************************************************************************/ UINT32 WavOpen (struct _sWAV *pObj, char* FileName) { UINT32 stat; //Wav-File öffnen strcpy(pObj->m_Name, FileName); pObj->pHndWavFile = fopen (pObj->m_Name,"rb"); if (pObj->pHndWavFile == 0) return -1; stat=ReadHeader(pObj); if (stat != 0) { pObj->m_FileType = FILETYPE_RAW; fseek(pObj->pHndWavFile, 0L, SEEK_END); pObj->m_DataSize = ftell(pObj->pHndWavFile); pObj->m_FileSize = pObj->m_DataSize; pObj->m_numSamples = pObj->m_DataSize/pObj->m_Format.nBlockAlign; fseek(pObj->pHndWavFile, 0L, SEEK_SET); pObj->WREAD = 1; return 0; } pObj->m_numSamples = pObj->m_DataSize /pObj->m_Format.nBlockAlign; pObj->m_FileType = FILETYPE_WAV; pObj->WREAD = 1; return 0; } /******************************************************************************/ UINT32 WavClose(struct _sWAV *pObj) { if (!pObj->WREAD && (pObj->m_FileType == FILETYPE_WAV)) WriteHeader(pObj); fclose(pObj->pHndWavFile); return 0; } /******************************************************************************/ UINT32 WavCreate (struct _sWAV *pObj, char *fileName, UINT32 fileType) { pObj->m_FileType = fileType; strcpy(pObj->m_Name, fileName); //Wav-File öffnen pObj->pHndWavFile = fopen (pObj->m_Name,"wb"); if (pObj->pHndWavFile == 0) return -1; pObj->WREAD = 0; if (pObj->m_FileType == FILETYPE_WAV) WriteHeader(pObj); return 0; } /******************************************************************************/ UINT32 WavRead(struct _sWAV *pObj, char *data, UINT32 nSamples) { UINT32 count; count = fread(data, sizeof(char), nSamples*pObj->m_Format.nBlockAlign, pObj->pHndWavFile); return count /pObj->m_Format.nBlockAlign; } /******************************************************************************/ UINT32 WavWrite(struct _sWAV *pObj, char *data, UINT32 nSamples) { UINT32 count; fseek(pObj->pHndWavFile, 0L, SEEK_END); count = fwrite(data, sizeof(char), nSamples*pObj->m_Format.nBlockAlign, pObj->pHndWavFile); pObj->m_DataSize = pObj->m_DataSize + count; pObj->m_numSamples = pObj->m_DataSize /pObj->m_Format.nBlockAlign; pObj->m_FileSize = pObj->m_DataSize; if (pObj->m_FileType == FILETYPE_WAV) pObj->m_FileSize += pObj->m_HeaderSize + 20; return count/pObj->m_Format.nBlockAlign; } /******************************************************************************/ UINT32 ReadHeader (struct _sWAV *pObj) { char buf[80]; // 1. 'RIFF' abprüfen fread(buf, sizeof(char), 4,pObj->pHndWavFile); buf[4]=0; if (strcmp (buf,"RIFF")) return -1; // 2. FILESIZE ermitteln fread(&pObj->m_FileSize, sizeof(UINT32), 1,pObj->pHndWavFile); // 3. 'WAVEfmt' abprüfen fread(buf, sizeof(char), 8,pObj->pHndWavFile); buf[8]=0; if (strcmp (buf,"WAVEfmt ")) return -1; // 3. HeaderSize ermitteln fread(&pObj->m_HeaderSize, sizeof(pObj->m_HeaderSize), 1,pObj->pHndWavFile); // 4. Den ganzen Infoblock einlesen fread(&pObj->m_Format, pObj->m_HeaderSize, 1,pObj->pHndWavFile); // 5. 'data' abprüfen fseek(pObj->pHndWavFile,(INT32)(pObj->m_HeaderSize+20), SEEK_SET); fread(buf, sizeof(char), 4, pObj->pHndWavFile); buf[4]=0; if (strcmp (buf,"data")) return -1; // 6. Datenlänge ermitteln fread(&pObj->m_DataSize, sizeof(pObj->m_DataSize), 1,pObj->pHndWavFile); return 0; } /******************************************************************************/ UINT32 WriteHeader (struct _sWAV *pObj) { pObj->m_HeaderSize = bs; pObj->m_FileSize = pObj->m_HeaderSize + pObj->m_DataSize + 20; fseek(pObj->pHndWavFile,0L, SEEK_SET); // 1. 'RIFF' schreiben fwrite("RIFF",sizeof(char), 4, pObj->pHndWavFile); // 2. FILESIZE schreiben fwrite(&pObj->m_FileSize, sizeof(pObj->m_FileSize), 1, pObj->pHndWavFile); // 3. 'WAVEfmt ' schreiben fwrite("WAVEfmt ", sizeof(char), 8, pObj->pHndWavFile); // 3. HeaderSize schreiben fwrite(&pObj->m_HeaderSize, sizeof(pObj->m_HeaderSize), 1, pObj->pHndWavFile); // 4. Infoblock schreiben fwrite(&pObj->m_Format, pObj->m_HeaderSize, 1, pObj->pHndWavFile); // 5. 'data' schreiben fseek(pObj->pHndWavFile, (INT32)(pObj->m_HeaderSize+20), SEEK_SET); fwrite("data",sizeof(char), 4, pObj->pHndWavFile); // 6. Datenlänge schreiben fwrite(&pObj->m_DataSize, sizeof(pObj->m_DataSize), 1, pObj->pHndWavFile); return 0; } /******************************************************************************/