ReactOS  0.4.14-dev-323-g6fe6a88
mixer.c File Reference
#include "precomp.h"
#include <debug.h>
Include dependency graph for mixer.c:

Go to the source code of this file.

Macros

#define YDEBUG
 

Functions

ULONG MMixerGetCount (IN PMIXER_CONTEXT MixerContext)
 
MIXER_STATUS MMixerGetCapabilities (IN PMIXER_CONTEXT MixerContext, IN ULONG MixerIndex, OUT LPMIXERCAPSW MixerCaps)
 
MIXER_STATUS MMixerOpen (IN PMIXER_CONTEXT MixerContext, IN ULONG MixerId, IN PVOID MixerEventContext, IN PMIXER_EVENT MixerEventRoutine, OUT PHANDLE MixerHandle)
 
MIXER_STATUS MMixerClose (IN PMIXER_CONTEXT MixerContext, IN ULONG MixerId, IN PVOID MixerEventContext, IN PMIXER_EVENT MixerEventRoutine)
 
MIXER_STATUS MMixerGetLineInfo (IN PMIXER_CONTEXT MixerContext, IN HANDLE MixerHandle, IN ULONG MixerId, IN ULONG Flags, OUT LPMIXERLINEW MixerLine)
 
MIXER_STATUS MMixerGetLineControls (IN PMIXER_CONTEXT MixerContext, IN HANDLE MixerHandle, IN ULONG MixerId, IN ULONG Flags, OUT LPMIXERLINECONTROLSW MixerLineControls)
 
MIXER_STATUS MMixerSetControlDetails (IN PMIXER_CONTEXT MixerContext, IN HANDLE MixerHandle, IN ULONG MixerId, IN ULONG Flags, OUT LPMIXERCONTROLDETAILS MixerControlDetails)
 
MIXER_STATUS MMixerGetControlDetails (IN PMIXER_CONTEXT MixerContext, IN HANDLE MixerHandle, IN ULONG MixerId, IN ULONG Flags, OUT LPMIXERCONTROLDETAILS MixerControlDetails)
 
VOID MMixerPrintMixerLineControls (IN LPMIXERLINE_EXT MixerLine)
 
VOID MMixerPrintMixers (IN PMIXER_CONTEXT MixerContext, IN PMIXER_LIST MixerList)
 
MIXER_STATUS MMixerInitialize (IN PMIXER_CONTEXT MixerContext, IN PMIXER_ENUM EnumFunction, IN PVOID EnumContext)
 

Macro Definition Documentation

◆ YDEBUG

#define YDEBUG

Definition at line 11 of file mixer.c.

Function Documentation

◆ MMixerClose()

MIXER_STATUS MMixerClose ( IN PMIXER_CONTEXT  MixerContext,
IN ULONG  MixerId,
IN PVOID  MixerEventContext,
IN PMIXER_EVENT  MixerEventRoutine 
)

Definition at line 116 of file mixer.c.

121 {
123  LPMIXER_INFO MixerInfo;
124 
125  /* verify mixer context */
127 
128  if (Status != MM_STATUS_SUCCESS)
129  {
130  /* invalid context passed */
131  DPRINT1("invalid context\n");
132  return Status;
133  }
134 
135  /* get mixer info */
136  MixerInfo = MMixerGetMixerInfoByIndex(MixerContext, MixerId);
137  if (!MixerInfo)
138  {
139  /* invalid mixer id */
140  DPRINT1("invalid mixer id %lu\n", MixerId);
142  }
143 
144  /* remove event from list */
145  return MMixerRemoveEvent(MixerContext, MixerInfo, MixerEventContext, MixerEventRoutine);
146 }
MIXER_STATUS MMixerVerifyContext(IN PMIXER_CONTEXT MixerContext)
Definition: sup.c:41
MIXER_CONTEXT MixerContext
Definition: mmixer.c:46
MIXER_STATUS MMixerRemoveEvent(IN PMIXER_CONTEXT MixerContext, IN OUT LPMIXER_INFO MixerInfo, IN PVOID MixerEventContext, IN PMIXER_EVENT MixerEventRoutine)
Definition: controls.c:1878
LPMIXER_INFO MMixerGetMixerInfoByIndex(IN PMIXER_CONTEXT MixerContext, IN ULONG MixerIndex)
Definition: sup.c:161
Status
Definition: gdiplustypes.h:24
MIXER_STATUS
Definition: mmixer.h:3
#define DPRINT1
Definition: precomp.h:8

Referenced by WdmAudCloseAllMixers(), and WdmAudControlCloseMixer().

◆ MMixerGetCapabilities()

MIXER_STATUS MMixerGetCapabilities ( IN PMIXER_CONTEXT  MixerContext,
IN ULONG  MixerIndex,
OUT LPMIXERCAPSW  MixerCaps 
)

Definition at line 38 of file mixer.c.

42 {
44  LPMIXER_INFO MixerInfo;
45 
46  /* verify mixer context */
48 
50  {
51  /* invalid context passed */
52  return Status;
53  }
54 
55  /* get mixer info */
56  MixerInfo = MMixerGetMixerInfoByIndex(MixerContext, MixerIndex);
57 
58  if (!MixerInfo)
59  {
60  // invalid device index
62  }
63 
64  MixerCaps->wMid = MixerInfo->MixCaps.wMid;
65  MixerCaps->wPid = MixerInfo->MixCaps.wPid;
66  MixerCaps->vDriverVersion = MixerInfo->MixCaps.vDriverVersion;
67  MixerCaps->fdwSupport = MixerInfo->MixCaps.fdwSupport;
68  MixerCaps->cDestinations = MixerInfo->MixCaps.cDestinations;
69 
70  ASSERT(MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] == 0);
71  wcscpy(MixerCaps->szPname, MixerInfo->MixCaps.szPname);
72 
73  return MM_STATUS_SUCCESS;
74 }
DWORD fdwSupport
Definition: mmsystem.h:1227
DWORD cDestinations
Definition: mmsystem.h:1228
MIXER_STATUS MMixerVerifyContext(IN PMIXER_CONTEXT MixerContext)
Definition: sup.c:41
MIXER_CONTEXT MixerContext
Definition: mmixer.c:46
MIXERCAPSW MixCaps
Definition: precomp.h:70
LPMIXER_INFO MMixerGetMixerInfoByIndex(IN PMIXER_CONTEXT MixerContext, IN ULONG MixerIndex)
Definition: sup.c:161
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
MMVERSION vDriverVersion
Definition: mmsystem.h:1225
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
Status
Definition: gdiplustypes.h:24
MIXER_STATUS
Definition: mmixer.h:3
#define MAXPNAMELEN
Definition: mmsystem.h:24
WCHAR szPname[MAXPNAMELEN]
Definition: mmsystem.h:1226

Referenced by WdmAudGetMixerCapabilities(), and WdmAudMixerCapabilities().

◆ MMixerGetControlDetails()

MIXER_STATUS MMixerGetControlDetails ( IN PMIXER_CONTEXT  MixerContext,
IN HANDLE  MixerHandle,
IN ULONG  MixerId,
IN ULONG  Flags,
OUT LPMIXERCONTROLDETAILS  MixerControlDetails 
)

Definition at line 566 of file mixer.c.

