/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef __INC_DEVICETOPOLOGY__
#define __INC_DEVICETOPOLOGY__

#if (_WIN32_WINNT >= 0x0600)
#include <windef.h>

typedef enum _ConnectorType {
  Unknown_Connector = 0,
  Physical_Internal,
  Physical_External,
  Software_IO,
  Software_Fixed,
  Network 
} ConnectorType;

typedef enum _DataFlow {
  In,
  Out 
} DataFlow;

typedef enum _PartType {
  Connector,
  Subunit 
} PartType;

/* Fixme: Guessed from http://msdn.microsoft.com/en-us/library/dd316543%28VS.85%29.aspx */
typedef enum _EChannelMapping {
  ePcxChanMap_FL_FR = 0,
  ePcxChanMap_FC_LFE,
  ePcxChanMap_BL_BR,
  ePcxChanMap_FLC_FRC,
  ePcxChanMap_SL_SR,
  ePcxChanMap_Unknown
} EChannelMapping;

typedef enum _EPcxConnectionType {
  eConnTypeUnknown = 0,
  eConnTypeEighth,
  eConnType3Point5mm = eConnTypeEighth,
  eConnTypeQuarter,
  eConnTypeAtapiInternal,
  eConnTypeRCA,
  eConnTypeOptical,
  eConnTypeOtherDigital,
  eConnTypeOtherAnalog,
  eConnTypeMultichannelAnalogDIN,
  eConnTypeXlrProfessional,
  eConnTypeRJ11Modem,
  eConnTypeCombination
} EPcxConnectionType;

typedef enum _EPcxGeoLocation {
  eGeoLocRear = 0,
  eGeoLocFront,
  eGeoLocLeft,
  eGeoLocRight,
  eGeoLocTop,
  eGeoLocBottom,
  eGeoLocRearOPanel,
  eGeoLocRearPanel = eGeoLocRearOPanel,
  eGeoLocRiser,
  eGeoLocInsideMobileLid,
  eGeoLocDrivebay,
  eGeoLocHDMI,
  eGeoLocOutsideMobileLid,
  eGeoLocATAPI
} EPcxGeoLocation;

typedef enum _EPcxGenLocation {
  eGenLocPrimaryBox = 0,
  eGenLocInternal,
  eGenLocSeperate,
  eGenLocSeparate = eGenLocSeperate,
  eGenLocOther
} EPcxGenLocation;

typedef enum _EPxcPortConnection {
  ePortConnJack = 0,
  ePortConnIntegratedDevice,
  ePortConnBothIntegratedAndJack,
  ePortConnUnknown
} EPxcPortConnection;

typedef struct _KSJACK_DESCRIPTION {
  EChannelMapping    ChannelMapping;
  COLORREF           Color;
  EPcxConnectionType ConnectionType;
  EPcxGeoLocation    GeoLocation;
  EPcxGenLocation    GenLocation;
  EPxcPortConnection PortConnection;
  BOOL               IsConnected;
} KSJACK_DESCRIPTION, *PKSJACK_DESCRIPTION;

#define SPEAKER_FRONT_LEFT              0x1
#define SPEAKER_FRONT_RIGHT             0x2
#define SPEAKER_FRONT_CENTER            0x4
#define SPEAKER_LOW_FREQUENCY           0x8
#define SPEAKER_BACK_LEFT               0x10
#define SPEAKER_BACK_RIGHT              0x20
#define SPEAKER_FRONT_LEFT_OF_CENTER    0x40
#define SPEAKER_FRONT_RIGHT_OF_CENTER   0x80
#define SPEAKER_BACK_CENTER             0x100
#define SPEAKER_SIDE_LEFT               0x200
#define SPEAKER_SIDE_RIGHT              0x400
#define SPEAKER_TOP_CENTER              0x800
#define SPEAKER_TOP_FRONT_LEFT          0x1000
#define SPEAKER_TOP_FRONT_CENTER        0x2000
#define SPEAKER_TOP_FRONT_RIGHT         0x4000
#define SPEAKER_TOP_BACK_LEFT           0x8000
#define SPEAKER_TOP_BACK_CENTER         0x10000
#define SPEAKER_TOP_BACK_RIGHT          0x20000

#endif /*(_WIN32_WINNT >= 0x0600)*/

#if (_WIN32_WINNT >= 0x0601)

typedef enum _KSJACK_SINK_CONNECTIONTYPE {
  KSJACK_SINK_CONNECTIONTYPE_HDMI          = 0,
  KSJACK_SINK_CONNECTIONTYPE_DISPLAYPORT   = 1 
} KSJACK_SINK_CONNECTIONTYPE;

typedef struct _KSJACK_DESCRIPTION2 {
  DWORD DeviceStateInfo;
  DWORD JackCapabilities;
} KSJACK_DESCRIPTION2, *PKSJACK_DESCRIPTION2;

#define JACKDESC2_PRESENCE_DETECT_CAPABILITY (0x00000001)
#define JACKDESC2_DYNAMIC_FORMAT_CHANGE_CAPABILITY (0x00000002)

#define MAX_SINK_DESCRIPTION_NAME_LENGTH 32

typedef struct _KSJACK_SINK_INFORMATION {
  KSJACK_SINK_CONNECTIONTYPE               ConnType;
  WORD                                     ManufacturerId;
  WORD                                     ProductId;
  WORD                                     AudioLatency;
  WINBOOL                                  HDCPCapable;
  WINBOOL                                  AICapable;
  UCHAR                                    SinkDescriptionLength;
  WCHAR                                    SinkDescription [MAX_SINK_DESCRIPTION_NAME_LENGTH];
  LUID                                     PortId;
} KSJACK_SINK_INFORMATION, *PKSJACK_SINK_INFORMATION;

#endif /*(_WIN32_WINNT >= 0x0601)*/
#endif /*__INC_DEVICETOPOLOGY__*/
