[142] | 1 | /* $Id: ossidc16.cpp 178 2001-04-30 21:08:00Z 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 | //******************************************************************************
|
---|
| 9 | extern "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"
|
---|
[151] | 26 | #include "mpu401.hpp"
|
---|
[142] | 27 | #include "malloc.h"
|
---|
| 28 | #include <ossidc.h>
|
---|
| 29 | #include <dbgos2.h>
|
---|
| 30 |
|
---|
| 31 | //init.c
|
---|
| 32 | extern ResourceManager* pRM; // Resource manager object.
|
---|
| 33 |
|
---|
| 34 | IDCTABLE IDCTable= {0};
|
---|
| 35 |
|
---|
| 36 | extern "C" ULONG far __cdecl OSSIDC_ENTRY(USHORT cmd, IDC16_PACKET FAR *packet);
|
---|
| 37 |
|
---|
| 38 | //******************************************************************************
|
---|
| 39 | //******************************************************************************
|
---|
| 40 | BOOL 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 | //******************************************************************************
|
---|
| 50 | void OSS16_DetachFromPdd()
|
---|
| 51 | {
|
---|
| 52 | CallOSS32(IDC32_EXIT, 0, 0, 0, 0, 0);
|
---|
| 53 | }
|
---|
| 54 | //******************************************************************************
|
---|
| 55 | //******************************************************************************
|
---|
| 56 | ULONG 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 | //******************************************************************************
|
---|
| 73 | ULONG OSS16_OpenStream(STREAM *stream)
|
---|
| 74 | {
|
---|
| 75 | return CallOSS32(IDC32_STREAM_OPEN, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), 0, 0, 0);
|
---|
| 76 | }
|
---|
| 77 | //******************************************************************************
|
---|
| 78 | //******************************************************************************
|
---|
| 79 | void OSS16_CloseStream(STREAM *stream)
|
---|
| 80 | {
|
---|
| 81 | CallOSS32(IDC32_STREAM_CLOSE, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, 0, 0);
|
---|
| 82 | }
|
---|
| 83 | //******************************************************************************
|
---|
| 84 | //******************************************************************************
|
---|
[147] | 85 | ULONG OSS16_OpenMidiStream(MIDITYPE midiType)
|
---|
| 86 | {
|
---|
[151] | 87 | return CallOSS32(IDC32_STREAM_OPEN, 0x666, (midiType == MIDI_RECEIVE) ? OSS_STREAM_MIDIOUT: OSS_STREAM_MIDIIN, 0, 0, 0);
|
---|
[147] | 88 | }
|
---|
| 89 | //******************************************************************************
|
---|
| 90 | //******************************************************************************
|
---|
[151] | 91 | BOOL OSS16_WriteMidiByte(ULONG streamid, BYTE midiByte)
|
---|
| 92 | {
|
---|
[178] | 93 | return (BOOL)CallOSS32(IDC32_MIDI_WRITE, 0x666, OSS_STREAM_MIDIOUT, streamid, midiByte, 0);
|
---|
[151] | 94 | }
|
---|
| 95 | //******************************************************************************
|
---|
| 96 | //******************************************************************************
|
---|
| 97 | int OSS16_ReadMidiBytes(ULONG streamid, char far *buffer, int bufsize)
|
---|
| 98 | {
|
---|
[178] | 99 | return (int)CallOSS32(IDC32_MIDI_READ, 0x666, OSS_STREAM_MIDIIN, streamid, (ULONG)buffer, bufsize);
|
---|
[151] | 100 | }
|
---|
| 101 | //******************************************************************************
|
---|
| 102 | //******************************************************************************
|
---|
[147] | 103 | void OSS16_CloseMidiStream(MIDITYPE midiType, ULONG streamid)
|
---|
| 104 | {
|
---|
[151] | 105 | CallOSS32(IDC32_STREAM_CLOSE, 0x666, (midiType == MIDI_RECEIVE) ? OSS_STREAM_MIDIOUT : OSS_STREAM_MIDIIN, streamid, 0, 0);
|
---|
[147] | 106 | }
|
---|
| 107 | //******************************************************************************
|
---|
| 108 | //******************************************************************************
|
---|
[142] | 109 | BOOL OSS16_StartStream(STREAM *stream)
|
---|
| 110 | {
|
---|
| 111 | return (BOOL)CallOSS32(IDC32_STREAM_START, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, 0, 0);
|
---|
| 112 | }
|
---|
| 113 | //******************************************************************************
|
---|
| 114 | //******************************************************************************
|
---|
| 115 | BOOL OSS16_PauseStream(STREAM *stream)
|
---|
| 116 | {
|
---|
| 117 | return (BOOL)CallOSS32(IDC32_STREAM_PAUSE, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, 0, 0);
|
---|
| 118 | }
|
---|
| 119 | //******************************************************************************
|
---|
| 120 | //******************************************************************************
|
---|
| 121 | BOOL OSS16_StopStream(STREAM *stream)
|
---|
| 122 | {
|
---|
| 123 | return (BOOL)CallOSS32(IDC32_STREAM_STOP, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, 0, 0);
|
---|
| 124 | }
|
---|
| 125 | //******************************************************************************
|
---|
| 126 | //******************************************************************************
|
---|
| 127 | BOOL OSS16_StreamReset(STREAM *stream)
|
---|
| 128 | {
|
---|
| 129 | return (BOOL)CallOSS32(IDC32_STREAM_RESET, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, 0, 0);
|
---|
| 130 | }
|
---|
| 131 | //******************************************************************************
|
---|
| 132 | //******************************************************************************
|
---|
| 133 | BOOL 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 | //******************************************************************************
|
---|
| 140 | ULONG 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 | //******************************************************************************
|
---|
| 146 | BOOL 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 | //******************************************************************************
|
---|
| 152 | BOOL 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 | //******************************************************************************
|
---|
| 160 | BOOL 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 | //******************************************************************************
|
---|
| 166 | BOOL 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 | //******************************************************************************
|
---|
| 172 | BOOL 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 | //******************************************************************************
|
---|
| 178 | BOOL 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 | //******************************************************************************
|
---|
[152] | 184 | ULONG OSS16_StreamGetSpace(STREAM *stream)
|
---|
| 185 | {
|
---|
[153] | 186 | return CallOSS32(IDC32_STREAM_GETSPACE, stream->ulSysFileNum, MMPMToOSSStreamType(stream->ulStreamType), stream->ulStreamId, 0, 0);
|
---|
[152] | 187 | }
|
---|
| 188 | //******************************************************************************
|
---|
| 189 | //******************************************************************************
|
---|
[142] | 190 | ULONG 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 | //******************************************************************************
|
---|
| 221 | BOOL __far __loadds __saveregs OSS_Irq_Handler(int irqnr)
|
---|
| 222 | {
|
---|
| 223 | return (BOOL) CallOSS32(IDC32_IRQ, 0, irqnr, 0, 0, 0);
|
---|
| 224 | }
|
---|
| 225 | //******************************************************************************
|
---|
| 226 | //******************************************************************************
|
---|
| 227 | extern "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 | }
|
---|
[152] | 300 | delete pResources;
|
---|
[142] | 301 | return 1;
|
---|
| 302 | }
|
---|
| 303 | case IDC16_MALLOC:
|
---|
| 304 | {
|
---|
| 305 | LIN linaddr;
|
---|
[152] | 306 | ULONG near *addr16 = (ULONG near *)malloc((USHORT)packet->malloc.size+4);
|
---|
| 307 | ULONG far *addr = (ULONG far *)addr16;
|
---|
[142] | 308 |
|
---|
[152] | 309 | if(addr16 == NULL) {
|
---|
[142] | 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 |
|
---|
[151] | 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,
|
---|
[142] | 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 | }
|
---|