Ejemplo n.º 1
0
/*!
 *
 *  \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;
}
Ejemplo n.º 2
0
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;
}