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

Last change on this file since 143 was 142, checked in by ktk, 25 years ago

Import

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