2 * Sample AUXILARY Wine Driver
4 * Copyright 1994 Martin Ayotte
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #ifdef HAVE_SYS_IOCTL_H
31 # include <sys/ioctl.h>
38 #include "wine/unicode.h"
39 #include "wine/debug.h"
41 WINE_DEFAULT_DEBUG_CHANNEL(mmaux);
45 #define MIXER_DEV "/dev/mixer"
47 static int NumDev = 6;
49 /*-----------------------------------------------------------------------*/
51 static int AUXDRV_Init(void)
55 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
56 WARN("mixer device not available !\n");
65 /**************************************************************************
66 * AUX_GetDevCaps [internal]
68 static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPSW lpCaps, DWORD dwSize)
71 static const WCHAR ini[] = {'O','S','S',' ','A','u','x',0};
73 TRACE("(%04X, %p, %lu);\n", wDevID, lpCaps, dwSize);
74 if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
75 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
76 WARN("mixer device not available !\n");
77 return MMSYSERR_NOTENABLED;
79 if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
81 WARN("unable to read mixer !\n");
82 return MMSYSERR_NOTENABLED;
87 lpCaps->vDriverVersion = 0x0100;
88 strcpyW(lpCaps->szPname, ini);
89 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
90 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
92 return MMSYSERR_NOERROR;
96 /**************************************************************************
97 * AUX_GetVolume [internal]
99 static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
101 int mixer, volume, left, right, cmd;
103 TRACE("(%04X, %p);\n", wDevID, lpdwVol);
104 if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
105 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
106 WARN("mixer device not available !\n");
107 return MMSYSERR_NOTENABLED;
111 TRACE("SOUND_MIXER_READ_PCM !\n");
112 cmd = SOUND_MIXER_READ_PCM;
115 TRACE("SOUND_MIXER_READ_SYNTH !\n");
116 cmd = SOUND_MIXER_READ_SYNTH;
119 TRACE("SOUND_MIXER_READ_CD !\n");
120 cmd = SOUND_MIXER_READ_CD;
123 TRACE("SOUND_MIXER_READ_LINE !\n");
124 cmd = SOUND_MIXER_READ_LINE;
127 TRACE("SOUND_MIXER_READ_MIC !\n");
128 cmd = SOUND_MIXER_READ_MIC;
131 TRACE("SOUND_MIXER_READ_VOLUME !\n");
132 cmd = SOUND_MIXER_READ_VOLUME;
135 WARN("invalid device id=%04X !\n", wDevID);
136 return MMSYSERR_NOTENABLED;
138 if (ioctl(mixer, cmd, &volume) == -1) {
139 WARN("unable to read mixer !\n");
140 return MMSYSERR_NOTENABLED;
143 left = LOBYTE(LOWORD(volume));
144 right = HIBYTE(LOWORD(volume));
145 TRACE("left=%d right=%d !\n", left, right);
146 *lpdwVol = MAKELONG((left * 0xFFFFL) / 100, (right * 0xFFFFL) / 100);
147 return MMSYSERR_NOERROR;
150 /**************************************************************************
151 * AUX_SetVolume [internal]
153 static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
156 int volume, left, right;
159 TRACE("(%04X, %08lX);\n", wDevID, dwParam);
161 left = (LOWORD(dwParam) * 100) >> 16;
162 right = (HIWORD(dwParam) * 100) >> 16;
163 volume = (right << 8) | left;
165 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
166 WARN("mixer device not available !\n");
167 return MMSYSERR_NOTENABLED;
172 TRACE("SOUND_MIXER_WRITE_PCM !\n");
173 cmd = SOUND_MIXER_WRITE_PCM;
176 TRACE("SOUND_MIXER_WRITE_SYNTH !\n");
177 cmd = SOUND_MIXER_WRITE_SYNTH;
180 TRACE("SOUND_MIXER_WRITE_CD !\n");
181 cmd = SOUND_MIXER_WRITE_CD;
184 TRACE("SOUND_MIXER_WRITE_LINE !\n");
185 cmd = SOUND_MIXER_WRITE_LINE;
188 TRACE("SOUND_MIXER_WRITE_MIC !\n");
189 cmd = SOUND_MIXER_WRITE_MIC;
192 TRACE("SOUND_MIXER_WRITE_VOLUME !\n");
193 cmd = SOUND_MIXER_WRITE_VOLUME;
196 WARN("invalid device id=%04X !\n", wDevID);
197 return MMSYSERR_NOTENABLED;
199 if (ioctl(mixer, cmd, &volume) == -1) {
200 WARN("unable to set mixer !\n");
201 return MMSYSERR_NOTENABLED;
204 return MMSYSERR_NOERROR;
209 /**************************************************************************
210 * auxMessage (WINEOSS.2)
212 DWORD WINAPI OSS_auxMessage(UINT wDevID, UINT wMsg, DWORD dwUser,
213 DWORD dwParam1, DWORD dwParam2)
215 TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n",
216 wDevID, wMsg, dwUser, dwParam1, dwParam2);
226 /* FIXME: Pretend this is supported */
228 case AUXDM_GETDEVCAPS:
229 return AUX_GetDevCaps(wDevID, (LPAUXCAPSW)dwParam1, dwParam2);
230 case AUXDM_GETNUMDEVS:
231 TRACE("return %d;\n", NumDev);
233 case AUXDM_GETVOLUME:
234 return AUX_GetVolume(wDevID, (LPDWORD)dwParam1);
235 case AUXDM_SETVOLUME:
236 return AUX_SetVolume(wDevID, dwParam1);
238 WARN("unknown message !\n");
240 return MMSYSERR_NOTSUPPORTED;
242 return MMSYSERR_NOTENABLED;