572 {
574  ULONG NodeId;
575  LPMIXER_INFO MixerInfo;
576  LPMIXERLINE_EXT MixerLine;
577  LPMIXERCONTROL_EXT MixerControl;
578 
579  /* verify mixer context */
581 
582  if (Status != MM_STATUS_SUCCESS)
583  {
584  /* invalid context passed */
585  return Status;
586  }
587 
589  {
590  /* caller passed mixer id */
591  MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
592 
593  if (!MixerHandle)
594  {
595  /* invalid parameter */
597  }
598  }
599 
600  /* get mixer info */
601  MixerInfo = (LPMIXER_INFO)MixerHandle;
602 
603  /* get mixer control */
604  Status = MMixerGetMixerControlById(MixerInfo, MixerControlDetails->dwControlID, &MixerLine, &MixerControl, &NodeId);
605 
606  /* check for success */
607  if (Status != MM_STATUS_SUCCESS)
608  {
609  /* failed to find control id */
611  }
612 
613  switch(MixerControl->Control.dwControlType)
614  {
616  Status = MMixerSetGetMuteControlDetails(MixerContext, MixerInfo, MixerControl, MixerLine->Line.dwLineID, MixerControlDetails, FALSE);
617  break;
619  Status = MMixerSetGetVolumeControlDetails(MixerContext, MixerInfo, NodeId, FALSE, MixerControl, MixerControlDetails, MixerLine);
620  break;
622  DPRINT1("Not Implemented MIXERCONTROL_CONTROLTYPE_ONOFF\n");
623  break;
625  Status = MMixerSetGetMuxControlDetails(MixerContext, MixerInfo, NodeId, FALSE, Flags, MixerControl, MixerControlDetails, MixerLine);
626  break;
627 
628  default:
630  DPRINT1("ControlType %lx not implemented\n", MixerControl->Control.dwControlType);
631  }
632 
633  return Status;
634 }
#define MIXERCONTROL_CONTROLTYPE_MUX
Definition: mmsystem.h:403
MIXERLINEW Line
Definition: precomp.h:89
MIXERCONTROLW Control
Definition: precomp.h:79
DWORD dwControlType
Definition: mmsystem.h:1306
MIXER_STATUS MMixerSetGetMuteControlDetails(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo, IN LPMIXERCONTROL_EXT MixerControl, IN ULONG dwLineID, IN LPMIXERCONTROLDETAILS MixerControlDetails, IN ULONG bSet)
Definition: sup.c:367
MIXER_STATUS MMixerGetMixerControlById(LPMIXER_INFO MixerInfo, DWORD dwControlID, LPMIXERLINE_EXT *MixerLine, LPMIXERCONTROL_EXT *MixerControl, PULONG NodeId)
Definition: sup.c:281
DWORD dwLineID
Definition: mmsystem.h:1258
#define MIXER_OBJECTF_MIXER
Definition: mmsystem.h:300
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
MIXER_STATUS MMixerVerifyContext(IN PMIXER_CONTEXT MixerContext)
Definition: sup.c:41
MIXER_CONTEXT MixerContext
Definition: mmixer.c:46
LPMIXER_INFO MMixerGetMixerInfoByIndex(IN PMIXER_CONTEXT MixerContext, IN ULONG MixerIndex)
Definition: sup.c:161
PVOID HANDLE
Definition: typedefs.h:71
MIXER_STATUS MMixerSetGetVolumeControlDetails(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo, IN ULONG NodeId, IN ULONG bSet, LPMIXERCONTROL_EXT MixerControl, IN LPMIXERCONTROLDETAILS MixerControlDetails, LPMIXERLINE_EXT MixerLine)
Definition: sup.c:668
#define MIXER_OBJECTF_HMIXER
Definition: mmsystem.h:301
MIXER_STATUS MMixerSetGetMuxControlDetails(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo, IN ULONG NodeId, IN ULONG bSet, IN ULONG Flags, LPMIXERCONTROL_EXT MixerControl, IN LPMIXERCONTROLDETAILS MixerControlDetails, LPMIXERLINE_EXT MixerLine)
Status
Definition: gdiplustypes.h:24
#define MIXERCONTROL_CONTROLTYPE_VOLUME
Definition: mmsystem.h:398
#define MIXERCONTROL_CONTROLTYPE_MUTE
Definition: mmsystem.h:384
MIXER_STATUS
Definition: mmixer.h:3
#define MIXERCONTROL_CONTROLTYPE_ONOFF
Definition: mmsystem.h:383
#define DPRINT1
Definition: precomp.h:8
struct MIXER_INFO * LPMIXER_INFO
unsigned int ULONG
Definition: retypes.h:1

Referenced by WdmAudGetControlDetails().

◆ MMixerGetCount()

ULONG MMixerGetCount ( IN PMIXER_CONTEXT  MixerContext)

Definition at line 15 of file mixer.c.

17 {
18  PMIXER_LIST MixerList;
20 
21  /* verify mixer context */
23 
25  {
26  /* invalid context passed */
27  return Status;
28  }
29 
30  /* grab mixer list */
32 
33  // return number of mixers
34  return MixerList->MixerListCount;
35 }
MIXER_STATUS MMixerVerifyContext(IN PMIXER_CONTEXT MixerContext)
Definition: sup.c:41
MIXER_CONTEXT MixerContext
Definition: mmixer.c:46
Status
Definition: gdiplustypes.h:24
MIXER_STATUS
Definition: mmixer.h:3
PVOID MixerContext
Definition: mmixer.h:92
struct MIXER_LIST * PMIXER_LIST
ULONG MixerListCount
Definition: precomp.h:149

Referenced by WdmAudGetMixerDeviceCount(), and WdmAudGetNumWdmDevsByMMixer().

◆ MMixerGetLineControls()

MIXER_STATUS MMixerGetLineControls ( IN PMIXER_CONTEXT  MixerContext,
IN HANDLE  MixerHandle,
IN ULONG  MixerId,
IN ULONG  Flags,
OUT LPMIXERLINECONTROLSW  MixerLineControls 
)

Definition at line 332 of file mixer.c.

