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

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