source: trunk/src/winmm/mixeros2.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.3 KB
Line 
1/* $Id: mixeros2.cpp,v 1.1 2002-05-22 20:19:11 sandervl Exp $ */
2
3/*
4 * OS/2 Mixer multimedia
5 *
6 * Copyright 2002 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12
13#define INCL_BASE
14#define INCL_DOSERRORS
15#define INCL_DOSDEVIOCTL
16#define INCL_DOSFILEMGR
17#define INCL_OS2MM
18#include <os2wrap.h>
19#include <os2mewrap.h>
20#include <stdlib.h>
21#include <string.h>
22#include <dbglog.h>
23#include <ioctl90.h>
24
25#include "initwinmm.h"
26#include "mixeros2.h"
27
28static BOOL GetAudioPDDName (char *pszPDDName);
29static HFILE DevOpen (char *ddName);
30static BOOL mixerapiIOCTL90 (HFILE hPdd, ULONG ulFunc, PVOID pData, ULONG cbDataSize);
31
32static HFILE hPDDMix = 0;
33static char mixerApiMap[256] = {0};
34
35/******************************************************************************/
36/******************************************************************************/
37BOOL OSLibMixerOpen()
38{
39 char szPDDName[128] = "\\DEV\\";
40
41 if(GetAudioPDDName(&szPDDName[5]) == FALSE) {
42 return FALSE;
43 }
44
45 dprintf(("OSLibMixerOpen: PDD name %s", szPDDName));
46
47 hPDDMix = DevOpen(szPDDName);
48 if(hPDDMix == 0) {
49 dprintf(("Unable to open PDD %s", szPDDName));
50 return FALSE;
51 }
52 if(mixerapiIOCTL90(hPDDMix, GETAPIMAP, mixerApiMap, sizeof(mixerApiMap)) == FALSE) {
53 dprintf(("GETAPIMAP failed!!"));
54 DosClose(hPDDMix);
55 return FALSE;
56 }
57
58 return TRUE;
59}
60/******************************************************************************/
61/******************************************************************************/
62void OSLibMixerClose()
63{
64 if(hPDDMix) {
65 DosClose(hPDDMix);
66 }
67}
68/******************************************************************************/
69/******************************************************************************/
70static DWORD OSLibMixGetIndex(DWORD dwControl)
71{
72 DWORD idx;
73
74 switch(dwControl) {
75 case MIXER_CTRL_MONOIN:
76 idx = MONOINSET;
77 break;
78 case MIXER_CTRL_PHONE:
79 idx = PHONESET;
80 break;
81 case MIXER_CTRL_MIC:
82 idx = MICSET;
83 break;
84 case MIXER_CTRL_LINE:
85 idx = LINESET;
86 break;
87 case MIXER_CTRL_CD:
88 idx = CDSET;
89 break;
90 case MIXER_CTRL_VIDEO:
91 idx = VIDEOSET;
92 break;
93 case MIXER_CTRL_AUX:
94 idx = AUXSET;
95 break;
96 case MIXER_CTRL_BASS:
97 idx = BASSTREBLESET;
98 break;
99 case MIXER_CTRL_TREBLE:
100 idx = BASSTREBLESET;
101 break;
102 case MIXER_CTRL_3D:
103 idx = THREEDSET;
104 break;
105 case MIXER_CTRL_STREAMVOL:
106 idx = STREAMVOLSET;
107 break;
108 case MIXER_CTRL_RECORDSRC:
109 idx = RECORDSRCSET;
110 break;
111 case MIXER_CTRL_RECORDGAIN:
112 idx = RECORDGAINSET;
113 break;
114 default:
115 DebugInt3();
116 return -1;
117 }
118 return idx & 0xF;
119}
120/******************************************************************************/
121/******************************************************************************/
122BOOL OSLibMixIsControlPresent(DWORD dwControl)
123{
124 DWORD idx;
125
126 idx = OSLibMixGetIndex(dwControl);
127 if(idx == -1) {
128 return FALSE;
129 }
130 idx += MONOINSET;
131 return mixerApiMap[idx] != 0;
132}
133/******************************************************************************/
134/******************************************************************************/
135BOOL OSLibMixSetVolume(DWORD dwControl, BOOL fMute, DWORD dwVolLeft, DWORD dwVolRight)
136{
137 DWORD dwFunc;
138 MIXSTRUCT mixstruct;
139
140 dwFunc = OSLibMixGetIndex(dwControl);
141 if(dwFunc == -1) {
142 return FALSE;
143 }
144 dwFunc += MONOINSET;
145
146 if(dwVolLeft > MIXER_MAX_VOLUME || dwVolRight > MIXER_MAX_VOLUME) {
147 dprintf(("OSLibMixSetVolume: Volume (%d,%d) out of RANGE!!", dwVolLeft, dwVolRight));
148 return FALSE;
149 }
150 mixstruct.Mute = fMute;
151 mixstruct.VolumeL = dwVolLeft;
152 mixstruct.VolumeR = dwVolRight;
153
154 if(mixerapiIOCTL90(hPDDMix, dwFunc, &mixstruct, sizeof(mixstruct)) == TRUE) {
155 return TRUE;
156 }
157 dprintf(("OSLibMixSetVolume: mixerapiIOCTL90 %d failed!!", dwFunc));
158 return FALSE;
159}
160/******************************************************************************/
161/******************************************************************************/
162BOOL OSLibMixGetVolume(DWORD dwControl, BOOL *pfMute, DWORD *pdwVolLeft, DWORD *pdwVolRight)
163{
164 DWORD dwFunc;
165 MIXSTRUCT mixstruct;
166
167 dwFunc = OSLibMixGetIndex(dwControl);
168 if(dwFunc == -1) {
169 return FALSE;
170 }
171 dwFunc += MONOINQUERY;
172
173 if(mixerapiIOCTL90(hPDDMix, dwFunc, &mixstruct, sizeof(mixstruct)) == TRUE) {
174 return TRUE;
175 }
176 if(pfMute) *pfMute = mixstruct.Mute;
177 if(pdwVolLeft) *pdwVolLeft = mixstruct.VolumeL;
178 if(pdwVolRight) *pdwVolRight = mixstruct.VolumeR;
179
180 if(mixstruct.VolumeL > MIXER_MAX_VOLUME || mixstruct.VolumeR > MIXER_MAX_VOLUME) {
181 dprintf(("OSLibMixGetVolume: Volume (%d,%d) out of RANGE!!", mixstruct.VolumeL, mixstruct.VolumeR));
182 return FALSE;
183 }
184
185 dprintf(("OSLibMixGetVolume: mixerapiIOCTL90 %d failed!!", dwFunc));
186 return FALSE;
187}
188/******************************************************************************/
189/******************************************************************************/
190BOOL OSLibMixSetRecSource(DWORD dwRecSrc)
191{
192 DWORD idx;
193 MIXSTRUCT mixstruct;
194
195 switch(dwRecSrc) {
196 case MIXER_RECSRC_MIC:
197 idx = I90SRC_MIC;
198 break;
199 case MIXER_RECSRC_CD:
200 idx = I90SRC_CD;
201 break;
202 case MIXER_RECSRC_VIDEO:
203 idx = I90SRC_VIDEO;
204 break;
205 case MIXER_RECSRC_AUX:
206 idx = I90SRC_AUX;
207 break;
208 case MIXER_RECSRC_LINE:
209 idx = I90SRC_LINE;
210 break;
211 case MIXER_RECSRC_RES5:
212 idx = I90SRC_RES5;
213 break;
214 case MIXER_RECSRC_RES6:
215 idx = I90SRC_RES6;
216 break;
217 case MIXER_RECSRC_PHONE:
218 idx = I90SRC_PHONE;
219 break;
220 default:
221 DebugInt3();
222 return FALSE;
223 }
224 mixstruct.Mute = 0;
225 mixstruct.VolumeL = idx;
226
227 if(mixerapiIOCTL90(hPDDMix, RECORDSRCSET, &mixstruct, sizeof(mixstruct)) == TRUE) {
228 return TRUE;
229 }
230 dprintf(("OSLibMixSetRecSource: mixerapiIOCTL90 RECORDSRCSET failed!!"));
231 return FALSE;
232}
233/******************************************************************************/
234/******************************************************************************/
235BOOL OSLibMixGetRecSource(DWORD *pdwRecSrc)
236{
237 DWORD idx;
238 MIXSTRUCT mixstruct;
239
240 if(mixerapiIOCTL90(hPDDMix, RECORDSRCQUERY, &mixstruct, sizeof(mixstruct)) == FALSE) {
241 dprintf(("OSLibMixSetRecSource: mixerapiIOCTL90 RECORDSRCGET failed!!"));
242 return FALSE;
243 }
244 switch(mixstruct.VolumeL) {
245 case I90SRC_MIC:
246 idx = MIXER_RECSRC_MIC;
247 break;
248 case I90SRC_CD:
249 idx = MIXER_RECSRC_CD;
250 break;
251 case I90SRC_VIDEO:
252 idx = MIXER_RECSRC_VIDEO;
253 break;
254 case I90SRC_AUX:
255 idx = MIXER_RECSRC_AUX;
256 break;
257 case I90SRC_LINE:
258 idx = MIXER_RECSRC_LINE;
259 break;
260 case I90SRC_RES5:
261 idx = MIXER_RECSRC_RES5;
262 break;
263 case I90SRC_RES6:
264 idx = MIXER_RECSRC_RES6;
265 break;
266 case I90SRC_PHONE:
267 idx = MIXER_RECSRC_PHONE;
268 break;
269 default:
270 DebugInt3();
271 return FALSE;
272 }
273 if(pdwRecSrc) {
274 *pdwRecSrc = idx;
275 }
276 return TRUE;
277}
278/******************************************************************************/
279// OS/2 32-bit program to query the Physical Device Driver name
280// for the default MMPM/2 WaveAudio device. Joe Nord 10-Mar-1999
281/******************************************************************************/
282static HFILE DevOpen (char *ddName)
283{
284 ULONG ulRC;
285 ULONG OpenFlags;
286 ULONG OpenMode;
287 ULONG ulFileSize = 0;
288 ULONG ulFileAttribute = 0;
289 ULONG ulActionTaken = 0;
290 HFILE hPdd = NULL;
291
292 OpenFlags = OPEN_ACTION_OPEN_IF_EXISTS; // Do not create file
293
294 OpenMode = OPEN_ACCESS_READWRITE + // Read/Write file
295 OPEN_SHARE_DENYNONE + // Non-exclusive access
296 OPEN_FLAGS_FAIL_ON_ERROR; // No system popups on errors
297
298 ulRC = DosOpen (ddName, // in
299 &hPdd, // out (handle)
300 &ulActionTaken, // out
301 ulFileSize, // in
302 ulFileAttribute, // in
303 OpenFlags, // in
304 OpenMode, // in
305 NULL); // in
306
307 if (ulRC != 0)
308 hPdd = NULL;
309
310 return (hPdd);
311}
312/******************************************************************************/
313/******************************************************************************/
314static BOOL mixerapiIOCTL90 (HFILE hPdd, ULONG ulFunc, PVOID pData, ULONG cbDataSize)
315{
316 ULONG ulRC;
317
318 ulRC = DosDevIOCtl
319 (hPdd, // Device Handle
320 0x90, // Category (user defined >= 0x80)
321 ulFunc, // Function Use defines in .H file
322 NULL, // in Address of parm data (not used)
323 0, // in Max size of parm data structure
324 NULL, // in out Actual size of parm data structure
325 pData, // in Address of command data
326 cbDataSize, // in Maximum size of command data
327 &cbDataSize); // in out Size of command data
328
329 return ulRC == NO_ERROR;
330}
331/******************************************************************************/
332// OS/2 32-bit program to query the Physical Device Driver name
333// for the default MMPM/2 WaveAudio device. Joe Nord 10-Mar-1999
334/******************************************************************************/
335static BOOL GetAudioPDDName (char *pszPDDName)
336{
337 ULONG ulRC;
338 char szAmpMix[9] = "AMPMIX01";
339
340 MCI_SYSINFO_PARMS SysInfo;
341 MCI_SYSINFO_LOGDEVICE SysInfoParm;
342 MCI_SYSINFO_QUERY_NAME QueryNameParm;
343
344 memset (&SysInfo, '\0', sizeof(SysInfo));
345 memset (&SysInfoParm, '\0', sizeof(SysInfoParm));
346 memset (&QueryNameParm, '\0', sizeof(QueryNameParm));
347
348 SysInfo.ulItem = MCI_SYSINFO_QUERY_NAMES;
349 SysInfo.usDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO;
350 SysInfo.pSysInfoParm = &QueryNameParm;
351
352 strcpy (QueryNameParm.szLogicalName, szAmpMix);
353
354 ulRC = mymciSendCommand (0,
355 MCI_SYSINFO,
356 MCI_SYSINFO_ITEM | MCI_WAIT,
357 (PVOID) &SysInfo,
358 0);
359 if (ulRC != 0) return FALSE;
360
361 // Get PDD associated with our AmpMixer
362 // Device name is in pSysInfoParm->szPDDName
363
364 SysInfo.ulItem = MCI_SYSINFO_QUERY_DRIVER;
365 SysInfo.usDeviceType = MCI_DEVTYPE_WAVEFORM_AUDIO;
366 SysInfo.pSysInfoParm = &SysInfoParm;
367
368 strcpy (SysInfoParm.szInstallName, QueryNameParm.szInstallName);
369
370 ulRC = mymciSendCommand (0,
371 MCI_SYSINFO,
372 MCI_SYSINFO_ITEM | MCI_WAIT,
373 (PVOID) &SysInfo,
374 0);
375 if (ulRC != 0) return FALSE;
376
377 strcpy (pszPDDName, SysInfoParm.szPDDName);
378
379 return TRUE;
380}
381/******************************************************************************/
382/******************************************************************************/
383
Note: See TracBrowser for help on using the repository browser.