www.pudn.com > audiocapture.zip > Wav.h, change:2001-04-19,size:5217b


/*=========================================================================*/ 
/*     Sistema de entrada/sal¤ida para ficheros de sonido en formato WAV   */ 
/*                    (s¢lo formato mono de 8 bits)                        */ 
/*=========================================================================*/ 
 
 
/* Include */ 
#include <string.h> 
#include <stdio.h> 
 
 
/* Prototipos de las funciones */ 
int WAV_ReadFile(char *Name, int *Frequency, long *Size, char far *Sample); 
void WAV_WriteFile(char *Name, int Frequency, long Size, char far *Sample); 
 
 
/*----------------Offsets para las diferentes partes--------------------*/ 
 
/* RIFF File Format */ 
#define rID             0x00 
#define rLen            0x04 
#define rData           0x08 
 
/* WAVE Form Definition */ 
#define wID             0x00 
#define FormatChunk     0x04 
#define DataChunk       0x1C 
 
/* Format Chunk */ 
#define fId             0x00 
#define fLen            0x04 
#define wFormatTag      0x08 
#define nChannels       0x0A 
#define nSamplesPerSec  0x0C 
#define nAvgBytesPerSec 0x0E 
#define nBlockAlign     0x10 
#define FormatSpecific  0x12 
 
/* Data Chunk */ 
#define dId             0x00 
#define dLen            0x04 
#define dData           0x08 
 
/* Desplazamientos absolutos */ 
#define WAVE_Chunk      rData 
#define FORMAT_Chunk    rData+FormatChunk 
#define DATA_Chunk      rData+DataChunk 
 
 
/*-----------------Funci¢n de lectura de un fichero WAV--------------------*/ 
/* Name:        nombre del fichero                                         */ 
/* Frequency:   frecuencia de reproducci¢n                                 */    
/* Size:        tama¤o del muestreo                                        */ 
/* Sample:      contador de muestreo                                       */ 
/* La funci¢n devuelve 0 si termina correctamente y 1 en caso de error     */ 
/*-------------------------------------------------------------------------*/ 
int WAV_ReadFile(char *Name, int *Frequency, long *Size, char far *Sample) 
{ 
        FILE    *Stream;        /* handle del fichero */ 
        char    tmp[10];        /* cadena temporal */ 
        long    dummy;          /* variable temporal */ 
        long    i;              /* variable del bucle */ 
 
        /* Abrir fichero */ 
	if ((Stream=fopen(Name,"rb"))==NULL) 
	{ 
                printf("ERROR: fichero <%s> no encontrado\n",Name); 
		return (1); 
	} 
	 
        /* Comprobaci¢n del formato WAV */ 
	fseek(Stream,rData,SEEK_SET); 
	fread(tmp,sizeof(char),4,Stream); 
	if (strncmp(tmp,"WAVE",4)!=0) 
	{       
                printf("ERROR: fichero <%s> formato desconocido\n",Name); 
		return (1); 
	} 
 
        /* Comprobaci¢n de que el muestreo es mono */ 
	fseek(Stream,FORMAT_Chunk+nChannels,SEEK_SET); 
	fread(tmp,sizeof(char),2,Stream); 
	if ((tmp[0]+tmp[1]*256)!=1) 
	{ 
                printf("ERROR: fichero <%s> no es mono\n",Name); 
		return (1); 
	} 
 
        /* Lectura de la frecuencia de reproducci¢n */ 
	fseek(Stream,FORMAT_Chunk+nSamplesPerSec,SEEK_SET); 
	fread(tmp,sizeof(char),2,Stream); 
	*Frequency=tmp[0]+tmp[1]*256; 
 
        /* Lectura del tama¤o del muestreo */ 
	fseek(Stream,DATA_Chunk+dLen,SEEK_SET); 
	fread(tmp,sizeof(char),4,Stream); 
	*Size=(long)(tmp[0]+(unsigned int)(tmp[1]*256)); 
	dummy=tmp[2]*65536; 
	*Size=*Size+dummy; 
 
        /* Lectura del muestreo */ 
	for (i=0; i<(*Size); i++) 
		Sample[i]=(char)fgetc(Stream); 
 
        /* Cerrar el fichero */ 
	fclose(Stream); 
 
        /* La lectura se realiza con ‚xito */ 
	return (0); 
 
} 
 
 
/*----------------Procedimiento de escritura de un fichero WAV-------------*/ 
/* Name:        nombre del fichero                                            */ 
/* Frequency:   frecuencia de reproducci¢n                                 */    
/* Size:        tama¤o del muestreo                                        */ 
/* Sample:      contador de muestreo                                       */ 
/*-------------------------------------------------------------------------*/ 
void WAV_WriteFile(char *Name, int Frequency, long Size, char far *Sample) 
{ 
        FILE    *Stream;        /* handle del fichero */ 
        long    dummy;          /* variable temporal */ 
        long    i;              /* variable ddel bucle */ 
 
        /* Abrir fichero */ 
	if ((Stream=fopen(Name,"wb"))==NULL) 
	{ 
                printf("ERROR: Imposible crear <%s> \n",Name); 
		return; 
	} 
 
        /* Escritura de las diferentes capas */ 
	dummy=Size+36; 
	fprintf(Stream,"RIFF"); 
	fwrite(&dummy,sizeof(long),1,Stream); 
	fprintf(Stream,"WAVEfmt "); 
	fputc(0x10,Stream);fputc(0x00,Stream); 
	fputc(0x00,Stream);fputc(0x00,Stream); 
	fputc(0x01,Stream);fputc(0x00,Stream); 
	fputc(0x01,Stream);fputc(0x00,Stream); 
	fwrite(&Frequency,sizeof(int),1,Stream); 
	fputc(0x00,Stream);fputc(0x00,Stream); 
	fwrite(&Frequency,sizeof(int),1,Stream); 
	fputc(0x00,Stream);fputc(0x00,Stream); 
	fputc(0x01,Stream);fputc(0x00,Stream); 
	fputc(0x08,Stream);fputc(0x00,Stream); 
	fprintf(Stream,"data"); 
	fwrite(&Size,sizeof(long),1,Stream); 
	for (i=0; i<Size; i++) 
		fputc(Sample[i],Stream); 
 
        /* Cerrar fichero */ 
	fclose (Stream); 
 
}