338 {
339  LPMIXER_INFO MixerInfo;
340  LPMIXERLINE_EXT MixerLineSrc;
341  LPMIXERCONTROL_EXT MixerControl;
344  ULONG Index;
345 
346  /* verify mixer context */
348 
349  if (Status != MM_STATUS_SUCCESS)
350  {
351  /* invalid context passed */
352  return Status;
353  }
354 
355  if (MixerLineControls->cbStruct != sizeof(MIXERLINECONTROLSW))
356  {
357  DPRINT1("Invalid MixerLineControls cbStruct passed %lu expected %lu\n", MixerLineControls->cbStruct, sizeof(MIXERLINECONTROLSW));
358  /* invalid parameter */
360  }
361 
362  if (MixerLineControls->cbmxctrl != sizeof(MIXERCONTROLW))
363  {
364  DPRINT1("Invalid MixerLineControls cbmxctrl passed %lu expected %lu\n", MixerLineControls->cbmxctrl, sizeof(MIXERCONTROLW));
365  /* invalid parameter */
367  }
368 
370  {
371  /* caller passed mixer id */
372  MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
373 
374  if (!MixerHandle)
375  {
376  /* invalid parameter */
378  }
379  }
380 
382 
383  DPRINT("MMixerGetLineControls MixerId %lu Flags %lu\n", MixerId, Flags);
384 
386  {
387  /* cast to mixer info */
388  MixerInfo = (LPMIXER_INFO)MixerHandle;
389 
390  /* get mixer line */
391  MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLineControls->dwLineID);
392 
393  if (!MixerLineSrc)
394  {
395  /* invalid line id */
396  DPRINT("MMixerGetLineControls Line not found %lx\n", MixerLineControls->dwLineID);
398  }
399 
400  if (MixerLineSrc->Line.cControls != MixerLineControls->cControls)
401  {
402  /* invalid parameter */
403  DPRINT1("Invalid control count %lu expected %lu\n", MixerLineControls->cControls, MixerLineSrc->Line.cControls);
405  }
406 
407  /* copy line control(s) */
408  Entry = MixerLineSrc->ControlsList.Flink;
409  Index = 0;
410  while(Entry != &MixerLineSrc->ControlsList)
411  {
412  /* get mixer control */
414 
415  /* copy mixer control */
416  MixerContext->Copy(&MixerLineControls->pamxctrl[Index], &MixerControl->Control, sizeof(MIXERCONTROLW));
417 
418  /* move to next */
419  Entry = Entry->Flink;
420 
421  /* increment mixer control offset */
422  Index++;
423  }
424  return MM_STATUS_SUCCESS;
425  }
427  {
428  /* cast to mixer info */
429  MixerInfo = (LPMIXER_INFO)MixerHandle;
430 
431  /* get mixer line */
432  MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLineControls->dwLineID);
433 
434  if (!MixerLineSrc)
435  {
436  /* invalid line id */
437  DPRINT1("MMixerGetLineControls Line not found %lx\n", MixerLineControls->dwLineID);
439  }
440 
441  /* sanity checks */
442  ASSERT(MixerLineControls->cControls == 1);
443  ASSERT(MixerLineControls->cbmxctrl == sizeof(MIXERCONTROLW));
444  ASSERT(MixerLineControls->pamxctrl != NULL);
445 
446  Entry = MixerLineSrc->ControlsList.Flink;
447  while(Entry != &MixerLineSrc->ControlsList)
448  {
450  if (MixerLineControls->dwControlType == MixerControl->Control.dwControlType)
451  {
452  /* found a control with that type */
453  MixerContext->Copy(MixerLineControls->pamxctrl, &MixerControl->Control, sizeof(MIXERCONTROLW));
454  return MM_STATUS_SUCCESS;
455  }
456 
457  /* move to next entry */
458  Entry = Entry->Flink;
459  }
460 
461  DPRINT("DeviceInfo->u.MixControls.dwControlType %x not found in Line %x cControls %u \n", MixerLineControls->dwControlType, MixerLineControls->dwLineID, MixerLineSrc->Line.cControls);
462  return MM_STATUS_UNSUCCESSFUL;
463  }
465  {
466  /* cast to mixer info */
467  MixerInfo = (LPMIXER_INFO)MixerHandle;
468 
469  Status = MMixerGetMixerControlById(MixerInfo, MixerLineControls->dwControlID, NULL, &MixerControl, NULL);
470 
471  if (Status != MM_STATUS_SUCCESS)
472  {
473  /* invalid parameter */
474  DPRINT("MMixerGetLineControls ControlID not found %lx\n", MixerLineControls->dwLineID);
476  }
477 
478  ASSERT(MixerLineControls->cControls == 1);
479  ASSERT(MixerLineControls->cbmxctrl == sizeof(MIXERCONTROLW));
480  ASSERT(MixerLineControls->pamxctrl != NULL);
481 
482  DPRINT("MMixerGetLineControls ControlID %lx ControlType %lx Name %S\n", MixerControl->Control.dwControlID, MixerControl->Control.dwControlType, MixerControl->Control.szName);
483 
484  /* copy the controls */
485  MixerContext->Copy(MixerLineControls->pamxctrl, &MixerControl->Control, sizeof(MIXERCONTROLW));
486  MixerLineControls->pamxctrl->szName[MIXER_LONG_NAME_CHARS-1] = L'\0';
487  MixerLineControls->pamxctrl->szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0';
488 
489  return MM_STATUS_SUCCESS;
490  }
493 }
#define MIXER_GETLINECONTROLSF_ONEBYID
Definition: mmsystem.h:409
WCHAR szName[MIXER_LONG_NAME_CHARS]
Definition: mmsystem.h:1310
#define MIXER_GETLINECONTROLSF_ALL
Definition: mmsystem.h:408
MIXERLINEW Line
Definition: precomp.h:89
MIXERCONTROLW Control
Definition: precomp.h:79
struct _Entry Entry
Definition: kefuncs.h:640
DWORD dwControlType
Definition: mmsystem.h:1306
MIXER_STATUS MMixerGetMixerControlById(LPMIXER_INFO MixerInfo, DWORD dwControlID, LPMIXERLINE_EXT *MixerLine, LPMIXERCONTROL_EXT *MixerControl, PULONG NodeId)
Definition: sup.c:281
#define MIXER_OBJECTF_MIXER
Definition: mmsystem.h:300
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
MIXER_STATUS MMixerVerifyContext(IN PMIXER_CONTEXT MixerContext)
Definition: sup.c:41
MIXER_CONTEXT MixerContext
Definition: mmixer.c:46
LPMIXERLINE_EXT MMixerGetSourceMixerLineByLineId(LPMIXER_INFO MixerInfo, DWORD dwLineID)
Definition: sup.c:221
smooth NULL
Definition: ftsmooth.c:416
struct MIXERCONTROL_EXT * LPMIXERCONTROL_EXT
void DPRINT(...)
Definition: polytest.cpp:61
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
DWORD cControls
Definition: mmsystem.h:1264
static const UCHAR Index[8]
Definition: usbohci.c:18
LPMIXER_INFO MMixerGetMixerInfoByIndex(IN PMIXER_CONTEXT MixerContext, IN ULONG MixerIndex)
Definition: sup.c:161
PVOID HANDLE
Definition: typedefs.h:71
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define MIXER_OBJECTF_HMIXER
Definition: mmsystem.h:301
static const WCHAR L[]
Definition: oid.c:1250
#define MIXER_SHORT_NAME_CHARS
Definition: mmsystem.h:293
Definition: typedefs.h:117
#define MIXER_LONG_NAME_CHARS
Definition: mmsystem.h:294
Status
Definition: gdiplustypes.h:24
MIXER_STATUS
Definition: mmixer.h:3
#define MIXER_GETLINECONTROLSF_ONEBYTYPE
Definition: mmsystem.h:410
#define DPRINT1
Definition: precomp.h:8
struct MIXER_INFO * LPMIXER_INFO
LIST_ENTRY ControlsList
Definition: precomp.h:90
unsigned int ULONG
Definition: retypes.h:1
#define UNIMPLEMENTED
Definition: debug.h:114
PMIXER_COPY Copy
Definition: mmixer.h:99
base of all file and directory entries
Definition: entries.h:82

Referenced by WdmAudGetLineControls().

◆ MMixerGetLineInfo()

MIXER_STATUS MMixerGetLineInfo ( IN PMIXER_CONTEXT  MixerContext,
IN HANDLE  MixerHandle,
IN ULONG  MixerId,
IN ULONG  Flags,
OUT LPMIXERLINEW  MixerLine 
)

Definition at line 149 of file mixer.c.

