windows-nt/Source/XPSP1/NT/multimedia/directx/dplay/dvoice/dxvutils/wiutils.cpp
2020-09-26 16:20:57 +08:00

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;
}