1 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
3 * Sample AUXILARY Wine Driver
5 * Copyright 1994 Martin Ayotte
16 #include <sys/ioctl.h>
20 #include "debugtools.h"
22 DEFAULT_DEBUG_CHANNEL(mmaux);
26 #define MIXER_DEV "/dev/mixer"
28 static int NumDev = 6;
30 /*-----------------------------------------------------------------------*/
32 static int AUXDRV_Init(void)
36 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
37 WARN("mixer device not available !\n");
46 /**************************************************************************
47 * AUX_GetDevCaps [internal]
49 static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPSA lpCaps, DWORD dwSize)
53 TRACE("(%04X, %p, %lu);\n", wDevID, lpCaps, dwSize);
54 if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
55 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
56 WARN("mixer device not available !\n");
57 return MMSYSERR_NOTENABLED;
59 if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
61 WARN("unable to read mixer !\n");
62 return MMSYSERR_NOTENABLED;
66 lpCaps->wMid = 0x0002;
67 lpCaps->vDriverVersion = 0x0200;
68 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
71 lpCaps->wPid = 0x0196;
72 strcpy(lpCaps->szPname, "SB16 Aux: Wave");
73 lpCaps->wTechnology = AUXCAPS_AUXIN;
76 lpCaps->wPid = 0x0197;
77 strcpy(lpCaps->szPname, "SB16 Aux: Midi Synth");
78 lpCaps->wTechnology = AUXCAPS_AUXIN;
81 lpCaps->wPid = 0x0191;
82 strcpy(lpCaps->szPname, "SB16 Aux: CD");
83 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
86 lpCaps->wPid = 0x0192;
87 strcpy(lpCaps->szPname, "SB16 Aux: Line-In");
88 lpCaps->wTechnology = AUXCAPS_AUXIN;
91 lpCaps->wPid = 0x0193;
92 strcpy(lpCaps->szPname, "SB16 Aux: Mic");
93 lpCaps->wTechnology = AUXCAPS_AUXIN;
96 lpCaps->wPid = 0x0194;
97 strcpy(lpCaps->szPname, "SB16 Aux: Master");
98 lpCaps->wTechnology = AUXCAPS_AUXIN;
104 lpCaps->vDriverVersion = 0x0100;
105 strcpy(lpCaps->szPname, "Generic Linux Auxiliary Driver");
106 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
107 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
109 return MMSYSERR_NOERROR;
113 /**************************************************************************
114 * AUX_GetVolume [internal]
116 static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
118 int mixer, volume, left, right, cmd;
120 TRACE("(%04X, %p);\n", wDevID, lpdwVol);
121 if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
122 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
123 WARN("mixer device not available !\n");
124 return MMSYSERR_NOTENABLED;
128 TRACE("SOUND_MIXER_READ_PCM !\n");
129 cmd = SOUND_MIXER_READ_PCM;
132 TRACE("SOUND_MIXER_READ_SYNTH !\n");
133 cmd = SOUND_MIXER_READ_SYNTH;
136 TRACE("SOUND_MIXER_READ_CD !\n");
137 cmd = SOUND_MIXER_READ_CD;
140 TRACE("SOUND_MIXER_READ_LINE !\n");
141 cmd = SOUND_MIXER_READ_LINE;
144 TRACE("SOUND_MIXER_READ_MIC !\n");
145 cmd = SOUND_MIXER_READ_MIC;
148 TRACE("SOUND_MIXER_READ_VOLUME !\n");
149 cmd = SOUND_MIXER_READ_VOLUME;
152 WARN("invalid device id=%04X !\n", wDevID);
153 return MMSYSERR_NOTENABLED;
155 if (ioctl(mixer, cmd, &volume) == -1) {
156 WARN("unable to read mixer !\n");
157 return MMSYSERR_NOTENABLED;
160 left = LOBYTE(LOWORD(volume));
161 right = HIBYTE(LOWORD(volume));
162 TRACE("left=%d right=%d !\n", left, right);
163 *lpdwVol = MAKELONG((left * 0xFFFFL) / 100, (right * 0xFFFFL) / 100);
164 return MMSYSERR_NOERROR;
167 /**************************************************************************
168 * AUX_SetVolume [internal]
170 static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
173 int volume, left, right;
176 TRACE("(%04X, %08lX);\n", wDevID, dwParam);
178 left = (LOWORD(dwParam) * 100) >> 16;
179 right = (HIWORD(dwParam) * 100) >> 16;
180 volume = (right << 8) | left;
182 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
183 WARN("mixer device not available !\n");
184 return MMSYSERR_NOTENABLED;
189 TRACE("SOUND_MIXER_WRITE_PCM !\n");
190 cmd = SOUND_MIXER_WRITE_PCM;
193 TRACE("SOUND_MIXER_WRITE_SYNTH !\n");
194 cmd = SOUND_MIXER_WRITE_SYNTH;
197 TRACE("SOUND_MIXER_WRITE_CD !\n");
198 cmd = SOUND_MIXER_WRITE_CD;
201 TRACE("SOUND_MIXER_WRITE_LINE !\n");
202 cmd = SOUND_MIXER_WRITE_LINE;
205 TRACE("SOUND_MIXER_WRITE_MIC !\n");
206 cmd = SOUND_MIXER_WRITE_MIC;
209 TRACE("SOUND_MIXER_WRITE_VOLUME !\n");
210 cmd = SOUND_MIXER_WRITE_VOLUME;
213 WARN("invalid device id=%04X !\n", wDevID);
214 return MMSYSERR_NOTENABLED;
216 if (ioctl(mixer, cmd, &volume) == -1) {
217 WARN("unable to set mixer !\n");
218 return MMSYSERR_NOTENABLED;
221 return MMSYSERR_NOERROR;
226 /**************************************************************************
227 * auxMessage (WINEOSS.2)
229 DWORD WINAPI OSS_auxMessage(UINT wDevID, UINT wMsg, DWORD dwUser,
230 DWORD dwParam1, DWORD dwParam2)
232 TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n",
233 wDevID, wMsg, dwUser, dwParam1, dwParam2);
243 /* FIXME: Pretend this is supported */
245 case AUXDM_GETDEVCAPS:
246 return AUX_GetDevCaps(wDevID, (LPAUXCAPSA)dwParam1,dwParam2);
247 case AUXDM_GETNUMDEVS:
248 TRACE("return %d;\n", NumDev);
250 case AUXDM_GETVOLUME:
251 return AUX_GetVolume(wDevID, (LPDWORD)dwParam1);
252 case AUXDM_SETVOLUME:
253 return AUX_SetVolume(wDevID, dwParam1);
255 WARN("unknown message !\n");
257 return MMSYSERR_NOTSUPPORTED;
259 return MMSYSERR_NOTENABLED;