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
;