Release 970525
[wine/multimedia.git] / multimedia / mmaux.c
blob5b261d0436e4011fdefc744556a083e660464aa4
1 /*
2 * Sample AUXILARY Wine Driver for Linux
4 * Copyright 1994 Martin Ayotte
5 */
7 #define EMULATE_SB16
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <unistd.h>
12 #include <fcntl.h>
13 #include <sys/ioctl.h>
14 #include "windows.h"
15 #include "user.h"
16 #include "driver.h"
17 #include "mmsystem.h"
19 #ifdef linux
20 #include <linux/soundcard.h>
21 #elif __FreeBSD__
22 #include <machine/soundcard.h>
23 #endif
25 #include "stddebug.h"
26 #include "debug.h"
28 #define SOUND_DEV "/dev/dsp"
29 #define MIXER_DEV "/dev/mixer"
31 #ifdef SOUND_VERSION
32 #define IOCTL(a,b,c) ioctl(a,b,&c)
33 #else
34 #define IOCTL(a,b,c) (c = ioctl(a,b,c) )
35 #endif
38 static int NumDev = 6;
40 /*-----------------------------------------------------------------------*/
43 /**************************************************************************
44 * AUX_GetDevCaps [internal]
46 static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPS lpCaps, DWORD dwSize)
48 #ifdef linux
49 int mixer;
50 int volume;
51 dprintf_mmaux(stddeb,"AUX_GetDevCaps(%04X, %p, %lu);\n", wDevID, lpCaps, dwSize);
52 if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
53 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
54 dprintf_mmaux(stddeb,"AUX_GetDevCaps // mixer device not available !\n");
55 return MMSYSERR_NOTENABLED;
57 if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
58 close(mixer);
59 dprintf_mmaux(stddeb,"AUX_GetDevCaps // unable read mixer !\n");
60 return MMSYSERR_NOTENABLED;
62 close(mixer);
63 #ifdef EMULATE_SB16
64 lpCaps->wMid = 0x0002;
65 lpCaps->vDriverVersion = 0x0200;
66 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
67 switch (wDevID) {
68 case 0:
69 lpCaps->wPid = 0x0196;
70 strcpy(lpCaps->szPname, "SB16 Aux: Wave");
71 lpCaps->wTechnology = AUXCAPS_AUXIN;
72 break;
73 case 1:
74 lpCaps->wPid = 0x0197;
75 strcpy(lpCaps->szPname, "SB16 Aux: Midi Synth");
76 lpCaps->wTechnology = AUXCAPS_AUXIN;
77 break;
78 case 2:
79 lpCaps->wPid = 0x0191;
80 strcpy(lpCaps->szPname, "SB16 Aux: CD");
81 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
82 break;
83 case 3:
84 lpCaps->wPid = 0x0192;
85 strcpy(lpCaps->szPname, "SB16 Aux: Line-In");
86 lpCaps->wTechnology = AUXCAPS_AUXIN;
87 break;
88 case 4:
89 lpCaps->wPid = 0x0193;
90 strcpy(lpCaps->szPname, "SB16 Aux: Mic");
91 lpCaps->wTechnology = AUXCAPS_AUXIN;
92 break;
93 case 5:
94 lpCaps->wPid = 0x0194;
95 strcpy(lpCaps->szPname, "SB16 Aux: Master");
96 lpCaps->wTechnology = AUXCAPS_AUXIN;
97 break;
99 #else
100 lpCaps->wMid = 0xAA;
101 lpCaps->wPid = 0x55;
102 lpCaps->vDriverVersion = 0x0100;
103 strcpy(lpCaps->szPname, "Generic Linux Auxiliary Driver");
104 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
105 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
106 #endif
107 return MMSYSERR_NOERROR;
108 #else
109 return MMSYSERR_NOTENABLED;
110 #endif
114 /**************************************************************************
115 * AUX_GetVolume [internal]
117 static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
119 #ifdef linux
120 int mixer;
121 int volume, left, right;
122 int cmd;
124 dprintf_mmaux(stddeb,"AUX_GetVolume(%04X, %p);\n", wDevID, lpdwVol);
125 if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
126 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
127 dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // mixer device not available !\n");
128 return MMSYSERR_NOTENABLED;
130 switch(wDevID) {
131 case 0:
132 dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // SOUND_MIXER_READ_PCM !\n");
133 cmd = SOUND_MIXER_READ_PCM;
134 break;
135 case 1:
136 dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // SOUND_MIXER_READ_SYNTH !\n");
137 cmd = SOUND_MIXER_READ_SYNTH;
138 break;
139 case 2:
140 dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // SOUND_MIXER_READ_CD !\n");
141 cmd = SOUND_MIXER_READ_CD;
142 break;
143 case 3:
144 dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // SOUND_MIXER_READ_LINE !\n");
145 cmd = SOUND_MIXER_READ_LINE;
146 break;
147 case 4:
148 dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // SOUND_MIXER_READ_MIC !\n");
149 cmd = SOUND_MIXER_READ_MIC;
150 break;
151 case 5:
152 dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // SOUND_MIXER_READ_VOLUME !\n");
153 cmd = SOUND_MIXER_READ_VOLUME;
154 break;
155 default:
156 dprintf_mmaux(stddeb, "Linux 'AUX_GetVolume' // invalid device id=%04X !\n", wDevID);
157 return MMSYSERR_NOTENABLED;
159 if (ioctl(mixer, cmd, &volume) == -1) {
160 dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // unable read mixer !\n");
161 return MMSYSERR_NOTENABLED;
163 close(mixer);
164 left = volume & 0x7F;
165 right = (volume >> 8) & 0x7F;
166 dprintf_mmaux(stddeb,"Linux 'AUX_GetVolume' // left=%d right=%d !\n", left, right);
167 *lpdwVol = MAKELONG(left << 9, right << 9);
168 return MMSYSERR_NOERROR;
169 #else
170 return MMSYSERR_NOTENABLED;
171 #endif
174 /**************************************************************************
175 * AUX_SetVolume [internal]
177 static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
179 #ifdef linux
180 int mixer;
181 int volume;
182 int cmd;
183 dprintf_mmaux(stddeb,"AUX_SetVolume(%04X, %08lX);\n", wDevID, dwParam);
184 volume = (LOWORD(dwParam) >> 9 & 0x7F) +
185 ((HIWORD(dwParam) >> 9 & 0x7F) << 8);
186 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
187 dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // mixer device not available !\n");
188 return MMSYSERR_NOTENABLED;
190 switch(wDevID) {
191 case 0:
192 dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_PCM !\n");
193 cmd = SOUND_MIXER_WRITE_PCM;
194 break;
195 case 1:
196 dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_SYNTH !\n");
197 cmd = SOUND_MIXER_WRITE_SYNTH;
198 break;
199 case 2:
200 dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_CD !\n");
201 cmd = SOUND_MIXER_WRITE_CD;
202 break;
203 case 3:
204 dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_LINE !\n");
205 cmd = SOUND_MIXER_WRITE_LINE;
206 break;
207 case 4:
208 dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_MIC !\n");
209 cmd = SOUND_MIXER_WRITE_MIC;
210 break;
211 case 5:
212 dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_VOLUME !\n");
213 cmd = SOUND_MIXER_WRITE_VOLUME;
214 break;
215 default:
216 dprintf_mmaux(stddeb, "Linux 'AUX_SetVolume' // invalid device id=%04X !\n", wDevID);
217 return MMSYSERR_NOTENABLED;
219 if (ioctl(mixer, cmd, &volume) == -1) {
220 dprintf_mmaux(stddeb,"Linux 'AUX_SetVolume' // unable set mixer !\n");
221 return MMSYSERR_NOTENABLED;
223 close(mixer);
224 return MMSYSERR_NOERROR;
225 #else
226 return MMSYSERR_NOTENABLED;
227 #endif
231 /**************************************************************************
232 * auxMessage [sample driver]
234 DWORD auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
235 DWORD dwParam1, DWORD dwParam2)
237 dprintf_mmaux(stddeb,"auxMessage(%04X, %04X, %08lX, %08lX, %08lX);\n",
238 wDevID, wMsg, dwUser, dwParam1, dwParam2);
239 switch(wMsg) {
240 case AUXDM_GETDEVCAPS:
241 return AUX_GetDevCaps(wDevID,
242 (LPAUXCAPS)PTR_SEG_TO_LIN(dwParam1), dwParam2);
243 case AUXDM_GETNUMDEVS:
244 dprintf_mmaux(stddeb,"AUX_GetNumDevs() return %d;\n", NumDev);
245 return NumDev;
246 case AUXDM_GETVOLUME:
247 return AUX_GetVolume(wDevID, (LPDWORD)PTR_SEG_TO_LIN(dwParam1));
248 case AUXDM_SETVOLUME:
249 return AUX_SetVolume(wDevID, dwParam1);
250 default:
251 dprintf_mmaux(stddeb,"auxMessage // unknown message !\n");
253 return MMSYSERR_NOTSUPPORTED;