Digital Signal Processing LibraryVoice LabProgram 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:
Mathematical Description: Comments: Routine is used to read header of NSP data file and return a few parameters 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); } |
English Version > Documents and tutorials > D.Sc. projects > Routines for DSP > file_lib >