check_nsp

Digital Signal Processing Library

Voice Lab

Program name: check_nsp

Language: C

In file: file_lib.c

Objective: Read header and extract values from data file.

Usage: int check_nsp(FILE *in_file_ptr, int *data_length, int *sample_rate);

Parameters:

  • in_file - FILE Pointer to open file to process.
  • data_length - Length of data word - typically 2 bytes.
  • sample_rate - number of bits per sample - typically 16.
Return:
  • header_length

Mathematical Description:

Comments: Routine is used to read header of NSP data file and return a few parameters

User Comments

Code:

int check_nsp(FILE *in_file_ptr, int *data_length, int *sample_rate)
{
        int header_length;
        int size, i, quit;
        char c, header[MAX_HEADER_LENGTH], month[20], day[20], hour[30], year[30], txt[120];

        (*sample_rate) = -1;

        /* information on header format taken from http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/CSL/CSL.html */
        fseek(in_file_ptr,0,0);
        fread(header, sizeof(char), 4, in_file_ptr);
        if(strncmp(header, "FORM", strlen("FORM")) != 0) {
                /* file is not NSP */
                fseek(in_file_ptr,0,0);
                return(0);
        }

        fread(header, sizeof(char), 4, in_file_ptr);
        /* The chunk identifier DS16 indicates that the sound data is 16-bit integer. */
        if(strncmp(header, "DS16", strlen("DS16")) != 0) {
                /* file is not valid NSP */
                fseek(in_file_ptr,0,0);
                return(0);
        }
        (*data_length) = 2;

        fread(&size, sizeof(char), 4, in_file_ptr);

        fread(header, sizeof(char), 4, in_file_ptr);
        if(strncmp(header, "HEDR", strlen("HEDR")) != 0) {
                /* file is not valid NSP */
                fseek(in_file_ptr,0,0);
                return(0);
        }

        fread(&size, sizeof(char), 4, in_file_ptr);

        fscanf(in_file_ptr, "%s ", &month);

        fscanf(in_file_ptr, "%s ", &day);

        fscanf(in_file_ptr, "%s ", &hour);

        fread(header, sizeof(char), 4, in_file_ptr);
        header[4] = '\0';
        sscanf(header, "%s ", &year);

        printf("Date: %s %s %s\n", day, month, year);
        printf("Time: %s\n", hour);

        fread(&(*sample_rate), sizeof(char), 4, in_file_ptr);
        printf("Sample Rate: %d\n", (*sample_rate));

        fread(&size, sizeof(char), 4, in_file_ptr);

        fread(&size, sizeof(char), 2, in_file_ptr);

        fread(&size, sizeof(char), 2, in_file_ptr);

        fread(header, sizeof(char), 4, in_file_ptr);
        if(strncmp(header, "NOTE", strlen("NOTE")) != 0) {
                /* file is not valid NSP */
                header[4] = '\0';
                printf("string = %s\n", header);
                fseek(in_file_ptr,0,0);
                (*sample_rate) = -1;
                return(0);
        }

        fread(&size, sizeof(char), 4, in_file_ptr);

        /* make size end on an even boundary */
        if(size%2) size++;

        if(size >= MAX_HEADER_LENGTH) {
                fprintf(stderr, "Please increase MAX_HEADER_LENGTH to at least %d and re-compile programs\n", size+1);
                exit(1);
        }

        for(i = 0; i < size; i++) {
                fread(&c, sizeof(char), 1, in_file_ptr);
                header[i] = c;
        }
        header[i] = '\0';

        fread(header, sizeof(char), 4, in_file_ptr);
        header[4] = '\0';

        fread(&size, sizeof(char), 4, in_file_ptr);
        printf("Data segment length = %d\n", size);

        header_length = ftell(in_file_ptr);
        return(header_length);
}