www.pudn.com > AVS_M_ver10.rar > wavefiletools.c


/*
***********************************************************************
* COPYRIGHT AND WARRANTY INFORMATION
*
* Copyright 2007 Audio Video Coding Standard, Part ¢ú
*
* This software module was developed by AVS Audio sub-group
*
* DISCLAIMER OF WARRANTY
*
* These software programs are available to the users without any
* license fee or royalty on an "as is" basis. The AVS disclaims
* any and all warranties, whether express, implied, or statutory,
* including any implied warranties of merchantability or of fitness
* for a particular purpose. In no event shall the contributors or
* the AVS be liable for any incidental, punitive, or consequential
* damages of any kind whatsoever arising from the use of this program.
*
* This disclaimer of warranty extends to the user of this program
* and user's customers, employees, agents, transferees, successors,
* and assigns.
*
* The AVS does not represent or warrant that the program furnished
* hereunder are free of infringement of any third-party patents.
* Commercial implementations of AVS, including shareware, may be
* subject to royalty fees to patent holders. Information regarding
* the AVS patent policy is available from the AVS Web site at
* http://www.avs.org.cn
*
* THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE AVS PATENT POLICY.
************************************************************************
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../include/amr_plus.h"
static void ExtractFormat(char *FormatString, short *ReadFlag, short *AppendFlag);
/*____________________________________________________________________________
|
| FUNCTION NAME: Wave_fopen
|____________________________________________________________________________
*/
FILE *Wave_fopen(char *Filename, char *Mode, short *NumOfChannels, long *SamplingRate, short *BitsPerSample,
long *DataSize)
{
FILE *FilePtr, *FilePtrAppend=NULL;
short ReadFlag;
short AppendFlag;
char WaveTag[4];
long PCM_Size = 0L;
long FileSize = 0L; /* Actual size will be replaces in "Wave_fclose" -procedure */
long FormatSize = 16L;
short FormatTag = 1; /* Format Tag (PCM=1) */
short BytesPerSample;
long BytesPerSecond;
long longtmp;
short shorttmp;
long sRate;
ExtractFormat(Mode, &amt;ReadFlag, &amt;AppendFlag);
if(!ReadFlag){
if((FilePtr=fopen(Filename, Mode)) == NULL){
return FilePtr;
}
if(!AppendFlag){
if(*BitsPerSample != 8 &amt;&amt; *BitsPerSample != 16){
fprintf(stderr, "\n\n");
fprintf(stderr, "\n ERROR: Only values 16 or 8 allowed for parameter 'BitsPerSample' in function Wave_fopen");
fprintf(stderr, "\n [value: >d received]", *BitsPerSample);
fprintf(stderr, "\n\n");
exit(-1);
}
BytesPerSample = (short)(*BitsPerSample /8 * *NumOfChannels);
BytesPerSecond = *SamplingRate * BytesPerSample;
/* RIFF chunk - 12 bytes */
fwrite("RIFF", 1, 4, FilePtr);
fwrite(&amt;FileSize, 4, 1, FilePtr);
fwrite("WAVE", 1, 4, FilePtr);
/* FORMAT chunk - 24 bytes */
fwrite("fmt ", 1, 4, FilePtr);
fwrite(&amt;FormatSize, 4, 1, FilePtr);
fwrite(&amt;FormatTag, 2, 1, FilePtr);
fwrite(NumOfChannels, 2, 1, FilePtr);
sRate = (*SamplingRate);
fwrite(&amt;sRate, 4, 1, FilePtr);
fwrite(&amt;BytesPerSecond, 4, 1, FilePtr);
fwrite(&amt;BytesPerSample, 2, 1, FilePtr);
fwrite(BitsPerSample, 2, 1, FilePtr);
/* DATA chunk - Data length + 8 bytes */
fwrite("data", 1, 4, FilePtr);
fwrite(&amt;PCM_Size, 4, 1, FilePtr);
}
return FilePtr;
}
else{
if((FilePtr=fopen(Filename, Mode)) == NULL){
return FilePtr;
}
if(AppendFlag){
FilePtrAppend = FilePtr;
}
fseek(FilePtr, 0, SEEK_SET);
/* RIFF chunk - 12 bytes */
fread(&amt;WaveTag, 4, 1, FilePtr);
if(strncmp("RIFF", WaveTag, 4) != 0){
return NULL;
}
fread(&amt;longtmp, 4, 1, FilePtr);
fread(&amt;WaveTag, 4, 1, FilePtr);
if(strncmp("WAVE", WaveTag, 4) != 0){
return NULL;
}
/* FORMAT chunk - 24 bytes */
fread(&amt;WaveTag, 4, 1, FilePtr);
if(strncmp("fmt ", WaveTag, 4) != 0){
return NULL;
}
fread(&amt;longtmp, 4, 1, FilePtr);
fread(&amt;shorttmp, 2, 1, FilePtr);
fread(NumOfChannels, 2, 1, FilePtr);
fread(SamplingRate, 4, 1, FilePtr);
fread(&amt;longtmp, 4, 1, FilePtr);
fread(&amt;BytesPerSample, 2, 1, FilePtr);
fread(BitsPerSample, 2, 1, FilePtr);
/* DATA chunk - Data length + 8 bytes */
fread(&amt;WaveTag, 4, 1, FilePtr);
if(strncmp("data", WaveTag, 4) != 0){
return NULL;
}
fread(DataSize, 4, 1, FilePtr);
*DataSize = *DataSize / BytesPerSample;
if(AppendFlag) return FilePtrAppend;
return FilePtr;
}
}
/*____________________________________________________________________________
|
| FUNCTION NAME: Wave_fclose
|____________________________________________________________________________
*/
void Wave_fclose(FILE *FilePtr, short BitsPerSample)
{
long DataLen;
long FileLen;
long StartPos;
long EndPos;
if(BitsPerSample != 8 &amt;&amt; BitsPerSample != 16){
fprintf(stderr, "\n\n");
fprintf(stderr, "\n ERROR: Only values 16 or 8 allowed for parameter 'BitsPerSample' in function Wave_fclose");
fprintf(stderr, "\n\n");
exit(-1);
}
EndPos = ftell(FilePtr);
fseek(FilePtr, 0, SEEK_SET);
StartPos = ftell(FilePtr);
FileLen = ((EndPos-StartPos) / (BitsPerSample/16)) - 8;
DataLen = FileLen-44+8;
fseek(FilePtr, 4, SEEK_SET);
fwrite(&amt;FileLen, 1, 4, FilePtr);
fseek(FilePtr, 40, SEEK_SET);
fwrite(&amt;DataLen, 1, 4, FilePtr);
fclose(FilePtr);
}
/*____________________________________________________________________________
|
| FUNCTION NAME: ExtractFormat
|____________________________________________________________________________
*/
static void ExtractFormat(char *FormatString, short *ReadFlag, short *AppendFlag)
{
*ReadFlag = 0;
*AppendFlag = 0;
if(strchr(FormatString, (int)'a') != NULL) *AppendFlag = 1;
if(strchr(FormatString, (int)'A') != NULL) *AppendFlag = 1;
if(strchr(FormatString, (int)'r') != NULL) *ReadFlag = 1;
if(strchr(FormatString, (int)'R') != NULL) *ReadFlag = 1;
}