155 {
157  LPMIXER_INFO MixerInfo;
158  LPMIXERLINE_EXT MixerLineSrc;
159  ULONG DestinationLineID;
160 
161  /* verify mixer context */
163 
164  if (Status != MM_STATUS_SUCCESS)
165  {
166  /* invalid context passed */
167  return Status;
168  }
170  {
171  /* caller passed mixer id */
172  MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
173 
174  if (!MixerHandle)
175  {
176  /* invalid parameter */
178  }
179  }
180 
181  if (MixerLine->cbStruct != sizeof(MIXERLINEW))
182  {
183  DPRINT1("MixerLine Expected %lu but got %lu\n", sizeof(MIXERLINEW), MixerLine->cbStruct);
185  }
186 
187  /* clear hmixer from flags */
189 
190  DPRINT("MMixerGetLineInfo MixerId %lu Flags %lu\n", MixerId, Flags);
191 
193  {
194  /* cast to mixer info */
195  MixerInfo = (LPMIXER_INFO)MixerHandle;
196 
197  /* calculate destination line id */
198  DestinationLineID = (MixerLine->dwDestination + DESTINATION_LINE);
199 
200  /* get destination line */
201  MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, DestinationLineID);
202 
203  if (MixerLineSrc == NULL)
204  {
205  DPRINT1("MixerCaps Name %S DestinationLineCount %lu dwDestination %lu not found\n", MixerInfo->MixCaps.szPname, MixerInfo->MixCaps.cDestinations, MixerLine->dwDestination);
206  return MM_STATUS_UNSUCCESSFUL;
207  }
208  /* copy mixer line */
209  MixerContext->Copy(MixerLine, &MixerLineSrc->Line, sizeof(MIXERLINEW));
210 
211  /* make sure it is null terminated */
212  MixerLine->szName[MIXER_LONG_NAME_CHARS-1] = L'\0';
213  MixerLine->szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0';
214  MixerLine->Target.szPname[MAXPNAMELEN-1] = L'\0';
215 
216  /* done */
217  return MM_STATUS_SUCCESS;
218  }
219  else if (Flags == MIXER_GETLINEINFOF_SOURCE)
220  {
221  /* cast to mixer info */
222  MixerInfo = (LPMIXER_INFO)MixerHandle;
223 
224  /* calculate destination line id */
225  DestinationLineID = (MixerLine->dwDestination + DESTINATION_LINE);
226 
227  /* get destination line */
228  MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, DestinationLineID);
229 
230  if (MixerLineSrc == NULL)
231  {
232  DPRINT1("MixerCaps Name %S DestinationLineCount %lu dwDestination %lu not found\n", MixerInfo->MixCaps.szPname, MixerInfo->MixCaps.cDestinations, MixerLine->dwDestination);
233  return MM_STATUS_UNSUCCESSFUL;
234  }
235 
236  /* check if dwSource is out of bounds */
237  if (MixerLine->dwSource >= MixerLineSrc->Line.cConnections)
238  {
239  DPRINT1("MixerCaps Name %S MixerLineName %S Connections %lu dwSource %lu not found\n", MixerInfo->MixCaps.szPname, MixerLineSrc->Line.szName, MixerLineSrc->Line.cConnections, MixerLine->dwSource);
240  return MM_STATUS_UNSUCCESSFUL;
241  }
242 
243  /* calculate destination line id */
244  DestinationLineID = (MixerLine->dwSource * SOURCE_LINE) + MixerLine->dwDestination;
245 
246  DPRINT("MixerName %S cDestinations %lu MixerLineName %S cConnections %lu dwSource %lu dwDestination %lu ID %lx\n", MixerInfo->MixCaps.szPname, MixerInfo->MixCaps.cDestinations,
247  MixerLineSrc->Line.szName, MixerLineSrc->Line.cConnections,
248  MixerLine->dwSource, MixerLine->dwDestination,
249  DestinationLineID);
250  /* get target destination line id */
251  MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, DestinationLineID);
252 
253  /* sanity check */
254  ASSERT(MixerLineSrc);
255 
256  DPRINT("Line %u Name %S\n", MixerLineSrc->Line.dwSource, MixerLineSrc->Line.szName);
257 
258  /* copy mixer line */
259  MixerContext->Copy(MixerLine, &MixerLineSrc->Line, sizeof(MIXERLINEW));
260 
261  /* make sure it is null terminated */
262  MixerLine->szName[MIXER_LONG_NAME_CHARS-1] = L'\0';
263  MixerLine->szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0';
264  MixerLine->Target.szPname[MAXPNAMELEN-1] = L'\0';
265 
266  /* done */
267  return MM_STATUS_SUCCESS;
268  }
269  else if (Flags == MIXER_GETLINEINFOF_LINEID)
270  {
271  /* cast to mixer info */
272  MixerInfo = (LPMIXER_INFO)MixerHandle;
273 
274  /* try to find line */
275  MixerLineSrc = MMixerGetSourceMixerLineByLineId(MixerInfo, MixerLine->dwLineID);
276  if (!MixerLineSrc)
277  {
278  /* invalid parameter */
279  DPRINT1("MMixerGetLineInfo: MixerName %S Line not found 0x%lx\n", MixerInfo->MixCaps.szPname, MixerLine->dwLineID);
281  }
282 
283  DPRINT("Line %u Name %S\n", MixerLineSrc->Line.dwSource, MixerLineSrc->Line.szName);
284 
285  /* copy mixer line*/
286  MixerContext->Copy(MixerLine, &MixerLineSrc->Line, sizeof(MIXERLINEW));
287 
288  /* make sure it is null terminated */
289  MixerLine->szName[MIXER_LONG_NAME_CHARS-1] = L'\0';
290  MixerLine->szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0';
291  MixerLine->Target.szPname[MAXPNAMELEN-1] = L'\0';
292 
293  return MM_STATUS_SUCCESS;
294  }
296  {
297  /* cast to mixer info */
298  MixerInfo = (LPMIXER_INFO)MixerHandle;
299 
300  /* find mixer line by component type */
301  MixerLineSrc = MMixerGetSourceMixerLineByComponentType(MixerInfo, MixerLine->dwComponentType);
302  if (!MixerLineSrc)
303  {
304  DPRINT1("Failed to find component type %x\n", MixerLine->dwComponentType);
305  return MM_STATUS_UNSUCCESSFUL;
306  }
307 
308  /* copy mixer line */
309  MixerContext->Copy(MixerLine, &MixerLineSrc->Line, sizeof(MIXERLINEW));
310 
311  /* make sure it is null terminated */
312  MixerLine->szName[MIXER_LONG_NAME_CHARS-1] = L'\0';
313  MixerLine->szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0';
314  MixerLine->Target.szPname[MAXPNAMELEN-1] = L'\0';
315 
316  /* done */
317  return MM_STATUS_SUCCESS;
318  }
320  {
321  DPRINT1("MIXER_GETLINEINFOF_TARGETTYPE handling is unimplemented\n");
322  }
323  else
324  {
325  DPRINT1("Unknown Flags %lx handling is unimplemented\n", Flags);
326  }
327 
329 }
LPMIXERLINE_EXT MMixerGetSourceMixerLineByComponentType(LPMIXER_INFO MixerInfo, DWORD dwComponentType)
Definition: sup.c:258
MIXERLINEW Line
Definition: precomp.h:89
#define SOURCE_LINE
Definition: precomp.h:177
DWORD cDestinations
Definition: mmsystem.h:1228
#define MIXER_GETLINEINFOF_COMPONENTTYPE
Definition: mmsystem.h:347
#define MIXER_OBJECTF_MIXER
Definition: mmsystem.h:300
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
MIXER_STATUS MMixerVerifyContext(IN PMIXER_CONTEXT MixerContext)
Definition: sup.c:41
MIXER_CONTEXT MixerContext
Definition: mmixer.c:46
LPMIXERLINE_EXT MMixerGetSourceMixerLineByLineId(LPMIXER_INFO MixerInfo, DWORD dwLineID)
Definition: sup.c:221
smooth NULL
Definition: ftsmooth.c:416
MIXERCAPSW MixCaps
Definition: precomp.h:70
void DPRINT(...)
Definition: polytest.cpp:61
#define MIXER_GETLINEINFOF_DESTINATION
Definition: mmsystem.h:344
#define MIXER_GETLINEINFOF_LINEID
Definition: mmsystem.h:346
DWORD dwSource
Definition: mmsystem.h:1257
#define MIXER_GETLINEINFOF_TARGETTYPE
Definition: mmsystem.h:348
LPMIXER_INFO MMixerGetMixerInfoByIndex(IN PMIXER_CONTEXT MixerContext, IN ULONG MixerIndex)
Definition: sup.c:161
PVOID HANDLE
Definition: typedefs.h:71
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define MIXER_OBJECTF_HMIXER
Definition: mmsystem.h:301
static const WCHAR L[]
Definition: oid.c:1250
#define MIXER_SHORT_NAME_CHARS
Definition: mmsystem.h:293
#define DESTINATION_LINE
Definition: precomp.h:176
#define MIXER_LONG_NAME_CHARS
Definition: mmsystem.h:294
Status
Definition: gdiplustypes.h:24
MIXER_STATUS
Definition: mmixer.h:3
#define MIXER_GETLINEINFOF_SOURCE
Definition: mmsystem.h:345
WCHAR szName[MIXER_LONG_NAME_CHARS]
Definition: mmsystem.h:1266
DWORD cConnections
Definition: mmsystem.h:1263
#define MAXPNAMELEN
Definition: mmsystem.h:24
#define DPRINT1
Definition: precomp.h:8
struct MIXER_INFO * LPMIXER_INFO
WCHAR szPname[MAXPNAMELEN]
Definition: mmsystem.h:1226
unsigned int ULONG
Definition: retypes.h:1
PMIXER_COPY Copy
Definition: mmixer.h:99

