git-svn-id: http://moon:8086/svn/software/trunk/libsrc/avwavio@1 b431acfa-c32f-4a4a-93f1-934dc6c82436
212 lines
6.3 KiB
C
Executable File
212 lines
6.3 KiB
C
Executable File
/*
|
|
*-------------------------------------------------------------------------
|
|
* 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;
|
|
}
|
|
|
|
/******************************************************************************/
|