2 * Sample AUXILARY Wine Driver
4 * Copyright 1994 Martin Ayotte
13 #include <sys/ioctl.h>
19 #include "debugtools.h"
21 DEFAULT_DEBUG_CHANNEL(mmaux)
23 #define MIXER_DEV "/dev/mixer"
25 static int NumDev = 6;
27 /*-----------------------------------------------------------------------*/
30 /**************************************************************************
31 * AUX_GetDevCaps [internal]
33 static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPS16 lpCaps, DWORD dwSize)
38 TRACE("(%04X, %p, %lu);\n", wDevID, lpCaps, dwSize);
39 if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
40 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
41 WARN("mixer device not available !\n");
42 return MMSYSERR_NOTENABLED;
44 if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
46 WARN("unable read mixer !\n");
47 return MMSYSERR_NOTENABLED;
51 lpCaps->wMid = 0x0002;
52 lpCaps->vDriverVersion = 0x0200;
53 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
56 lpCaps->wPid = 0x0196;
57 strcpy(lpCaps->szPname, "SB16 Aux: Wave");
58 lpCaps->wTechnology = AUXCAPS_AUXIN;
61 lpCaps->wPid = 0x0197;
62 strcpy(lpCaps->szPname, "SB16 Aux: Midi Synth");
63 lpCaps->wTechnology = AUXCAPS_AUXIN;
66 lpCaps->wPid = 0x0191;
67 strcpy(lpCaps->szPname, "SB16 Aux: CD");
68 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
71 lpCaps->wPid = 0x0192;
72 strcpy(lpCaps->szPname, "SB16 Aux: Line-In");
73 lpCaps->wTechnology = AUXCAPS_AUXIN;
76 lpCaps->wPid = 0x0193;
77 strcpy(lpCaps->szPname, "SB16 Aux: Mic");
78 lpCaps->wTechnology = AUXCAPS_AUXIN;
81 lpCaps->wPid = 0x0194;
82 strcpy(lpCaps->szPname, "SB16 Aux: Master");
83 lpCaps->wTechnology = AUXCAPS_AUXIN;
89 lpCaps->vDriverVersion = 0x0100;
90 strcpy(lpCaps->szPname, "Generic Linux Auxiliary Driver");
91 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
92 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
94 return MMSYSERR_NOERROR;
96 return MMSYSERR_NOTENABLED;
101 /**************************************************************************
102 * AUX_GetVolume [internal]
104 static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
107 int mixer, volume, left, right, cmd;
109 TRACE("(%04X, %p);\n", wDevID, lpdwVol);
110 if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
111 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
112 WARN("mixer device not available !\n");
113 return MMSYSERR_NOTENABLED;
117 TRACE("SOUND_MIXER_READ_PCM !\n");
118 cmd = SOUND_MIXER_READ_PCM;
121 TRACE("SOUND_MIXER_READ_SYNTH !\n");
122 cmd = SOUND_MIXER_READ_SYNTH;
125 TRACE("SOUND_MIXER_READ_CD !\n");
126 cmd = SOUND_MIXER_READ_CD;
129 TRACE("SOUND_MIXER_READ_LINE !\n");
130 cmd = SOUND_MIXER_READ_LINE;
133 TRACE("SOUND_MIXER_READ_MIC !\n");
134 cmd = SOUND_MIXER_READ_MIC;
137 TRACE("SOUND_MIXER_READ_VOLUME !\n");
138 cmd = SOUND_MIXER_READ_VOLUME;
141 WARN("invalid device id=%04X !\n", wDevID);
142 return MMSYSERR_NOTENABLED;
144 if (ioctl(mixer, cmd, &volume) == -1) {
145 WARN("unable read mixer !\n");
146 return MMSYSERR_NOTENABLED;
149 left = LOBYTE(LOWORD(volume));
150 right = HIBYTE(LOWORD(volume));
151 TRACE("left=%d right=%d !\n", left, right);
152 *lpdwVol = MAKELONG((left * 0xFFFFL) / 100, (right * 0xFFFFL) / 100);
153 return MMSYSERR_NOERROR;
155 return MMSYSERR_NOTENABLED;
159 /**************************************************************************
160 * AUX_SetVolume [internal]
162 static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
166 int volume, left, right;
169 TRACE("(%04X, %08lX);\n", wDevID, dwParam);
171 left = (LOWORD(dwParam) * 100) >> 16;
172 right = (HIWORD(dwParam) * 100) >> 16;
173 volume = (right << 8) | left;
175 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
176 WARN("mixer device not available !\n");
177 return MMSYSERR_NOTENABLED;
182 TRACE("SOUND_MIXER_WRITE_PCM !\n");
183 cmd = SOUND_MIXER_WRITE_PCM;
186 TRACE("SOUND_MIXER_WRITE_SYNTH !\n");
187 cmd = SOUND_MIXER_WRITE_SYNTH;
190 TRACE("SOUND_MIXER_WRITE_CD !\n");
191 cmd = SOUND_MIXER_WRITE_CD;
194 TRACE("SOUND_MIXER_WRITE_LINE !\n");
195 cmd = SOUND_MIXER_WRITE_LINE;
198 TRACE("SOUND_MIXER_WRITE_MIC !\n");
199 cmd = SOUND_MIXER_WRITE_MIC;
202 TRACE("SOUND_MIXER_WRITE_VOLUME !\n");
203 cmd = SOUND_MIXER_WRITE_VOLUME;
206 WARN("invalid device id=%04X !\n", wDevID);
207 return MMSYSERR_NOTENABLED;
209 if (ioctl(mixer, cmd, &volume) == -1) {
210 WARN("unable set mixer !\n");
211 return MMSYSERR_NOTENABLED;
214 return MMSYSERR_NOERROR;
216 return MMSYSERR_NOTENABLED;
221 /**************************************************************************
222 * auxMessage [sample driver]
224 DWORD WINAPI auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
225 DWORD dwParam1, DWORD dwParam2)
227 TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n",
228 wDevID, wMsg, dwUser, dwParam1, dwParam2);
230 case AUXDM_GETDEVCAPS:
231 return AUX_GetDevCaps(wDevID,(LPAUXCAPS16)dwParam1,dwParam2);
232 case AUXDM_GETNUMDEVS:
233 TRACE("return %d;\n", NumDev);
235 case AUXDM_GETVOLUME:
236 return AUX_GetVolume(wDevID,(LPDWORD)dwParam1);
237 case AUXDM_SETVOLUME:
238 return AUX_SetVolume(wDevID,dwParam1);
240 WARN("unknown message !\n");
242 return MMSYSERR_NOTSUPPORTED;