Referenced by WdmAudGetLineInfo().

◆ MMixerInitialize()

MIXER_STATUS MMixerInitialize ( IN PMIXER_CONTEXT  MixerContext,
IN PMIXER_ENUM  EnumFunction,
IN PVOID  EnumContext 
)

Definition at line 770 of file mixer.c.

774 {
776  HANDLE hMixer, hKey;
777  ULONG DeviceIndex, Count;
779  LPMIXER_DATA MixerData;
780  PMIXER_LIST MixerList;
782 
783  if (!MixerContext || !EnumFunction || !EnumContext)
784  {
785  /* invalid parameter */
787  }
788 
792  {
793  /* invalid parameter */
795  }
796 
797  /* allocate a mixer list */
798  MixerList = (PMIXER_LIST)MixerContext->Alloc(sizeof(MIXER_LIST));
799  if (!MixerList)
800  {
801  /* no memory */
802  return MM_STATUS_NO_MEMORY;
803  }
804 
805  /* initialize mixer list */
806  MixerList->MixerListCount = 0;
807  MixerList->MixerDataCount = 0;
808  MixerList->WaveInListCount = 0;
809  MixerList->WaveOutListCount = 0;
810  MixerList->MidiInListCount = 0;
811  MixerList->MidiOutListCount = 0;
812  InitializeListHead(&MixerList->MixerList);
813  InitializeListHead(&MixerList->MixerData);
814  InitializeListHead(&MixerList->WaveInList);
815  InitializeListHead(&MixerList->WaveOutList);
816  InitializeListHead(&MixerList->MidiInList);
817  InitializeListHead(&MixerList->MidiOutList);
818 
819  /* store mixer list */
820  MixerContext->MixerContext = (PVOID)MixerList;
821 
822  /* start enumerating all available devices */
823  Count = 0;
824  DeviceIndex = 0;
825 
826  do
827  {
828  /* enumerate a device */
829  Status = EnumFunction(EnumContext, DeviceIndex, &DeviceName, &hMixer, &hKey);
830 
831  if (Status != MM_STATUS_SUCCESS)
832  {
833  /* check error code */
835  {
836  /* enumeration has finished */
837  break;
838  }
839  else
840  {
841  DPRINT1("Failed to enumerate device %lu\n", DeviceIndex);
842 
843  /* TODO cleanup */
844  return Status;
845  }
846  }
847  else
848  {
849  /* create a mixer data entry */
850  Status = MMixerCreateMixerData(MixerContext, MixerList, DeviceIndex, DeviceName, hMixer, hKey);
851  if (Status != MM_STATUS_SUCCESS)
852  break;
853  }
854 
855  /* increment device index */
856  DeviceIndex++;
857  }while(TRUE);
858 
859  /* now all filters have been pre-opened
860  * lets enumerate the filters
861  */
862  Entry = MixerList->MixerData.Flink;
863  while(Entry != &MixerList->MixerData)
864  {
866  MMixerSetupFilter(MixerContext, MixerList, MixerData, &Count);
867  Entry = Entry->Flink;
868  }
869 
870  Entry = MixerList->MixerData.Flink;
871  while(Entry != &MixerList->MixerData)
872  {
874 
875  /* now handle alternative mixer types */
876  MMixerHandleAlternativeMixers(MixerContext, MixerList, MixerData, MixerData->Topology);
877  Entry = Entry->Flink;
878  }
879 
880  //MMixerPrintMixers(MixerContext, MixerList);
881 
882  /* done */
883  return MM_STATUS_SUCCESS;
884 }
#define TRUE
Definition: types.h:120
struct _Entry Entry
Definition: kefuncs.h:640
LIST_ENTRY MixerList
Definition: precomp.h:150
VOID MMixerHandleAlternativeMixers(IN PMIXER_CONTEXT MixerContext, IN PMIXER_LIST MixerList, IN LPMIXER_DATA MixerData, IN PTOPOLOGY Topology)
Definition: controls.c:1678
LIST_ENTRY MidiOutList
Definition: precomp.h:165
_Inout_ __drv_aliasesMem PSLIST_ENTRY _Inout_ PSLIST_ENTRY _In_ ULONG Count
Definition: exfuncs.h:1015
PMIXER_OPEN_KEY OpenKey
Definition: mmixer.h:100
WCHAR DeviceName[]
Definition: adapter.cpp:21
LIST_ENTRY MixerData
Definition: precomp.h:153
struct MIXER_DATA * LPMIXER_DATA
MIXER_STATUS MMixerSetupFilter(IN PMIXER_CONTEXT MixerContext, IN PMIXER_LIST MixerList, IN LPMIXER_DATA MixerData, IN PULONG DeviceCount)
Definition: controls.c:1751
PMIXER_CLOSE Close
Definition: mmixer.h:98
MIXER_CONTEXT MixerContext
Definition: mmixer.c:46
LIST_ENTRY WaveInList
Definition: precomp.h:156
PMIXER_DEVICE_CONTROL Control
Definition: mmixer.h:95
ULONG MidiInListCount
Definition: precomp.h:161
HMIXER hMixer
Definition: test.c:10
void * PVOID
Definition: retypes.h:9
ULONG MixerDataCount
Definition: precomp.h:152
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
PMIXER_ALLOC_EVENT_DATA AllocEventData
Definition: mmixer.h:103
PMIXER_FREE_EVENT_DATA FreeEventData
Definition: mmixer.h:104
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
PMIXER_FREE Free
Definition: mmixer.h:96
PMIXER_QUERY_KEY_VALUE QueryKeyValue
Definition: mmixer.h:101
PTOPOLOGY Topology
Definition: precomp.h:118
ULONG MidiOutListCount
Definition: precomp.h:164
PMIXER_ALLOC Alloc
Definition: mmixer.h:94
Definition: typedefs.h:117
Status
Definition: gdiplustypes.h:24
MIXER_STATUS MMixerCreateMixerData(IN PMIXER_CONTEXT MixerContext, IN PMIXER_LIST MixerList, IN ULONG DeviceId, IN LPWSTR DeviceName, IN HANDLE hDevice, IN HANDLE hKey)
Definition: sup.c:779
MIXER_STATUS
Definition: mmixer.h:3
PVOID MixerContext
Definition: mmixer.h:92
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
PMIXER_CLOSEKEY CloseKey
Definition: mmixer.h:102
#define DPRINT1
Definition: precomp.h:8
LIST_ENTRY WaveOutList
Definition: precomp.h:159
struct MIXER_LIST * PMIXER_LIST
unsigned int ULONG
Definition: retypes.h:1
ULONG WaveOutListCount
Definition: precomp.h:158
ULONG WaveInListCount
Definition: precomp.h:155
WCHAR * LPWSTR
Definition: xmlstorage.h:184
base of all file and directory entries
Definition: entries.h:82
ULONG MixerListCount
Definition: precomp.h:149
LIST_ENTRY MidiInList
Definition: precomp.h:162
PMIXER_OPEN Open
Definition: mmixer.h:97

