source: GPL/branches/uniaud32-next/drv32/idc.c@ 677

Last change on this file since 677 was 677, checked in by Paul Smedley, 4 years ago

More code cleanups from AlexT from #os2russian

File size: 7.0 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
25//DAZ extern "C" { // 16-bit header files are not C++ aware
26#define INCL_NOPMAPI
27#define INCL_DOSINFOSEG
28#include <os2.h>
29//DAZ }
30#include <devtype.h>
31#include <stacktoflat.h>
32#include <ossidc32.h>
33#include <irqos2.h>
34#include <dbgos2.h>
35
36//16:32 address of 16 bits pdd idc handler
37IDC16_HANDLER idc16_PddHandler = 0;
38extern int pcm_device;
39OSSRET OSS32IDC(ULONG cmd, PIDC32_PACKET pPacket);
40
41//packet pointer must reference a structure on the stack
42
43#pragma aux AlsaIDC "ALSA_IDC" parm reverse [ecx edx]
44OSSRET AlsaIDC(ULONG cmd, ULONG packet)
45{
46 PIDC32_PACKET pPacket = (PIDC32_PACKET)__Stack16ToFlat(packet);
47 ULONG oldfileid;
48 OSSRET rc;
49
50 //Sets file id in current task structure
51 oldfileid = OSS32_SetFileId(pPacket->fileid);
52 rc = OSS32IDC(cmd & 0xFFFF, pPacket);
53 OSS32_SetFileId(oldfileid);
54 return rc;
55}
56
57OSSRET OSS32IDC(ULONG cmd, PIDC32_PACKET pPacket)
58{
59 OSSRET rc;
60
61 switch(cmd)
62 {
63 case IDC32_OSS32_INIT:
64 idc16_PddHandler = (IDC16_HANDLER)MAKE_FARPTR32(pPacket->init.handler16);
65 return OSSERR_SUCCESS;
66
67 case IDC32_OSS32_EXIT:
68 idc16_PddHandler = 0;
69 return OSSERR_SUCCESS;
70
71 case IDC32_OSS32_QUERYDEVCAPS:
72 return OSS32_QueryDevCaps(pPacket->devcaps.devicenr, (POSS32_DEVCAPS)__Stack16ToFlat(pPacket->devcaps.pDevCaps));
73
74 case IDC32_OSS32_APM_SUSPEND:
75 return OSS32_APMSuspend();
76
77 case IDC32_OSS32_APM_RESUME:
78 return OSS32_APMResume();
79
80 case IDC32_WAVE_OPEN:
81 {
82 OSSSTREAMID streamId = 0;
83
84 rc = OSS32_WaveOpen(pPacket->open.devicenr, pPacket->open.streamtype, &streamId, pcm_device, (USHORT)pPacket->fileid); /* DAZ cast added to stop compiler warning */
85 pPacket->streamid = streamId;
86 return rc;
87 }
88
89 case IDC32_WAVE_CLOSE:
90 return OSS32_WaveClose(pPacket->streamid);
91
92 case IDC32_WAVE_ADDBUFFER:
93 {
94 ULONG transferred = 0;
95 rc = OSS32_WaveAddBuffer(pPacket->streamid, pPacket->buffer.buffer, pPacket->buffer.size, &transferred, pcm_device);
96 pPacket->buffer.transferred = transferred;
97 return rc;
98 }
99
100 case IDC32_WAVE_GETSPACE:
101 {
102 ULONG bytesavail = 0;
103 rc = OSS32_WaveGetSpace(pPacket->streamid, &bytesavail);
104 pPacket->getspace.bytesavail = bytesavail;
105 return rc;
106 }
107
108 case IDC32_WAVE_PREPARE:
109 return OSS32_WavePrepare(pPacket->streamid);
110
111 case IDC32_WAVE_RESUME:
112 return OSS32_WaveResume(pPacket->streamid);
113
114 case IDC32_WAVE_PAUSE:
115 return OSS32_WavePause(pPacket->streamid);
116
117 case IDC32_WAVE_START:
118 return OSS32_WaveStart(pPacket->streamid);
119
120 case IDC32_WAVE_STOP:
121 DbgPrintIrq();
122 return OSS32_WaveStop(pPacket->streamid);
123
124 case IDC32_WAVE_SETHWPARAMS:
125 {
126 OSS32_HWPARAMS *pHwParam = (OSS32_HWPARAMS *)__Stack16ToFlat(pPacket->sethwparams.hwparams);
127 return OSS32_WaveSetHwParams(pPacket->streamid, pHwParam);
128 }
129
130 case IDC32_WAVE_GETPOS:
131 {
132 ULONG position = 0;
133 rc = OSS32_WaveGetPosition(pPacket->streamid, &position);
134 pPacket->getpos.position = position;
135 return rc;
136 }
137
138 case IDC32_WAVE_GETHWPTR:
139 {
140 ULONG position = 0;
141 rc = OSS32_WaveGetHwPtr(pPacket->streamid, &position);
142 pPacket->getpos.position = position;
143 return rc;
144 }
145
146 case IDC32_WAVE_GETSTATUS:
147 {
148 ULONG status = 0;
149 rc = OSS32_WaveGetStatus(pPacket->streamid, &status);
150 pPacket->status.state = status;
151 return rc;
152 }
153
154 case IDC32_WAVE_SETVOLUME:
155 return OSS32_WaveSetVolume(pPacket->streamid, pPacket->setwavevol.volume);
156
157 case IDC32_MIXER_OPEN:
158 {
159 OSSSTREAMID streamId = 0;
160
161 rc = OSS32_MixOpen(pPacket->open.devicenr, &streamId);
162 pPacket->streamid = streamId;
163 return rc;
164 }
165
166 case IDC32_MIXER_CLOSE:
167 return OSS32_MixClose(pPacket->streamid);
168
169 case IDC32_MIXER_GETVOLUME:
170 {
171 ULONG volume = 0;
172
173 rc = OSS32_MixGetVolume(pPacket->streamid, pPacket->mixvol.line, &volume);
174 pPacket->mixvol.volume = volume;
175 return rc;
176 }
177
178 case IDC32_MIXER_SETVOLUME:
179 return OSS32_MixSetVolume(pPacket->streamid, pPacket->mixvol.line, pPacket->mixvol.volume);
180
181 case IDC32_MIXER_GETPROPERTY:
182 {
183 ULONG value = 0;
184
185 rc = OSS32_MixGetProperty(pPacket->streamid, pPacket->mixprop.property, &value);
186 pPacket->mixprop.value = value;
187 return rc;
188 }
189
190 case IDC32_MIXER_SETPROPERTY:
191 return OSS32_MixSetProperty(pPacket->streamid, pPacket->mixprop.property, pPacket->mixprop.value);
192
193 case IDC32_MIXER_QUERYCAPS:
194 return OSS32_MixQueryCaps(pPacket->streamid, (POSS32_MIXCAPS)__Stack16ToFlat(pPacket->mixcaps.pCaps));
195
196 case IDC32_MIDI_OPEN:
197 {
198 OSSSTREAMID streamId = 0;
199
200 rc = OSS32_MidiOpen(pPacket->open.devicenr, pPacket->open.streamtype, &streamId);
201 pPacket->streamid = streamId;
202 return rc;
203 }
204
205 case IDC32_MIDI_CLOSE:
206 return OSS32_MidiClose(pPacket->streamid);
207
208 case IDC32_MIDI_WRITE:
209 return OSS32_MidiWrite(pPacket->streamid, pPacket->midiwrite.midiByte);
210
211 case IDC32_MIDI_READ:
212 {
213 ULONG transferred = 0;
214 rc = OSS32_MidiRead(pPacket->streamid, (char *)__Stack16ToFlat(pPacket->midiread.buffer), pPacket->midiread.bufsize, &transferred);
215 pPacket->buffer.transferred = transferred;
216 return rc;
217 }
218
219 case IDC32_MIDI_QUERYCAPS:
220 return OSS32_MidiQueryCaps(pPacket->streamid, (POSS32_MIDICAPS)__Stack16ToFlat(pPacket->midicaps.pCaps));
221
222 case IDC32_DEBUG_STRING:
223 return OSS32_DebugString((char *)pPacket->buffer.buffer, pPacket->buffer.size);
224
225 case IDC32_MIDI_NOTEON:
226 case IDC32_MIDI_NOTEOFF:
227 case IDC32_MIDI_KEY_PRESSURE:
228 case IDC32_MIDI_CONTROL_CHANGE:
229 case IDC32_MIDI_PROGRAM_CHANGE:
230 case IDC32_MIDI_CHANNEL_PRESSURE:
231 case IDC32_MIDI_PITCH_BEND:
232 return OSS32_MidiCommand(pPacket->streamid, cmd, pPacket->midicmd.channel, pPacket->midicmd.param1, pPacket->midicmd.param2);
233 }
234
235 return OSSERR_INVALID_PARAMETER;
236}
Note: See TracBrowser for help on using the repository browser.