1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
|
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
PURPOSE.
Module Name:
private.h
Abstract:
Contains structure definitions and function prototypes private to
the driver.
Environment:
Kernel mode
--*/
#ifndef _PRIVATE_H_
#define _PRIVATE_H_
#include "cpp_utils.h"
#include "NewDelete.h"
/* make prototypes usable from C++ */
#ifdef __cplusplus
extern "C" {
#endif
#pragma warning(disable:4200) //
#pragma warning(disable:4201) // nameless struct/union
#pragma warning(disable:4214) // bit field types other than int
#include <initguid.h>
#include <ntddk.h>
#include <ntstrsafe.h>
#include <ntintsafe.h>
#pragma warning(default:4200)
#pragma warning(default:4201)
#pragma warning(default:4214)
#include <wdf.h>
#include <acx.h>
#include "SoundWireController.h"
#include "SdcaXu.h"
#include "trace.h"
#include <TestProperties.h>
#define PAGED_CODE_SEG __declspec(code_seg("PAGE"))
#define INIT_CODE_SEG __declspec(code_seg("INIT"))
extern RECORDER_LOG g_SDCAVCodecLog;
// Simple ACX driver
#define DRIVER_TAG (ULONG) 'Ccds'
// Number of millisecs per sec.
#define MS_PER_SEC 1000
// Number of hundred nanosecs per sec.
#define HNS_PER_SEC 10000000
// Compatible ID for render/capture
#define ACX_CODEC_TEST_COMPATIBLE_ID L"{99a0ee05-7167-4b63-843d-19d6d285942e}"
// Container ID for render/capture
#define ACX_CODEC_TEST_CONTAINER_ID L"{00000000-0000-0000-ffff-ffffffffffff}"
#define RENDER_CIRCUIT_URI L"test:obj-path:\\SDCAVCODEC\\RENDER"
#define EXT_RENDER_CIRCUIT_URI L"test:obj-path:\\SDCAVCODEC\\RENDER_xu"
#define CAPTURE_CIRCUIT_URI L"test:obj-path:\\SDCAVCODEC\\CAPTURE"
#define EXT_CAPTURE_CIRCUIT_URI L"test:obj-path:\\SDCAVCODEC\\CAPTURE_xu"
#undef MIN
#undef MAX
#define MIN(a,b) ((a) > (b) ? (b) : (a))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#ifndef BOOL
typedef int BOOL;
#endif
#ifndef SIZEOF_ARRAY
#define SIZEOF_ARRAY(ar) (sizeof(ar)/sizeof((ar)[0]))
#endif // !defined(SIZEOF_ARRAY)
#ifndef RGB
#define RGB(r, g, b) (DWORD)(r << 16 | g << 8 | b)
#endif
//
// Example Acpi blob for Hardware configuration
//
typedef struct _SdcaXuAcpiBlob
{
// Number of endpoints
ULONG NumEndpoints;
}SdcaXuAcpiBlob, *PSdcaXuAcpiBlob;
#define ALL_CHANNELS_ID UINT32_MAX
#define MAX_CHANNELS 2
//
// Ks support.
//
#define KSPROPERTY_TYPE_ALL KSPROPERTY_TYPE_BASICSUPPORT | \
KSPROPERTY_TYPE_GET | \
KSPROPERTY_TYPE_SET
//
// Define CODEC driver context.
//
typedef struct _CODEC_DRIVER_CONTEXT {
ULONG reserved;
} CODEC_DRIVER_CONTEXT, *PCODEC_DRIVER_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_DRIVER_CONTEXT, GetCodecDriverContext)
//
// Extension Unit specific data
//
typedef struct _SDCAXU_DATA
{
BOOLEAN bSdcaXu;
BOOLEAN bExtensionJackOVerride;
SDCAXU_INTERFACE_V0101 ExtensionInterface;
ULONG numXUEntities;
ULONG *XUEntities;
PSDCAXU_INTERRUPT_INFO InterruptInfo;
}SDCAXU_DATA, *PSDCAXU_DATA;
//
// Define CODEC device context.
//
typedef struct _CODEC_DEVICE_CONTEXT {
ACXCIRCUIT Render;
ACXCIRCUIT Capture;
ACXCOMPOSITETEMPLATE Composite[2];
ULONG refComposite[2];
SDCAXU_DATA SdcaXuData;
} CODEC_DEVICE_CONTEXT, *PCODEC_DEVICE_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_DEVICE_CONTEXT, GetCodecDeviceContext)
//
// Define RENDER device context.
//
typedef struct _CODEC_RENDER_DEVICE_CONTEXT {
ACXCIRCUIT Circuit;
BOOLEAN FirstTimePrepareHardware;
} CODEC_RENDER_DEVICE_CONTEXT, *PCODEC_RENDER_DEVICE_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_RENDER_DEVICE_CONTEXT, GetRenderDeviceContext)
//
// Define RENDER circuit context.
//
typedef struct _CODEC_RENDER_CIRCUIT_CONTEXT {
ACXMUTE MuteElement;
ACXVOLUME VolumeElement;
} CODEC_RENDER_CIRCUIT_CONTEXT, *PCODEC_RENDER_CIRCUIT_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_RENDER_CIRCUIT_CONTEXT, GetRenderCircuitContext)
//
// Define CAPTURE device context.
//
typedef struct _CODEC_CAPTURE_DEVICE_CONTEXT {
ACXCIRCUIT Circuit;
BOOLEAN FirstTimePrepareHardware;
} CODEC_CAPTURE_DEVICE_CONTEXT, *PCODEC_CAPTURE_DEVICE_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_CAPTURE_DEVICE_CONTEXT, GetCaptureDeviceContext)
//
// Define CAPTURE circuit context.
//
typedef struct _CODEC_CAPTURE_CIRCUIT_CONTEXT {
BOOLEAN KwsActiveVadStream;
KEVENT KwsSuspendEvent;
KEVENT KwsResumeEvent;
ACXDATAFORMAT KwsDataFormat;
} CODEC_CAPTURE_CIRCUIT_CONTEXT, *PCODEC_CAPTURE_CIRCUIT_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_CAPTURE_CIRCUIT_CONTEXT, GetCaptureCircuitContext)
//
// Define CODEC render/capture stream context.
//
typedef struct _CODEC_STREAM_CONTEXT {
PVOID StreamEngine;
} CODEC_STREAM_CONTEXT, *PCODEC_STREAM_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_STREAM_CONTEXT, GetCodecStreamContext)
//
// Define CODEC circuit/stream element context.
//
typedef struct _CODEC_ELEMENT_CONTEXT {
BOOLEAN Dummy;
} CODEC_ELEMENT_CONTEXT, *PCODEC_ELEMENT_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_ELEMENT_CONTEXT, GetCodecElementContext)
//
// Define CODEC circuit/stream element context.
//
typedef struct _CODEC_MUTE_ELEMENT_CONTEXT {
BOOL MuteState[MAX_CHANNELS];
WDFTIMER Timer; // for testing only.
} CODEC_MUTE_ELEMENT_CONTEXT, *PCODEC_MUTE_ELEMENT_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_MUTE_ELEMENT_CONTEXT, GetCodecMuteElementContext)
//
// Define CODEC mute timer context.
//
typedef struct _CODEC_MUTE_TIMER_CONTEXT {
ACXMUTE MuteElement;
} CODEC_MUTE_TIMER_CONTEXT, *PCODEC_MUTE_TIMER_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_MUTE_TIMER_CONTEXT, GetCodecMuteTimerContext)
//
// Define CODEC circuit/stream element context.
//
typedef struct _CODEC_VOLUME_ELEMENT_CONTEXT {
LONG VolumeLevel[MAX_CHANNELS];
WDFTIMER Timer; // for testing only.
} CODEC_VOLUME_ELEMENT_CONTEXT, *PCODEC_VOLUME_ELEMENT_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_VOLUME_ELEMENT_CONTEXT, GetCodecVolumeElementContext)
#define VOLUME_STEPPING 0x8000
#define VOLUME_LEVEL_MAXIMUM 0x00000000
#define VOLUME_LEVEL_MINIMUM (-96 * 0x10000)
//
// Define CODEC mute timer context.
//
typedef struct _CODEC_VOLUME_TIMER_CONTEXT {
ACXVOLUME VolumeElement;
} CODEC_VOLUME_TIMER_CONTEXT, *PCODEC_VOLUME_TIMER_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_VOLUME_TIMER_CONTEXT, GetCodecVolumeTimerContext)
//
// Define CODEC format context.
//
typedef struct _CODEC_FORMAT_CONTEXT {
BOOLEAN Dummy;
} CODEC_FORMAT_CONTEXT, *PCODEC_FORMAT_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_FORMAT_CONTEXT, GetCodecFormatContext)
typedef struct _CODEC_PIN_CONTEXT {
BOOLEAN Dummy;
} CODEC_PIN_CONTEXT, *PCODEC_PIN_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_PIN_CONTEXT, GetCodecPinContext)
typedef struct _CODEC_JACK_CONTEXT
{
ULONG Dummy;
} CODEC_JACK_CONTEXT, *PCODEC_JACK_CONTEXT;
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CODEC_JACK_CONTEXT, GetCodecJackContext)
typedef enum {
CompositeType_RENDER,
CompositeType_CAPTURE
}CompositeType;
//
// Driver prototypes.
//
DRIVER_INITIALIZE DriverEntry;
EVT_WDF_DRIVER_UNLOAD Codec_DriverUnload;
EVT_WDF_DRIVER_DEVICE_ADD Codec_EvtBusDeviceAdd;
// Device callbacks.
EVT_WDF_DEVICE_PREPARE_HARDWARE Codec_EvtDevicePrepareHardware;
EVT_WDF_DEVICE_RELEASE_HARDWARE Codec_EvtDeviceReleaseHardware;
EVT_WDF_DEVICE_CONTEXT_CLEANUP Codec_EvtDeviceContextCleanup;
// Stream callbacks shared between Capture and Render
EVT_WDF_OBJECT_CONTEXT_DESTROY Codec_EvtStreamDestroy;
EVT_ACX_STREAM_GET_HW_LATENCY Codec_EvtStreamGetHwLatency;
EVT_ACX_STREAM_PREPARE_HARDWARE Codec_EvtStreamPrepareHardware;
EVT_ACX_STREAM_RELEASE_HARDWARE Codec_EvtStreamReleaseHardware;
EVT_ACX_STREAM_RUN Codec_EvtStreamRun;
EVT_ACX_STREAM_PAUSE Codec_EvtStreamPause;
EVT_ACX_STREAM_ASSIGN_DRM_CONTENT_ID Codec_EvtStreamAssignDrmContentId;
// Render callbacks.
EVT_ACX_OBJECT_PREPROCESS_REQUEST CodecR_EvtCircuitRequestPreprocess;
EVT_ACX_CIRCUIT_CREATE_STREAM CodecR_EvtCircuitCreateStream;
EVT_ACX_CIRCUIT_POWER_UP CodecR_EvtCircuitPowerUp;
EVT_ACX_CIRCUIT_POWER_DOWN CodecR_EvtCircuitPowerDown;
EVT_ACX_STREAM_SET_RENDER_PACKET CodecR_EvtStreamSetRenderPacket;
EVT_ACX_PIN_SET_DATAFORMAT CodecR_EvtAcxPinSetDataFormat;
EVT_WDF_DEVICE_CONTEXT_CLEANUP CodecR_EvtPinContextCleanup;
EVT_ACX_CIRCUIT_COMPOSITE_CIRCUIT_INITIALIZE CodecR_EvtCircuitCompositeCircuitInitialize;
EVT_ACX_CIRCUIT_COMPOSITE_INITIALIZE CodecR_EvtCircuitCompositeInitialize;
// Capture callbacks.
EVT_ACX_OBJECT_PREPROCESS_REQUEST CodecC_EvtCircuitRequestPreprocess;
EVT_ACX_CIRCUIT_CREATE_STREAM CodecC_EvtCircuitCreateStream;
EVT_ACX_CIRCUIT_POWER_UP CodecC_EvtCircuitPowerUp;
EVT_ACX_CIRCUIT_POWER_DOWN CodecC_EvtCircuitPowerDown;
EVT_ACX_STREAM_GET_CAPTURE_PACKET CodecC_EvtStreamGetCapturePacket;
EVT_ACX_PIN_SET_DATAFORMAT CodecC_EvtAcxPinSetDataFormat;
EVT_WDF_DEVICE_CONTEXT_CLEANUP CodecC_EvtPinContextCleanup;
EVT_ACX_OBJECT_PREPROCESS_REQUEST CodecC_EvtStreamRequestPreprocess;
EVT_ACX_OBJECT_PROCESS_REQUEST CodecC_EvtCircuitDeviceKwsCapability;
EVT_ACX_OBJECT_PROCESS_REQUEST CodecC_EvtCircuitVadCapability;
EVT_ACX_OBJECT_PROCESS_REQUEST CodecC_EvtCircuitVadEntities;
EVT_ACX_OBJECT_PROCESS_REQUEST CodecC_EvtCircuitSetKwsAccessEvents;
EVT_ACX_OBJECT_PROCESS_REQUEST CodecC_EvtCircuitConfigureVadPort;
EVT_ACX_OBJECT_PROCESS_REQUEST CodecC_EvtCircuitCleanupVadPort;
EVT_ACX_MUTE_ASSIGN_STATE CodecR_EvtMuteAssignStateCallback;
EVT_ACX_MUTE_RETRIEVE_STATE CodecR_EvtMuteRetrieveStateCallback;
EVT_WDF_TIMER CodecR_EvtMuteTimerFunc;
EVT_ACX_VOLUME_ASSIGN_LEVEL CodecR_EvtVolumeAssignLevelCallback;
EVT_ACX_VOLUME_RETRIEVE_LEVEL CodecR_EvtVolumeRetrieveLevelCallback;
EVT_WDF_TIMER CodecR_EvtVolumeTimerFunc;
EVT_ACX_OBJECT_PREPROCESS_REQUEST CodecR_EvtStreamRequestPreprocess;
/* make internal prototypes usable from C++ */
#ifdef __cplusplus
}
#endif
//
// Used to store the registry settings path for the driver
//
extern UNICODE_STRING g_RegistryPath;
__drv_requiresIRQL(PASSIVE_LEVEL)
PAGED_CODE_SEG
NTSTATUS
CopyRegistrySettingsPath(
_In_ PUNICODE_STRING RegistryPath
);
__drv_requiresIRQL(PASSIVE_LEVEL)
PAGED_CODE_SEG
NTSTATUS
Codec_AddComposites(_In_ WDFDEVICE Device, _In_ CompositeType compositeType);
__drv_requiresIRQL(PASSIVE_LEVEL)
PAGED_CODE_SEG
NTSTATUS
Codec_AddRenderComposites(_In_ WDFDEVICE Device);
__drv_requiresIRQL(PASSIVE_LEVEL)
PAGED_CODE_SEG
NTSTATUS
Codec_AddCaptureComposites(_In_ WDFDEVICE Device);
#pragma code_seg()
NTSTATUS
Codec_RemoveComposites(_In_ WDFDEVICE Device);
PAGED_CODE_SEG
NTSTATUS
Codec_SetPowerPolicy(
_In_ WDFDEVICE Device
);
PAGED_CODE_SEG
NTSTATUS
CodecR_AddRenders(
_In_ WDFDRIVER Driver,
_In_ WDFDEVICE Device
);
PAGED_CODE_SEG
NTSTATUS
CodecR_AddStaticRender(
_In_ WDFDEVICE Device
);
PAGED_CODE_SEG
NTSTATUS
CodecR_CreateRenderCircuit(
_In_ WDFDEVICE Device,
_Out_ ACXCIRCUIT * Circuit
);
PAGED_CODE_SEG
NTSTATUS
CodecC_AddCaptures(
_In_ WDFDRIVER Driver,
_In_ WDFDEVICE Device
);
PAGED_CODE_SEG
NTSTATUS
CodecC_AddStaticCapture(
_In_ WDFDEVICE Device
);
PAGED_CODE_SEG
NTSTATUS
CodecC_CreateCaptureCircuit(
_In_ WDFDEVICE Device,
_Out_ ACXCIRCUIT * Circuit
);
//
// Extension Unit
//
PAGED_CODE_SEG
NTSTATUS Codec_SdcaXuSetJackOverride
(
_In_ PVOID Context, // SDCA Context
_In_ BOOLEAN Override // TRUE: Override
// FALSE: Default SDCA behavior
);
PAGED_CODE_SEG
NTSTATUS Codec_SdcaXuSetJackSelectedMode
(
_In_ PVOID Context, // SDCA Context
_In_ ULONG GroupEntityId, // SDCA Group Entity ID for Jack(s)
_In_ ULONG SelectedMode // Type of jack type overriden by XU
);
#pragma code_seg()
NTSTATUS Codec_SdcaXuPDEPowerReferenceAcquire
(
_In_ PVOID Context,
_In_ ULONG PowerDomainEntityId,
_In_ SDCAXU_POWER_STATE RequiredState
);
#pragma code_seg()
NTSTATUS Codec_SdcaXuPDEPowerReferenceRelease
(
_In_ PVOID Context,
_In_ ULONG PowerDomainEntityId,
_In_ SDCAXU_POWER_STATE ReleasedState
);
#pragma code_seg()
NTSTATUS Codec_SdcaXuReadDeferredAudioControls
(
_In_ PVOID Context,
_Inout_ PSDCA_AUDIO_CONTROLS Controls
);
#pragma code_seg()
NTSTATUS Codec_SdcaXuWriteDeferredAudioControls
(
_In_ PVOID Context,
_Inout_ PSDCA_AUDIO_CONTROLS Controls
);
PAGED_CODE_SEG
NTSTATUS Codec_SdcaXuSetXUEntities
(
_In_ PVOID Context,
_In_ ULONG NumEntities,
_In_reads_(NumEntities)
ULONG EntityIDs[]
);
PAGED_CODE_SEG
NTSTATUS Codec_SdcaXuRegisterForInterrupts
(
_In_ PVOID Context,
_In_ PSDCAXU_INTERRUPT_INFO InterruptInfo
);
PAGED_CODE_SEG
NTSTATUS Codec_SdcaXuSetRenderEndpointConfig
(
_In_ WDFDEVICE Device,
_In_ ACXCIRCUIT Circuit
);
PAGED_CODE_SEG
NTSTATUS Codec_SdcaXuSetCaptureEndpointConfig
(
_In_ WDFDEVICE Device,
_In_ ACXCIRCUIT Circuit
);
PAGED_CODE_SEG
NTSTATUS Codec_GetSdcaXu(_In_ WDFDEVICE Device);
PAGED_CODE_SEG
NTSTATUS Codec_SetSdcaXuHwConfig(_In_ WDFDEVICE Device);
#pragma code_seg()
#endif // _PRIVATE_H_
|