Referenced by WdmAudInitUserModeMixer(), and WdmAudMixerInitialize().

◆ MMixerOpen()

MIXER_STATUS MMixerOpen ( IN PMIXER_CONTEXT  MixerContext,
IN ULONG  MixerId,
IN PVOID  MixerEventContext,
IN PMIXER_EVENT  MixerEventRoutine,
OUT PHANDLE  MixerHandle 
)

Definition at line 77 of file mixer.c.

83 {
85  LPMIXER_INFO MixerInfo;
86 
87  /* verify mixer context */
89 
91  {
92  /* invalid context passed */
93  DPRINT1("invalid context\n");
94  return Status;
95  }
96 
97  /* get mixer info */
99  if (!MixerInfo)
100  {
101  /* invalid mixer id */
102  DPRINT1("invalid mixer id %lu\n", MixerId);
104  }
105 
106  /* add the event */
107  Status = MMixerAddEvent(MixerContext, MixerInfo, MixerEventContext, MixerEventRoutine);
108 
109 
110  /* store result */
111  *MixerHandle = (HANDLE)MixerInfo;
112  return MM_STATUS_SUCCESS;
113 }
MIXER_STATUS MMixerVerifyContext(IN PMIXER_CONTEXT MixerContext)
Definition: sup.c:41
MIXER_CONTEXT MixerContext
Definition: mmixer.c:46
LPMIXER_INFO MMixerGetMixerInfoByIndex(IN PMIXER_CONTEXT MixerContext, IN ULONG MixerIndex)
Definition: sup.c:161
PVOID HANDLE
Definition: typedefs.h:71
Status
Definition: gdiplustypes.h:24
MIXER_STATUS
Definition: mmixer.h:3
MIXER_STATUS MMixerAddEvent(IN PMIXER_CONTEXT MixerContext, IN OUT LPMIXER_INFO MixerInfo, IN PVOID MixerEventContext, IN PMIXER_EVENT MixerEventRoutine)
Definition: controls.c:1830
#define DPRINT1
Definition: precomp.h:8
struct MIXER_INFO * LPMIXER_INFO

Referenced by WdmAudControlOpenMixer(), and WdmAudSetMixerDeviceFormatByMMixer().

◆ MMixerPrintMixerLineControls()

VOID MMixerPrintMixerLineControls ( IN LPMIXERLINE_EXT  MixerLine)

Definition at line 637 of file mixer.c.

639 {
641  LPMIXERCONTROL_EXT MixerControl;
642  ULONG Index = 0;
643 
644  Entry = MixerLine->ControlsList.Flink;
645  while(Entry != &MixerLine->ControlsList)
646  {
648 
649  DPRINT1("\n");
650  DPRINT1("Control Index: %lu\n", Index);
651  DPRINT("\n");
652  DPRINT1("cbStruct %u\n", MixerControl->Control.cbStruct);
653  DPRINT1("dwControlID %lu\n", MixerControl->Control.dwControlID);
654  DPRINT1("dwControlType %lx\n", MixerControl->Control.dwControlType);
655  DPRINT1("fdwControl %lu\n", MixerControl->Control.fdwControl);
656  DPRINT1("cMultipleItems %lu\n", MixerControl->Control.cMultipleItems);
657  DPRINT1("szShortName %S\n", MixerControl->Control.szShortName);
658  DPRINT1("szName %S\n", MixerControl->Control.szName);
659  DPRINT1("Bounds.dwMinimum %lu\n", MixerControl->Control.Bounds.dwMinimum);
660  DPRINT1("Bounds.dwMaximum %lu\n", MixerControl->Control.Bounds.dwMaximum);
661 
662  DPRINT1("Metrics.Reserved[0] %lu\n", MixerControl->Control.Metrics.dwReserved[0]);
663  DPRINT1("Metrics.Reserved[1] %lu\n", MixerControl->Control.Metrics.dwReserved[1]);
664  DPRINT1("Metrics.Reserved[2] %lu\n", MixerControl->Control.Metrics.dwReserved[2]);
665  DPRINT1("Metrics.Reserved[3] %lu\n", MixerControl->Control.Metrics.dwReserved[3]);
666  DPRINT1("Metrics.Reserved[4] %lu\n", MixerControl->Control.Metrics.dwReserved[4]);
667  DPRINT1("Metrics.Reserved[5] %lu\n", MixerControl->Control.Metrics.dwReserved[5]);
668 
669  Entry = Entry->Flink;
670  Index++;
671  }
672 }
WCHAR szName[MIXER_LONG_NAME_CHARS]
Definition: mmsystem.h:1310
MIXERCONTROLW Control
Definition: precomp.h:79
WCHAR szShortName[MIXER_SHORT_NAME_CHARS]
Definition: mmsystem.h:1309
struct _Entry Entry
Definition: kefuncs.h:640
DWORD dwControlType
Definition: mmsystem.h:1306
DWORD cMultipleItems
Definition: mmsystem.h:1308
struct MIXERCONTROL_EXT * LPMIXERCONTROL_EXT
void DPRINT(...)
Definition: polytest.cpp:61
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
static const UCHAR Index[8]
Definition: usbohci.c:18
Definition: typedefs.h:117
DWORD dwReserved[6]
Definition: mmsystem.h:1320
union tagMIXERCONTROLW::@2944 Metrics
union tagMIXERCONTROLW::@2943 Bounds
#define DPRINT1
Definition: precomp.h:8
unsigned int ULONG
Definition: retypes.h:1
base of all file and directory entries
Definition: entries.h:82

