Domanda

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.

È stato utile?

Soluzione

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;
}

Altri suggerimenti

"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;

  /* ... */
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top