source: GPL/branches/uniaud32-2.1.x/drv32/idc.c@ 550

Last change on this file since 550 was 550, checked in by David Azarewicz, 14 years ago

merge interrupt fixes from trunk

File size: 7.2 KB
Line 
1/* $Id: idc.c,v 1.1.1.1 2003/07/02 13:56:56 eleph Exp $ */
2/*
3 * IDC entry point for calls from 16bit driver
4 *
5 * (C) 2000-2002 InnoTek Systemberatung GmbH
6 * (C) 2000-2001 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this program; if not, write to the Free
20 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
21 * USA.
22 *
23 */
24
25extern "C" { // 16-bit header files are not C++ aware
26#define INCL_NOPMAPI
27#define INCL_DOSINFOSEG
28#include <os2.h>
29}
30#include <devtype.h>
31#include <devhelp.h>
32#include <strategy.h>
33#include <ossidc32.h>
34#include <irqos2.h>
35#include <stacktoflat.h>
36#include <dbgos2.h>
37
38//16:32 address of 16 bits pdd idc handler
39IDC16_HANDLER idc16_PddHandler = 0;
40extern "C" int pcm_device;
41WORD32 OSS32IDC(ULONG cmd, PIDC32_PACKET pPacket);
42extern "C" BOOL fRewired; //pci.c
43
44//packet pointer must reference a structure on the stack
45
46OSSRET AlsaIDC(ULONG cmd, ULONG packet);
47#pragma aux AlsaIDC "ALSA_IDC" parm reverse [ecx edx]
48OSSRET AlsaIDC(ULONG cmd, ULONG packet)
49{
50 PIDC32_PACKET pPacket = (PIDC32_PACKET)__Stack16ToFlat(packet);
51 ULONG oldfileid;
52 OSSRET rc;
53
54 if (fRewired) {
55 fRewired = FALSE;
56 rprintf(("AlsaIDC: Resuming"));
57 OSS32_APMResume();
58 DbgPrintIrq();
59 }
60
61 //Sets file id in current task structure
62 oldfileid = OSS32_SetFileId(pPacket->fileid);
63 rc = OSS32IDC(cmd & 0xFFFF, pPacket);
64 OSS32_SetFileId(oldfileid);
65 return rc;
66}
67
68OSSRET OSS32IDC(ULONG cmd, PIDC32_PACKET pPacket)
69{
70 OSSRET rc;
71
72 switch(cmd)
73 {
74 case IDC32_OSS32_INIT:
75 idc16_PddHandler = (IDC16_HANDLER)MAKE_FARPTR32(pPacket->init.handler16);
76 return OSSERR_SUCCESS;
77
78 case IDC32_OSS32_EXIT:
79 idc16_PddHandler = 0;
80 return OSSERR_SUCCESS;
81
82 case IDC32_OSS32_QUERYDEVCAPS:
83 return OSS32_QueryDevCaps(pPacket->devcaps.devicenr, (POSS32_DEVCAPS)__Stack16ToFlat(pPacket->devcaps.pDevCaps));
84
85 case IDC32_OSS32_APM_SUSPEND:
86 return OSS32_APMSuspend();
87
88 case IDC32_OSS32_APM_RESUME:
89 return OSS32_APMResume();
90
91 case IDC32_WAVE_OPEN:
92 {
93 OSSSTREAMID streamId = 0;
94
95 rc = OSS32_WaveOpen(pPacket->open.devicenr, pPacket->open.streamtype, &streamId, pcm_device, (USHORT)pPacket->fileid); /* DAZ cast added to stop compiler warning */
96 pPacket->streamid = streamId;
97 return rc;
98 }
99
100 case IDC32_WAVE_CLOSE:
101 return OSS32_WaveClose(pPacket->streamid);
102
103 case IDC32_WAVE_ADDBUFFER:
104 {
105 ULONG transferred = 0;
106 rc = OSS32_WaveAddBuffer(pPacket->streamid, pPacket->buffer.buffer, pPacket->buffer.size, &transferred, pcm_device);
107 pPacket->buffer.transferred = transferred;
108 return rc;
109 }
110
111 case IDC32_WAVE_GETSPACE:
112 {
113 ULONG bytesavail = 0;
114 rc = OSS32_WaveGetSpace(pPacket->streamid, &bytesavail);
115 pPacket->getspace.bytesavail = bytesavail;
116 return rc;
117 }
118
119 case IDC32_WAVE_PREPARE:
120 return OSS32_WavePrepare(pPacket->streamid);
121
122 case IDC32_WAVE_RESUME:
123 return OSS32_WaveResume(pPacket->streamid);
124
125 case IDC32_WAVE_PAUSE:
126 return OSS32_WavePause(pPacket->streamid);
127
128 case IDC32_WAVE_START:
129 return OSS32_WaveStart(pPacket->streamid);
130
131 case IDC32_WAVE_STOP:
132 DbgPrintIrq();
133 return OSS32_WaveStop(pPacket->streamid);
134
135 case IDC32_WAVE_SETHWPARAMS:
136 {
137 OSS32_HWPARAMS *pHwParam = (OSS32_HWPARAMS *)__Stack16ToFlat(pPacket->sethwparams.hwparams);
138 return OSS32_WaveSetHwParams(pPacket->streamid, pHwParam);
139 }
140
141 case IDC32_WAVE_GETPOS:
142 {
143 ULONG position = 0;
144 rc = OSS32_WaveGetPosition(pPacket->streamid, &position);
145 pPacket->getpos.position = position;
146 return rc;
147 }
148
149 case IDC32_WAVE_GETHWPTR:
150 {
151 ULONG position = 0;
152 rc = OSS32_WaveGetHwPtr(pPacket->streamid, &position);
153 pPacket->getpos.position = position;
154 return rc;
155 }
156
157 case IDC32_WAVE_GETSTATUS:
158 {
159 ULONG status = 0;
160 rc = OSS32_WaveGetStatus(pPacket->streamid, &status);
161 pPacket->status.state = status;
162 return rc;
163 }
164
165 case IDC32_WAVE_SETVOLUME:
166 return OSS32_WaveSetVolume(pPacket->streamid, pPacket->setwavevol.volume);
167
168 case IDC32_MIXER_OPEN:
169 {
170 OSSSTREAMID streamId = 0;
171
172 rc = OSS32_MixOpen(pPacket->open.devicenr, &streamId);
173 pPacket->streamid = streamId;
174 return rc;
175 }
176
177 case IDC32_MIXER_CLOSE:
178 return OSS32_MixClose(pPacket->streamid);
179
180 case IDC32_MIXER_GETVOLUME:
181 {
182 ULONG volume = 0;
183
184 rc = OSS32_MixGetVolume(pPacket->streamid, pPacket->mixvol.line, &volume);
185 pPacket->mixvol.volume = volume;
186 return rc;
187 }
188
189 case IDC32_MIXER_SETVOLUME:
190 return OSS32_MixSetVolume(pPacket->streamid, pPacket->mixvol.line, pPacket->mixvol.volume);
191
192 case IDC32_MIXER_GETPROPERTY:
193 {
194 ULONG value = 0;
195
196 rc = OSS32_MixGetProperty(pPacket->streamid, pPacket->mixprop.property, &value);
197 pPacket->mixprop.value = value;
198 return rc;
199 }
200
201 case IDC32_MIXER_SETPROPERTY:
202 return OSS32_MixSetProperty(pPacket->streamid, pPacket->mixprop.property, pPacket->mixprop.value);
203
204 case IDC32_MIXER_QUERYCAPS:
205 return OSS32_MixQueryCaps(pPacket->streamid, (POSS32_MIXCAPS)__Stack16ToFlat(pPacket->mixcaps.pCaps));
206
207 case IDC32_MIDI_OPEN:
208 {
209 OSSSTREAMID streamId = 0;
210
211 rc = OSS32_MidiOpen(pPacket->open.devicenr, pPacket->open.streamtype, &streamId);
212 pPacket->streamid = streamId;
213 return rc;
214 }
215
216 case IDC32_MIDI_CLOSE:
217 return OSS32_MidiClose(pPacket->streamid);
218
219 case IDC32_MIDI_WRITE:
220 return OSS32_MidiWrite(pPacket->streamid, pPacket->midiwrite.midiByte);
221
222 case IDC32_MIDI_READ:
223 {
224 ULONG transferred = 0;
225 rc = OSS32_MidiRead(pPacket->streamid, (char *)__Stack16ToFlat(pPacket->midiread.buffer), pPacket->midiread.bufsize, &transferred);
226 pPacket->buffer.transferred = transferred;
227 return rc;
228 }
229
230 case IDC32_MIDI_QUERYCAPS:
231 return OSS32_MidiQueryCaps(pPacket->streamid, (POSS32_MIDICAPS)__Stack16ToFlat(pPacket->midicaps.pCaps));
232
233 case IDC32_DEBUG_STRING:
234 return OSS32_DebugString((char *)pPacket->buffer.buffer, pPacket->buffer.size);
235
236 case IDC32_MIDI_NOTEON:
237 case IDC32_MIDI_NOTEOFF:
238 case IDC32_MIDI_KEY_PRESSURE:
239 case IDC32_MIDI_CONTROL_CHANGE:
240 case IDC32_MIDI_PROGRAM_CHANGE:
241 case IDC32_MIDI_CHANNEL_PRESSURE:
242 case IDC32_MIDI_PITCH_BEND:
243 return OSS32_MidiCommand(pPacket->streamid, cmd, pPacket->midicmd.channel, pPacket->midicmd.param1, pPacket->midicmd.param2);
244 }
245
246 return OSSERR_INVALID_PARAMETER;
247}
Note: See TracBrowser for help on using the repository browser.