Referenced by MMixerPrintMixers().

◆ MMixerPrintMixers()

VOID MMixerPrintMixers ( IN PMIXER_CONTEXT  MixerContext,
IN PMIXER_LIST  MixerList 
)

Definition at line 675 of file mixer.c.

678 {
679  ULONG Index, SubIndex, DestinationLineID, SrcIndex;
680  LPMIXER_INFO MixerInfo;
681  LPMIXERLINE_EXT DstMixerLine, SrcMixerLine;
682 
683  DPRINT1("MixerList %p\n", MixerList);
684  DPRINT1("MidiInCount %lu\n", MixerList->MidiInListCount);
685  DPRINT1("MidiOutCount %lu\n", MixerList->MidiOutListCount);
686  DPRINT1("WaveInCount %lu\n", MixerList->WaveInListCount);
687  DPRINT1("WaveOutCount %lu\n", MixerList->WaveOutListCount);
688  DPRINT1("MixerCount %p\n", MixerList->MixerListCount);
689 
690 
691  for(Index = 0; Index < MixerList->MixerListCount; Index++)
692  {
693  /* get mixer info */
695 
696  ASSERT(MixerInfo);
697  DPRINT1("\n");
698  DPRINT1("Name :%S\n", MixerInfo->MixCaps.szPname);
699  DPRINT1("cDestinations: %lu\n", MixerInfo->MixCaps.cDestinations);
700  DPRINT1("fdwSupport %lu\n", MixerInfo->MixCaps.fdwSupport);
701  DPRINT1("vDriverVersion %lx\n", MixerInfo->MixCaps.vDriverVersion);
702  DPRINT1("wMid %lx\n", MixerInfo->MixCaps.wMid);
703  DPRINT1("wPid %lx\n", MixerInfo->MixCaps.wPid);
704 
705  for(SubIndex = 0; SubIndex < MixerInfo->MixCaps.cDestinations; SubIndex++)
706  {
707  /* calculate destination line id */
708  DestinationLineID = (SubIndex + DESTINATION_LINE);
709 
710  /* get destination line */
711  DstMixerLine = MMixerGetSourceMixerLineByLineId(MixerInfo, DestinationLineID);
712  DPRINT1("//----------------------------------------------------------------------------------------------\n");
713  DPRINT1("\n");
714  DPRINT1("Destination Index %lu\n", SubIndex);
715  DPRINT1("\n");
716  DPRINT1("cChannels %lu\n", DstMixerLine->Line.cChannels);
717  DPRINT1("cConnections %lu\n", DstMixerLine->Line.cConnections);
718  DPRINT1("cControls %lu\n", DstMixerLine->Line.cControls);
719  DPRINT1("dwComponentType %lx\n", DstMixerLine->Line.dwComponentType);
720  DPRINT1("dwDestination %lu\n", DstMixerLine->Line.dwDestination);
721  DPRINT1("dwLineID %lx\n", DstMixerLine->Line.dwLineID);
722  DPRINT1("dwSource %lx\n", DstMixerLine->Line.dwSource);
723  DPRINT1("dwUser %lu\n", DstMixerLine->Line.dwUser);
724  DPRINT1("fdwLine %lu\n", DstMixerLine->Line.fdwLine);
725  DPRINT1("szName %S\n", DstMixerLine->Line.szName);
726  DPRINT1("szShortName %S\n", DstMixerLine->Line.szShortName);
727  DPRINT1("Target.dwDeviceId %lu\n", DstMixerLine->Line.Target.dwDeviceID);
728  DPRINT1("Target.dwType %lu\n", DstMixerLine->Line.Target.dwType);
729  DPRINT1("Target.szName %S\n", DstMixerLine->Line.Target.szPname);
730  DPRINT1("Target.vDriverVersion %lx\n", DstMixerLine->Line.Target.vDriverVersion);
731  DPRINT1("Target.wMid %lx\n", DstMixerLine->Line.Target.wMid );
732  DPRINT1("Target.wPid %lx\n", DstMixerLine->Line.Target.wPid);
733  MMixerPrintMixerLineControls(DstMixerLine);
734 
735  for(SrcIndex = 0; SrcIndex < DstMixerLine->Line.cConnections; SrcIndex++)
736  {
737  /* calculate destination line id */
738  DestinationLineID = (SOURCE_LINE * SrcIndex) + SubIndex;
739 
740  /* get source line */
741  SrcMixerLine = MMixerGetSourceMixerLineByLineId(MixerInfo, DestinationLineID);
742  DPRINT1("//==============================================================================================\n");
743  DPRINT1("\n");
744  DPRINT1("SrcLineIndex : %lu\n", SrcIndex);
745  DPRINT1("\n");
746  DPRINT1("cChannels %lu\n", SrcMixerLine->Line.cChannels);
747  DPRINT1("cConnections %lu\n", SrcMixerLine->Line.cConnections);
748  DPRINT1("cControls %lu\n", SrcMixerLine->Line.cControls);
749  DPRINT1("dwComponentType %lx\n", SrcMixerLine->Line.dwComponentType);
750  DPRINT1("dwDestination %lu\n", SrcMixerLine->Line.dwDestination);
751  DPRINT1("dwLineID %lx\n", SrcMixerLine->Line.dwLineID);
752  DPRINT1("dwSource %lx\n", SrcMixerLine->Line.dwSource);
753  DPRINT1("dwUser %lu\n", SrcMixerLine->Line.dwUser);
754  DPRINT1("fdwLine %lu\n", SrcMixerLine->Line.fdwLine);
755  DPRINT1("szName %S\n", SrcMixerLine->Line.szName);
756  DPRINT1("szShortName %S\n", SrcMixerLine->Line.szShortName);
757  DPRINT1("Target.dwDeviceId %lu\n", SrcMixerLine->Line.Target.dwDeviceID);
758  DPRINT1("Target.dwType %lu\n", SrcMixerLine->Line.Target.dwType);
759  DPRINT1("Target.szName %S\n", SrcMixerLine->Line.Target.szPname);
760  DPRINT1("Target.vDriverVersion %lx\n", SrcMixerLine->Line.Target.vDriverVersion);
761  DPRINT1("Target.wMid %lx\n", SrcMixerLine->Line.Target.wMid );
762  DPRINT1("Target.wPid %lx\n", SrcMixerLine->Line.Target.wPid);
763  MMixerPrintMixerLineControls(SrcMixerLine);
764  }
765  }
766  }
767 }
DWORD fdwSupport
Definition: mmsystem.h:1227
MIXERLINEW Line
Definition: precomp.h:89
#define SOURCE_LINE
Definition: precomp.h:177
DWORD cDestinations
Definition: mmsystem.h:1228
DWORD dwLineID
Definition: mmsystem.h:1258
struct tagMIXERLINEW::@2938 Target
WCHAR szShortName[MIXER_SHORT_NAME_CHARS]
Definition: mmsystem.h:1265
MIXER_CONTEXT MixerContext
Definition: mmixer.c:46
DWORD dwComponentType
Definition: mmsystem.h:1261
LPMIXERLINE_EXT MMixerGetSourceMixerLineByLineId(LPMIXER_INFO MixerInfo, DWORD dwLineID)
Definition: sup.c:221
DWORD dwDestination
Definition: mmsystem.h:1256
MIXERCAPSW MixCaps
Definition: precomp.h:70
DWORD cControls
Definition: mmsystem.h:1264
DWORD dwSource
Definition: mmsystem.h:1257
DWORD cChannels
Definition: mmsystem.h:1262
DWORD dwUser
Definition: mmsystem.h:1260
static const UCHAR Index[8]
Definition: usbohci.c:18
DWORD fdwLine
Definition: mmsystem.h:1259
LPMIXER_INFO MMixerGetMixerInfoByIndex(IN PMIXER_CONTEXT MixerContext, IN ULONG MixerIndex)
Definition: sup.c:161
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
MMVERSION vDriverVersion
Definition: mmsystem.h:1225
#define DESTINATION_LINE
Definition: precomp.h:176
WCHAR szName[MIXER_LONG_NAME_CHARS]
Definition: mmsystem.h:1266
DWORD cConnections
Definition: mmsystem.h:1263
#define DPRINT1
Definition: precomp.h:8
WCHAR szPname[MAXPNAMELEN]
Definition: mmsystem.h:1226
unsigned int ULONG
Definition: retypes.h:1
VOID MMixerPrintMixerLineControls(IN LPMIXERLINE_EXT MixerLine)
Definition: mixer.c:637

