Fixed returned type upon open.
[wine] / multimedia / mmaux.c
1 /*
2  * Sample AUXILARY Wine Driver
3  *
4  * Copyright 1994 Martin Ayotte
5  */
6
7 #define EMULATE_SB16
8
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 "mmddk.h"
17 #include "oss.h"
18
19 #include "debugtools.h"
20
21 DEFAULT_DEBUG_CHANNEL(mmaux)
22
23 #define MIXER_DEV "/dev/mixer"
24
25 static int      NumDev = 6;
26
27 /*-----------------------------------------------------------------------*/
28
29
30 /**************************************************************************
31  *                              AUX_GetDevCaps                  [internal]
32  */
33 static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPS16 lpCaps, DWORD dwSize)
34 {
35 #ifdef HAVE_OSS
36         int     mixer,volume;
37         
38         TRACE("(%04X, %p, %lu);\n", wDevID, lpCaps, dwSize);
39         if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
40         if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
41                 WARN("mixer device not available !\n");
42                 return MMSYSERR_NOTENABLED;
43         }
44         if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
45                 close(mixer);
46                 WARN("unable read mixer !\n");
47                 return MMSYSERR_NOTENABLED;
48         }
49         close(mixer);
50 #ifdef EMULATE_SB16
51         lpCaps->wMid = 0x0002;
52         lpCaps->vDriverVersion = 0x0200;
53         lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
54         switch (wDevID) {
55         case 0:
56                 lpCaps->wPid = 0x0196;
57                 strcpy(lpCaps->szPname, "SB16 Aux: Wave");
58                 lpCaps->wTechnology = AUXCAPS_AUXIN;
59                 break;
60         case 1:
61                 lpCaps->wPid = 0x0197;
62                 strcpy(lpCaps->szPname, "SB16 Aux: Midi Synth");
63                 lpCaps->wTechnology = AUXCAPS_AUXIN;
64                 break;
65         case 2:
66                 lpCaps->wPid = 0x0191;
67                 strcpy(lpCaps->szPname, "SB16 Aux: CD");
68                 lpCaps->wTechnology = AUXCAPS_CDAUDIO;
69                 break;
70         case 3:
71                 lpCaps->wPid = 0x0192;
72                 strcpy(lpCaps->szPname, "SB16 Aux: Line-In");
73                 lpCaps->wTechnology = AUXCAPS_AUXIN;
74                 break;
75         case 4:
76                 lpCaps->wPid = 0x0193;
77                 strcpy(lpCaps->szPname, "SB16 Aux: Mic");
78                 lpCaps->wTechnology = AUXCAPS_AUXIN;
79                 break;
80         case 5:
81                 lpCaps->wPid = 0x0194;
82                 strcpy(lpCaps->szPname, "SB16 Aux: Master");
83                 lpCaps->wTechnology = AUXCAPS_AUXIN;
84                 break;
85         }
86 #else
87         lpCaps->wMid = 0xAA;
88         lpCaps->wPid = 0x55;
89         lpCaps->vDriverVersion = 0x0100;
90         strcpy(lpCaps->szPname, "Generic Linux Auxiliary Driver");
91         lpCaps->wTechnology = AUXCAPS_CDAUDIO;
92         lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
93 #endif
94         return MMSYSERR_NOERROR;
95 #else
96         return MMSYSERR_NOTENABLED;
97 #endif
98 }
99
100
101 /**************************************************************************
102  *                              AUX_GetVolume                   [internal]
103  */
104 static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
105 {
106 #ifdef HAVE_OSS
107         int     mixer, volume, left, right, cmd;
108         
109         TRACE("(%04X, %p);\n", wDevID, lpdwVol);
110         if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
111         if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
112                 WARN("mixer device not available !\n");
113                 return MMSYSERR_NOTENABLED;
114         }
115         switch(wDevID) {
116         case 0:
117                 TRACE("SOUND_MIXER_READ_PCM !\n");
118                 cmd = SOUND_MIXER_READ_PCM;
119                 break;
120         case 1:
121                 TRACE("SOUND_MIXER_READ_SYNTH !\n");
122                 cmd = SOUND_MIXER_READ_SYNTH;
123                 break;
124         case 2:
125                 TRACE("SOUND_MIXER_READ_CD !\n");
126                 cmd = SOUND_MIXER_READ_CD;
127                 break;
128         case 3:
129                 TRACE("SOUND_MIXER_READ_LINE !\n");
130                 cmd = SOUND_MIXER_READ_LINE;
131                 break;
132         case 4:
133                 TRACE("SOUND_MIXER_READ_MIC !\n");
134                 cmd = SOUND_MIXER_READ_MIC;
135                 break;
136         case 5:
137                 TRACE("SOUND_MIXER_READ_VOLUME !\n");
138                 cmd = SOUND_MIXER_READ_VOLUME;
139                 break;
140         default:
141                 WARN("invalid device id=%04X !\n", wDevID);
142                 return MMSYSERR_NOTENABLED;
143         }
144         if (ioctl(mixer, cmd, &volume) == -1) {
145                 WARN("unable read mixer !\n");
146                 return MMSYSERR_NOTENABLED;
147         }
148         close(mixer);
149         left  = LOBYTE(LOWORD(volume));
150         right = HIBYTE(LOWORD(volume));
151         TRACE("left=%d right=%d !\n", left, right);
152         *lpdwVol = MAKELONG((left * 0xFFFFL) / 100, (right * 0xFFFFL) / 100);
153         return MMSYSERR_NOERROR;
154 #else
155         return MMSYSERR_NOTENABLED;
156 #endif
157 }
158
159 /**************************************************************************
160  *                              AUX_SetVolume                   [internal]
161  */
162 static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
163 {
164 #ifdef HAVE_OSS
165         int             mixer;
166         int             volume, left, right;
167         int             cmd;
168
169         TRACE("(%04X, %08lX);\n", wDevID, dwParam);
170
171         left   = (LOWORD(dwParam) * 100) >> 16;
172         right  = (HIWORD(dwParam) * 100) >> 16;
173         volume = (right << 8) | left;
174
175         if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
176                 WARN("mixer device not available !\n");
177                 return MMSYSERR_NOTENABLED;
178         }
179
180         switch(wDevID) {
181         case 0:
182                 TRACE("SOUND_MIXER_WRITE_PCM !\n");
183                 cmd = SOUND_MIXER_WRITE_PCM;
184                 break;
185         case 1:
186                 TRACE("SOUND_MIXER_WRITE_SYNTH !\n");
187                 cmd = SOUND_MIXER_WRITE_SYNTH;
188                 break;
189         case 2:
190                 TRACE("SOUND_MIXER_WRITE_CD !\n");
191                 cmd = SOUND_MIXER_WRITE_CD;
192                 break;
193         case 3:
194                 TRACE("SOUND_MIXER_WRITE_LINE !\n");
195                 cmd = SOUND_MIXER_WRITE_LINE;
196                 break;
197         case 4:
198                 TRACE("SOUND_MIXER_WRITE_MIC !\n");
199                 cmd = SOUND_MIXER_WRITE_MIC;
200                 break;
201         case 5:
202                 TRACE("SOUND_MIXER_WRITE_VOLUME !\n");
203                 cmd = SOUND_MIXER_WRITE_VOLUME;
204                 break;
205         default:
206                 WARN("invalid device id=%04X !\n", wDevID);
207                 return MMSYSERR_NOTENABLED;
208         }
209         if (ioctl(mixer, cmd, &volume) == -1) {
210                 WARN("unable set mixer !\n");
211                 return MMSYSERR_NOTENABLED;
212         }
213         close(mixer);
214         return MMSYSERR_NOERROR;
215 #else
216         return MMSYSERR_NOTENABLED;
217 #endif
218 }
219
220
221 /**************************************************************************
222  *                              auxMessage                      [sample driver]
223  */
224 DWORD WINAPI auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
225                                                                 DWORD dwParam1, DWORD dwParam2)
226 {
227         TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n", 
228                         wDevID, wMsg, dwUser, dwParam1, dwParam2);
229         switch(wMsg) {
230         case AUXDM_GETDEVCAPS:
231                 return AUX_GetDevCaps(wDevID,(LPAUXCAPS16)dwParam1,dwParam2);
232         case AUXDM_GETNUMDEVS:
233                 TRACE("return %d;\n", NumDev);
234                 return NumDev;
235         case AUXDM_GETVOLUME:
236                 return AUX_GetVolume(wDevID,(LPDWORD)dwParam1);
237         case AUXDM_SETVOLUME:
238                 return AUX_SetVolume(wDevID,dwParam1);
239         default:
240                 WARN("unknown message !\n");
241         }
242         return MMSYSERR_NOTSUPPORTED;
243 }