16 MixerThread(LPVOID Parameter
)
21 printf("hMixer %p\n", hMixer
);
23 while(GetMessage(&msg
, NULL
, 0, 0))
25 if (msg
.message
== MM_MIXM_CONTROL_CHANGE
)
26 printf("got MM_MIXM_CONTROL_CHANGE wParam %Ix lParam %Ix\n", msg
.wParam
, msg
.lParam
);
27 else if (msg
.message
== MM_MIXM_LINE_CHANGE
)
28 printf("got MM_MIXM_LINE_CHANGE wParam %Ix lParam %Ix\n", msg
.wParam
, msg
.lParam
);
38 hwnd
= CreateWindowExA(0, "static", "winmm test", WS_POPUP
, 0,0,100,100,
43 printf("failed to create window\n");
47 printf("window created\n");
49 if (mixerOpen(&hMixer
, 0, (DWORD_PTR
)hwnd
, 0, CALLBACK_WINDOW
| MIXER_OBJECTF_MIXER
) != MMSYSERR_NOERROR
)
51 printf("failed to create mixer\n");
55 hThread
= CreateThread(NULL
, 0, MixerThread
, NULL
, 0, NULL
);
59 printf("failed to create thread\n");
70 printMixerLine(LPMIXERLINEW MixerLine
, IN ULONG MixerIndex
)
72 MIXERLINECONTROLSW MixerLineControls
;
73 LPMIXERCONTROLDETAILS_LISTTEXTW ListText
;
74 MIXERCONTROLDETAILS MixerControlDetails
;
75 ULONG Index
, SubIndex
;
79 printf("cChannels %lu\n", MixerLine
->cChannels
);
80 printf("cConnections %lu\n", MixerLine
->cConnections
);
81 printf("cControls %lu\n", MixerLine
->cControls
);
82 printf("dwComponentType %lx\n", MixerLine
->dwComponentType
);
83 printf("dwDestination %lu\n", MixerLine
->dwDestination
);
84 printf("dwLineID %lx\n", MixerLine
->dwLineID
);
85 printf("dwSource %lx\n", MixerLine
->dwSource
);
86 printf("dwUser %Iu\n", MixerLine
->dwUser
);
87 printf("fdwLine %lu\n", MixerLine
->fdwLine
);
88 printf("szName %S\n", MixerLine
->szName
);
89 printf("szShortName %S\n", MixerLine
->szShortName
);
90 printf("Target.dwDeviceId %lu\n", MixerLine
->Target
.dwDeviceID
);
91 printf("Target.dwType %lu\n", MixerLine
->Target
.dwType
);
92 printf("Target.szName %S\n", MixerLine
->Target
.szPname
);
93 printf("Target.vDriverVersion %x\n", MixerLine
->Target
.vDriverVersion
);
94 printf("Target.wMid %x\n", MixerLine
->Target
.wMid
);
95 printf("Target.wPid %x\n", MixerLine
->Target
.wPid
);
97 MixerLineControls
.cbStruct
= sizeof(MixerLineControls
);
98 MixerLineControls
.dwLineID
= MixerLine
->dwLineID
;
99 MixerLineControls
.cControls
= MixerLine
->cControls
;
100 MixerLineControls
.cbmxctrl
= sizeof(MIXERCONTROLW
);
101 MixerLineControls
.pamxctrl
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, MixerLineControls
.cControls
* sizeof(MIXERCONTROLW
));
103 Result
= mixerGetLineControlsW((HMIXEROBJ
)UlongToHandle(MixerIndex
), &MixerLineControls
, MIXER_GETLINECONTROLSF_ALL
| MIXER_OBJECTF_MIXER
);
105 printf("Result %u\n", Result
);
107 for(Index
= 0; Index
< MixerLine
->cControls
; Index
++)
110 printf("Control Index: %lu\n", Index
);
112 printf("cbStruct %lu\n", MixerLineControls
.pamxctrl
[Index
].cbStruct
);
113 printf("dwControlID %lu\n", MixerLineControls
.pamxctrl
[Index
].dwControlID
);
114 printf("dwControlType %lx\n", MixerLineControls
.pamxctrl
[Index
].dwControlType
);
115 printf("fdwControl %lu\n", MixerLineControls
.pamxctrl
[Index
].fdwControl
);
116 printf("cMultipleItems %lu\n", MixerLineControls
.pamxctrl
[Index
].cMultipleItems
);
117 printf("szShortName %S\n", MixerLineControls
.pamxctrl
[Index
].szShortName
);
118 printf("szName %S\n", MixerLineControls
.pamxctrl
[Index
].szName
);
119 printf("Bounds.dwMinimum %lu\n", MixerLineControls
.pamxctrl
[Index
].Bounds
.dwMinimum
);
120 printf("Bounds.dwMaximum %lu\n", MixerLineControls
.pamxctrl
[Index
].Bounds
.dwMaximum
);
122 printf("Metrics.Reserved[0] %lu\n", MixerLineControls
.pamxctrl
[Index
].Metrics
.dwReserved
[0]);
123 printf("Metrics.Reserved[1] %lu\n", MixerLineControls
.pamxctrl
[Index
].Metrics
.dwReserved
[1]);
124 printf("Metrics.Reserved[2] %lu\n", MixerLineControls
.pamxctrl
[Index
].Metrics
.dwReserved
[2]);
125 printf("Metrics.Reserved[3] %lu\n", MixerLineControls
.pamxctrl
[Index
].Metrics
.dwReserved
[3]);
126 printf("Metrics.Reserved[4] %lu\n", MixerLineControls
.pamxctrl
[Index
].Metrics
.dwReserved
[4]);
127 printf("Metrics.Reserved[5] %lu\n", MixerLineControls
.pamxctrl
[Index
].Metrics
.dwReserved
[5]);
129 if (MixerLineControls
.pamxctrl
[Index
].dwControlType
== MIXERCONTROL_CONTROLTYPE_MUX
)
131 ZeroMemory(&MixerControlDetails
, sizeof(MixerControlDetails
));
132 MixerControlDetails
.cbStruct
= sizeof(MIXERCONTROLDETAILS
);
133 MixerControlDetails
.cbDetails
= sizeof(MIXERCONTROLDETAILS_LISTTEXTW
);
134 MixerControlDetails
.cChannels
= 1;
135 MixerControlDetails
.cMultipleItems
= MixerLineControls
.pamxctrl
[Index
].Metrics
.dwReserved
[0];
136 MixerControlDetails
.dwControlID
= MixerLineControls
.pamxctrl
[Index
].dwControlID
;
137 MixerControlDetails
.paDetails
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, MixerControlDetails
.cbDetails
* MixerControlDetails
.cChannels
* MixerControlDetails
.cMultipleItems
);
139 Result
= mixerGetControlDetailsW((HMIXEROBJ
)UlongToHandle(MixerIndex
), &MixerControlDetails
, MIXER_GETCONTROLDETAILSF_LISTTEXT
| MIXER_OBJECTF_MIXER
);
141 printf("Result %x\n", Result
);
142 ListText
= (LPMIXERCONTROLDETAILS_LISTTEXTW
)MixerControlDetails
.paDetails
;
143 for(SubIndex
= 0; SubIndex
< MixerControlDetails
.cMultipleItems
; SubIndex
++)
145 printf("dwParam1 %lx\n", ListText
[SubIndex
].dwParam1
);
146 printf("dwParam1 %lx\n", ListText
[SubIndex
].dwParam2
);
147 printf("szName %S\n", ListText
[SubIndex
].szName
);
150 MixerControlDetails
.cbDetails
= sizeof(MIXERCONTROLDETAILS_BOOLEAN
);
151 MixerControlDetails
.paDetails
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(MIXERCONTROLDETAILS_BOOLEAN
) * MixerControlDetails
.cMultipleItems
);
152 ((LPMIXERCONTROLDETAILS_BOOLEAN
)MixerControlDetails
.paDetails
)->fValue
= TRUE
;
154 Result
= mixerSetControlDetails((HMIXEROBJ
)hMixer
, &MixerControlDetails
, MIXER_SETCONTROLDETAILSF_VALUE
| MIXER_OBJECTF_HANDLE
);
155 printf("Result %x hMixer %p\n", Result
, hMixer
);
160 int main(int argc
, char**argv
)
162 DWORD MixerCount
, MixerIndex
, DestinationIndex
, SrcIndex
;
163 MIXERCAPSW MixerCaps
;
164 MIXERLINEW DstMixerLine
, SrcLine
;
170 MixerCount
= mixerGetNumDevs();
172 printf("MixerCount %lu\n", MixerCount
);
174 for(MixerIndex
= 0; MixerIndex
< MixerCount
; MixerIndex
++)
176 Result
= mixerGetDevCapsW((UINT_PTR
)MixerIndex
, &MixerCaps
, sizeof(MixerCaps
));
179 printf("Index %lu Result %x\n", MixerIndex
, Result
);
180 printf("Name :%S\n", MixerCaps
.szPname
);
181 printf("cDestinations: %lu\n", MixerCaps
.cDestinations
);
182 printf("fdwSupport %lx\n", MixerCaps
.fdwSupport
);
183 printf("vDriverVersion %x\n", MixerCaps
.vDriverVersion
);
184 printf("wMid %x\n", MixerCaps
.wMid
);
185 printf("wPid %x\n", MixerCaps
.wPid
);
187 for(DestinationIndex
= 0; DestinationIndex
< MixerCaps
.cDestinations
; DestinationIndex
++)
189 ZeroMemory(&DstMixerLine
, sizeof(DstMixerLine
));
190 DstMixerLine
.dwDestination
= DestinationIndex
;
191 DstMixerLine
.cbStruct
= sizeof(DstMixerLine
);
193 Result
= mixerGetLineInfoW((HMIXEROBJ
)UlongToHandle(MixerIndex
), &DstMixerLine
, MIXER_GETLINEINFOF_DESTINATION
| MIXER_OBJECTF_MIXER
);
195 printf("Destination Index %lu\n", DestinationIndex
);
196 printMixerLine(&DstMixerLine
, MixerIndex
);
197 for(SrcIndex
= 0; SrcIndex
< DstMixerLine
.cConnections
; SrcIndex
++)
199 ZeroMemory(&SrcLine
, sizeof(SrcLine
));
200 SrcLine
.dwDestination
= DestinationIndex
;
201 SrcLine
.dwSource
= SrcIndex
;
202 SrcLine
.cbStruct
= sizeof(SrcLine
);
204 Result
= mixerGetLineInfoW((HMIXEROBJ
)UlongToHandle(MixerIndex
), &SrcLine
, MIXER_GETLINEINFOF_SOURCE
| MIXER_OBJECTF_MIXER
);
206 if (Result
== MMSYSERR_NOERROR
)
209 printf("SrcLineIndex %lu\n", SrcIndex
);
210 printMixerLine(&SrcLine
, MixerIndex
);
215 WaitForSingleObject(hThread
, INFINITE
);
216 CloseHandle(hThread
);