source: GPL/branches/uniaud32-2.0/drv32/idc.c@ 386

Last change on this file since 386 was 386, checked in by rjerant, 17 years ago

Add OSS32_WaveGetHwPtr() to sound.c

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