Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

245 lines
7.6 KiB

// SpBtnCtrl.cpp : Implement SpButtonControl which is to control the speech mode and status.
//
#include "private.h"
#include "SpBtnCtrl.h"
/////////////////////////////////////////////////////////////////////////////
//
HRESULT SpButtonControl::SetDictationButton(BOOL fButtonDown, UINT uTimePressed)
{
return _SetButtonDown(DICTATION_BUTTON, fButtonDown, uTimePressed);
}
HRESULT SpButtonControl::SetCommandingButton(BOOL fButtonDown, UINT uTimePressed)
{
return _SetButtonDown(COMMANDING_BUTTON, fButtonDown, uTimePressed);
}
HRESULT SpButtonControl::_SetButtonDown(DWORD dwButton, BOOL fButtonDown, UINT uTimePressed)
{
BOOL fDictationOn = FALSE;
BOOL fCommandingOn = FALSE;
BOOL fMicrophoneOn = FALSE;
DWORD dwMyState = dwButton ? TF_COMMANDING_ON : TF_DICTATION_ON;
DWORD dwOtherState = dwButton ? TF_DICTATION_ON : TF_COMMANDING_ON;
if (uTimePressed == 0)
uTimePressed = GetTickCount();
if (m_ulButtonDownTime[1 - dwButton])
{
// Other button pressed but not released.
// In this scenario we ignore the second press since there is no perfect answer to what we could do instead.
return S_OK;
}
fMicrophoneOn = GetMicrophoneOn( );
fDictationOn = GetDictationOn( );
fCommandingOn = GetCommandingOn( );
BOOL fMyStateOn = dwButton ? fCommandingOn : fDictationOn;
BOOL fOtherStateOn = dwButton ? fDictationOn : fCommandingOn;
TraceMsg(TF_SPBUTTON, "uTimePressed=%d MicrophoneOnOff=%d", uTimePressed, fMicrophoneOn);
TraceMsg(TF_SPBUTTON, "fDictationOn=%d,fCommandingOn=%d", fDictationOn,fCommandingOn);
TraceMsg(TF_SPBUTTON, "fMyStateOn=%d, OtherStateOn=%d", fMyStateOn, fOtherStateOn);
if (fButtonDown)
{
// Button has been pressed.
if ( m_ulButtonDownTime[dwButton] )
{
TraceMsg(TF_SPBUTTON, "Double down event on speech button");
return S_OK;
}
// Now we store the time to detect a press-and-hold.
m_ulButtonDownTime[dwButton] = uTimePressed;
if (fMicrophoneOn)
{
// Microphone is ON
if (fCommandingOn && fDictationOn)
{
// Both dictation and commanding are on.
// Switch microphone off, disable other state.
m_fMicrophoneOnAtDown[dwButton] = TRUE;
SetState(dwMyState);
}
if (fOtherStateOn)
{
// Leave microphone on, switch state.
// Need to store other state to reset if it's a press-and-hold.
m_fPreviouslyOtherStateOn[dwButton] = TRUE;
SetState(dwMyState);
}
else if (fMyStateOn)
{
// Switch microphone off.
m_fMicrophoneOnAtDown[dwButton] = TRUE;
}
else
{
// Microphone on but no state defined.
// Switch microphone off, enable dictation.
m_fMicrophoneOnAtDown[dwButton] = TRUE;
SetState(dwMyState);
}
}
else
{
// Microphone is OFF
if (fCommandingOn && fDictationOn)
{
// Both dictation and commanding are on.
// Switch microphone on, disable my state.
SetState(dwMyState);
SetMicrophoneOn(TRUE);
}
if (fOtherStateOn)
{
// Switch microphone on, switch state.
SetState(dwMyState);
SetMicrophoneOn(TRUE);
}
else if (fMyStateOn)
{
// Switch microphone on.
SetMicrophoneOn(TRUE);
}
else
{
// Microphone off and no state defined.
// Switch microphone on, enable my state.
SetState(dwMyState);
SetMicrophoneOn(TRUE);
}
}
}
else
{
// Button released.
#ifdef DEBUG
if ( m_ulButtonDownTime[dwButton] == 0 )
TraceMsg(TF_SPBUTTON, "Speech button released without being pressed.");
// Since the button has previously been pressed, the other state should not be enabled.
if ( fOtherStateOn )
TraceMsg(TF_SPBUTTON, "Other speech state incorrectly enabled on button release.");
#endif
// Will wrap after 49.7 days of continuous use.
DWORD dwTimeElapsed = uTimePressed - m_ulButtonDownTime[dwButton];
m_ulButtonDownTime[dwButton] = 0;
// Is this a quick press or a press-and-hold action?
if (dwTimeElapsed < PRESS_AND_HOLD)
{
// This is a quick release.
if (m_fMicrophoneOnAtDown[dwButton])
{
// Microphone was on at button down. Need to switch microphone off.
SetMicrophoneOn(FALSE);
}
m_fPreviouslyOtherStateOn[dwButton] = FALSE;
m_fMicrophoneOnAtDown[dwButton] = FALSE;
}
else
{
// This is a press-and-hold.
// We must either stop the microphone or return to other state.
TraceMsg(TF_SPBUTTON, "press-and-hold button!");
if (m_fPreviouslyOtherStateOn[dwButton])
{
// Other state was previously on. Leave microphone on, switch state.
TraceMsg(TF_SPBUTTON, "Other state was previously on, leave Microphone On, switch state");
SetState(dwOtherState);
m_fPreviouslyOtherStateOn[dwButton] = FALSE;
}
else
{
// Other state was not previously on. Switch microphone off.
TraceMsg(TF_SPBUTTON, "Other state was not previous on, switch microphone off");
SetMicrophoneOn(FALSE);
m_fMicrophoneOnAtDown[dwButton] = FALSE;
}
}
}
return S_OK;
}
BOOL SpButtonControl::GetDictationOn( )
{
DWORD dwGLobal;
GetCompartmentDWORD(m_pimx->_tim, GUID_COMPARTMENT_SPEECH_GLOBALSTATE, &dwGLobal, TRUE);
return (dwGLobal & TF_DICTATION_ON ) ? TRUE : FALSE;
}
BOOL SpButtonControl::GetCommandingOn( )
{
DWORD dwGLobal;
GetCompartmentDWORD(m_pimx->_tim, GUID_COMPARTMENT_SPEECH_GLOBALSTATE, &dwGLobal, TRUE);
return (dwGLobal & TF_COMMANDING_ON ) ? TRUE : FALSE;
}
HRESULT SpButtonControl::SetCommandingOn(void)
{
HRESULT hr;
DWORD dw = TF_COMMANDING_ON;
hr = SetCompartmentDWORD(m_pimx->_GetId( ), m_pimx->_tim, GUID_COMPARTMENT_SPEECH_GLOBALSTATE, dw, TRUE);
return hr;
}
HRESULT SpButtonControl::SetDictationOn(void)
{
HRESULT hr;
DWORD dw = TF_DICTATION_ON;
hr = SetCompartmentDWORD(m_pimx->_GetId( ), m_pimx->_tim, GUID_COMPARTMENT_SPEECH_GLOBALSTATE, dw, TRUE);
return hr;
}
HRESULT SpButtonControl::SetState(DWORD dwState)
{
HRESULT hr = S_OK;
if (dwState == TF_DICTATION_ON)
{
hr = SetDictationOn();
}
else if (dwState == TF_COMMANDING_ON)
{
hr = SetCommandingOn();
}
else
{
TraceMsg(TF_SPBUTTON, "Unknown speech state requested.");
Assert(0);
hr = E_INVALIDARG;
}
return hr;
}
BOOL SpButtonControl::GetMicrophoneOn( )
{
Assert(m_pimx);
return m_pimx->GetOnOff( );
}
void SpButtonControl::SetMicrophoneOn(BOOL fOn)
{
Assert(m_pimx);
m_pimx->SetOnOff(fOn, TRUE);
}