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
30 #include <sys/ioctl.h>
34 #include "wine/debug.h"
36 WINE_DEFAULT_DEBUG_CHANNEL(mmaux);
40 #define MIXER_DEV "/dev/mixer"
42 static int NumDev = 6;
44 /*-----------------------------------------------------------------------*/
46 static int AUXDRV_Init(void)
50 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
51 WARN("mixer device not available !\n");
60 /**************************************************************************
61 * AUX_GetDevCaps [internal]
63 static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPSA lpCaps, DWORD dwSize)
67 TRACE("(%04X, %p, %lu);\n", wDevID, lpCaps, dwSize);
68 if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
69 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
70 WARN("mixer device not available !\n");
71 return MMSYSERR_NOTENABLED;
73 if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
75 WARN("unable to read mixer !\n");
76 return MMSYSERR_NOTENABLED;
80 lpCaps->wMid = 0x0002;
81 lpCaps->vDriverVersion = 0x0200;
82 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
85 lpCaps->wPid = 0x0196;
86 strcpy(lpCaps->szPname, "SB16 Aux: Wave");
87 lpCaps->wTechnology = AUXCAPS_AUXIN;
90 lpCaps->wPid = 0x0197;
91 strcpy(lpCaps->szPname, "SB16 Aux: Midi Synth");
92 lpCaps->wTechnology = AUXCAPS_AUXIN;
95 lpCaps->wPid = 0x0191;
96 strcpy(lpCaps->szPname, "SB16 Aux: CD");
97 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
100 lpCaps->wPid = 0x0192;
101 strcpy(lpCaps->szPname, "SB16 Aux: Line-In");
102 lpCaps->wTechnology = AUXCAPS_AUXIN;
105 lpCaps->wPid = 0x0193;
106 strcpy(lpCaps->szPname, "SB16 Aux: Mic");
107 lpCaps->wTechnology = AUXCAPS_AUXIN;
110 lpCaps->wPid = 0x0194;
111 strcpy(lpCaps->szPname, "SB16 Aux: Master");
112 lpCaps->wTechnology = AUXCAPS_AUXIN;
118 lpCaps->vDriverVersion = 0x0100;
119 strcpy(lpCaps->szPname, "Generic Linux Auxiliary Driver");
120 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
121 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
123 return MMSYSERR_NOERROR;
127 /**************************************************************************
128 * AUX_GetVolume [internal]
130 static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
132 int mixer, volume, left, right, cmd;
134 TRACE("(%04X, %p);\n", wDevID, lpdwVol);
135 if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
136 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
137 WARN("mixer device not available !\n");
138 return MMSYSERR_NOTENABLED;
142 TRACE("SOUND_MIXER_READ_PCM !\n");
143 cmd = SOUND_MIXER_READ_PCM;
146 TRACE("SOUND_MIXER_READ_SYNTH !\n");
147 cmd = SOUND_MIXER_READ_SYNTH;
150 TRACE("SOUND_MIXER_READ_CD !\n");
151 cmd = SOUND_MIXER_READ_CD;
154 TRACE("SOUND_MIXER_READ_LINE !\n");
155 cmd = SOUND_MIXER_READ_LINE;
158 TRACE("SOUND_MIXER_READ_MIC !\n");
159 cmd = SOUND_MIXER_READ_MIC;
162 TRACE("SOUND_MIXER_READ_VOLUME !\n");
163 cmd = SOUND_MIXER_READ_VOLUME;
166 WARN("invalid device id=%04X !\n", wDevID);
167 return MMSYSERR_NOTENABLED;
169 if (ioctl(mixer, cmd, &volume) == -1) {
170 WARN("unable to read mixer !\n");
171 return MMSYSERR_NOTENABLED;
174 left = LOBYTE(LOWORD(volume));
175 right = HIBYTE(LOWORD(volume));
176 TRACE("left=%d right=%d !\n", left, right);
177 *lpdwVol = MAKELONG((left * 0xFFFFL) / 100, (right * 0xFFFFL) / 100);
178 return MMSYSERR_NOERROR;
181 /**************************************************************************
182 * AUX_SetVolume [internal]
184 static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
187 int volume, left, right;
190 TRACE("(%04X, %08lX);\n", wDevID, dwParam);
192 left = (LOWORD(dwParam) * 100) >> 16;
193 right = (HIWORD(dwParam) * 100) >> 16;
194 volume = (right << 8) | left;
196 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
197 WARN("mixer device not available !\n");
198 return MMSYSERR_NOTENABLED;
203 TRACE("SOUND_MIXER_WRITE_PCM !\n");
204 cmd = SOUND_MIXER_WRITE_PCM;
207 TRACE("SOUND_MIXER_WRITE_SYNTH !\n");
208 cmd = SOUND_MIXER_WRITE_SYNTH;
211 TRACE("SOUND_MIXER_WRITE_CD !\n");
212 cmd = SOUND_MIXER_WRITE_CD;
215 TRACE("SOUND_MIXER_WRITE_LINE !\n");
216 cmd = SOUND_MIXER_WRITE_LINE;
219 TRACE("SOUND_MIXER_WRITE_MIC !\n");
220 cmd = SOUND_MIXER_WRITE_MIC;
223 TRACE("SOUND_MIXER_WRITE_VOLUME !\n");
224 cmd = SOUND_MIXER_WRITE_VOLUME;
227 WARN("invalid device id=%04X !\n", wDevID);
228 return MMSYSERR_NOTENABLED;
230 if (ioctl(mixer, cmd, &volume) == -1) {
231 WARN("unable to set mixer !\n");
232 return MMSYSERR_NOTENABLED;
235 return MMSYSERR_NOERROR;
240 /**************************************************************************
241 * auxMessage (WINEOSS.2)
243 DWORD WINAPI OSS_auxMessage(UINT wDevID, UINT wMsg, DWORD dwUser,
244 DWORD dwParam1, DWORD dwParam2)
246 TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n",
247 wDevID, wMsg, dwUser, dwParam1, dwParam2);
257 /* FIXME: Pretend this is supported */
259 case AUXDM_GETDEVCAPS:
260 return AUX_GetDevCaps(wDevID, (LPAUXCAPSA)dwParam1,dwParam2);
261 case AUXDM_GETNUMDEVS:
262 TRACE("return %d;\n", NumDev);
264 case AUXDM_GETVOLUME:
265 return AUX_GetVolume(wDevID, (LPDWORD)dwParam1);
266 case AUXDM_SETVOLUME:
267 return AUX_SetVolume(wDevID, dwParam1);
269 WARN("unknown message !\n");
271 return MMSYSERR_NOTSUPPORTED;
273 return MMSYSERR_NOTENABLED;