1#ifndef _DMUSICKS_
2#define _DMUSICKS_
3
4#define DONT_HOLD_FOR_SEQUENCING 0x8000000000000000
5
6#ifndef REFERENCE_TIME
7typedef LONGLONG REFERENCE_TIME;
8#endif
9
10typedef struct _DMUS_KERNEL_EVENT {
11  BYTE bReserved;
12  BYTE cbStruct;
13  USHORT cbEvent;
14  USHORT usChannelGroup;
15  USHORT usFlags;
16  REFERENCE_TIME ullPresTime100ns;
17  ULONGLONG ullBytePosition;
18  struct _DMUS_KERNEL_EVENT *pNextEvt;
19  union {
20    BYTE abData[sizeof(PBYTE)];
21    PBYTE pbData;
22    struct _DMUS_KERNEL_EVENT *pPackageEvt;
23  } uData;
24} DMUS_KERNEL_EVENT, *PDMUS_KERNEL_EVENT;
25
26typedef enum {
27  DMUS_STREAM_MIDI_INVALID = -1,
28  DMUS_STREAM_MIDI_RENDER = 0,
29  DMUS_STREAM_MIDI_CAPTURE,
30  DMUS_STREAM_WAVE_SINK
31} DMUS_STREAM_TYPE;
32
33DEFINE_GUID(CLSID_MiniportDriverDMusUART,        0xd3f0ce1c, 0xFFFC, 0x11D1, 0x81, 0xB0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xC1);
34DEFINE_GUID(CLSID_MiniportDriverDMusUARTCapture, 0xD3F0CE1D, 0xFFFC, 0x11D1, 0x81, 0xB0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xC1);
35
36/* ===============================================================
37    IMasterClock Interface
38*/
39
40#undef INTERFACE
41#define INTERFACE IMasterClock
42
43DECLARE_INTERFACE_(IMasterClock,IUnknown)
44{
45    DEFINE_ABSTRACT_UNKNOWN()
46
47    STDMETHOD_(NTSTATUS,GetTime)( THIS_
48        OUT     REFERENCE_TIME  * pTime
49    ) PURE;
50};
51
52typedef IMasterClock *PMASTERCLOCK;
53
54#define IMP_IMasterClock                    \
55    STDMETHODIMP_(NTSTATUS) GetTime(        \
56        OUT     REFERENCE_TIME  * pTime     \
57    )
58
59/* ===============================================================
60    IMXF Interface
61*/
62
63#undef INTERFACE
64#define INTERFACE IMXF
65
66struct IMXF;
67typedef struct IMXF *PMXF;
68
69#define DEFINE_ABSTRACT_IMXF()                 \
70    STDMETHOD_(NTSTATUS,SetState)(THIS_        \
71        IN      KSSTATE State                  \
72    ) PURE;                                    \
73    STDMETHOD_(NTSTATUS,PutMessage)            \
74    (   THIS_                                  \
75        IN      PDMUS_KERNEL_EVENT  pDMKEvt    \
76    ) PURE;                                    \
77    STDMETHOD_(NTSTATUS,ConnectOutput)         \
78    (   THIS_                                  \
79        IN      PMXF    sinkMXF                \
80    ) PURE;                                    \
81    STDMETHOD_(NTSTATUS,DisconnectOutput)      \
82    (   THIS_                                  \
83        IN      PMXF    sinkMXF                \
84    ) PURE;
85
86#define IMP_IMXF                                \
87    STDMETHODIMP_(NTSTATUS) SetState            \
88    (                                           \
89        IN      KSSTATE State                   \
90    );                                          \
91    STDMETHODIMP_(NTSTATUS) PutMessage          \
92    (   THIS_                                   \
93        IN      PDMUS_KERNEL_EVENT  pDMKEvt     \
94    );                                          \
95    STDMETHODIMP_(NTSTATUS) ConnectOutput       \
96    (   THIS_                                   \
97        IN      PMXF    sinkMXF                 \
98    );                                          \
99    STDMETHODIMP_(NTSTATUS) DisconnectOutput    \
100    (   THIS_                                   \
101        IN      PMXF    sinkMXF                 \
102    )
103
104
105DECLARE_INTERFACE_(IMXF,IUnknown)
106{
107    DEFINE_ABSTRACT_UNKNOWN()
108
109    DEFINE_ABSTRACT_IMXF()
110};
111
112/* ===============================================================
113    IAllocatorMXF Interface
114*/
115
116#undef INTERFACE
117#define INTERFACE IAllocatorMXF
118
119struct  IAllocatorMXF;
120typedef struct IAllocatorMXF *PAllocatorMXF;
121
122#define STATIC_IID_IAllocatorMXF\
123    0xa5f0d62c, 0xb30f, 0x11d2, 0xb7, 0xa3, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1
124DEFINE_GUIDSTRUCT("a5f0d62c-b30f-11d2-b7a3-0060083316c1", IID_IAllocatorMXF);
125#define IID_IAllocatorMXF DEFINE_GUIDNAMED(IID_IAllocatorMXF)
126
127
128DECLARE_INTERFACE_(IAllocatorMXF, IMXF)
129{
130    DEFINE_ABSTRACT_UNKNOWN()
131
132    DEFINE_ABSTRACT_IMXF()
133
134    STDMETHOD_(NTSTATUS,GetMessage)(THIS_
135        OUT     PDMUS_KERNEL_EVENT * ppDMKEvt
136    ) PURE;
137
138    STDMETHOD_(USHORT,GetBufferSize)(THIS) PURE;
139
140    STDMETHOD_(NTSTATUS,GetBuffer)(THIS_
141        OUT     PBYTE * ppBuffer
142    )PURE;
143
144    STDMETHOD_(NTSTATUS,PutBuffer)(THIS_
145        IN      PBYTE   pBuffer
146    )   PURE;
147};
148
149#define IMP_IAllocatorMXF                               \
150    IMP_IMXF;                                           \
151    STDMETHODIMP_(NTSTATUS) GetMessage(                 \
152        OUT     PDMUS_KERNEL_EVENT * ppDMKEvt           \
153    );                                                  \
154                                                        \
155    STDMETHODIMP_(USHORT) GetBufferSize(void);          \
156                                                        \
157    STDMETHODIMP_(NTSTATUS) GetBuffer(                  \
158        OUT     PBYTE * ppBuffer                        \
159    );                                                  \
160                                                        \
161    STDMETHODIMP_(NTSTATUS) PutBuffer(                  \
162        IN      PBYTE   pBuffer                         \
163    )
164
165#undef INTERFACE
166#define INTERFACE IPortDMus
167
168DEFINE_GUID(IID_IPortDMus, 0xc096df9c, 0xfb09, 0x11d1, 0x81, 0xb0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1);
169DEFINE_GUID(CLSID_PortDMus, 0xb7902fe9, 0xfb0a, 0x11d1, 0x81, 0xb0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1);
170
171DECLARE_INTERFACE_(IPortDMus, IPort)
172{
173    DEFINE_ABSTRACT_UNKNOWN()
174
175    DEFINE_ABSTRACT_PORT()
176
177    STDMETHOD_(void,Notify)(THIS_
178        IN PSERVICEGROUP ServiceGroup OPTIONAL
179    )PURE;
180
181    STDMETHOD_(void,RegisterServiceGroup)(THIS_
182        IN PSERVICEGROUP ServiceGroup
183    ) PURE;
184};
185typedef IPortDMus *PPORTDMUS;
186
187#define IMP_IPortDMus                                 \
188    IMP_IPort;                                        \
189    STDMETHODIMP_(void) Notify(                       \
190        IN PSERVICEGROUP ServiceGroup OPTIONAL        \
191    );                                                \
192                                                      \
193    STDMETHODIMP_(void) RegisterServiceGroup(         \
194        IN PSERVICEGROUP ServiceGroup                 \
195    )
196
197#undef INTERFACE
198#define INTERFACE IMiniportDMus
199
200DEFINE_GUID(IID_IMiniportDMus, 0xc096df9d, 0xfb09, 0x11d1, 0x81, 0xb0, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1);
201DECLARE_INTERFACE_(IMiniportDMus, IMiniport)
202{
203    DEFINE_ABSTRACT_UNKNOWN()
204
205    DEFINE_ABSTRACT_MINIPORT()
206
207    STDMETHOD_(NTSTATUS,Init)(THIS_
208        IN      PUNKNOWN        UnknownAdapter,
209        IN      PRESOURCELIST   ResourceList,
210        IN      PPORTDMUS       Port,
211        OUT     PSERVICEGROUP * ServiceGroup
212    )   PURE;
213
214    STDMETHOD_(void,Service)(THIS) PURE;
215
216    STDMETHOD_(NTSTATUS,NewStream)(THIS_
217        OUT     PMXF                  * MXF,
218        IN      PUNKNOWN                OuterUnknown    OPTIONAL,
219        IN      POOL_TYPE               PoolType,
220        IN      ULONG                   PinID,
221        IN      DMUS_STREAM_TYPE        StreamType,
222        IN      PKSDATAFORMAT           DataFormat,
223        OUT     PSERVICEGROUP         * ServiceGroup,
224        IN      PAllocatorMXF           AllocatorMXF,
225        IN      PMASTERCLOCK            MasterClock,
226        OUT     PULONGLONG              SchedulePreFetch
227    ) PURE;
228};
229
230typedef IMiniportDMus *PMINIPORTDMUS;
231#undef INTERFACE
232
233#define IMP_IMiniportDMus                              \
234    IMP_IMiniport;                                     \
235    STDMETHODIMP_(NTSTATUS) Init(                      \
236        IN      PUNKNOWN        UnknownAdapter,        \
237        IN      PRESOURCELIST   ResourceList,          \
238        IN      PPORTDMUS       Port,                  \
239        OUT     PSERVICEGROUP * ServiceGroup           \
240    );                                                 \
241                                                       \
242    STDMETHODIMP_(void) Service(THIS);                 \
243                                                       \
244    STDMETHODIMP_(NTSTATUS) NewStream(                 \
245        OUT     PMXF              * MXF,               \
246        IN      PUNKNOWN          OuterUnknown,        \
247        IN      POOL_TYPE         PoolType,            \
248        IN      ULONG             PinID,               \
249        IN      DMUS_STREAM_TYPE  StreamType,          \
250        IN      PKSDATAFORMAT     DataFormat,          \
251        OUT     PSERVICEGROUP     * ServiceGroup,      \
252        IN      PAllocatorMXF     AllocatorMXF,        \
253        IN      PMASTERCLOCK      MasterClock,         \
254        OUT     PULONGLONG        SchedulePreFetch     \
255    )
256
257#endif /* _DMUSICKS_ */
258
259