source: trunk/src/winmm/mixer.cpp@ 8472

Last change on this file since 8472 was 8472, checked in by sandervl, 23 years ago

started with mixer api rewrite

File size: 11.0 KB
Line 
1/* $Id: mixer.cpp,v 1.12 2002-05-22 20:19:11 sandervl Exp $ */
2
3/*
4 * Mixer functions
5 *
6 * Copyright 2002 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11
12/****************************************************************************
13 * Includes *
14 ****************************************************************************/
15
16#define NONAMELESSUNION
17#define NONAMELESSSTRUCT
18
19#include <os2win.h>
20#include <string.h>
21#include <mmsystem.h>
22#include <odinwrap.h>
23#include <misc.h>
24
25#include "waveoutdart.h"
26#include "winmm.h"
27#include "initwinmm.h"
28#include "mixer.h"
29#include "mixeros2.h"
30
31#define DBG_LOCALLOG DBG_mixer
32#include "dbglocal.h"
33
34
35MIXERLINEA mixerDest[MAX_MIXER_DESTINATIONS] = {0};
36MIXERLINEA mixerSource[MAX_MIXER_SOURCES] = {0};
37MIXERCONTROLA mixerControls[MAX_MIXER_CONTROLS] = {0};
38
39/******************************************************************************/
40/******************************************************************************/
41MMRESULT WINAPI mixerGetControlDetailsA(HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS lpmcd, DWORD fdwDetails)
42{
43 DWORD ret = MMSYSERR_NOTSUPPORTED;
44 DWORD lineID, controlType;
45
46 if (lpmcd == NULL) return MMSYSERR_INVALPARAM;
47
48 switch (fdwDetails & MIXER_GETCONTROLDETAILSF_QUERYMASK) {
49 case MIXER_GETCONTROLDETAILSF_VALUE:
50 break;
51 case MIXER_GETCONTROLDETAILSF_LISTTEXT:
52 dprintf(("mixerGetControlDetailsA: NIY\n"));
53 break;
54 default:
55 dprintf(("Unknown flag (%08lx)\n", fdwDetails & MIXER_GETCONTROLDETAILSF_QUERYMASK));
56 break;
57 }
58 return ret;
59}
60/******************************************************************************/
61/******************************************************************************/
62MMRESULT WINAPI mixerGetControlDetailsW(HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
63{
64 dprintf(("WINMM:mixerGetControlDetailsW - stub\n" ));
65 return MIXERR_INVALCONTROL;
66}
67/******************************************************************************/
68/******************************************************************************/
69MMRESULT WINAPI mixerSetControlDetails(HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS lpmcd, DWORD fdwDetails)
70{
71 DWORD ret = MMSYSERR_NOTSUPPORTED;
72 DWORD lineID, controlType;
73 int val;
74
75 if (lpmcd == NULL) return MMSYSERR_INVALPARAM;
76
77 switch (fdwDetails & MIXER_GETCONTROLDETAILSF_QUERYMASK) {
78 case MIXER_GETCONTROLDETAILSF_VALUE:
79 break;
80 case MIXER_GETCONTROLDETAILSF_LISTTEXT:
81 dprintf(("mixerSetControlDetails: NIY\n"));
82 break;
83 default:
84 dprintf(("Unknown flag (%08lx)\n", fdwDetails & MIXER_GETCONTROLDETAILSF_QUERYMASK));
85 break;
86 }
87 return MMSYSERR_NOTSUPPORTED;
88}
89/******************************************************************************/
90/******************************************************************************/
91MMRESULT WINAPI mixerGetLineControlsA(HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA lpMlc, DWORD fdwControls)
92{
93 DWORD dwRet = MMSYSERR_NOERROR;
94 DWORD lineID, controlType;
95
96 if (lpMlc == NULL) return MMSYSERR_INVALPARAM;
97 if (lpMlc->cbStruct < sizeof(*lpMlc) ||
98 lpMlc->cbmxctrl < sizeof(MIXERCONTROLA))
99 return MMSYSERR_INVALPARAM;
100
101 switch(fdwControls & MIXER_GETLINECONTROLSF_QUERYMASK)
102 {
103 case MIXER_GETLINECONTROLSF_ALL:
104 if (lpMlc->cControls != 2) {
105 dwRet = MMSYSERR_INVALPARAM;
106 }
107 else {
108 }
109 break;
110 case MIXER_GETLINECONTROLSF_ONEBYID:
111 break;
112 case MIXER_GETLINECONTROLSF_ONEBYTYPE:
113 switch (lpMlc->u.dwControlType & MIXERCONTROL_CT_CLASS_MASK) {
114 case MIXERCONTROL_CT_CLASS_FADER:
115 break;
116 case MIXERCONTROL_CT_CLASS_SWITCH:
117 break;
118 default:
119 dwRet = MMSYSERR_INVALPARAM;
120 }
121 break;
122 default:
123 dprintf(("Unknown flag %08lx\n", fdwControls & MIXER_GETLINECONTROLSF_QUERYMASK));
124 dwRet = MMSYSERR_INVALPARAM;
125 }
126
127 return dwRet;
128}
129/******************************************************************************/
130/******************************************************************************/
131MMRESULT WINAPI mixerGetLineControlsW(HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls)
132{
133 dprintf(("WINMM:mixerGetGetLineControlsW - stub\n" ));
134 return MIXERR_INVALLINE;
135}
136/******************************************************************************/
137/******************************************************************************/
138MMRESULT WINAPI mixerGetLineInfoA(HMIXEROBJ hmxobj, LPMIXERLINEA lpMl, DWORD fdwInfo)
139{
140 if (lpMl == NULL || lpMl->cbStruct != sizeof(*lpMl))
141 return MMSYSERR_INVALPARAM;
142
143 /* FIXME: set all the variables correctly... the lines below
144 * are very wrong...
145 */
146 lpMl->fdwLine = MIXERLINE_LINEF_ACTIVE;
147 lpMl->cChannels = 1;
148 lpMl->dwUser = 0;
149 lpMl->cControls = 2;
150
151 switch (fdwInfo & MIXER_GETLINEINFOF_QUERYMASK)
152 {
153 case MIXER_GETLINEINFOF_DESTINATION:
154 break;
155
156 case MIXER_GETLINEINFOF_LINEID:
157 break;
158
159 case MIXER_GETLINEINFOF_SOURCE:
160 break;
161
162 case MIXER_GETLINEINFOF_COMPONENTTYPE:
163 switch (lpMl->dwComponentType)
164 {
165 case MIXERLINE_COMPONENTTYPE_DST_SPEAKERS:
166 break;
167 case MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT:
168 break;
169 default:
170 dprintf(("Unhandled component type (%08lx)\n", lpMl->dwComponentType));
171 return MMSYSERR_INVALPARAM;
172 }
173 lpMl->cConnections = 0;
174 lpMl->cControls = 1;
175 lpMl->cChannels = 2;
176 break;
177
178 case MIXER_GETLINEINFOF_TARGETTYPE:
179 dprintf(("_TARGETTYPE not implemented yet.\n"));
180 break;
181 default:
182 dprintf(("Unknown flag (%08lx)\n", fdwInfo & MIXER_GETLINEINFOF_QUERYMASK));
183 break;
184 }
185
186 lpMl->Target.dwType = MIXERLINE_TARGETTYPE_AUX;
187 lpMl->Target.dwDeviceID = 0xFFFFFFFF;
188 lpMl->Target.wMid = 0;
189 lpMl->Target.wPid = 0;
190 lpMl->Target.vDriverVersion = 1;
191 lstrcpyA(lpMl->Target.szPname, WINMM_MIXERSTRING_A);
192
193 return MMSYSERR_NOERROR;
194}
195
196/******************************************************************************/
197MMRESULT WINAPI mixerGetLineInfoW(HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo)
198{
199 dprintf(("WINMM:mixerGetLineInfoW - stub\n" ));
200 return MIXERR_INVALLINE;
201}
202/******************************************************************************/
203/******************************************************************************/
204MMRESULT WINAPI mixerMessage(HMIXER hmx, UINT uMsg, DWORD dwParam1, DWORD dwParam2)
205{
206 dprintf(("WINMM:mixerMessage - stub\n" ));
207 return 0;
208}
209/******************************************************************************/
210/******************************************************************************/
211UINT WINAPI mixerGetNumDevs()
212{
213 if(fMMPMAvailable == FALSE || DartWaveOut::getNumDevices() == 0) {
214 return 0;
215 }
216 return 1;
217}
218/******************************************************************************/
219/******************************************************************************/
220MMRESULT WINAPI mixerGetDevCapsA(UINT uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps)
221{
222 if(fMMPMAvailable == FALSE || DartWaveOut::getNumDevices() == 0) {
223 return MMSYSERR_BADDEVICEID;
224 }
225
226 if(uMxId > 0) {
227 return MMSYSERR_BADDEVICEID;
228 }
229
230 //According to MSDN, nothing is copied when cbmxcaps is zero
231 if(cbmxcaps >= sizeof(MIXERCAPSA)) {
232 // we have to fill in this thing
233 pmxcaps->wMid = 0; /* manufacturer ID */
234 pmxcaps->wPid = 0; /* product ID */
235 pmxcaps->vDriverVersion = 0x0001; /* version of the driver */
236 strcpy( pmxcaps->szPname, WINMM_MIXERSTRING_A); /* product name */
237
238 pmxcaps->fdwSupport = 0; //no mixer flags exist
239 pmxcaps->cDestinations = 1;
240 }
241
242 return MMSYSERR_NOERROR;
243}
244/******************************************************************************/
245/******************************************************************************/
246MMRESULT WINAPI mixerGetDevCapsW(UINT uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps)
247{
248 if(fMMPMAvailable == FALSE || DartWaveOut::getNumDevices() == 0) {
249 return MMSYSERR_BADDEVICEID;
250 }
251
252 if(uMxId > 0) {
253 return MMSYSERR_BADDEVICEID;
254 }
255
256 //According to MSDN, nothing is copied when cbmxcaps is zero
257 if(cbmxcaps >= sizeof(MIXERCAPSW)) {
258 // we have to fill in this thing
259 pmxcaps->wMid = 0; /* manufacturer ID */
260 pmxcaps->wPid = 0; /* product ID */
261 pmxcaps->vDriverVersion = 0x0001; /* version of the driver */
262 lstrcpyW( pmxcaps->szPname, WINMM_MIXERSTRING_W ); /* product name */
263
264 pmxcaps->fdwSupport = 0; //no mixer flags exist
265 pmxcaps->cDestinations = 1;
266 }
267
268 return MMSYSERR_NOERROR;
269}
270/******************************************************************************/
271/******************************************************************************/
272MMRESULT WINAPI mixerGetID(HMIXEROBJ hmxobj, UINT * puMxId, DWORD fdwId)
273{
274 DEVICE_STRUCT *pMixInfo = (DEVICE_STRUCT *)hmxobj;
275
276 if(!pMixInfo) {
277 return MMSYSERR_INVALHANDLE;
278 }
279
280 if(puMxId) {
281 *puMxId = pMixInfo->uDeviceID;
282 }
283 else *puMxId = 0;
284 return MMSYSERR_NOERROR;
285}
286/******************************************************************************/
287/******************************************************************************/
288MMRESULT WINAPI mixerOpen(LPHMIXER phmx, UINT uMxId, DWORD dwCallback, DWORD dwInstance,
289 DWORD fdwOpen)
290{
291 DEVICE_STRUCT *pMixInfo;
292
293 if(DartWaveOut::getNumDevices() == 0) {
294 if(phmx) *phmx = 0;
295 return MMSYSERR_NODRIVER;
296 }
297 pMixInfo = (DEVICE_STRUCT *)malloc(sizeof(DEVICE_STRUCT));
298 if(pMixInfo == NULL) {
299 return MMSYSERR_NODRIVER;
300 }
301 pMixInfo->dwCallback = dwCallback;
302 pMixInfo->dwDriverInstance = dwInstance;
303 pMixInfo->dwFlags = fdwOpen;
304 pMixInfo->uDeviceID = uMxId;
305 pMixInfo->type = WINMM_MIXER;
306 if(phmx)
307 *phmx = (HMIXER)pMixInfo;
308 return MMSYSERR_NOERROR;
309}
310/******************************************************************************/
311/******************************************************************************/
312MMRESULT WINAPI mixerClose(HMIXER hmx)
313{
314 if(hmx) {
315 free((void *)hmx);
316 }
317 return MMSYSERR_NOERROR;
318}
319/******************************************************************************/
320/******************************************************************************/
321BOOL mixerInit()
322{
323 if(!fMMPMAvailable) return TRUE;
324
325 if(OSLibMixerOpen() == FALSE) {
326 return FALSE;
327 }
328 return TRUE;
329}
330/******************************************************************************/
331/******************************************************************************/
332void mixerExit()
333{
334 OSLibMixerClose();
335}
336/******************************************************************************/
337/******************************************************************************/
338
Note: See TracBrowser for help on using the repository browser.