wined3d: Get rid of the swapchain destroy callback.
[wine] / dlls / wineoss.drv / mmaux.c
1 /*
2  * Sample AUXILIARY Wine Driver
3  *
4  * Copyright 1994 Martin Ayotte
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "config.h"
22 #include "wine/port.h"
23
24 #include <stdarg.h>
25 #include <stdlib.h>
26 #include <string.h>
27 #ifdef HAVE_UNISTD_H
28 # include <unistd.h>
29 #endif
30 #include <fcntl.h>
31 #ifdef HAVE_SYS_IOCTL_H
32 # include <sys/ioctl.h>
33 #endif
34 #if defined(HAVE_SYS_SOUNDCARD_H)
35 # include <sys/soundcard.h>
36 #elif defined(HAVE_MACHINE_SOUNDCARD_H)
37 # include <machine/soundcard.h>
38 #elif defined(HAVE_SOUNDCARD_H)
39 # include <soundcard.h>
40 #endif
41 #ifdef HAVE_SYS_ERRNO_H
42 #include <sys/errno.h>
43 #endif
44
45 #include "windef.h"
46 #include "winbase.h"
47 #include "mmddk.h"
48 #include "wine/unicode.h"
49 #include "wine/debug.h"
50
51 WINE_DEFAULT_DEBUG_CHANNEL(mmaux);
52
53 #define MIXER_DEV "/dev/mixer"
54
55 static int      NumDev = 6;
56
57 /*-----------------------------------------------------------------------*/
58
59 static LRESULT OSS_AuxInit(void)
60 {
61     int mixer;
62     TRACE("()\n");
63
64     if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
65         WARN("mixer device not available !\n");
66         NumDev = 0;
67     } else {
68         close(mixer);
69         NumDev = 6;
70     }
71     return 0;
72 }
73
74 /*-----------------------------------------------------------------------*/
75
76 static LRESULT OSS_AuxExit(void)
77 {
78     TRACE("()\n");
79     return 0;
80 }
81
82 /**************************************************************************
83  *                              AUX_GetDevCaps                  [internal]
84  */
85 static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPSW lpCaps, DWORD dwSize)
86 {
87     int         mixer, volume;
88     static const WCHAR ini[] = {'O','S','S',' ','A','u','x',' ','#','0',0};
89
90     TRACE("(%04X, %p, %u);\n", wDevID, lpCaps, dwSize);
91     if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
92     if (wDevID >= NumDev) return MMSYSERR_BADDEVICEID;
93     if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
94         WARN("mixer device not available !\n");
95         return MMSYSERR_NOTENABLED;
96     }
97     if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
98         close(mixer);
99         WARN("unable to read mixer !\n");
100         return MMSYSERR_NOTENABLED;
101     }
102     close(mixer);
103     lpCaps->wMid = 0xAA;
104     lpCaps->wPid = 0x55 + wDevID;
105     lpCaps->vDriverVersion = 0x0100;
106     strcpyW(lpCaps->szPname, ini);
107     lpCaps->szPname[9] = '0' + wDevID; /* 6  at max */
108     lpCaps->wTechnology = wDevID == 2 ? AUXCAPS_CDAUDIO : AUXCAPS_AUXIN;
109     lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
110
111     return MMSYSERR_NOERROR;
112 }
113
114
115 /**************************************************************************
116  *                              AUX_GetVolume                   [internal]
117  */
118 static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
119 {
120     int         mixer, volume, left, right, cmd;
121
122     TRACE("(%04X, %p);\n", wDevID, lpdwVol);
123     if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
124     if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
125         WARN("mixer device not available !\n");
126         return MMSYSERR_NOTENABLED;
127     }
128     switch(wDevID) {
129     case 0:
130         TRACE("SOUND_MIXER_READ_PCM !\n");
131         cmd = SOUND_MIXER_READ_PCM;
132         break;
133     case 1:
134         TRACE("SOUND_MIXER_READ_SYNTH !\n");
135         cmd = SOUND_MIXER_READ_SYNTH;
136         break;
137     case 2:
138         TRACE("SOUND_MIXER_READ_CD !\n");
139         cmd = SOUND_MIXER_READ_CD;
140         break;
141     case 3:
142         TRACE("SOUND_MIXER_READ_LINE !\n");
143         cmd = SOUND_MIXER_READ_LINE;
144         break;
145     case 4:
146         TRACE("SOUND_MIXER_READ_MIC !\n");
147         cmd = SOUND_MIXER_READ_MIC;
148         break;
149     case 5:
150         TRACE("SOUND_MIXER_READ_VOLUME !\n");
151         cmd = SOUND_MIXER_READ_VOLUME;
152         break;
153     default:
154         WARN("invalid device id=%04X !\n", wDevID);
155         close(mixer);
156         return MMSYSERR_NOTENABLED;
157     }
158     if (ioctl(mixer, cmd, &volume) == -1) {
159         WARN("unable to read mixer !\n");
160         close(mixer);
161         return MMSYSERR_NOTENABLED;
162     }
163     close(mixer);
164     left  = LOBYTE(LOWORD(volume));
165     right = HIBYTE(LOWORD(volume));
166     TRACE("left=%d right=%d !\n", left, right);
167     *lpdwVol = MAKELONG((left * 0xFFFFL) / 100, (right * 0xFFFFL) / 100);
168     return MMSYSERR_NOERROR;
169 }
170
171 /**************************************************************************
172  *                              AUX_SetVolume                   [internal]
173  */
174 static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
175 {
176     int         mixer;
177     int         volume, left, right;
178     int         cmd;
179
180     TRACE("(%04X, %08X);\n", wDevID, dwParam);
181
182     left   = (LOWORD(dwParam) * 100) >> 16;
183     right  = (HIWORD(dwParam) * 100) >> 16;
184     volume = (right << 8) | left;
185
186     if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
187         WARN("mixer device not available !\n");
188         return MMSYSERR_NOTENABLED;
189     }
190
191     switch(wDevID) {
192     case 0:
193         TRACE("SOUND_MIXER_WRITE_PCM !\n");
194         cmd = SOUND_MIXER_WRITE_PCM;
195         break;
196     case 1:
197         TRACE("SOUND_MIXER_WRITE_SYNTH !\n");
198         cmd = SOUND_MIXER_WRITE_SYNTH;
199         break;
200     case 2:
201         TRACE("SOUND_MIXER_WRITE_CD !\n");
202         cmd = SOUND_MIXER_WRITE_CD;
203         break;
204     case 3:
205         TRACE("SOUND_MIXER_WRITE_LINE !\n");
206         cmd = SOUND_MIXER_WRITE_LINE;
207         break;
208     case 4:
209         TRACE("SOUND_MIXER_WRITE_MIC !\n");
210         cmd = SOUND_MIXER_WRITE_MIC;
211         break;
212     case 5:
213         TRACE("SOUND_MIXER_WRITE_VOLUME !\n");
214         cmd = SOUND_MIXER_WRITE_VOLUME;
215         break;
216     default:
217         WARN("invalid device id=%04X !\n", wDevID);
218         close(mixer);
219         return MMSYSERR_NOTENABLED;
220     }
221     if (ioctl(mixer, cmd, &volume) == -1) {
222         WARN("unable to set mixer !\n");
223         close(mixer);
224         return MMSYSERR_NOTENABLED;
225     }
226     close(mixer);
227     return MMSYSERR_NOERROR;
228 }
229
230 /**************************************************************************
231  *              auxMessage (WINEOSS.2)
232  */
233 DWORD WINAPI OSS_auxMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser,
234                             DWORD_PTR dwParam1, DWORD_PTR dwParam2)
235 {
236     TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n",
237           wDevID, wMsg, dwUser, dwParam1, dwParam2);
238
239     switch (wMsg) {
240     case DRVM_INIT:
241         return OSS_AuxInit();
242     case DRVM_EXIT:
243         return OSS_AuxExit();
244     case DRVM_ENABLE:
245     case DRVM_DISABLE:
246         /* FIXME: Pretend this is supported */
247         return 0;
248     case AUXDM_GETDEVCAPS:
249         return AUX_GetDevCaps(wDevID, (LPAUXCAPSW)dwParam1, dwParam2);
250     case AUXDM_GETNUMDEVS:
251         TRACE("return %d;\n", NumDev);
252         return NumDev;
253     case AUXDM_GETVOLUME:
254         return AUX_GetVolume(wDevID, (LPDWORD)dwParam1);
255     case AUXDM_SETVOLUME:
256         return AUX_SetVolume(wDevID, dwParam1);
257     default:
258         WARN("unknown message !\n");
259     }
260     return MMSYSERR_NOTSUPPORTED;
261 }