2 * Sample AUXILARY Wine Driver for Linux
4 * Copyright 1994 Martin Ayotte
6 static char Copyright[] = "Copyright Martin Ayotte, 1994";
9 #define BUILTIN_MMSYSTEM
12 #ifdef BUILTIN_MMSYSTEM
20 #include <sys/ioctl.h>
27 #include <linux/soundcard.h>
30 #define SOUND_DEV "/dev/dsp"
31 #define MIXER_DEV "/dev/mixer"
34 #define IOCTL(a,b,c) ioctl(a,b,&c)
36 #define IOCTL(a,b,c) (c = ioctl(a,b,c) )
40 static int NumDev
= 6;
42 /*-----------------------------------------------------------------------*/
45 /**************************************************************************
46 * AUX_GetDevCaps [internal]
48 DWORD
AUX_GetDevCaps(WORD wDevID
, LPAUXCAPS lpCaps
, DWORD dwSize
)
53 printf("AUX_GetDevCaps(%u, %p, %lu);\n", wDevID
, lpCaps
, dwSize
);
54 if (lpCaps
== NULL
) return MMSYSERR_NOTENABLED
;
55 if ((mixer
= open(MIXER_DEV
, O_RDWR
)) < 0) {
56 printf("AUX_GetDevCaps // mixer device not available !\n");
57 return MMSYSERR_NOTENABLED
;
59 if (ioctl(mixer
, SOUND_MIXER_READ_LINE
, &volume
) == -1) {
61 printf("AUX_GetDevCaps // unable read mixer !\n");
62 return MMSYSERR_NOTENABLED
;
66 lpCaps
->wMid
= 0x0002;
67 lpCaps
->vDriverVersion
= 0x0200;
68 lpCaps
->dwSupport
= AUXCAPS_VOLUME
| AUXCAPS_LRVOLUME
;
71 lpCaps
->wPid
= 0x0196;
72 strcpy(lpCaps
->szPname
, "SB16 Aux: Wave");
73 lpCaps
->wTechnology
= AUXCAPS_AUXIN
;
76 lpCaps
->wPid
= 0x0197;
77 strcpy(lpCaps
->szPname
, "SB16 Aux: Midi Synth");
78 lpCaps
->wTechnology
= AUXCAPS_AUXIN
;
81 lpCaps
->wPid
= 0x0191;
82 strcpy(lpCaps
->szPname
, "SB16 Aux: CD");
83 lpCaps
->wTechnology
= AUXCAPS_CDAUDIO
;
86 lpCaps
->wPid
= 0x0192;
87 strcpy(lpCaps
->szPname
, "SB16 Aux: Line-In");
88 lpCaps
->wTechnology
= AUXCAPS_AUXIN
;
91 lpCaps
->wPid
= 0x0193;
92 strcpy(lpCaps
->szPname
, "SB16 Aux: Mic");
93 lpCaps
->wTechnology
= AUXCAPS_AUXIN
;
96 lpCaps
->wPid
= 0x0194;
97 strcpy(lpCaps
->szPname
, "SB16 Aux: Master");
98 lpCaps
->wTechnology
= AUXCAPS_AUXIN
;
104 lpCaps
->vDriverVersion
= 0x0100;
105 strcpy(lpCaps
->szPname
, "Generic Linux Auxiliary Driver");
106 lpCaps
->wTechnology
= AUXCAPS_CDAUDIO
;
107 lpCaps
->dwSupport
= AUXCAPS_VOLUME
| AUXCAPS_LRVOLUME
;
109 return MMSYSERR_NOERROR
;
111 return MMSYSERR_NOTENABLED
;
116 /**************************************************************************
117 * AUX_GetVolume [internal]
119 DWORD
AUX_GetVolume(WORD wDevID
, LPDWORD lpdwVol
)
123 int volume
, left
, right
;
125 printf("AUX_GetVolume(%u, %p);\n", wDevID
, lpdwVol
);
126 if (lpdwVol
== NULL
) return MMSYSERR_NOTENABLED
;
127 if ((mixer
= open(MIXER_DEV
, O_RDWR
)) < 0) {
128 printf("Linux 'AUX_GetVolume' // mixer device not available !\n");
129 return MMSYSERR_NOTENABLED
;
133 printf("Linux 'AUX_GetVolume' // SOUND_MIXER_READ_PCM !\n");
134 cmd
= SOUND_MIXER_READ_PCM
;
137 printf("Linux 'AUX_GetVolume' // SOUND_MIXER_READ_SYNTH !\n");
138 cmd
= SOUND_MIXER_READ_SYNTH
;
141 printf("Linux 'AUX_GetVolume' // SOUND_MIXER_READ_CD !\n");
142 cmd
= SOUND_MIXER_READ_CD
;
145 printf("Linux 'AUX_GetVolume' // SOUND_MIXER_READ_LINE !\n");
146 cmd
= SOUND_MIXER_READ_LINE
;
149 printf("Linux 'AUX_GetVolume' // SOUND_MIXER_READ_MIC !\n");
150 cmd
= SOUND_MIXER_READ_MIC
;
153 printf("Linux 'AUX_GetVolume' // SOUND_MIXER_READ_VOLUME !\n");
154 cmd
= SOUND_MIXER_READ_VOLUME
;
157 fprintf(stderr
, "Linux 'AUX_GetVolume' // invalid device id=%d !\n", wDevID
);
158 return MMSYSERR_NOTENABLED
;
160 if (ioctl(mixer
, cmd
, &volume
) == -1) {
161 printf("Linux 'AUX_GetVolume' // unable read mixer !\n");
162 return MMSYSERR_NOTENABLED
;
165 left
= volume
& 0x7F;
166 right
= (volume
>> 8) & 0x7F;
167 printf("Linux 'AUX_GetVolume' // left=%d right=%d !\n", left
, right
);
168 *lpdwVol
= MAKELONG(left
<< 9, right
<< 9);
169 return MMSYSERR_NOERROR
;
171 return MMSYSERR_NOTENABLED
;
175 /**************************************************************************
176 * AUX_SetVolume [internal]
178 DWORD
AUX_SetVolume(WORD wDevID
, DWORD dwParam
)
184 printf("AUX_SetVolume(%u (%04X), %08lX);\n", wDevID
, wDevID
, dwParam
);
185 volume
= (LOWORD(dwParam
) >> 9 & 0x7F) +
186 ((HIWORD(dwParam
) >> 9 & 0x7F) << 8);
187 if ((mixer
= open(MIXER_DEV
, O_RDWR
)) < 0) {
188 printf("Linux 'AUX_SetVolume' // mixer device not available !\n");
189 return MMSYSERR_NOTENABLED
;
193 printf("Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_PCM !\n");
194 cmd
= SOUND_MIXER_WRITE_PCM
;
197 printf("Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_SYNTH !\n");
198 cmd
= SOUND_MIXER_WRITE_SYNTH
;
201 printf("Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_CD !\n");
202 cmd
= SOUND_MIXER_WRITE_CD
;
205 printf("Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_LINE !\n");
206 cmd
= SOUND_MIXER_WRITE_LINE
;
209 printf("Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_MIC !\n");
210 cmd
= SOUND_MIXER_WRITE_MIC
;
213 printf("Linux 'AUX_SetVolume' // SOUND_MIXER_WRITE_VOLUME !\n");
214 cmd
= SOUND_MIXER_WRITE_VOLUME
;
217 fprintf(stderr
, "Linux 'AUX_SetVolume' // invalid device id=%d !\n", wDevID
);
218 return MMSYSERR_NOTENABLED
;
220 if (ioctl(mixer
, cmd
, &volume
) == -1) {
221 printf("Linux 'AUX_SetVolume' // unable set mixer !\n");
222 return MMSYSERR_NOTENABLED
;
225 return MMSYSERR_NOERROR
;
227 return MMSYSERR_NOTENABLED
;
232 /**************************************************************************
233 * auxMessage [sample driver]
235 DWORD
auxMessage(WORD wDevID
, WORD wMsg
, DWORD dwUser
,
236 DWORD dwParam1
, DWORD dwParam2
)
238 printf("auxMessage(%u, %04X, %08lX, %08lX, %08lX);\n",
239 wDevID
, wMsg
, dwUser
, dwParam1
, dwParam2
);
241 case AUXDM_GETDEVCAPS
:
242 return AUX_GetDevCaps(wDevID
,
243 (LPAUXCAPS
)PTR_SEG_TO_LIN(dwParam1
), dwParam2
);
244 case AUXDM_GETNUMDEVS
:
245 printf("AUX_GetNumDevs() return %d;\n", NumDev
);
247 case AUXDM_GETVOLUME
:
248 return AUX_GetVolume(wDevID
, (LPDWORD
)PTR_SEG_TO_LIN(dwParam1
));
249 case AUXDM_SETVOLUME
:
250 return AUX_SetVolume(wDevID
, dwParam1
);
252 fprintf(stderr
,"auxMessage // unknown message !\n");
254 return MMSYSERR_NOTSUPPORTED
;
258 #endif /* #ifdef BUILTIN_MMSYSTEM */