Reputation: 1627
I have to normalize .wav
audio file. Succeeded to get metadata (the first 44 bytes) from the file (ChunkID
, ChunkSize
, Format
, fmt
and so on.) so I can find out how many channels are there (NumChannels
) or BitPerSaple
etc.
Now I have to copy all samples' data into dynamically allocated array but I don't know how to get the file's size (for using in malloc()
function).
Here is the code (if it will help):
#include <stdio.h>
#include <stdlib.h>
#define hdr_SIZE 44
typedef struct FMT
{
char SubChunk1ID[4];
int SubChunk1Size;
short int AudioFormat;
short int NumChannels;
int SampleRate;
int ByteRate;
short int BlockAlign;
short int BitsPerSample;
} fmt;
typedef struct DATA
{
char Subchunk2ID[4];
int Subchunk2Size;
int Data[441000];
} data;
typedef struct HEADER
{
char ChunkID[4];
int ChunkSize;
char Format[4];
fmt S1;
data S2;
} header;
int main()
{
char nameIn[255], nameOut[255];
printf("Enter the names of input and output files including file extension:\n");
scanf ("%s", nameIn);
//printf("%s\n", nameIn);
scanf ("%s", nameOut);
//printf("%s\n", nameOut);
FILE *input = fopen( nameIn, "rb");
FILE *output = fopen( nameOut, "wb");
header hdr;
if(input == NULL)
{
printf("Unable to open wave file (input)\n");
exit(EXIT_FAILURE);
}
fread(&hdr, sizeof(char), hdr_SIZE, input);
/* Displaying file's metadata (chunks). */
printf("\n*********************************\n");
printf("WAVE file's metadata:\n\n");
printf("%4.4s\n", hdr.ChunkID );
printf("%d\n", hdr.ChunkSize );
printf("%4.4s\n", hdr.Format );
printf("%4.4s\n", hdr.S1.SubChunk1ID );
printf("%d\n", hdr.S1.SubChunk1Size );
printf("%d\n", hdr.S1.AudioFormat );
printf("%d\n", hdr.S1.NumChannels );
printf("%d\n", hdr.S1.SampleRate );
printf("%d\n", hdr.S1.ByteRate );
printf("%d\n", hdr.S1.BlockAlign );
printf("%d\n", hdr.S1.BitsPerSample );
printf("%4.4s\n", hdr.S2.Subchunk2ID );
printf("%d\n", hdr.S2.Subchunk2Size );
printf("\n*********************************\n");
/* Dead end... =( */
fclose(input);
fclose(output);
return 0;
}
OS Windows 7; Code::Blocks IDE.
UPDATE (SOLUTION!):
As it turned out, I had already had the samples' size value (Subchunk2Size
). So in my case I just have to use hdr.S2.Subchunk2Size
for the malloc()
function.
Upvotes: 0
Views: 2381
Reputation: 3097
stat
-less implementation to find file-size is,
long get_file_size( char *filename )
{
FILE *fp;
long n;
/* Open file */
fp = fopen(filename, "rb");
/* Ignoring error checks */
/* Find end of file */
fseek(fp, 0L, SEEK_END);
/* Get current position */
n = ftell(fp);
/* Close file */
fclose(fp);
/* Return the file size*/
return n;
}
Upvotes: 1
Reputation: 883
"how to get the file's size": use stat(2)
:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
long get_file_size(int fd)
{
struct stat st;
if (fstat(fd, &st) == -1)
return -1; /* error.. */
return (long) st.st_size;
}
int main()
{
/* ... */
long data_size;
data_size = get_file_size(fileno(input)) - hdr_SIZE;
/* ... */
}
Upvotes: 1