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

181 lines
4.7 KiB
C++

/*==========================================================================
*
* Copyright (C) 1995-1999 Microsoft Corporation. All Rights Reserved.
*
* File: misc.cpp
* Content: Misc Support Routines
* History:
*
* Date By Reason
* ==== == ======
* 10/15/99 rodtoll created it
*
***************************************************************************/
#include "dxvhelppch.h"
#undef DPF_SUBCOMP
#define DPF_SUBCOMP DN_SUBCOMP_VOICE
// MicrophoneGetVolume
//
// This function retrieves the current volume of the microphone
// recording line.
//
// Parameters:
// UINT waveInDevice -
// This specifies the device for which we wish to get
// the microphone recording volume. This is the
// waveIN device ID for the desired device.
//
// BYTE &volume -
// [output] The current volume of the microphone recording
// line for the specified device. (DSound Range)
//
// BOOL -
// true on success, false on failure
//
#undef DPF_MODNAME
#define DPF_MODNAME "MicrophoneGetVolume"
BOOL MicrophoneGetVolume( UINT waveInDevice, LONG &volume ) {
MMRESULT result;
// Open the mixer device
HMIXER hmx = NULL;
LPMIXERCONTROLDETAILS_UNSIGNED pUnsigned = NULL;
LPMIXERCONTROL pmxctrl = NULL;
bool foundMicrophone = false;
DWORD i;
if( mixerOpen(&hmx, waveInDevice, 0, 0, MIXER_OBJECTF_WAVEIN) != MMSYSERR_NOERROR )
return FALSE;
// Get the line info for the wave in destination line
MIXERLINE mxl;
mxl.cbStruct = sizeof(mxl);
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
// Now find the microphone source line connected to this wave in
// destination
DWORD cConnections = mxl.cConnections;
for(i=0; i<cConnections; i++)
{
mxl.dwSource = i;
mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_SOURCE);
if (MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE == mxl.dwComponentType)
{
foundMicrophone = true;
break;
}
}
if( !foundMicrophone )
{
for(i=0; i<cConnections; i++)
{
mxl.dwSource = i;
if( mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_SOURCE) != MMSYSERR_NOERROR )
{
return false;
}
if (MIXERLINE_COMPONENTTYPE_SRC_LINE == mxl.dwComponentType)
{
foundMicrophone = true;
break;
}
}
if( !foundMicrophone )
{
for(i=0; i<cConnections; i++)
{
mxl.dwSource = i;
if( mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_SOURCE) != MMSYSERR_NOERROR )
{
return false;
}
if (MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY == mxl.dwComponentType)
{
foundMicrophone = true;
break;
}
}
}
}
if( !foundMicrophone )
{
DPFX(DPFPREP, DVF_INFOLEVEL, "ERROR: Unable to find microphone source" );
return FALSE;
}
// Find a volume control, if any, of the microphone line
pmxctrl = new MIXERCONTROL;
if( pmxctrl == NULL )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Unable to alloc mixercontrol" );
return FALSE;
}
MIXERLINECONTROLS mxlctrl = {
sizeof(mxlctrl), mxl.dwLineID, MIXERCONTROL_CONTROLTYPE_VOLUME,
1, sizeof(MIXERCONTROL), pmxctrl
};
if( (result = mixerGetLineControls((HMIXEROBJ) hmx, &mxlctrl, MIXER_GETLINECONTROLSF_ONEBYTYPE)) == MMSYSERR_NOERROR )
{
// Found!
DWORD cChannels = mxl.cChannels;
if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
cChannels = 1;
pUnsigned = new MIXERCONTROLDETAILS_UNSIGNED[cChannels];
if( pUnsigned == NULL )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Unable to alloc unsigneds" );
delete pmxctrl;
return FALSE;
}
MIXERCONTROLDETAILS mxcd = {
sizeof(mxcd), pmxctrl->dwControlID,
cChannels, (HWND)0, sizeof(MIXERCONTROLDETAILS_UNSIGNED),
(LPVOID) pUnsigned
};
if( mixerGetControlDetails((HMIXEROBJ)hmx, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE) != MMSYSERR_NOERROR )
return false;
volume = ((pUnsigned[0].dwValue) * (DSBVOLUME_MAX-DSBVOLUME_MIN)) / 0xFFFF;
volume += DSBVOLUME_MIN;
if( mixerSetControlDetails((HMIXEROBJ)hmx, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE) != MMSYSERR_NOERROR )
return FALSE;
if( mixerClose(hmx) != MMSYSERR_NOERROR )
return FALSE;
delete pmxctrl;
delete [] pUnsigned;
return TRUE;
}
else
{
return FALSE;
}
}