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

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

Fixed wave volume, recording gain + wave recording

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