source: GPL/branches/uniaud-2.0/drv32/idc.c@ 304

Last change on this file since 304 was 265, checked in by Brendan Oakley, 18 years ago

Add debug logging functions to Uniaud32 for receiving output from Uniaud16, from Pavel

File size: 6.5 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_SETVOLUME:
140 return OSS32_WaveSetVolume(pPacket->streamid, pPacket->setwavevol.volume);
141
142 case IDC32_MIXER_OPEN:
143 {
144 OSSSTREAMID streamId = 0;
145
146 rc = OSS32_MixOpen(pPacket->open.devicenr, &streamId);
147 pPacket->streamid = streamId;
148 return rc;
149 }
150
151 case IDC32_MIXER_CLOSE:
152 return OSS32_MixClose(pPacket->streamid);
153
154 case IDC32_MIXER_GETVOLUME:
155 {
156 ULONG volume = 0;
157
158 rc = OSS32_MixGetVolume(pPacket->streamid, pPacket->mixvol.line, &volume);
159 pPacket->mixvol.volume = volume;
160 return rc;
161 }
162
163 case IDC32_MIXER_SETVOLUME:
164 return OSS32_MixSetVolume(pPacket->streamid, pPacket->mixvol.line, pPacket->mixvol.volume);
165
166 case IDC32_MIXER_GETPROPERTY:
167 {
168 ULONG value = 0;
169
170 rc = OSS32_MixGetProperty(pPacket->streamid, pPacket->mixprop.property, &value);
171 pPacket->mixprop.value = value;
172 return rc;
173 }
174
175 case IDC32_MIXER_SETPROPERTY:
176 return OSS32_MixSetProperty(pPacket->streamid, pPacket->mixprop.property, pPacket->mixprop.value);
177
178 case IDC32_MIXER_QUERYCAPS:
179 return OSS32_MixQueryCaps(pPacket->streamid, (POSS32_MIXCAPS)__Stack16ToFlat(pPacket->mixcaps.pCaps));
180
181 case IDC32_MIDI_OPEN:
182 {
183 OSSSTREAMID streamId = 0;
184
185 rc = OSS32_MidiOpen(pPacket->open.devicenr, pPacket->open.streamtype, &streamId);
186 pPacket->streamid = streamId;
187 return rc;
188 }
189
190 case IDC32_MIDI_CLOSE:
191 return OSS32_MidiClose(pPacket->streamid);
192
193 case IDC32_MIDI_WRITE:
194 return OSS32_MidiWrite(pPacket->streamid, pPacket->midiwrite.midiByte);
195
196 case IDC32_MIDI_READ:
197 {
198 ULONG transferred = 0;
199 rc = OSS32_MidiRead(pPacket->streamid, (char *)__Stack16ToFlat(pPacket->midiread.buffer), pPacket->midiread.bufsize, &transferred);
200 pPacket->buffer.transferred = transferred;
201 return rc;
202 }
203
204 case IDC32_MIDI_QUERYCAPS:
205 return OSS32_MidiQueryCaps(pPacket->streamid, (POSS32_MIDICAPS)__Stack16ToFlat(pPacket->midicaps.pCaps));
206
207 case IDC32_DEBUG_STRING:
208 return OSS32_DebugString((char *)pPacket->buffer.buffer, pPacket->buffer.size);
209
210 case IDC32_MIDI_NOTEON:
211 case IDC32_MIDI_NOTEOFF:
212 case IDC32_MIDI_KEY_PRESSURE:
213 case IDC32_MIDI_CONTROL_CHANGE:
214 case IDC32_MIDI_PROGRAM_CHANGE:
215 case IDC32_MIDI_CHANNEL_PRESSURE:
216 case IDC32_MIDI_PITCH_BEND:
217 return OSS32_MidiCommand(pPacket->streamid, cmd, pPacket->midicmd.channel, pPacket->midicmd.param1, pPacket->midicmd.param2);
218 }
219 return 0;
220}
Note: See TracBrowser for help on using the repository browser.