1 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
3 * Sample AUXILARY Wine Driver
5 * Copyright 1994 Martin Ayotte
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33 #ifdef HAVE_SYS_IOCTL_H
34 # include <sys/ioctl.h>
41 #include "wine/debug.h"
43 WINE_DEFAULT_DEBUG_CHANNEL(mmaux);
47 #define MIXER_DEV "/dev/mixer"
49 static int NumDev = 6;
51 /*-----------------------------------------------------------------------*/
53 static int AUXDRV_Init(void)
57 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
58 WARN("mixer device not available !\n");
67 /**************************************************************************
68 * AUX_GetDevCaps [internal]
70 static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPSA lpCaps, DWORD dwSize)
74 TRACE("(%04X, %p, %lu);\n", wDevID, lpCaps, dwSize);
75 if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
76 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
77 WARN("mixer device not available !\n");
78 return MMSYSERR_NOTENABLED;
80 if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
82 WARN("unable to read mixer !\n");
83 return MMSYSERR_NOTENABLED;
87 lpCaps->wMid = 0x0002;
88 lpCaps->vDriverVersion = 0x0200;
89 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
92 lpCaps->wPid = 0x0196;
93 strcpy(lpCaps->szPname, "SB16 Aux: Wave");
94 lpCaps->wTechnology = AUXCAPS_AUXIN;
97 lpCaps->wPid = 0x0197;
98 strcpy(lpCaps->szPname, "SB16 Aux: Midi Synth");
99 lpCaps->wTechnology = AUXCAPS_AUXIN;
102 lpCaps->wPid = 0x0191;
103 strcpy(lpCaps->szPname, "SB16 Aux: CD");
104 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
107 lpCaps->wPid = 0x0192;
108 strcpy(lpCaps->szPname, "SB16 Aux: Line-In");
109 lpCaps->wTechnology = AUXCAPS_AUXIN;
112 lpCaps->wPid = 0x0193;
113 strcpy(lpCaps->szPname, "SB16 Aux: Mic");
114 lpCaps->wTechnology = AUXCAPS_AUXIN;
117 lpCaps->wPid = 0x0194;
118 strcpy(lpCaps->szPname, "SB16 Aux: Master");
119 lpCaps->wTechnology = AUXCAPS_AUXIN;
125 lpCaps->vDriverVersion = 0x0100;
126 strcpy(lpCaps->szPname, "Generic Linux Auxiliary Driver");
127 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
128 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
130 return MMSYSERR_NOERROR;
134 /**************************************************************************
135 * AUX_GetVolume [internal]
137 static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
139 int mixer, volume, left, right, cmd;
141 TRACE("(%04X, %p);\n", wDevID, lpdwVol);
142 if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
143 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
144 WARN("mixer device not available !\n");
145 return MMSYSERR_NOTENABLED;
149 TRACE("SOUND_MIXER_READ_PCM !\n");
150 cmd = SOUND_MIXER_READ_PCM;
153 TRACE("SOUND_MIXER_READ_SYNTH !\n");
154 cmd = SOUND_MIXER_READ_SYNTH;
157 TRACE("SOUND_MIXER_READ_CD !\n");
158 cmd = SOUND_MIXER_READ_CD;
161 TRACE("SOUND_MIXER_READ_LINE !\n");
162 cmd = SOUND_MIXER_READ_LINE;
165 TRACE("SOUND_MIXER_READ_MIC !\n");
166 cmd = SOUND_MIXER_READ_MIC;
169 TRACE("SOUND_MIXER_READ_VOLUME !\n");
170 cmd = SOUND_MIXER_READ_VOLUME;
173 WARN("invalid device id=%04X !\n", wDevID);
174 return MMSYSERR_NOTENABLED;
176 if (ioctl(mixer, cmd, &volume) == -1) {
177 WARN("unable to read mixer !\n");
178 return MMSYSERR_NOTENABLED;
181 left = LOBYTE(LOWORD(volume));
182 right = HIBYTE(LOWORD(volume));
183 TRACE("left=%d right=%d !\n", left, right);
184 *lpdwVol = MAKELONG((left * 0xFFFFL) / 100, (right * 0xFFFFL) / 100);
185 return MMSYSERR_NOERROR;
188 /**************************************************************************
189 * AUX_SetVolume [internal]
191 static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
194 int volume, left, right;
197 TRACE("(%04X, %08lX);\n", wDevID, dwParam);
199 left = (LOWORD(dwParam) * 100) >> 16;
200 right = (HIWORD(dwParam) * 100) >> 16;
201 volume = (right << 8) | left;
203 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
204 WARN("mixer device not available !\n");
205 return MMSYSERR_NOTENABLED;
210 TRACE("SOUND_MIXER_WRITE_PCM !\n");
211 cmd = SOUND_MIXER_WRITE_PCM;
214 TRACE("SOUND_MIXER_WRITE_SYNTH !\n");
215 cmd = SOUND_MIXER_WRITE_SYNTH;
218 TRACE("SOUND_MIXER_WRITE_CD !\n");
219 cmd = SOUND_MIXER_WRITE_CD;
222 TRACE("SOUND_MIXER_WRITE_LINE !\n");
223 cmd = SOUND_MIXER_WRITE_LINE;
226 TRACE("SOUND_MIXER_WRITE_MIC !\n");
227 cmd = SOUND_MIXER_WRITE_MIC;
230 TRACE("SOUND_MIXER_WRITE_VOLUME !\n");
231 cmd = SOUND_MIXER_WRITE_VOLUME;
234 WARN("invalid device id=%04X !\n", wDevID);
235 return MMSYSERR_NOTENABLED;
237 if (ioctl(mixer, cmd, &volume) == -1) {
238 WARN("unable to set mixer !\n");
239 return MMSYSERR_NOTENABLED;
242 return MMSYSERR_NOERROR;
247 /**************************************************************************
248 * auxMessage (WINEOSS.2)
250 DWORD WINAPI OSS_auxMessage(UINT wDevID, UINT wMsg, DWORD dwUser,
251 DWORD dwParam1, DWORD dwParam2)
253 TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n",
254 wDevID, wMsg, dwUser, dwParam1, dwParam2);
264 /* FIXME: Pretend this is supported */
266 case AUXDM_GETDEVCAPS:
267 return AUX_GetDevCaps(wDevID, (LPAUXCAPSA)dwParam1,dwParam2);
268 case AUXDM_GETNUMDEVS:
269 TRACE("return %d;\n", NumDev);
271 case AUXDM_GETVOLUME:
272 return AUX_GetVolume(wDevID, (LPDWORD)dwParam1);
273 case AUXDM_SETVOLUME:
274 return AUX_SetVolume(wDevID, dwParam1);
276 WARN("unknown message !\n");
278 return MMSYSERR_NOTSUPPORTED;
280 return MMSYSERR_NOTENABLED;