/*! * * \brief Read header from a WAVEfile. Host endianess is handled accordingly. * \wav->fp filepointer of type FILE*. * \wavinfo SWavInfo struct where the decoded header info is stored into. * \return 0 on success and non-zero on failure. * */ INT WAV_InputOpen (HANDLE_WAV *pWav, const char *filename) { HANDLE_WAV wav = (HANDLE_WAV)FDKcalloc(1, sizeof(struct WAV)); INT offset; if (wav == NULL) { FDKprintfErr("WAV_InputOpen(): Unable to allocate WAV struct.\n"); goto error; } wav->fp = FDKfopen(filename, "rb"); if (wav->fp == NULL) { FDKprintfErr("WAV_InputOpen(): Unable to open wav file. %s\n", filename); goto error; } /* read RIFF-chunk */ if (FDKfread(&(wav->header.riffType), 1, 4, wav->fp) != 4) { FDKprintfErr("WAV_InputOpen(): couldn't read RIFF_ID\n"); goto error; /* bad error "couldn't read RIFF_ID" */ } if (FDKstrncmp("RIFF", wav->header.riffType, 4)) { FDKprintfErr("WAV_InputOpen(): RIFF descriptor not found.\n") ; goto error; } /* Read RIFF size. Ignored. */ FDKfread_EL(&(wav->header.riffSize), 4, 1, wav->fp); /* read WAVE-chunk */ if (FDKfread(&wav->header.waveType, 1, 4, wav->fp) !=4) { FDKprintfErr("WAV_InputOpen(): couldn't read format\n"); goto error; /* bad error "couldn't read format" */ } if (FDKstrncmp("WAVE", wav->header.waveType, 4)) { FDKprintfErr("WAV_InputOpen(): WAVE chunk ID not found.\n") ; goto error; } /* read format-chunk */ if (FDKfread(&(wav->header.formatType), 1, 4, wav->fp) != 4) { FDKprintfErr("WAV_InputOpen(): couldn't read format_ID\n"); goto error; /* bad error "couldn't read format_ID" */ } if (FDKstrncmp("fmt", wav->header.formatType, 3)) { FDKprintfErr("WAV_InputOpen(): fmt chunk format not found.\n") ; goto error; } FDKfread_EL(&wav->header.formatSize, 4, 1, wav->fp); /* should be 16 for PCM-format (uncompressed) */ /* read info */ FDKfread_EL(&(wav->header.compressionCode), 2, 1, wav->fp); FDKfread_EL(&(wav->header.numChannels), 2, 1, wav->fp); FDKfread_EL(&(wav->header.sampleRate), 4, 1, wav->fp); FDKfread_EL(&(wav->header.bytesPerSecond), 4, 1, wav->fp); FDKfread_EL(&(wav->header.blockAlign), 2, 1, wav->fp); FDKfread_EL(&(wav->header.bitsPerSample), 2, 1, wav->fp); offset = wav->header.formatSize - 16; /* Wave format extensible */ if (wav->header.compressionCode == 0xFFFE) { static const UCHAR guidPCM[16] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }; USHORT extraFormatBytes, validBitsPerSample; UCHAR guid[16]; INT i; /* read extra bytes */ FDKfread_EL(&(extraFormatBytes), 2, 1, wav->fp); offset -= 2; if (extraFormatBytes >= 22) { FDKfread_EL(&(validBitsPerSample), 2, 1, wav->fp); FDKfread_EL(&(wav->channelMask), 4, 1, wav->fp); FDKfread_EL(&(guid), 16, 1, wav->fp); /* check for PCM GUID */ for (i = 0; i < 16; i++) if (guid[i] != guidPCM[i]) break; if (i == 16) wav->header.compressionCode = 0x01; offset -= 22; } } /* Skip rest of fmt header if any. */ for (;offset > 0; offset--) { FDKfread(&wav->header.formatSize, 1, 1, wav->fp); } do { /* Read data chunk ID */ if (FDKfread(wav->header.dataType, 1, 4, wav->fp) != 4) { FDKprintfErr("WAV_InputOpen(): Unable to read data chunk ID.\n"); FDKfree(wav); goto error; } /* Read chunk length. */ FDKfread_EL(&offset, 4, 1, wav->fp); /* Check for data chunk signature. */ if (FDKstrncmp("data", wav->header.dataType, 4) == 0) { wav->header.dataSize = offset; break; } /* Jump over non data chunk. */ for (;offset > 0; offset--) { FDKfread(&(wav->header.dataSize), 1, 1, wav->fp); } } while (!FDKfeof(wav->fp)); /* return success */ *pWav = wav; return 0; /* Error path */ error: if (wav) { if (wav->fp) { FDKfclose(wav->fp); wav->fp = NULL; } FDKfree(wav); } *pWav = NULL; return -1; }
void FDKafree (void *ptr) { void *addr; addr = *(((void**)ptr)-1); /* Get pointer to malloc'ed memory. */ FDKfree(addr); /* Free malloc'ed memory area. */ }
void FDKfree_L (void *p) { FDKfree(p); }
INT IIS_ScanCmdl(INT argc, TEXTCHAR* argv[], const TEXTCHAR* str, ...) { INT i = 0; INT found_and_set = 0; INT nArgs = 0; INT* switches_used = 0; INT* b_str_opt = 0; TEXTCHAR* s_str = 0; TEXTCHAR* c_str_type = 0; TEXTCHAR* str_clean = 0; va_list ap; if (argc == 0 || argc == 1) { FDKprintf("No command line arguments\n"); goto bail; } str_clean = (TEXTCHAR*) FDKcalloc((unsigned int)_tcslen(str), sizeof(TEXTCHAR)); if (str_clean == NULL) { FDKprintf("Error allocating memory line %d, file %s\n", __LINE__, __FILE__); return 0; } RemoveWhiteSpace(str, str_clean ); GetNumberOfArgs(str_clean, &nArgs); b_str_opt = (INT*) FDKcalloc(nArgs, sizeof(INT)); s_str = (TEXTCHAR*) FDKcalloc(nArgs*CMDL_MAX_ARGC, sizeof(TEXTCHAR) ); c_str_type = (TEXTCHAR*) FDKcalloc(nArgs, sizeof(TEXTCHAR)); switches_used = (INT*) FDKcalloc(argc, sizeof(INT)); if (b_str_opt == NULL || s_str == NULL || c_str_type == NULL || switches_used == NULL) { FDKprintf("Error allocating memory line %d, file %s\n", __LINE__, __FILE__); goto bail; } if ( ParseString( str_clean, b_str_opt, s_str, c_str_type )) { goto bail; } va_start(ap, str); for ( i = 0; i < nArgs; i++ ) { TEXTCHAR arg[CMDL_MAX_STRLEN] = {L'\0'}; TEXTCHAR* p_arg = arg; TEXTCHAR* current_str = &(s_str[i*CMDL_MAX_ARGC]); if (GetArgFromString(argc, argv, current_str, c_str_type[i], arg, switches_used ) && !b_str_opt[i] ) { #ifdef _UNICODE _ftprintf(stderr, _TEXT("\n\nError: Parsing argument for required switch '%ls'.\n" ), current_str); #else _ftprintf(stderr, _TEXT("\n\nError: Parsing argument for required switch '%s'.\n" ), current_str); #endif found_and_set = 0; goto bail; } if (CheckArg(p_arg, s_str, nArgs, c_str_type[i], current_str)) { goto bail; } switch (c_str_type[i] ) { case 's': { TEXTCHAR* tmp; tmp = va_arg(ap, TEXTCHAR*); if ( arg[0] == '\0' ) break; _tcsncpy( tmp, arg, CMDL_MAX_STRLEN ); /* Remove quotes. Windows Mobile Workaround. */ removeQuotes(tmp); found_and_set++; break; } case 'd': { INT* tmp = va_arg(ap, INT*); if ( arg[0] == '\0' ) break; *tmp = _tcstol(arg, NULL, 0); found_and_set++; break; } case 'c': { char* tmp = va_arg(ap, char*); if ( arg[0] == '\0' ) break; *tmp = *arg; found_and_set++; break; } case 'u': { UCHAR* tmp = va_arg(ap, UCHAR*); if ( arg[0] == '\0' ) break; *tmp = _tstoi(arg); found_and_set++; break; } case 'f': { float* tmp = (float*) va_arg( ap,double*); if ( arg[0] == '\0' ) break; *tmp = (float) _tstof(arg); found_and_set++; break; } case 'y': // support 'data type double' { double* tmp = (double*) va_arg( ap,double*); // use sscanf instead _tstof because of gcc //_tstof(arg,"%lf",tmp); // '%lf' reads as double *tmp = _tstof(arg); // '%lf' reads as double found_and_set++; break; } case '1': { INT* tmp = va_arg( ap, INT*); if ( arg[0] == '\0' ) break; *tmp = 1; found_and_set++; break; } default: FDKprintfErr("Bug: unsupported data identifier \"%c\"\n", c_str_type[i]); break; } } va_end(ap); CheckForUnusedSwitches(argc, /*argv,*/ switches_used); bail: if (b_str_opt) FDKfree(b_str_opt); if (s_str) FDKfree(s_str); if (c_str_type) FDKfree(c_str_type); if (str_clean) FDKfree(str_clean); if (switches_used) FDKfree(switches_used); return found_and_set; }