///////////////////////////////////////////////////////////////////////////////
//
//  File:  gfxui.h
//
//      This file defines the functions that are used by the Global
//      Effects (GFX) page to drive manipulate the effects for a 
//      mixer.
//
//  History:
//      10 June 2000 RogerW
//          Created.
//
//  Copyright (C) 2000 Microsoft Corporation  All Rights Reserved.
//
//                  Microsoft Confidential
//
///////////////////////////////////////////////////////////////////////////////
#pragma once

//=============================================================================
//                            Include files
//=============================================================================
#include <mmsysp.h> // Middle Layer

// GFXUI element status flags
#define GFX_DEFAULT  0X00000000
#define GFX_CREATED  0X00000001 // Id, Order, & Type are valid
#define GFX_ADD      0X00000002

typedef struct _GFXUI GFXUI;
typedef GFXUI* PGFXUI;

typedef struct _GFXUI
{
	PWSTR  pszName;
	PWSTR  pszFactoryDi;
    DWORD  Id;
    DWORD  Type; 
    DWORD  Order;
    DWORD  nFlags;
    CLSID  clsidUI;
    PGFXUI pNext;
} **PPGFXUI;

typedef struct 
{
	DWORD  dwType;
    PWSTR  pszZoneDi;
    PGFXUI puiList;
} GFXUILIST, *PGFXUILIST, **PPGFXUILIST;


//
// API Prototypes
//

#ifdef __cplusplus
extern "C" {            /* Assume C declarations for C++ */
#endif  /* __cplusplus */

// Interface
HRESULT GFXUI_CreateList (DWORD dwMixID, DWORD dwType, BOOL fAll, PPGFXUILIST ppList);
BOOL    GFXUI_CheckDevice (DWORD dwMixID, DWORD dwType);
void    GFXUI_FreeList (PPGFXUILIST ppList);
HRESULT GFXUI_Properties (PGFXUI puiGFX, HWND hWndOwner);
HRESULT GFXUI_CreateAddGFX (PPGFXUI ppuiGFXAdd, PGFXUI puiGFXSource);
HRESULT GFXUI_Apply (PPGFXUILIST ppListApply, PPGFXUI ppuiListDelete);

#ifdef __cplusplus
} // extern "C"
#endif

// Helpers
BOOL GFXUI_CanShowProperties (PGFXUI puiGFX);


//
// Local Function Prototypes
//
HRESULT InitList (DWORD dwMixID, DWORD dwType, PPGFXUILIST ppList);
HRESULT AddNode (PCWSTR pszGfxFactoryDi, DWORD Id, REFCLSID rclsid, DWORD Type, DWORD Order, DWORD nFlags, PPGFXUILIST ppList);
HRESULT AddFactoryNode (PCWSTR pszGfxFactoryDi, PPGFXUILIST ppList);
void    FreeNode (PPGFXUI ppNode);
void    FreeListNodes (PPGFXUI ppuiList);
HRESULT AttachNode (PPGFXUILIST ppList, PGFXUI pNode);
HRESULT CreateNode (PCWSTR pszName, PCWSTR pszGfxFactoryDi, PPGFXUI ppNode);
HRESULT GetFriendlyName (PCWSTR pszGfxFactoryDi, PWSTR* ppszName);
HKEY    OpenGfxRegKey (PCWSTR pszGfxFactoryDi, REGSAM sam);
UINT    GetListSize (PGFXUI puiList);
PTCHAR  GetInterfaceName (DWORD dwMixerID);
// Callback
LONG    GFXEnum (PVOID Context, DWORD Id, PCWSTR GfxFactoryDi, REFCLSID rclsid, DWORD Type, DWORD Order);