299 lines
9 KiB
C++
299 lines
9 KiB
C++
/*==========================================================================
|
|
*
|
|
* 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;
|
|
}
|
|
|