mmaux.c 6.21 KB
Newer Older
Alexandre Julliard's avatar
Alexandre Julliard committed
1
/*
2
 * Sample AUXILIARY Wine Driver
Alexandre Julliard's avatar
Alexandre Julliard committed
3 4
 *
 * Copyright 1994 Martin Ayotte
5 6 7 8 9 10 11 12 13 14 15 16 17 18
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Alexandre Julliard's avatar
Alexandre Julliard committed
19 20
 */

21
#include "config.h"
22
#include "wine/port.h"
23

24
#include <stdarg.h>
Alexandre Julliard's avatar
Alexandre Julliard committed
25
#include <stdlib.h>
26
#include <string.h>
27 28 29
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
30
#include <fcntl.h>
31 32 33 34
#ifdef HAVE_SYS_IOCTL_H
# include <sys/ioctl.h>
#endif

35
#include "windef.h"
36
#include "winbase.h"
37 38
#include "mmddk.h"
#include "oss.h"
39
#include "wine/unicode.h"
40
#include "wine/debug.h"
Alexandre Julliard's avatar
Alexandre Julliard committed
41

42
WINE_DEFAULT_DEBUG_CHANNEL(mmaux);
43

44 45
#ifdef HAVE_OSS

Alexandre Julliard's avatar
Alexandre Julliard committed
46
#define MIXER_DEV "/dev/mixer"
47

Alexandre Julliard's avatar
Alexandre Julliard committed
48 49
static int	NumDev = 6;

Alexandre Julliard's avatar
Alexandre Julliard committed
50 51
/*-----------------------------------------------------------------------*/

52
LRESULT OSS_AuxInit(void)
53 54
{
    int	mixer;
55
    TRACE("()\n");
56 57 58 59 60 61 62 63

    if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
	WARN("mixer device not available !\n");
	NumDev = 0;
    } else {
	close(mixer);
	NumDev = 6;
    }
64 65 66 67 68 69 70 71 72
    return 0;
}

/*-----------------------------------------------------------------------*/

LRESULT OSS_AuxExit(void)
{
    TRACE("()\n");
    return 0;
73
}
Alexandre Julliard's avatar
Alexandre Julliard committed
74 75

/**************************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
76 77
 * 				AUX_GetDevCaps			[internal]
 */
78
static DWORD AUX_GetDevCaps(WORD wDevID, LPAUXCAPSW lpCaps, DWORD dwSize)
Alexandre Julliard's avatar
Alexandre Julliard committed
79
{
80 81
    int 	mixer, volume;
    static const WCHAR ini[] = {'O','S','S',' ','A','u','x',0};
82

83 84 85 86 87 88 89
    TRACE("(%04X, %p, %lu);\n", wDevID, lpCaps, dwSize);
    if (lpCaps == NULL) return MMSYSERR_NOTENABLED;
    if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
	WARN("mixer device not available !\n");
	return MMSYSERR_NOTENABLED;
    }
    if (ioctl(mixer, SOUND_MIXER_READ_LINE, &volume) == -1) {
Alexandre Julliard's avatar
Alexandre Julliard committed
90
	close(mixer);
91
	WARN("unable to read mixer !\n");
92 93 94 95 96 97
	return MMSYSERR_NOTENABLED;
    }
    close(mixer);
    lpCaps->wMid = 0xAA;
    lpCaps->wPid = 0x55;
    lpCaps->vDriverVersion = 0x0100;
98
    strcpyW(lpCaps->szPname, ini);
99 100
    lpCaps->wTechnology = AUXCAPS_CDAUDIO;
    lpCaps->dwSupport = AUXCAPS_VOLUME | AUXCAPS_LRVOLUME;
101

102
    return MMSYSERR_NOERROR;
Alexandre Julliard's avatar
Alexandre Julliard committed
103 104 105 106
}


/**************************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
107 108
 * 				AUX_GetVolume			[internal]
 */
Alexandre Julliard's avatar
Alexandre Julliard committed
109
static DWORD AUX_GetVolume(WORD wDevID, LPDWORD lpdwVol)
Alexandre Julliard's avatar
Alexandre Julliard committed
110
{
111
    int 	mixer, volume, left, right, cmd;
112

113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
    TRACE("(%04X, %p);\n", wDevID, lpdwVol);
    if (lpdwVol == NULL) return MMSYSERR_NOTENABLED;
    if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
	WARN("mixer device not available !\n");
	return MMSYSERR_NOTENABLED;
    }
    switch(wDevID) {
    case 0:
	TRACE("SOUND_MIXER_READ_PCM !\n");
	cmd = SOUND_MIXER_READ_PCM;
	break;
    case 1:
	TRACE("SOUND_MIXER_READ_SYNTH !\n");
	cmd = SOUND_MIXER_READ_SYNTH;
	break;
    case 2:
	TRACE("SOUND_MIXER_READ_CD !\n");
	cmd = SOUND_MIXER_READ_CD;
	break;
    case 3:
	TRACE("SOUND_MIXER_READ_LINE !\n");
	cmd = SOUND_MIXER_READ_LINE;
	break;
    case 4:
	TRACE("SOUND_MIXER_READ_MIC !\n");
	cmd = SOUND_MIXER_READ_MIC;
	break;
    case 5:
	TRACE("SOUND_MIXER_READ_VOLUME !\n");
	cmd = SOUND_MIXER_READ_VOLUME;
	break;
    default:
	WARN("invalid device id=%04X !\n", wDevID);
Alexandre Julliard's avatar
Alexandre Julliard committed
146
	return MMSYSERR_NOTENABLED;
147 148
    }
    if (ioctl(mixer, cmd, &volume) == -1) {
149
	WARN("unable to read mixer !\n");
150 151 152 153 154 155 156 157
	return MMSYSERR_NOTENABLED;
    }
    close(mixer);
    left  = LOBYTE(LOWORD(volume));
    right = HIBYTE(LOWORD(volume));
    TRACE("left=%d right=%d !\n", left, right);
    *lpdwVol = MAKELONG((left * 0xFFFFL) / 100, (right * 0xFFFFL) / 100);
    return MMSYSERR_NOERROR;
