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

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

update

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.2 KB
Line 
1/* $Id: ossidc16.cpp 151 2000-05-28 16:50:46Z 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 CallOSS32(USHORT cmd, ULONG fileid, ULONG param1, ULONG param2, ULONG param3, ULONG param4)
185{
186 ULONG rc = 0;
187 ULONG idcptr = (ULONG)IDCTable.ProtIDCEntry;
188 ULONG idcparm;
189 IDC32_PACKET idcpacket;
190
191 if(idcptr == 0)
192 return(0);
193
194 idcpacket.fileid = fileid;
195 idcpacket.param1 = param1;
196 idcpacket.param2 = param2;
197 idcpacket.param3 = param3;
198 idcpacket.param4 = param4;
199 idcparm = (ULONG)&idcpacket;
200
201 _asm {
202 pusha
203 mov cx, cmd
204 mov dx, word ptr [idcparm+2]
205 mov bx, word ptr [idcparm]
206 call dword ptr [idcptr]
207 mov word ptr rc, ax
208 mov word ptr [rc+2], dx
209 popa
210 }
211 return(rc);
212}
213//******************************************************************************
214//******************************************************************************
215BOOL __far __loadds __saveregs OSS_Irq_Handler(int irqnr)
216{
217 return (BOOL) CallOSS32(IDC32_IRQ, 0, irqnr, 0, 0, 0);
218}
219//******************************************************************************
220//******************************************************************************
221extern "C" ULONG __cdecl __saveregs OSSIDC_EntryPoint(ULONG cmd, IDC16_PACKET FAR *packet)
222{
223 BOOL fPciDevice = TRUE;
224 int i;
225
226 switch(cmd & 0xFFFF)
227 {
228 case IDC16_INIT:
229 break;
230
231 case IDC16_EXIT:
232 IDCTable.ProtIDCEntry = 0;
233 break;
234
235 case IDC16_SETIRQ:
236 {
237 IRQ *pIrq = pMakeIRQ((USHORT)packet->irq.irqnr);
238 if(!pIrq) return FALSE;
239
240 if(pIrq->bAddHandler(OSS_Irq_Handler) == FALSE) {
241 DebugInt3();
242 return FALSE;
243 }
244
245 if(pIrq->bEnableHandler(OSS_Irq_Handler) == FALSE) {
246 DebugInt3();
247 return FALSE;
248 }
249 return TRUE;
250 }
251 case IDC16_FREEIRQ:
252 {
253 IRQ *pIrq = getIRQ((USHORT)packet->irq.irqnr);
254 if(!pIrq) return FALSE;
255
256 if(pIrq->bDisableHandler(OSS_Irq_Handler) == FALSE) {
257 DebugInt3();
258 return FALSE;
259 }
260 return TRUE;
261 }
262
263 case IDC16_FIND_PNPDEVICE:
264 fPciDevice = FALSE;
265 //fall through
266 case IDC16_FIND_PCIDEVICE:
267 {
268 LDev_Resources* pResources;
269 IDC_RESOURCE FAR *idcres = (IDC_RESOURCE FAR *)packet->finddev.pResource;
270
271 if(!pRM->bIsDevDetected(packet->finddev.devid, SEARCH_ID_DEVICEID, fPciDevice)) {
272 return 0;
273 }
274
275 pResources = pRM->pGetDevResources(packet->finddev.devid, SEARCH_ID_DEVICEID, fPciDevice);
276 if ((!pResources) || pResources->isEmpty()) {
277 return 0;
278 }
279 // Available device resources identified
280 for(i=0;i<MAX_ISA_Dev_IO;i++) {
281 idcres->io[i] = pResources->uIOBase[i];
282 idcres->iolength[i] = pResources->uIOLength[i];
283 }
284 for(i=0;i<MAX_ISA_Dev_IRQ;i++) {
285 idcres->irq[i] = pResources->uIRQLevel[i];
286 }
287 for(i=0;i<MAX_ISA_Dev_DMA;i++) {
288 idcres->dma[i] = pResources->uDMAChannel[i];
289 }
290 for(i=0;i<MAX_ISA_Dev_MEM;i++) {
291 idcres->mem[i] = pResources->uMemBase[i];
292 idcres->memlength[i] = pResources->uMemLength[i];
293 }
294
295 return 1;
296 }
297 case IDC16_MALLOC:
298 {
299 LIN linaddr;
300 ULONG far *addr = (ULONG far *)malloc((USHORT)packet->malloc.size+4);
301
302 if(addr == NULL) {
303 return 0;
304 }
305 *addr = (ULONG)addr;
306 if(DevHelp_VirtToLin(SELECTOROF(addr), OFFSETOF(addr), &linaddr)) {
307 dprintf(("DevHelp_VirtToLin failed for %x:%x\n", SELECTOROF(addr), OFFSETOF(addr)));
308 DebugInt3();
309 return 0;
310 }
311 return linaddr;
312 }
313 case IDC16_FREE:
314 free((void __near *)(void far *)packet->free.addr);
315 break;
316 case IDC16_VMALLOC:
317 break;
318 case IDC16_VMFREE:
319 break;
320 case IDC16_PROCESS:
321 {
322 PWAVESTREAM pStream;
323
324 if(packet->process.type == IDC16_MIDI_IRQ) {
325 MPU_401::processIrq(packet->process.streamid);
326 break;
327 }
328
329 pStream = (PWAVESTREAM)FindActiveStream((packet->process.type == IDC16_WAVEOUT_IRQ) ? STREAM_WAVE_PLAY : STREAM_WAVE_CAPTURE,
330 packet->process.streamid);
331 if(pStream) {
332 pStream->Process();
333 return 0;
334 }
335 dprintf(("Stream %lx not found or not active!", packet->process.streamid));
336 break;
337 }
338
339 }
340 return 0;
341}
Note: See TracBrowser for help on using the repository browser.