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