source: GPL/trunk/lib32/ossidc.cpp@ 265

Last change on this file since 265 was 265, checked in by Brendan Oakley, 18 years ago

Add debug logging functions to Uniaud32 for receiving output from Uniaud16, from Pavel

File size: 13.3 KB
Line 
1/* $Id: ossidc.cpp,v 1.4 2003/08/08 15:09:03 vladest Exp $ */
2/*
3 * OS/2 IDC services (callback to 16 bits MMPM2 driver)
4 *
5 * (C) 2000-2002 InnoTek Systemberatung GmbH
6 * (C) 2000-2001 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this program; if not, write to the Free
20 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
21 * USA.
22 *
23 */
24
25#define INCL_NOPMAPI
26#define INCL_DOSERRORS // for ERROR_INVALID_FUNCTION
27#include <os2.h>
28#include <ossdefos2.h>
29#include <ossidc32.h>
30#include <dbgos2.h>
31#include <devhelp.h>
32#include <unicard.h>
33#ifdef KEE
34#include <kee.h>
35#endif
36#include "initcall.h"
37
38extern "C" DWORD TimerHandler16; //drv32\strategy.asm
39extern "C" int OSS32_ProcessMIDIIRQ(int bytes);
40extern "C" int OSS32_CloseUNI16(void);
41
42//******************************************************************************
43//******************************************************************************
44BOOL CallOSS16(ULONG cmd, ULONG param1, ULONG param2)
45{
46 BOOL rc;
47
48 if(idc16_PddHandler == 0) {
49 return FALSE;
50 }
51
52 rc = CallPDD16(idc16_PddHandler, cmd, param1, param2);
53 return rc;
54}
55//******************************************************************************
56exitcall_t fnCardExitCall[OSS32_MAX_AUDIOCARDS] = {0};
57extern "C" {
58#if 0
59
60 typedef int (initcall_tt)(void);
61 typedef void (exitcall_tt)(void);
62
63typedef struct cardcalls_t {
64 int card_id;
65 initcall_tt *cinitcall;
66 exitcall_tt *cexitcall;
67}cardcalls_t;
68
69cardcalls_t cardcalls[1] = {
70 // { CARD_SBLIVE, name_module(alsa_card_emu10k1, _init, _exit) },
71 { CARD_SBLIVE, __initcall_alsa_card_emu10k1_init, __exitcall_alsa_card_emu10k1_exit },
72/*
73 { CARD_CMEDIA, name_module(alsa_card_cmipci, _init, _exit) },
74 { CARD_ALS4000, name_module(alsa_card_als4000, _init, _exit) },
75 { CARD_CS4281, name_module(alsa_card_cs4281, _init, _exit) },
76 { CARD_ICH, name_module(alsa_card_intel8x0, _init, _exit) },
77 { CARD_CS46XX, name_module(alsa_card_cs46xx, _init, _exit) },
78 { CARD_VIA82XX, name_module(alsa_card_via82xx, _init, _exit) },
79 { CARD_ESS1938, name_module(alsa_card_es1938, _init, _exit) },
80// { CARD_VORTEX, name_module(alsa_card_vortex, _init, _exit) },
81 { CARD_ENSONIQ, name_module(alsa_card_ens137x, _init, _exit) },
82 { CARD_YAMAHA, name_module(alsa_card_ymfpci, _init, _exit) },
83 { CARD_MAESTRO, name_module(alsa_card_es1968, _init, _exit) },
84 { CARD_MAESTRO3, name_module(alsa_card_m3, _init, _exit) },
85 { CARD_ALI5451, name_module(alsa_card_ali, _init, _exit) },
86 { CARD_TRIDENT, name_module(alsa_card_trident, _init, _exit) },
87 { CARD_NEOMAGIC, name_module(alsa_card_nm256, _init, _exit) },
88 { CARD_ATIIXP, name_module(alsa_card_atiixp, _init, _exit) },
89 { CARD_FM801, name_module(alsa_card_fm801, _init, _exit) },
90 { CARD_AUDIGYLS, name_module(alsa_card_ca0106, _init, _exit) },
91 { CARD_BT87X, name_module(alsa_card_bt87x, _init, _exit) },
92 { CARD_AZX, name_module(alsa_card_azx, _init, _exit) }*/
93};
94#endif
95
96int nrCardsDetected = 0;
97int fStrategyInit = FALSE;
98void pcm_info(void);
99void FillCaps(ULONG deviceid);
100};
101//******************************************************************************
102OSSRET OSS32_Initialize(void)
103{
104 fStrategyInit = TRUE;
105
106 if(DevSetTimer(TimerHandler16) != 0) {
107 dprintf(("DevSetTimer failed!!"));
108 DebugInt3();
109 return OSSERR_INIT_FAILED;
110 }
111
112 dprintf(("OSS32_Initialize. Start addrees: %X", OffsetBeginCS32));
113// DebugInt3();
114
115 if(call_module_init(alsa_sound_init) != 0) return OSSERR_INIT_FAILED;
116 dprintf(("OSS32_Initialize1"));
117 if(call_module_init(alsa_pcm_init) != 0) return OSSERR_INIT_FAILED;
118 if(call_module_init(alsa_hwdep_init) != 0) return OSSERR_INIT_FAILED;
119 if(call_module_init(alsa_timer_init) != 0) return OSSERR_INIT_FAILED;
120
121 if(call_module_init(alsa_rawmidi_init) != 0) return OSSERR_INIT_FAILED;
122 if(call_module_init(alsa_seq_init) != 0) return OSSERR_INIT_FAILED;
123 if(call_module_init(alsa_opl3_init) != 0) return OSSERR_INIT_FAILED;
124 if(call_module_init(alsa_opl3_seq_init) != 0) return OSSERR_INIT_FAILED;
125
126 if(call_module_init(alsa_mpu401_uart_init) != 0) return OSSERR_INIT_FAILED;
127#if 0
128 int i;
129
130 if (ForceCard != CARD_NONE)
131 {
132 if (cardcalls[ForceCard].cinitcall() == 0)
133 fnCardExitCall[nrCardsDetected] = cardcalls[ForceCard].cexitcall;
134 for (i=0; i < CARDS_NUM; i++)
135 {
136 if (i==ForceCard) continue;
137 if (cardcalls[i].cinitcall() == 0)
138 fnCardExitCall[nrCardsDetected] = cardcalls[i].cexitcall;
139 if (nrCardsDetected >= OSS32_MAX_AUDIOCARDS)
140 break;
141 }
142 } else
143 {
144 for (i=0; i < CARDS_NUM; i++)
145 {
146 dprintf(("calling: %X at %X", i, cardcalls[i].cinitcall));
147 if (cardcalls[i].cinitcall() == 0)
148 fnCardExitCall[nrCardsDetected] = cardcalls[i].cexitcall;
149 if (nrCardsDetected >= OSS32_MAX_AUDIOCARDS)
150 break;
151 }
152 }
153#else
154 dprintf(("force card: %d",ForceCard));
155 //Check for SoundBlaster Live!
156 if((ForceCard == CARD_NONE || ForceCard == CARD_ICH) &&
157 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_intel8x0_init) == 0)
158 {
159 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_intel8x0_exit);
160 }
161 if((ForceCard == CARD_NONE || ForceCard == CARD_VIA82XX) &&
162 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_via82xx_init) == 0)
163 {
164 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_via82xx_exit);
165 }
166
167 if((ForceCard == CARD_NONE || ForceCard == CARD_SBLIVE) &&
168 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_emu10k1_init) == 0)
169 {
170 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_emu10k1_exit);
171 }
172
173 if((ForceCard == CARD_NONE || ForceCard == CARD_CMEDIA) &&
174 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_cmipci_init) == 0)
175 {
176 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_cmipci_exit);
177 }
178 if((ForceCard == CARD_NONE || ForceCard == CARD_ALS4000) &&
179 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_als4000_init) == 0)
180 {
181 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_als4000_exit);
182 }
183 if((ForceCard == CARD_NONE || ForceCard == CARD_CS4281) &&
184 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_cs4281_init) == 0)
185 {
186 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_cs4281_exit);
187 }
188 if((ForceCard == CARD_NONE || ForceCard == CARD_CS46XX) &&
189 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_cs46xx_init) == 0)
190 {
191 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_cs46xx_exit);
192 }
193 if((ForceCard == CARD_NONE || ForceCard == CARD_ESS1938) &&
194 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_es1938_init) == 0)
195 {
196 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_es1938_exit);
197 }
198 if((ForceCard == CARD_NONE || ForceCard == CARD_ENSONIQ) &&
199 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_ens137x_init) == 0)
200 {
201 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_ens137x_exit);
202 }
203 if((ForceCard == CARD_NONE || ForceCard == CARD_YAMAHA) &&
204 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_ymfpci_init) == 0)
205 {
206 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_ymfpci_exit);
207 }
208 if((ForceCard == CARD_NONE || ForceCard == CARD_MAESTRO) &&
209 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_es1968_init) == 0)
210 {
211 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_es1968_exit);
212 }
213 if((ForceCard == CARD_NONE || ForceCard == CARD_MAESTRO3) &&
214 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_m3_init) == 0)
215 {
216 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_m3_exit);
217 }
218 if((ForceCard == CARD_NONE || ForceCard == CARD_ALI5451) &&
219 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_ali_init) == 0)
220 {
221 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_ali_exit);
222 }
223 if((ForceCard == CARD_NONE || ForceCard == CARD_TRIDENT) &&
224 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_trident_init) == 0)
225 {
226 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_trident_exit);
227 }
228
229#ifdef VORTEX
230 if((ForceCard == CARD_NONE || ForceCard == CARD_VORTEX) &&
231 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_vortex_init) == 0)
232 {
233 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_vortex_exit);
234 }
235#endif
236 if((ForceCard == CARD_NONE || ForceCard == CARD_NEOMAGIC) &&
237 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_nm256_init) == 0)
238 {
239 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_nm256_exit);
240 }
241 if((ForceCard == CARD_NONE || ForceCard == CARD_FM801) &&
242 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_fm801_init) == 0)
243 {
244 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_fm801_exit);
245 }
246 if((ForceCard == CARD_NONE || ForceCard == CARD_ATIIXP) &&
247 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_atiixp_init) == 0)
248 {
249 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_atiixp_exit);
250 }
251 if((ForceCard == CARD_NONE || ForceCard == CARD_AUDIGYLS) &&
252 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_ca0106_init) == 0)
253 {
254 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_ca0106_exit);
255 }
256 if((ForceCard == CARD_NONE || ForceCard == CARD_AZX) &&
257 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_azx_init) == 0)
258 {
259 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_azx_exit);
260 }
261 if((ForceCard == CARD_NONE || ForceCard == CARD_BT87X) &&
262 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_bt87x_init) == 0)
263 {
264 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_bt87x_exit);
265 }
266
267#endif
268 fStrategyInit = FALSE;
269
270 if(nrCardsDetected != 0) {
271 dprintf(("OSS32_Initialize2"));
272 pcm_info();
273 dprintf(("OSS32_Initialize3"));
274 for(int i=0;i<nrCardsDetected;i++) {
275 dprintf(("OSS32_Initialize4 start: %d",i));
276 FillCaps(i);
277 dprintf(("OSS32_Initialize4 end: %d",i));
278 }
279 dprintf(("OSS32_Initialize: SUCCESS. nr. of cards: %d",nrCardsDetected));
280 return OSSERR_SUCCESS;
281 }
282 dprintf(("OSS32_Initialize. FAILED"));
283 return OSSERR_INIT_FAILED;
284}
285//******************************************************************************
286//Called during OS/2 shutdown
287//******************************************************************************
288OSSRET OSS32_Shutdown()
289{
290 CallOSS16(IDC16_EXIT, 0, 0);
291
292 for(int i=0;i<nrCardsDetected;i++) {
293 if(fnCardExitCall[i]) fnCardExitCall[i]();
294 }
295
296 call_module_exit(alsa_mpu401_uart_exit);
297 call_module_exit(alsa_opl3_seq_exit);
298 call_module_exit(alsa_opl3_exit);
299 call_module_exit(alsa_seq_exit);
300 call_module_exit(alsa_rawmidi_exit);
301 call_module_exit(alsa_timer_exit);
302 call_module_exit(alsa_hwdep_exit);
303 call_module_exit(alsa_pcm_exit);
304 call_module_exit(alsa_sound_exit);
305
306 return OSSERR_SUCCESS;
307}
308//******************************************************************************
309//******************************************************************************
310int OSS32_ProcessIRQ()
311{
312 return CallOSS16(IDC16_PROCESS, 0, 0);
313}
314
315int OSS32_ProcessMIDIIRQ(int bytes)
316{
317 return CallOSS16(IDC16_MIDI_IRQ, bytes, 0);
318}
319
320int OSS32_CloseUNI16(void)
321{
322 return CallOSS16(IDC16_CLOSE_UNI16, 0, 0);
323}
324//******************************************************************************
325//******************************************************************************
326int MyDevBlock(ULONG id, ULONG tout, char flag)
327{
328 return DevBlock(id,tout, flag);
329}
330
331int OSS32_DebugString(char *buffer, ULONG size)
332{
333 dprintf(("U16: %s",buffer));
334 return size;
335}
Note: See TracBrowser for help on using the repository browser.