Alexandre Julliard's avatar
Alexandre Julliard committed
158 159 160
}

/**************************************************************************
Alexandre Julliard's avatar
Alexandre Julliard committed
161 162
 * 				AUX_SetVolume			[internal]
 */
Alexandre Julliard's avatar
Alexandre Julliard committed
163
static DWORD AUX_SetVolume(WORD wDevID, DWORD dwParam)
Alexandre Julliard's avatar
Alexandre Julliard committed
164
{
165
    int 	mixer;
166 167
    int		volume, left, right;
    int		cmd;
168

169
    TRACE("(%04X, %08lX);\n", wDevID, dwParam);
170

171 172 173
    left   = (LOWORD(dwParam) * 100) >> 16;
    right  = (HIWORD(dwParam) * 100) >> 16;
    volume = (right << 8) | left;
174

175 176 177 178
    if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
	WARN("mixer device not available !\n");
	return MMSYSERR_NOTENABLED;
    }
179

180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
    switch(wDevID) {
    case 0:
	TRACE("SOUND_MIXER_WRITE_PCM !\n");
	cmd = SOUND_MIXER_WRITE_PCM;
	break;
    case 1:
	TRACE("SOUND_MIXER_WRITE_SYNTH !\n");
	cmd = SOUND_MIXER_WRITE_SYNTH;
	break;
    case 2:
	TRACE("SOUND_MIXER_WRITE_CD !\n");
	cmd = SOUND_MIXER_WRITE_CD;
	break;
    case 3:
	TRACE("SOUND_MIXER_WRITE_LINE !\n");
	cmd = SOUND_MIXER_WRITE_LINE;
	break;
    case 4:
	TRACE("SOUND_MIXER_WRITE_MIC !\n");
	cmd = SOUND_MIXER_WRITE_MIC;
	break;
    case 5:
	TRACE("SOUND_MIXER_WRITE_VOLUME !\n");
	cmd = SOUND_MIXER_WRITE_VOLUME;
	break;
    default:
	WARN("invalid device id=%04X !\n", wDevID);
Alexandre Julliard's avatar
Alexandre Julliard committed
207
	return MMSYSERR_NOTENABLED;
208 209
    }
    if (ioctl(mixer, cmd, &volume) == -1) {
210
	WARN("unable to set mixer !\n");
211 212 213 214
	return MMSYSERR_NOTENABLED;
    }
    close(mixer);
    return MMSYSERR_NOERROR;
Alexandre Julliard's avatar
Alexandre Julliard committed
215 216
}

217
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
218 219

/**************************************************************************
Patrik Stridvall's avatar
Patrik Stridvall committed
220
 *		auxMessage (WINEOSS.2)
Alexandre Julliard's avatar
Alexandre Julliard committed
221
 */
222
DWORD WINAPI OSS_auxMessage(UINT wDevID, UINT wMsg, DWORD dwUser,
223
			    DWORD dwParam1, DWORD dwParam2)
Alexandre Julliard's avatar
Alexandre Julliard committed
224
{
225
    TRACE("(%04X, %04X, %08lX, %08lX, %08lX);\n",
226
	  wDevID, wMsg, dwUser, dwParam1, dwParam2);
227 228 229

#ifdef HAVE_OSS
    switch (wMsg) {
230 231 232 233 234 235 236
    case DRVM_INIT:
    case DRVM_EXIT:
    case DRVM_ENABLE:
    case DRVM_DISABLE:
	/* FIXME: Pretend this is supported */
	return 0;
    case AUXDM_GETDEVCAPS:
237
	return AUX_GetDevCaps(wDevID, (LPAUXCAPSW)dwParam1, dwParam2);
238 239 240 241 242 243 244 245 246 247 248
    case AUXDM_GETNUMDEVS:
	TRACE("return %d;\n", NumDev);
	return NumDev;
    case AUXDM_GETVOLUME:
	return AUX_GetVolume(wDevID, (LPDWORD)dwParam1);
    case AUXDM_SETVOLUME:
	return AUX_SetVolume(wDevID, dwParam1);
    default:
	WARN("unknown message !\n");
    }
    return MMSYSERR_NOTSUPPORTED;
249 250 251
#else
    return MMSYSERR_NOTENABLED;
#endif
Alexandre Julliard's avatar
Alexandre Julliard committed
252
}