windows-nt/Source/XPSP1/NT/multimedia/directx/dplay/dvoice/dxvtlib/fdtipc.h
2020-09-26 16:20:57 +08:00

205 lines
4.9 KiB
C++

/*==========================================================================;
*
* Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
*
* File: fdtipc.cpp
* Content: Declard the IPC calls for the full duplex test
* History:
* Date By Reason
* ============
* 08/26/99 pnewson created
* 01/21/2000 pnewson modified full duplex start command struct
* 04/18/2000 rodtoll Bug #32649 Voice wizard failing
* Changed secondary format for tests from stereo --> mono
* 04/19/2000 pnewson Error handling cleanup
***************************************************************************/
#ifndef _FDTIPC_H_
#define _FDTIPC_H_
enum EFDTestCommandCode
{
fdtccExit = 1,
fdtccPriorityStart,
fdtccPriorityStop,
fdtccFullDuplexStart,
fdtccFullDuplexStop,
fdtccEndOfEnum // keep this last thing in enum!
};
// Exit command struct
// This command tells the child processes to exit
struct SFDTestCommandExit
{
};
// PriorityStart command struct
// This command tells the child process to:
// - create a DirectSound interface on the specified render device
// - set it's cooperative level to priority mode
// - create a primary buffer
// - set the format of the primary buffer to the format specified in wfx
// - creates a secondary buffer of the same format as the primary
// = fills the secondary buffer with zeros
// - starts playing the secondary buffer
struct SFDTestCommandPriorityStart
{
GUID guidRenderDevice;
WAVEFORMATEX wfxRenderFormat;
WAVEFORMATEX wfxSecondaryFormat;
HWND hwndWizard;
HWND hwndProgress;
};
// PriorityStop command struct
// This command tells the child process to:
// - stop playing the secondary buffer
// - destroy the secondardy buffer object
// - destroy the primary buffer object
// - destroy the DirectSound object
struct SFDTestCommandPriorityStop
{
};
// FullDuplexStart command struct
// This command tells the child process to start
// a fullduplex loopback test.
struct SFDTestCommandFullDuplexStart
{
GUID guidRenderDevice;
GUID guidCaptureDevice;
DWORD dwFlags;
};
// FullDuplexStop command struct
// This command tells the child process to
// stop the full duplex loopback test.
struct SFDTestCommandFullDuplexStop
{
};
union UFDTestCommandUnion
{
SFDTestCommandExit fdtcExit;
SFDTestCommandPriorityStart fdtcPriorityStart;
SFDTestCommandPriorityStop fdtcPriorityStop;
SFDTestCommandFullDuplexStart fdtcFullDuplexStart;
SFDTestCommandFullDuplexStop fdtcFullDuplexStop;
};
struct SFDTestCommand
{
DWORD dwSize;
EFDTestCommandCode fdtcc;
UFDTestCommandUnion fdtu;
};
enum EFDTestTarget
{
fdttPriority = 1,
fdttFullDuplex
};
// The class used by the Supervisor Process
class CSupervisorIPC
{
private:
//HANDLE m_hMutex;
HANDLE m_hPriorityEvent;
HANDLE m_hFullDuplexEvent;
HANDLE m_hPriorityReplyEvent;
HANDLE m_hFullDuplexReplyEvent;
HANDLE m_hPriorityShMemHandle;
LPVOID m_lpvPriorityShMemPtr;
HANDLE m_hFullDuplexShMemHandle;
LPVOID m_lpvFullDuplexShMemPtr;
HANDLE m_hPriorityMutex;
HANDLE m_hFullDuplexMutex;
PROCESS_INFORMATION m_piPriority;
PROCESS_INFORMATION m_piFullDuplex;
DNCRITICAL_SECTION m_csLock;
BOOL m_fInitComplete;
HRESULT DoSend(
const SFDTestCommand *pfdtc,
HANDLE hProcess,
HANDLE hEvent,
HANDLE hReplyEvent,
LPVOID lpvShMemPtr,
HANDLE hMutex);
// make this private to disallow copy construction
// also not implemented, so linker error if used
CSupervisorIPC(const CSupervisorIPC& rhs);
public:
CSupervisorIPC();
HRESULT Init();
HRESULT Deinit();
HRESULT SendToPriority(const SFDTestCommand *pfdtc);
HRESULT SendToFullDuplex(const SFDTestCommand *pfdtc);
HRESULT StartPriorityProcess();
HRESULT StartFullDuplexProcess();
HRESULT WaitForStartupSignals();
HRESULT WaitOnChildren();
HRESULT TerminateChildProcesses();
};
// The class used by the Priority Process
class CPriorityIPC
{
private:
HANDLE m_hPriorityEvent;
HANDLE m_hPriorityReplyEvent;
HANDLE m_hPriorityShMemHandle;
LPVOID m_lpvPriorityShMemPtr;
HANDLE m_hPriorityMutex;
DNCRITICAL_SECTION m_csLock;
BOOL m_fInitComplete;
// make this private to disallow copy construction
// also not implemented, so linker error if used
CPriorityIPC(const CPriorityIPC& rhs);
public:
CPriorityIPC();
HRESULT Init();
HRESULT Deinit();
HRESULT SignalParentReady();
HRESULT Receive(SFDTestCommand* pfdtc);
HRESULT Reply(HRESULT hr);
};
// The class used by the Full Duplex Process
class CFullDuplexIPC
{
private:
HANDLE m_hFullDuplexEvent;
HANDLE m_hFullDuplexReplyEvent;
HANDLE m_hFullDuplexShMemHandle;
LPVOID m_lpvFullDuplexShMemPtr;
HANDLE m_hFullDuplexMutex;
DNCRITICAL_SECTION m_csLock;
BOOL m_fInitComplete;
// make this private to disallow copy construction
// also not implemented, so linker error if used
CFullDuplexIPC(const CFullDuplexIPC& rhs);
public:
CFullDuplexIPC();
HRESULT Init();
HRESULT Deinit();
HRESULT SignalParentReady();
HRESULT Receive(SFDTestCommand* pfdtc);
HRESULT Reply(HRESULT hr);
};
#endif