244 lines
6.3 KiB
C++
244 lines
6.3 KiB
C++
/*==========================================================================
|
|
*
|
|
* Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: MixerUtils.cpp
|
|
* Content: Utility functions for mixing audio
|
|
*
|
|
* History:
|
|
* Date By Reason
|
|
* ==== == ======
|
|
* 07/06/99 rodtoll Created It
|
|
*
|
|
***************************************************************************/
|
|
|
|
#include "dxvoicepch.h"
|
|
|
|
|
|
#define DPV_MAX_SHORT ((SHORT)32767)
|
|
#define DPV_MIN_SHORT ((SHORT)-32768)
|
|
|
|
#define DPV_MAX_BYTE 127
|
|
#define DPV_MIN_BYTE 0
|
|
|
|
// "Mixer Buffer"
|
|
//
|
|
// Throughout this module we refer to a "mixer buffer". A mixer buffer is a
|
|
// buffer of higher resolution then a traditional audio buffer which is used
|
|
// for mixing audio. In the case of this module a mixer buffer promotes
|
|
// each sample to a DWORD. So audio is mixed in a "mixer buffer" and then
|
|
// converted back to the approrpriate sample size.
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "FillBufferWithSilence"
|
|
// FillBufferWithSilence
|
|
//
|
|
// This function fills a mixer buffer with the appropriate bytes to make it
|
|
// equivalent to silence.
|
|
//
|
|
// Parameters:
|
|
// LONG *buffer -
|
|
// Pointer to the mixer buffer which will be filled with silence.
|
|
// BOOL eightBit -
|
|
// Is the audio we're mixing 8 bit? (Set to TRUE for 8 bit)
|
|
// LONG frameSize -
|
|
// The number of samples the mixer buffer consists of.
|
|
//
|
|
// Returns:
|
|
// N/A
|
|
//
|
|
void FillBufferWithSilence( LONG *buffer, BOOL eightBit, LONG frameSize )
|
|
{
|
|
LONG mixerSize = frameSize;
|
|
|
|
// If we're working with 16 bit then the number of samples is half the
|
|
// number of bytes in a frame.
|
|
if( !eightBit )
|
|
{
|
|
mixerSize >>= 1;
|
|
}
|
|
|
|
BYTE silenceByte = (eightBit) ? 0x80 : 0x00;
|
|
|
|
// Set the mixer buffer to silence
|
|
memset( buffer, silenceByte, mixerSize << 2 );
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "MixIn8BitBuffer"
|
|
// MixIn8BitBuffer
|
|
//
|
|
// This function mixes an 8-bit buffer with an existing mixer buffer.
|
|
//
|
|
// Parameters:
|
|
// LONG *mixerBuffer -
|
|
// Pointer to the mixer buffer
|
|
// BYTE *sourceBuffer -
|
|
// Pointer to the buffer which will be mixed into the mixer buffer
|
|
// LONG frameSize -
|
|
// The size, in bytes of the source Buffer. (Also = # of samples)
|
|
//
|
|
// Returns:
|
|
// N/A
|
|
//
|
|
void MixIn8BitBuffer( LONG *mixerBuffer, BYTE *sourceBuffer, LONG frameSize )
|
|
{
|
|
LONG mixerSize = frameSize;
|
|
|
|
for( int index = 0; index < mixerSize; index++ )
|
|
{
|
|
mixerBuffer[index] += sourceBuffer[index];
|
|
}
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "MixIn16BitBuffer"
|
|
// MixIn16BitBuffer
|
|
//
|
|
// This function mixes a 16-bit buffer with an existing mixer buffer.
|
|
//
|
|
// Parameters:
|
|
// LONG *mixerBuffer -
|
|
// Pointer to the mixer buffer
|
|
// SHORT *sourceBuffer -
|
|
// Pointer to the buffer which will be mixed into the mixer buffer
|
|
// LONG frameSize -
|
|
// The size, in bytes of the source Buffer. (Since the sourceBuffer
|
|
// is 16 bit, the number of samples is # of bytes / 2).
|
|
//
|
|
// Returns:
|
|
// N/A
|
|
//
|
|
void MixIn16BitBuffer( LONG *mixerBuffer, SHORT *sourceBuffer, LONG frameSize )
|
|
{
|
|
LONG mixerSize = frameSize >> 1;
|
|
|
|
for( int index = 0; index < mixerSize; index++ )
|
|
{
|
|
mixerBuffer[index] += sourceBuffer[index];
|
|
}
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "MixInBuffer"
|
|
// MixInBitBuffer
|
|
//
|
|
// This function mixes an 8 or 16-bit buffer with an existing mixer buffer.
|
|
//
|
|
// Parameters:
|
|
// LONG *mixerBuffer -
|
|
// Pointer to the mixer buffer
|
|
// BYTE *sourceBuffer -
|
|
// Pointer to the buffer which will be mixed into the mixer buffer
|
|
// LONG frameSize -
|
|
// The size, in bytes of the source Buffer.
|
|
//
|
|
// Returns:
|
|
// N/A
|
|
//
|
|
void MixInBuffer( LONG *mixerBuffer, BYTE *sourceBuffer, BOOL eightBit, LONG frameSize )
|
|
{
|
|
if( eightBit )
|
|
{
|
|
MixIn8BitBuffer( mixerBuffer, sourceBuffer, frameSize );
|
|
}
|
|
else
|
|
{
|
|
MixIn16BitBuffer( mixerBuffer, (SHORT *) sourceBuffer, frameSize );
|
|
}
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "Normalize16BitBuffer"
|
|
// Normalize16BitBuffer
|
|
//
|
|
// This function takes the "mixer buffer" and transfers the result of
|
|
// the mix back to a 16-bit audio buffer.
|
|
//
|
|
// Parameters:
|
|
// SHORT *targetBuffer -
|
|
// Pointer to the buffer which where the mixed audio will be placed
|
|
// LONG *mixerBuffer -
|
|
// Pointer to the mixer buffer
|
|
// LONG frameSize -
|
|
// The size, in bytes of the target buffer.
|
|
//
|
|
// Returns:
|
|
// N/A
|
|
//
|
|
void Normalize16BitBuffer( SHORT *targetBuffer, LONG *mixerBuffer, LONG frameSize )
|
|
{
|
|
LONG mixerSize = frameSize >> 1;
|
|
|
|
for( int index = 0; index < mixerSize; index++ )
|
|
{
|
|
// Clip mixed audio, ensure it does not exceed range
|
|
if( mixerBuffer[index] >= DPV_MAX_SHORT )
|
|
targetBuffer[index] = DPV_MAX_SHORT;
|
|
else if( mixerBuffer[index] <= DPV_MIN_SHORT )
|
|
targetBuffer[index] = DPV_MIN_SHORT;
|
|
else
|
|
targetBuffer[index] = (SHORT) mixerBuffer[index]; // / noiseCount;
|
|
}
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "Normalize8BitBuffer"
|
|
// Normalize8BitBuffer
|
|
//
|
|
// This function takes the "mixer buffer" and transfers the result of
|
|
// the mix back to an 8-bit audio buffer.
|
|
//
|
|
// Parameters:
|
|
// BYTE *targetBuffer -
|
|
// Pointer to the buffer which where the mixed audio will be placed
|
|
// LONG *mixerBuffer -
|
|
// Pointer to the mixer buffer
|
|
// LONG frameSize -
|
|
// The size, in bytes of the target buffer.
|
|
//
|
|
// Returns:
|
|
// N/A
|
|
//
|
|
void Normalize8BitBuffer( BYTE *targetBuffer, LONG *mixerBuffer, LONG frameSize )
|
|
{
|
|
LONG mixerSize = frameSize;
|
|
|
|
for( int index = 0; index < mixerSize; index++ )
|
|
{
|
|
targetBuffer[index] = (BYTE) mixerBuffer[index]; /// noiseCount;
|
|
}
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "NormalizeBuffer"
|
|
// NormalizeBuffer
|
|
//
|
|
// This function takes the "mixer buffer" and transfers the result of
|
|
// the mix back to an 8-bit or 160bit audio buffer.
|
|
//
|
|
// Parameters:
|
|
// BYTE *targetBuffer -
|
|
// Pointer to the buffer which where the mixed audio will be placed
|
|
// LONG *mixerBuffer -
|
|
// Pointer to the mixer buffer
|
|
// BOOL eightBit -
|
|
// If the buffer is 8-bit, set this to TRUE, set to FALSE for 16-bit
|
|
// LONG frameSize -
|
|
// The size, in bytes of the target buffer.
|
|
//
|
|
// Returns:
|
|
// N/A
|
|
//
|
|
void NormalizeBuffer( BYTE *targetBuffer, LONG *mixerBuffer, BOOL eightBit, LONG frameSize )
|
|
{
|
|
if( eightBit )
|
|
{
|
|
Normalize8BitBuffer( targetBuffer, mixerBuffer, frameSize );
|
|
}
|
|
else
|
|
{
|
|
Normalize16BitBuffer( (SHORT *) targetBuffer, mixerBuffer, frameSize );
|
|
}
|
|
}
|