◆ MMixerSetControlDetails()

MIXER_STATUS MMixerSetControlDetails ( IN PMIXER_CONTEXT  MixerContext,
IN HANDLE  MixerHandle,
IN ULONG  MixerId,
IN ULONG  Flags,
OUT LPMIXERCONTROLDETAILS  MixerControlDetails 
)

Definition at line 496 of file mixer.c.

502 {
504  ULONG NodeId;
505  LPMIXER_INFO MixerInfo;
506  LPMIXERLINE_EXT MixerLine;
507  LPMIXERCONTROL_EXT MixerControl;
508 
509  /* verify mixer context */
511 
512  if (Status != MM_STATUS_SUCCESS)
513  {
514  /* invalid context passed */
515  DPRINT1("invalid context\n");
516  return Status;
517  }
518 
520  {
521  /* caller passed mixer id */
522  MixerHandle = (HANDLE)MMixerGetMixerInfoByIndex(MixerContext, MixerId);
523 
524  if (!MixerHandle)
525  {
526  /* invalid parameter */
527  DPRINT1("invalid handle\n");
529  }
530  }
531 
532  /* get mixer info */
533  MixerInfo = (LPMIXER_INFO)MixerHandle;
534 
535  /* get mixer control */
536  Status = MMixerGetMixerControlById(MixerInfo, MixerControlDetails->dwControlID, &MixerLine, &MixerControl, &NodeId);
537 
538  /* check for success */
539  if (Status != MM_STATUS_SUCCESS)
540  {
541  /* failed to find control id */
542  DPRINT1("invalid control id %lu\n", MixerControlDetails->dwControlID);
544  }
545 
546  DPRINT("MMixerSetControlDetails ControlType %lx MixerControlName %S MixerLineName %S NodeID %lu\n", MixerControl->Control.dwControlType, MixerControl->Control.szName, MixerLine->Line.szName, NodeId);
547  switch(MixerControl->Control.dwControlType)
548  {
550  Status = MMixerSetGetMuteControlDetails(MixerContext, MixerInfo, MixerControl, MixerLine->Line.dwLineID, MixerControlDetails, TRUE);
551  break;
553  Status = MMixerSetGetVolumeControlDetails(MixerContext, MixerInfo, NodeId, TRUE, MixerControl, MixerControlDetails, MixerLine);
554  break;
556  Status = MMixerSetGetMuxControlDetails(MixerContext, MixerInfo, NodeId, TRUE, Flags, MixerControl, MixerControlDetails, MixerLine);
557  break;
558  default:
560  }
561 
562  return Status;
563 }
#define MIXERCONTROL_CONTROLTYPE_MUX
Definition: mmsystem.h:403
WCHAR szName[MIXER_LONG_NAME_CHARS]
Definition: mmsystem.h:1310
#define TRUE
Definition: types.h:120
MIXERLINEW Line
Definition: precomp.h:89
MIXERCONTROLW Control
Definition: precomp.h:79
DWORD dwControlType
Definition: mmsystem.h:1306
MIXER_STATUS MMixerSetGetMuteControlDetails(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo, IN LPMIXERCONTROL_EXT MixerControl, IN ULONG dwLineID, IN LPMIXERCONTROLDETAILS MixerControlDetails, IN ULONG bSet)
Definition: sup.c:367
MIXER_STATUS MMixerGetMixerControlById(LPMIXER_INFO MixerInfo, DWORD dwControlID, LPMIXERLINE_EXT *MixerLine, LPMIXERCONTROL_EXT *MixerControl, PULONG NodeId)
Definition: sup.c:281
DWORD dwLineID
Definition: mmsystem.h:1258
#define MIXER_OBJECTF_MIXER
Definition: mmsystem.h:300
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
MIXER_STATUS MMixerVerifyContext(IN PMIXER_CONTEXT MixerContext)
Definition: sup.c:41
MIXER_CONTEXT MixerContext
Definition: mmixer.c:46
void DPRINT(...)
Definition: polytest.cpp:61
LPMIXER_INFO MMixerGetMixerInfoByIndex(IN PMIXER_CONTEXT MixerContext, IN ULONG MixerIndex)
Definition: sup.c:161
PVOID HANDLE
Definition: typedefs.h:71
MIXER_STATUS MMixerSetGetVolumeControlDetails(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo, IN ULONG NodeId, IN ULONG bSet, LPMIXERCONTROL_EXT MixerControl, IN LPMIXERCONTROLDETAILS MixerControlDetails, LPMIXERLINE_EXT MixerLine)
Definition: sup.c:668
#define MIXER_OBJECTF_HMIXER
Definition: mmsystem.h:301
MIXER_STATUS MMixerSetGetMuxControlDetails(IN PMIXER_CONTEXT MixerContext, IN LPMIXER_INFO MixerInfo, IN ULONG NodeId, IN ULONG bSet, IN ULONG Flags, LPMIXERCONTROL_EXT MixerControl, IN LPMIXERCONTROLDETAILS MixerControlDetails, LPMIXERLINE_EXT MixerLine)
Status
Definition: gdiplustypes.h:24
#define MIXERCONTROL_CONTROLTYPE_VOLUME
Definition: mmsystem.h:398
#define MIXERCONTROL_CONTROLTYPE_MUTE
Definition: mmsystem.h:384
MIXER_STATUS
Definition: mmixer.h:3
WCHAR szName[MIXER_LONG_NAME_CHARS]
Definition: mmsystem.h:1266
#define DPRINT1
Definition: precomp.h:8
struct MIXER_INFO * LPMIXER_INFO
unsigned int ULONG
Definition: retypes.h:1

Referenced by WdmAudSetControlDetails().