2 * Sample AUXILIARY 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "wine/port.h"
31 #ifdef HAVE_SYS_IOCTL_H
32 # include <sys/ioctl.h>
34 #if defined(HAVE_SYS_SOUNDCARD_H)
35 # include <sys/soundcard.h>
36 #elif defined(HAVE_MACHINE_SOUNDCARD_H)
37 # include <machine/soundcard.h>
38 #elif defined(HAVE_SOUNDCARD_H)
39 # include <soundcard.h>
41 #ifdef HAVE_SYS_ERRNO_H
42 #include <sys/errno.h>
48 #include "wine/unicode.h"
49 #include "wine/debug.h"
51 WINE_DEFAULT_DEBUG_CHANNEL(mmaux);
53 #define MIXER_DEV "/dev/mixer"
55 static int NumDev = 6;
57 /*-----------------------------------------------------------------------*/
59 static LRESULT OSS_AuxInit(void)
64 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
65 WARN("mixer device not available !\n");
74 /*-----------------------------------------------------------------------*/
76 static LRESULT OSS_AuxExit(void)
82 /**************************************************************************
83 * AUX_GetDevCaps [internal]
85 static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPSW lpCaps, DWORD dwSize)
88 static const WCHAR ini[] = {'O','S','S',' ','A','u','x',' ','#','0',0};
90 TRACE("(%04X, %p, %u);\n", wDevID, lpCaps, dwSize);
91 if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
92 if (wDevID >= NumDev) return MMSYSERR_BADDEVICEID;
93 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
94 WARN("mixer device not available !\n");
95 return MMSYSERR_NOTENABLED;
97 if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
99 WARN("unable to read mixer !\n");
100 return MMSYSERR_NOTENABLED;
104 lpCaps->wPid = 0x55 + wDevID;
105 lpCaps->vDriverVersion = 0x0100;
106 strcpyW(lpCaps->szPname, ini);
107 lpCaps->szPname[9] = '0' + wDevID; /* 6 at max */
108 lpCaps->wTechnology = wDevID == 2 ? AUXCAPS_CDAUDIO : AUXCAPS_AUXIN;
109 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
111 return MMSYSERR_NOERROR;
115 /**************************************************************************
116 * AUX_GetVolume [internal]
118 static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
120 int mixer, volume, left, right, cmd;
122 TRACE("(%04X, %p);\n", wDevID, lpdwVol);
123 if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
124 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
125 WARN("mixer device not available !\n");
126 return MMSYSERR_NOTENABLED;
130 TRACE("SOUND_MIXER_READ_PCM !\n");
131 cmd = SOUND_MIXER_READ_PCM;
134 TRACE("SOUND_MIXER_READ_SYNTH !\n");
135 cmd = SOUND_MIXER_READ_SYNTH;
138 TRACE("SOUND_MIXER_READ_CD !\n");
139 cmd = SOUND_MIXER_READ_CD;
142 TRACE("SOUND_MIXER_READ_LINE !\n");
143 cmd = SOUND_MIXER_READ_LINE;
146 TRACE("SOUND_MIXER_READ_MIC !\n");
147 cmd = SOUND_MIXER_READ_MIC;
150 TRACE("SOUND_MIXER_READ_VOLUME !\n");
151 cmd = SOUND_MIXER_READ_VOLUME;
154 WARN("invalid device id=%04X !\n", wDevID);
156 return MMSYSERR_NOTENABLED;
158 if (ioctl(mixer, cmd, &volume) == -1) {
159 WARN("unable to read mixer !\n");
161 return MMSYSERR_NOTENABLED;
164 left = LOBYTE(LOWORD(volume));
165 right = HIBYTE(LOWORD(volume));
166 TRACE("left=%d right=%d !\n", left, right);
167 *lpdwVol = MAKELONG((left * 0xFFFFL) / 100, (right * 0xFFFFL) / 100);
168 return MMSYSERR_NOERROR;
171 /**************************************************************************
172 * AUX_SetVolume [internal]
174 static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
177 int volume, left, right;
180 TRACE("(%04X, %08X);\n", wDevID, dwParam);
182 left = (LOWORD(dwParam) * 100) >> 16;
183 right = (HIWORD(dwParam) * 100) >> 16;
184 volume = (right << 8) | left;
186 if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
187 WARN("mixer device not available !\n");
188 return MMSYSERR_NOTENABLED;
193 TRACE("SOUND_MIXER_WRITE_PCM !\n");
194 cmd = SOUND_MIXER_WRITE_PCM;
197 TRACE("SOUND_MIXER_WRITE_SYNTH !\n");
198 cmd = SOUND_MIXER_WRITE_SYNTH;
201 TRACE("SOUND_MIXER_WRITE_CD !\n");
202 cmd = SOUND_MIXER_WRITE_CD;
205 TRACE("SOUND_MIXER_WRITE_LINE !\n");
206 cmd = SOUND_MIXER_WRITE_LINE;
209 TRACE("SOUND_MIXER_WRITE_MIC !\n");
210 cmd = SOUND_MIXER_WRITE_MIC;
213 TRACE("SOUND_MIXER_WRITE_VOLUME !\n");
214 cmd = SOUND_MIXER_WRITE_VOLUME;
217 WARN("invalid device id=%04X !\n", wDevID);
219 return MMSYSERR_NOTENABLED;
221 if (ioctl(mixer, cmd, &volume) == -1) {
222 WARN("unable to set mixer !\n");
224 return MMSYSERR_NOTENABLED;
227 return MMSYSERR_NOERROR;
230 /**************************************************************************
231 * auxMessage (WINEOSS.2)
233 DWORD WINAPI OSS_auxMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser,
234 DWORD_PTR dwParam1, DWORD_PTR dwParam2)
236 TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n",
237 wDevID, wMsg, dwUser, dwParam1, dwParam2);
241 return OSS_AuxInit();
243 return OSS_AuxExit();
246 /* FIXME: Pretend this is supported */
248 case AUXDM_GETDEVCAPS:
249 return AUX_GetDevCaps(wDevID, (LPAUXCAPSW)dwParam1, dwParam2);
250 case AUXDM_GETNUMDEVS:
251 TRACE("return %d;\n", NumDev);
253 case AUXDM_GETVOLUME:
254 return AUX_GetVolume(wDevID, (LPDWORD)dwParam1);
255 case AUXDM_SETVOLUME:
256 return AUX_SetVolume(wDevID, dwParam1);
258 WARN("unknown message !\n");
260 return MMSYSERR_NOTSUPPORTED;