source: sbliveos2/trunk/drv16/ossidc16.cpp@ 152

Last change on this file since 152 was 152, checked in by sandervl, 25 years ago

misc updates

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.6 KB
Line 
1/* $Id: ossidc16.cpp 152 2000-07-17 18:37:33Z sandervl $ */
2
3//******************************************************************************
4// IDC interface for calling 32 bits SB Live PDD + IDC entrypoint
5//
6// Copyright 2000 Sander van Leeuwen (sandervl@xs4all.nl)
7//
8//******************************************************************************
9extern "C" { // 16-bit header files are not C++ aware
10#define INCL_16
11#define INCL_DOSINFOSEG
12#include <os2.h>
13}
14
15#include <ctype.h>
16#include <string.h>
17#include <devhelp.h>
18
19#include "idc_vdd.h"
20#include <include.h>
21#include "rm.hpp"
22#include "memutil.h"
23#include "irq.hpp"
24#include "stream.hpp"
25#include "wavestrm.hpp"
26#include "mpu401.hpp"
27#include "malloc.h"
28#include <ossidc.h>
29#include <dbgos2.h>
30
31//init.c
32extern ResourceManager* pRM; // Resource manager object.
33
34IDCTABLE IDCTable= {0};
35
36extern "C" ULONG far __cdecl OSSIDC_ENTRY(USHORT cmd, IDC16_PACKET FAR *packet);
37
38//******************************************************************************
39//******************************************************************************
40BOOL OSS16_AttachToPdd()
41{
42 // Attach to the 32 bits OSS driver
43 if(DevHelp_AttachDD((NPSZ)"SBLIVE2$",(NPBYTE)&IDCTable)) {
44 return FALSE;
45 }
46 return (BOOL) CallOSS32(IDC32_INIT, 0, (ULONG)(VOID FAR *)OSSIDC_ENTRY, 0, 0, 0);
47}
48//******************************************************************************
49//******************************************************************************
50void OSS16_DetachFromPdd()
51{
52 CallOSS32(IDC32_EXIT, 0, 0, 0, 0, 0);
53}
54//******************************************************************************
55//******************************************************************************
56ULONG MMPMToOSSStreamType(ULONG streamtype)
57{
58 switch((USHORT)streamtype) {
59 case STREAM_WAVE_CAPTURE:
60 return OSS_STREAM_WAVEIN;
61 case STREAM_WAVE_PLAY:
62 return OSS_STREAM_WAVEOUT;
63 case STREAM_MPU401_CAPTURE:
64 return OSS_STREAM_MIDIIN;
65 case STREAM_MPU401_PLAY:
66 return OSS_STREAM_MIDIOUT;
67 }
68 DebugInt3();
69 return -1;
70}
71//******************************************************************************
72//******************************************************************************
73ULONG OSS16_OpenStream(STREAM *stream)
74{
75 return CallOSS32(IDC32_STREAM_OPEN, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), 0, 0, 0);
76}
77//******************************************************************************
78//******************************************************************************
79void OSS16_CloseStream(STREAM *stream)
80{
81 CallOSS32(IDC32_STREAM_CLOSE, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, 0, 0);
82}
83//******************************************************************************
84//******************************************************************************
85ULONG OSS16_OpenMidiStream(MIDITYPE midiType)
86{
87 return CallOSS32(IDC32_STREAM_OPEN, 0x666, (midiType == MIDI_RECEIVE) ? OSS_STREAM_MIDIOUT: OSS_STREAM_MIDIIN, 0, 0, 0);
88}
89//******************************************************************************
90//******************************************************************************
91BOOL OSS16_WriteMidiByte(ULONG streamid, BYTE midiByte)
92{
93 return CallOSS32(IDC32_MIDI_WRITE, 0x666, OSS_STREAM_MIDIOUT, streamid, midiByte, 0);
94}
95//******************************************************************************
96//******************************************************************************
97int OSS16_ReadMidiBytes(ULONG streamid, char far *buffer, int bufsize)
98{
99 return CallOSS32(IDC32_MIDI_READ, 0x666, OSS_STREAM_MIDIIN, streamid, (ULONG)buffer, bufsize);
100}
101//******************************************************************************
102//******************************************************************************
103void OSS16_CloseMidiStream(MIDITYPE midiType, ULONG streamid)
104{
105 CallOSS32(IDC32_STREAM_CLOSE, 0x666, (midiType == MIDI_RECEIVE) ? OSS_STREAM_MIDIOUT : OSS_STREAM_MIDIIN, streamid, 0, 0);
106}
107//******************************************************************************
108//******************************************************************************
109BOOL OSS16_StartStream(STREAM *stream)
110{
111 return (BOOL)CallOSS32(IDC32_STREAM_START, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, 0, 0);
112}
113//******************************************************************************
114//******************************************************************************
115BOOL OSS16_PauseStream(STREAM *stream)
116{
117 return (BOOL)CallOSS32(IDC32_STREAM_PAUSE, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, 0, 0);
118}
119//******************************************************************************
120//******************************************************************************
121BOOL OSS16_StopStream(STREAM *stream)
122{
123 return (BOOL)CallOSS32(IDC32_STREAM_STOP, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, 0, 0);
124}
125//******************************************************************************
126//******************************************************************************
127BOOL OSS16_StreamReset(STREAM *stream)
128{
129 return (BOOL)CallOSS32(IDC32_STREAM_RESET, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, 0, 0);
130}
131//******************************************************************************
132//******************************************************************************
133BOOL OSS16_StreamSetFormat(STREAM *stream, ULONG param1)
134{
135 return (BOOL)CallOSS32(IDC32_STREAM_IOCTL, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, IOCTL_SETFORMAT, param1);
136}
137//******************************************************************************
138//Returns nr of bytes written
139//******************************************************************************
140ULONG OSS16_StreamAddBuffer(STREAM *stream, ULONG buffer, ULONG size)
141{
142 return CallOSS32(IDC32_STREAM_ADDBUFFER, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, buffer, size);
143}
144//******************************************************************************
145//******************************************************************************
146BOOL OSS16_StreamGetPos(STREAM *stream, ULONG FAR *pos)
147{
148 return (BOOL)CallOSS32(IDC32_STREAM_IOCTL, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, IOCTL_GETPOS, (ULONG)pos);
149}
150//******************************************************************************
151//******************************************************************************
152BOOL OSS16_StreamSetFragment(STREAM *stream, ULONG fragsize)
153{
154 ULONG fsize = fragsize;
155
156 return (BOOL)CallOSS32(IDC32_STREAM_IOCTL, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, IOCTL_SETFRAGMENT, (ULONG)((ULONG FAR *)&fsize));
157}
158//******************************************************************************
159//******************************************************************************
160BOOL OSS16_SetMasterVol(STREAM *stream, ULONG volume)
161{
162 return (BOOL)CallOSS32(IDC32_STREAM_MIXER, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, MIX_SETMASTERVOL, (ULONG)volume);
163}
164//******************************************************************************
165//******************************************************************************
166BOOL OSS16_SetWaveOutVol(STREAM *stream, ULONG volume)
167{
168 return (BOOL)CallOSS32(IDC32_STREAM_MIXER, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, MIX_SETWAVEVOL, (ULONG)volume);
169}
170//******************************************************************************
171//******************************************************************************
172BOOL OSS16_SetVolume(STREAM *stream, USHORT line, ULONG volume)
173{
174 return (BOOL)CallOSS32(IDC32_STREAM_MIXER, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, line, (ULONG)volume);
175}
176//******************************************************************************
177//******************************************************************************
178BOOL OSS16_SetGlobalVol(ULONG ulSysFileNum, USHORT line, ULONG volume)
179{
180 return (BOOL)CallOSS32(IDC32_STREAM_MIXER, ulSysFileNum, 0, 0, line, (ULONG)volume);
181}
182//******************************************************************************
183//******************************************************************************
184ULONG OSS16_StreamGetSpace(STREAM *stream)
185{
186 return (BOOL)CallOSS32(IDC32_STREAM_GETSPACE, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, 0, 0);
187}
188//******************************************************************************
189//******************************************************************************
190ULONG CallOSS32(USHORT cmd, ULONG fileid, ULONG param1, ULONG param2, ULONG param3, ULONG param4)
191{
192 ULONG rc = 0;
193 ULONG idcptr = (ULONG)IDCTable.ProtIDCEntry;
194 ULONG idcparm;
195 IDC32_PACKET idcpacket;
196
197 if(idcptr == 0)
198 return(0);
199
200 idcpacket.fileid = fileid;
201 idcpacket.param1 = param1;
202 idcpacket.param2 = param2;
203 idcpacket.param3 = param3;
204 idcpacket.param4 = param4;
205 idcparm = (ULONG)&idcpacket;
206
207 _asm {
208 pusha
209 mov cx, cmd
210 mov dx, word ptr [idcparm+2]
211 mov bx, word ptr [idcparm]
212 call dword ptr [idcptr]
213 mov word ptr rc, ax
214 mov word ptr [rc+2], dx
215 popa
216 }
217 return(rc);
218}
219//******************************************************************************
220//******************************************************************************
221BOOL __far __loadds __saveregs OSS_Irq_Handler(int irqnr)
222{
223 return (BOOL) CallOSS32(IDC32_IRQ, 0, irqnr, 0, 0, 0);
224}
225//******************************************************************************
226//******************************************************************************
227extern "C" ULONG __cdecl __saveregs OSSIDC_EntryPoint(ULONG cmd, IDC16_PACKET FAR *packet)
228{
229 BOOL fPciDevice = TRUE;
230 int i;
231
232 switch(cmd & 0xFFFF)
233 {
234 case IDC16_INIT:
235 break;
236
237 case IDC16_EXIT:
238 IDCTable.ProtIDCEntry = 0;
239 break;
240
241 case IDC16_SETIRQ:
242 {
243 IRQ *pIrq = pMakeIRQ((USHORT)packet->irq.irqnr);
244 if(!pIrq) return FALSE;
245
246 if(pIrq->bAddHandler(OSS_Irq_Handler) == FALSE) {
247 DebugInt3();
248 return FALSE;
249 }
250
251 if(pIrq->bEnableHandler(OSS_Irq_Handler) == FALSE) {
252 DebugInt3();
253 return FALSE;
254 }
255 return TRUE;
256 }
257 case IDC16_FREEIRQ:
258 {
259 IRQ *pIrq = getIRQ((USHORT)packet->irq.irqnr);
260 if(!pIrq) return FALSE;
261
262 if(pIrq->bDisableHandler(OSS_Irq_Handler) == FALSE) {
263 DebugInt3();
264 return FALSE;
265 }
266 return TRUE;
267 }
268
269 case IDC16_FIND_PNPDEVICE:
270 fPciDevice = FALSE;
271 //fall through
272 case IDC16_FIND_PCIDEVICE:
273 {
274 LDev_Resources* pResources;
275 IDC_RESOURCE FAR *idcres = (IDC_RESOURCE FAR *)packet->finddev.pResource;
276
277 if(!pRM->bIsDevDetected(packet->finddev.devid, SEARCH_ID_DEVICEID, fPciDevice)) {
278 return 0;
279 }
280
281 pResources = pRM->pGetDevResources(packet->finddev.devid, SEARCH_ID_DEVICEID, fPciDevice);
282 if ((!pResources) || pResources->isEmpty()) {
283 return 0;
284 }
285 // Available device resources identified
286 for(i=0;i<MAX_ISA_Dev_IO;i++) {
287 idcres->io[i] = pResources->uIOBase[i];
288 idcres->iolength[i] = pResources->uIOLength[i];
289 }
290 for(i=0;i<MAX_ISA_Dev_IRQ;i++) {
291 idcres->irq[i] = pResources->uIRQLevel[i];
292 }
293 for(i=0;i<MAX_ISA_Dev_DMA;i++) {
294 idcres->dma[i] = pResources->uDMAChannel[i];
295 }
296 for(i=0;i<MAX_ISA_Dev_MEM;i++) {
297 idcres->mem[i] = pResources->uMemBase[i];
298 idcres->memlength[i] = pResources->uMemLength[i];
299 }
300 delete pResources;
301 return 1;
302 }
303 case IDC16_MALLOC:
304 {
305 LIN linaddr;
306 ULONG near *addr16 = (ULONG near *)malloc((USHORT)packet->malloc.size+4);
307 ULONG far *addr = (ULONG far *)addr16;
308
309 if(addr16 == NULL) {
310 return 0;
311 }
312 *addr = (ULONG)addr;
313 if(DevHelp_VirtToLin(SELECTOROF(addr), OFFSETOF(addr), &linaddr)) {
314 dprintf(("DevHelp_VirtToLin failed for %x:%x\n", SELECTOROF(addr), OFFSETOF(addr)));
315 DebugInt3();
316 return 0;
317 }
318 return linaddr;
319 }
320 case IDC16_FREE:
321 free((void __near *)(void far *)packet->free.addr);
322 break;
323 case IDC16_VMALLOC:
324 break;
325 case IDC16_VMFREE:
326 break;
327 case IDC16_PROCESS:
328 {
329 PWAVESTREAM pStream;
330
331 if(packet->process.type == IDC16_MIDI_IRQ) {
332 MPU_401::processIrq(packet->process.streamid);
333 break;
334 }
335
336 pStream = (PWAVESTREAM)FindActiveStream((packet->process.type == IDC16_WAVEOUT_IRQ) ? STREAM_WAVE_PLAY : STREAM_WAVE_CAPTURE,
337 packet->process.streamid);
338 if(pStream) {
339 pStream->Process();
340 return 0;
341 }
342 dprintf(("Stream %lx not found or not active!", packet->process.streamid));
343 break;
344 }
345
346 }
347 return 0;
348}
Note: See TracBrowser for help on using the repository browser.