Authors: Chris Morgan <cmorgan@wpi.edu>, James Abbatiello <abbejy@wpi.edu>
[wine/multimedia.git] / multimedia / mmaux.c
blob134f038b8bf2af02da3b39adf6edb7e82ac08c9f
1 /*
2 * Sample AUXILARY Wine Driver
4 * Copyright 1994 Martin Ayotte
5 */
7 #define EMULATE_SB16
9 #include <stdlib.h>
10 #include <string.h>
11 #include <unistd.h>
12 #include <fcntl.h>
13 #include <sys/ioctl.h>
14 #include "windef.h"
15 #include "driver.h"
16 #include "multimedia.h"
17 #include "debug.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)
33 #ifdef HAVE_OSS
34 int mixer,volume;
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) {
43 close(mixer);
44 WARN(mmaux, "unable read mixer !\n");
45 return MMSYSERR_NOTENABLED;
47 close(mixer);
48 #ifdef EMULATE_SB16
49 lpCaps->wMid = 0x0002;
50 lpCaps->vDriverVersion = 0x0200;
51 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
52 switch (wDevID) {
53 case 0:
54 lpCaps->wPid = 0x0196;
55 strcpy(lpCaps->szPname, "SB16 Aux: Wave");
56 lpCaps->wTechnology = AUXCAPS_AUXIN;
57 break;
58 case 1:
59 lpCaps->wPid = 0x0197;
60 strcpy(lpCaps->szPname, "SB16 Aux: Midi Synth");
61 lpCaps->wTechnology = AUXCAPS_AUXIN;
62 break;
63 case 2:
64 lpCaps->wPid = 0x0191;
65 strcpy(lpCaps->szPname, "SB16 Aux: CD");
66 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
67 break;
68 case 3:
69 lpCaps->wPid = 0x0192;
70 strcpy(lpCaps->szPname, "SB16 Aux: Line-In");
71 lpCaps->wTechnology = AUXCAPS_AUXIN;
72 break;
73 case 4:
74 lpCaps->wPid = 0x0193;
75 strcpy(lpCaps->szPname, "SB16 Aux: Mic");
76 lpCaps->wTechnology = AUXCAPS_AUXIN;
77 break;
78 case 5:
79 lpCaps->wPid = 0x0194;
80 strcpy(lpCaps->szPname, "SB16 Aux: Master");
81 lpCaps->wTechnology = AUXCAPS_AUXIN;
82 break;
84 #else
85 lpCaps->wMid = 0xAA;
86 lpCaps->wPid = 0x55;
87 lpCaps->vDriverVersion = 0x0100;
88 strcpy(lpCaps->szPname, "Generic Linux Auxiliary Driver");
89 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
90 lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
91 #endif
92 return MMSYSERR_NOERROR;
93 #else
94 return MMSYSERR_NOTENABLED;
95 #endif
99 /**************************************************************************
100 * AUX_GetVolume [internal]
102 static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
104 #ifdef HAVE_OSS
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;
113 switch(wDevID) {
114 case 0:
115 TRACE(mmaux,"SOUND_MIXER_READ_PCM !\n");
116 cmd = SOUND_MIXER_READ_PCM;
117 break;
118 case 1:
119 TRACE(mmaux,"SOUND_MIXER_READ_SYNTH !\n");
120 cmd = SOUND_MIXER_READ_SYNTH;
121 break;
122 case 2:
123 TRACE(mmaux,"SOUND_MIXER_READ_CD !\n");
124 cmd = SOUND_MIXER_READ_CD;
125 break;
126 case 3:
127 TRACE(mmaux,"SOUND_MIXER_READ_LINE !\n");
128 cmd = SOUND_MIXER_READ_LINE;
129 break;
130 case 4:
131 TRACE(mmaux,"SOUND_MIXER_READ_MIC !\n");
132 cmd = SOUND_MIXER_READ_MIC;
133 break;
134 case 5:
135 TRACE(mmaux,"SOUND_MIXER_READ_VOLUME !\n");
136 cmd = SOUND_MIXER_READ_VOLUME;
137 break;
138 default:
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;
146 close(mixer);
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;
152 #else
153 return MMSYSERR_NOTENABLED;
154 #endif
157 /**************************************************************************
158 * AUX_SetVolume [internal]
160 static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
162 #ifdef HAVE_OSS
163 int mixer;
164 int volume;
165 int cmd;
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;
173 switch(wDevID) {
174 case 0:
175 TRACE(mmaux,"SOUND_MIXER_WRITE_PCM !\n");
176 cmd = SOUND_MIXER_WRITE_PCM;
177 break;
178 case 1:
179 TRACE(mmaux,"SOUND_MIXER_WRITE_SYNTH !\n");
180 cmd = SOUND_MIXER_WRITE_SYNTH;
181 break;
182 case 2:
183 TRACE(mmaux,"SOUND_MIXER_WRITE_CD !\n");
184 cmd = SOUND_MIXER_WRITE_CD;
185 break;
186 case 3:
187 TRACE(mmaux,"SOUND_MIXER_WRITE_LINE !\n");
188 cmd = SOUND_MIXER_WRITE_LINE;
189 break;
190 case 4:
191 TRACE(mmaux,"SOUND_MIXER_WRITE_MIC !\n");
192 cmd = SOUND_MIXER_WRITE_MIC;
193 break;
194 case 5:
195 TRACE(mmaux,"SOUND_MIXER_WRITE_VOLUME !\n");
196 cmd = SOUND_MIXER_WRITE_VOLUME;
197 break;
198 default:
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;
206 close(mixer);
207 return MMSYSERR_NOERROR;
208 #else
209 return MMSYSERR_NOTENABLED;
210 #endif
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);
222 switch(wMsg) {
223 case AUXDM_GETDEVCAPS:
224 return AUX_GetDevCaps(wDevID,(LPAUXCAPS16)dwParam1,dwParam2);
225 case AUXDM_GETNUMDEVS:
226 TRACE(mmaux,"return %d;\n", NumDev);
227 return NumDev;
228 case AUXDM_GETVOLUME:
229 return AUX_GetVolume(wDevID,(LPDWORD)dwParam1);
230 case AUXDM_SETVOLUME:
231 return AUX_SetVolume(wDevID,dwParam1);
232 default:
233 WARN(mmaux, "unknown message !\n");
235 return MMSYSERR_NOTSUPPORTED;