/*========================================================================== * * Copyright (C) 1999 Microsoft Corporation. All Rights Reserved. * * File: wirecs.cpp * Content: * This module contains the implementation of the WaveInException class * the recording format db. * * History: * Date By Reason * ==== == ====== * 07/16/99 rodtoll Created * 08/25/99 rodtoll General Cleanup/Modifications to support new * compression sub-system. * 09/03/99 rodtoll Fixed WaveFormatToString * 09/20/99 rodtoll Updated to check for memory allocation failures * 10/05/99 rodtoll Added DPF_MODNAMES * 03/28/2000 rodtoll Removed code which was no longer used * 04/14/2000 rodtoll Fix: Bug #32498 - Updating format list to ensure that 8Khz formats are * tried first to reduce compression overhead / quality loss * ***************************************************************************/ #include "dxvutilspch.h" #undef DPF_SUBCOMP #define DPF_SUBCOMP DN_SUBCOMP_VOICE #define __VOXWARE // NUM_RECORD_FORMATS // // This define determines the number of recording formats which // will be present in the recording db. (Since they are currently // hard-coded. #define NUM_RECORD_FORMATS 16 #define MODULE_ID WAVEINUTILS // g_waveInDBInitialized // // This flag is used to report when the recording db has been initialized. BOOL g_waveInDBInitialized = FALSE; // g_pwfRecordFormats // // This is the actual record format db. It contains a list of the formats // that are tried when attempting to find a format which will allow // full duplex operation. They are listed in the order in which they // should be tried. WAVEFORMATEX **g_pwfRecordFormats; #undef DPF_MODNAME #define DPF_MODNAME "GetRecordFormat" // GetRecordFormat // // This function returns the recording format at the index specified // by index in the recording format DB. // // The recording format db must be initialized before this can be called. // // Parameters: // UINT index - // The 0-based index into the recording format db that the user // wishes to retrieve. // // Returns: // WAVEFORMATEX * - // A pointer to a WAVEFORMATEX structure describing the format // at the given index in the recording db. This will be NULL // if index >= NUM_RECORD_FORMATS or if the recording db has // not been initialized. // // WARNING: // The pointer returned is to the actual entry in the recording db and // is owned by it. Therefore the caller should not modify or free // the memory returned by the pointer. // WAVEFORMATEX *GetRecordFormat( UINT index ) { if( !g_waveInDBInitialized ) return NULL; if( index >= NUM_RECORD_FORMATS ) { return NULL; } else { return g_pwfRecordFormats[index]; } } #undef DPF_MODNAME #define DPF_MODNAME "GetNumRecordFormats" // GetNumRecordFormats // // This function returns the number of recording formats stored // in the recording format db. // // Parameters: // N/A // // Returns: // UINT - // The number of formats in the recording format db. // UINT GetNumRecordFormats() { if( !g_waveInDBInitialized ) return 0; return NUM_RECORD_FORMATS; } #undef DPF_MODNAME #define DPF_MODNAME "InitRecordFormats" // InitRecordFormats // // This function initializes the recording format db with the formats which // should be tried when initializing recording. This should be the first // function called from the recording format db. // // Parameters: // N/A // // Returns: // N/A // void InitRecordFormats() { if( g_waveInDBInitialized ) return; DPFX(DPFPREP, DVF_ENTRYLEVEL, "- WDB: Init End" ); g_pwfRecordFormats = new WAVEFORMATEX*[NUM_RECORD_FORMATS]; if( g_pwfRecordFormats == NULL ) { DPFX(DPFPREP, DVF_ERRORLEVEL, "Unable to init recordb, memory alloc failure" ); return; } g_pwfRecordFormats[0] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 8000, 16 ); g_pwfRecordFormats[1] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 8000, 8 ); g_pwfRecordFormats[2] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 11025, 16 ); g_pwfRecordFormats[3] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 22050, 16 ); g_pwfRecordFormats[4] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 44100, 16 ); g_pwfRecordFormats[5] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 11025, 8 ); g_pwfRecordFormats[6] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 22050, 8 ); g_pwfRecordFormats[7] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 44100, 8 ); g_pwfRecordFormats[8] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 8000, 16 ); g_pwfRecordFormats[9] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 8000, 8 ); g_pwfRecordFormats[10] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 11025, 16 ); g_pwfRecordFormats[11] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 22050, 16 ); g_pwfRecordFormats[12] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 44100, 16 ); g_pwfRecordFormats[13] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 11025, 8 ); g_pwfRecordFormats[14] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 22050, 8 ); g_pwfRecordFormats[15] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 44100, 8 ); /* g_pwfRecordFormats[0] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 22050, 8 ); g_pwfRecordFormats[1] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 22050, 8 ); g_pwfRecordFormats[2] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 22050, 16 ); g_pwfRecordFormats[3] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 22050, 16 ); g_pwfRecordFormats[4] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 11025, 8 ); g_pwfRecordFormats[5] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 11025, 8 ); g_pwfRecordFormats[6] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 11025, 16 ); g_pwfRecordFormats[7] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 11025, 16 ); g_pwfRecordFormats[8] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 44100, 8 ); g_pwfRecordFormats[9] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 44100, 8 ); g_pwfRecordFormats[10] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 44100, 16 ); g_pwfRecordFormats[11] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 44100, 16 ); g_pwfRecordFormats[12] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 8000, 16 ); g_pwfRecordFormats[13] = CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 8000, 8 ); g_pwfRecordFormats[14] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 8000, 16 ); g_pwfRecordFormats[15] = CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 8000, 8 ); */ g_waveInDBInitialized = TRUE; DPFX(DPFPREP, DVF_ENTRYLEVEL, "- WDB: Init End" ); } #undef DPF_MODNAME #define DPF_MODNAME "DeInitRecordFormats" // DeInitRecordFormats // // This function releases the memory associated with the recording // format DB. // // Parameters: // N/A // // Returns: // N/A // void DeInitRecordFormats() { if( g_waveInDBInitialized ) { DPFX(DPFPREP, DVF_INFOLEVEL, "- WDB: DeInit Begin" ); for( int index = 0; index < NUM_RECORD_FORMATS; index++ ) { delete g_pwfRecordFormats[index]; } delete [] g_pwfRecordFormats; DPFX(DPFPREP, DVF_INFOLEVEL, "- WDB: DeInit End" ); g_waveInDBInitialized = FALSE; } } #undef DPF_MODNAME #define DPF_MODNAME "CreateWaveFormat" // CreateWaveFormat // // This utility function is used to allocate and fill WAVEFORMATEX // structures for the various formats used. This function // currently supports the following formats: // // WAVE_FORMAT_ADPCM // WAVE_FORMAT_DSPGROUP_TRUESPEECH // WAVE_FORMAT_GSM610 // WAVE_FORMAT_LH_CODEC // WAVE_FORMAT_PCM // // The function will allocate the required memory for the sturcture // (including extra bytes) as required by the format and will fill // in all the members of the sturcture. The structure which is // returned belongs to the caller and must be deallocated by the // caller. // // Parameters: // short formatTag - // The format tag for the wav format. // // BOOL stereo - // Specify TRUE for stereo, FALSE for mono // // int hz - // Specify the sampling rate of the format. E.g. 22050 // // int bits - // Specify the number of bits / sample. E.g. 8 or 16 // // Returns: // WAVEFORMATEX * - // A pointer to a newly allocated WAVEFORMATEX structure // for the specified format, or NULL if format is not supported // WAVEFORMATEX *CreateWaveFormat( short formatTag, BOOL stereo, int hz, int bits ) { switch( formatTag ) { case WAVE_FORMAT_PCM: { WAVEFORMATEX *format = new WAVEFORMATEX; if( format == NULL ) { goto EXIT_MEMALLOC_CREATEWAV; } format->wFormatTag = WAVE_FORMAT_PCM; format->nSamplesPerSec = hz; format->nChannels = (stereo) ? 2 : 1; format->wBitsPerSample = (WORD) bits; format->nBlockAlign = (bits * format->nChannels / 8); format->nAvgBytesPerSec = format->nSamplesPerSec * format->nBlockAlign; format->cbSize = 0; return format; } break; default: DNASSERT( TRUE ); } EXIT_MEMALLOC_CREATEWAV: DPFX(DPFPREP, DVF_ERRORLEVEL, "Unable to alloc buffer for waveformat, or invalid format" ); return NULL; }