2 * Sample AUXILARY Wine Driver
4 * Copyright 1994 Martin Ayotte
13 #include <sys/ioctl.h>
16 #include "multimedia.h"
19 DEFAULT_DEBUG_CHANNEL(mmaux
)
21 #define MIXER_DEV "/dev/mixer"
23 static int NumDev
= 6;
25 /*-----------------------------------------------------------------------*/
28 /**************************************************************************
29 * AUX_GetDevCaps [internal]
31 static DWORD
AUX_GetDevCaps(WORD wDevID
, LPAUXCAPS16 lpCaps
, DWORD dwSize
)
36 TRACE(mmaux
,"(%04X, %p, %lu);\n", wDevID
, lpCaps
, dwSize
);
37 if (lpCaps
== NULL
) return MMSYSERR_NOTENABLED
;
38 if ((mixer
= open(MIXER_DEV
, O_RDWR
)) < 0) {
39 WARN(mmaux
, "mixer device not available !\n");
40 return MMSYSERR_NOTENABLED
;
42 if (ioctl(mixer
, SOUND_MIXER_READ_LINE
, &volume
) == -1) {
44 WARN(mmaux
, "unable read mixer !\n");
45 return MMSYSERR_NOTENABLED
;
49 lpCaps
->wMid
= 0x0002;
50 lpCaps
->vDriverVersion
= 0x0200;
51 lpCaps
->dwSupport
= AUXCAPS_VOLUME
| AUXCAPS_LRVOLUME
;
54 lpCaps
->wPid
= 0x0196;
55 strcpy(lpCaps
->szPname
, "SB16 Aux: Wave");
56 lpCaps
->wTechnology
= AUXCAPS_AUXIN
;
59 lpCaps
->wPid
= 0x0197;
60 strcpy(lpCaps
->szPname
, "SB16 Aux: Midi Synth");
61 lpCaps
->wTechnology
= AUXCAPS_AUXIN
;
64 lpCaps
->wPid
= 0x0191;
65 strcpy(lpCaps
->szPname
, "SB16 Aux: CD");
66 lpCaps
->wTechnology
= AUXCAPS_CDAUDIO
;
69 lpCaps
->wPid
= 0x0192;
70 strcpy(lpCaps
->szPname
, "SB16 Aux: Line-In");
71 lpCaps
->wTechnology
= AUXCAPS_AUXIN
;
74 lpCaps
->wPid
= 0x0193;
75 strcpy(lpCaps
->szPname
, "SB16 Aux: Mic");
76 lpCaps
->wTechnology
= AUXCAPS_AUXIN
;
79 lpCaps
->wPid
= 0x0194;
80 strcpy(lpCaps
->szPname
, "SB16 Aux: Master");
81 lpCaps
->wTechnology
= AUXCAPS_AUXIN
;
87 lpCaps
->vDriverVersion
= 0x0100;
88 strcpy(lpCaps
->szPname
, "Generic Linux Auxiliary Driver");
89 lpCaps
->wTechnology
= AUXCAPS_CDAUDIO
;
90 lpCaps
->dwSupport
= AUXCAPS_VOLUME
| AUXCAPS_LRVOLUME
;
92 return MMSYSERR_NOERROR
;
94 return MMSYSERR_NOTENABLED
;
99 /**************************************************************************
100 * AUX_GetVolume [internal]
102 static DWORD
AUX_GetVolume(WORD wDevID
, LPDWORD lpdwVol
)
105 int mixer
,volume
,left
,right
,cmd
;
107 TRACE(mmaux
,"(%04X, %p);\n", wDevID
, lpdwVol
);
108 if (lpdwVol
== NULL
) return MMSYSERR_NOTENABLED
;
109 if ((mixer
= open(MIXER_DEV
, O_RDWR
)) < 0) {
110 WARN(mmaux
, "mixer device not available !\n");
111 return MMSYSERR_NOTENABLED
;
115 TRACE(mmaux
,"SOUND_MIXER_READ_PCM !\n");
116 cmd
= SOUND_MIXER_READ_PCM
;
119 TRACE(mmaux
,"SOUND_MIXER_READ_SYNTH !\n");
120 cmd
= SOUND_MIXER_READ_SYNTH
;
123 TRACE(mmaux
,"SOUND_MIXER_READ_CD !\n");
124 cmd
= SOUND_MIXER_READ_CD
;
127 TRACE(mmaux
,"SOUND_MIXER_READ_LINE !\n");
128 cmd
= SOUND_MIXER_READ_LINE
;
131 TRACE(mmaux
,"SOUND_MIXER_READ_MIC !\n");
132 cmd
= SOUND_MIXER_READ_MIC
;
135 TRACE(mmaux
,"SOUND_MIXER_READ_VOLUME !\n");
136 cmd
= SOUND_MIXER_READ_VOLUME
;
139 WARN(mmaux
, "invalid device id=%04X !\n", wDevID
);
140 return MMSYSERR_NOTENABLED
;
142 if (ioctl(mixer
, cmd
, &volume
) == -1) {
143 WARN(mmaux
, "unable read mixer !\n");
144 return MMSYSERR_NOTENABLED
;
147 left
= volume
& 0x7F;
148 right
= (volume
>> 8) & 0x7F;
149 TRACE(mmaux
,"left=%d right=%d !\n", left
, right
);
150 *lpdwVol
= MAKELONG(left
<< 9, right
<< 9);
151 return MMSYSERR_NOERROR
;
153 return MMSYSERR_NOTENABLED
;
157 /**************************************************************************
158 * AUX_SetVolume [internal]
160 static DWORD
AUX_SetVolume(WORD wDevID
, DWORD dwParam
)
166 TRACE(mmaux
,"(%04X, %08lX);\n", wDevID
, dwParam
);
167 volume
= (LOWORD(dwParam
) >> 9 & 0x7F) +
168 ((HIWORD(dwParam
) >> 9 & 0x7F) << 8);
169 if ((mixer
= open(MIXER_DEV
, O_RDWR
)) < 0) {
170 WARN(mmaux
, "mixer device not available !\n");
171 return MMSYSERR_NOTENABLED
;
175 TRACE(mmaux
,"SOUND_MIXER_WRITE_PCM !\n");
176 cmd
= SOUND_MIXER_WRITE_PCM
;
179 TRACE(mmaux
,"SOUND_MIXER_WRITE_SYNTH !\n");
180 cmd
= SOUND_MIXER_WRITE_SYNTH
;
183 TRACE(mmaux
,"SOUND_MIXER_WRITE_CD !\n");
184 cmd
= SOUND_MIXER_WRITE_CD
;
187 TRACE(mmaux
,"SOUND_MIXER_WRITE_LINE !\n");
188 cmd
= SOUND_MIXER_WRITE_LINE
;
191 TRACE(mmaux
,"SOUND_MIXER_WRITE_MIC !\n");
192 cmd
= SOUND_MIXER_WRITE_MIC
;
195 TRACE(mmaux
,"SOUND_MIXER_WRITE_VOLUME !\n");
196 cmd
= SOUND_MIXER_WRITE_VOLUME
;
199 WARN(mmaux
,"invalid device id=%04X !\n", wDevID
);
200 return MMSYSERR_NOTENABLED
;
202 if (ioctl(mixer
, cmd
, &volume
) == -1) {
203 WARN(mmaux
, "unable set mixer !\n");
204 return MMSYSERR_NOTENABLED
;
207 return MMSYSERR_NOERROR
;
209 return MMSYSERR_NOTENABLED
;
214 /**************************************************************************
215 * auxMessage [sample driver]
217 DWORD WINAPI
auxMessage(WORD wDevID
, WORD wMsg
, DWORD dwUser
,
218 DWORD dwParam1
, DWORD dwParam2
)
220 TRACE(mmaux
,"(%04X, %04X, %08lX, %08lX, %08lX);\n",
221 wDevID
, wMsg
, dwUser
, dwParam1
, dwParam2
);
223 case AUXDM_GETDEVCAPS
:
224 return AUX_GetDevCaps(wDevID
,(LPAUXCAPS16
)dwParam1
,dwParam2
);
225 case AUXDM_GETNUMDEVS
:
226 TRACE(mmaux
,"return %d;\n", NumDev
);
228 case AUXDM_GETVOLUME
:
229 return AUX_GetVolume(wDevID
,(LPDWORD
)dwParam1
);
230 case AUXDM_SETVOLUME
:
231 return AUX_SetVolume(wDevID
,dwParam1
);
233 WARN(mmaux
, "unknown message !\n");
235 return MMSYSERR_NOTSUPPORTED
;