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

Last change on this file since 86 was 86, checked in by vladest, 19 years ago

Added missed files
Applied latest modifications of ALSA
Reworked sharing strategy between MMOS2 and UNIAUD API

File size: 13.2 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 int i;
105
106 fStrategyInit = TRUE;
107
108 if(DevSetTimer(TimerHandler16) != 0) {
109 dprintf(("DevSetTimer failed!!"));
110 DebugInt3();
111 return OSSERR_INIT_FAILED;
112 }
113
114 dprintf(("OSS32_Initialize. Start addrees: %X", OffsetBeginCS32));
115// DebugInt3();
116
117 if(call_module_init(alsa_sound_init) != 0) return OSSERR_INIT_FAILED;
118 dprintf(("OSS32_Initialize1"));
119 if(call_module_init(alsa_pcm_init) != 0) return OSSERR_INIT_FAILED;
120 if(call_module_init(alsa_hwdep_init) != 0) return OSSERR_INIT_FAILED;
121 if(call_module_init(alsa_timer_init) != 0) return OSSERR_INIT_FAILED;
122
123 if(call_module_init(alsa_rawmidi_init) != 0) return OSSERR_INIT_FAILED;
124 if(call_module_init(alsa_seq_init) != 0) return OSSERR_INIT_FAILED;
125 if(call_module_init(alsa_opl3_init) != 0) return OSSERR_INIT_FAILED;
126 if(call_module_init(alsa_opl3_seq_init) != 0) return OSSERR_INIT_FAILED;
127
128 if(call_module_init(alsa_mpu401_uart_init) != 0) return OSSERR_INIT_FAILED;
129#if 0
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 if((ForceCard == CARD_NONE || ForceCard == CARD_SBLIVE) &&
167 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_emu10k1_init) == 0)
168 {
169 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_emu10k1_exit);
170 }
171 if((ForceCard == CARD_NONE || ForceCard == CARD_CMEDIA) &&
172 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_cmipci_init) == 0)
173 {
174 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_cmipci_exit);
175 }
176 if((ForceCard == CARD_NONE || ForceCard == CARD_ALS4000) &&
177 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_als4000_init) == 0)
178 {
179 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_als4000_exit);
180 }
181 if((ForceCard == CARD_NONE || ForceCard == CARD_CS4281) &&
182 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_cs4281_init) == 0)
183 {
184 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_cs4281_exit);
185 }
186 if((ForceCard == CARD_NONE || ForceCard == CARD_CS46XX) &&
187 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_cs46xx_init) == 0)
188 {
189 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_cs46xx_exit);
190 }
191 if((ForceCard == CARD_NONE || ForceCard == CARD_ESS1938) &&
192 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_es1938_init) == 0)
193 {
194 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_es1938_exit);
195 }
196 if((ForceCard == CARD_NONE || ForceCard == CARD_ENSONIQ) &&
197 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_ens137x_init) == 0)
198 {
199 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_ens137x_exit);
200 }
201 if((ForceCard == CARD_NONE || ForceCard == CARD_YAMAHA) &&
202 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_ymfpci_init) == 0)
203 {
204 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_ymfpci_exit);
205 }
206 if((ForceCard == CARD_NONE || ForceCard == CARD_MAESTRO) &&
207 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_es1968_init) == 0)
208 {
209 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_es1968_exit);
210 }
211 if((ForceCard == CARD_NONE || ForceCard == CARD_MAESTRO3) &&
212 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_m3_init) == 0)
213 {
214 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_m3_exit);
215 }
216 if((ForceCard == CARD_NONE || ForceCard == CARD_ALI5451) &&
217 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_ali_init) == 0)
218 {
219 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_ali_exit);
220 }
221 if((ForceCard == CARD_NONE || ForceCard == CARD_TRIDENT) &&
222 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_trident_init) == 0)
223 {
224 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_trident_exit);
225 }
226
227#ifdef VORTEX
228 if((ForceCard == CARD_NONE || ForceCard == CARD_VORTEX) &&
229 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_vortex_init) == 0)
230 {
231 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_vortex_exit);
232 }
233#endif
234 if((ForceCard == CARD_NONE || ForceCard == CARD_NEOMAGIC) &&
235 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_nm256_init) == 0)
236 {
237 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_nm256_exit);
238 }
239 if((ForceCard == CARD_NONE || ForceCard == CARD_FM801) &&
240 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_fm801_init) == 0)
241 {
242 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_fm801_exit);
243 }
244 if((ForceCard == CARD_NONE || ForceCard == CARD_ATIIXP) &&
245 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_atiixp_init) == 0)
246 {
247 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_atiixp_exit);
248 }
249 if((ForceCard == CARD_NONE || ForceCard == CARD_AUDIGYLS) &&
250 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_ca0106_init) == 0)
251 {
252 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_ca0106_exit);
253 }
254 if((ForceCard == CARD_NONE || ForceCard == CARD_AZX) &&
255 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_azx_init) == 0)
256 {
257 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_azx_exit);
258 }
259 if((ForceCard == CARD_NONE || ForceCard == CARD_BT87X) &&
260 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_bt87x_init) == 0)
261 {
262 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_bt87x_exit);
263 }
264
265#endif
266 fStrategyInit = FALSE;
267
268 if(nrCardsDetected != 0) {
269 dprintf(("OSS32_Initialize2"));
270 pcm_info();
271 dprintf(("OSS32_Initialize3"));
272 for(int i=0;i<nrCardsDetected;i++) {
273 dprintf(("OSS32_Initialize4 start: %d",i));
274 FillCaps(i);
275 dprintf(("OSS32_Initialize4 end: %d",i));
276 }
277 dprintf(("OSS32_Initialize: SUCCESS. nr. of cards: %d",nrCardsDetected));
278 return OSSERR_SUCCESS;
279 }
280 dprintf(("OSS32_Initialize. FAILED"));
281 return OSSERR_INIT_FAILED;
282}
283//******************************************************************************
284//Called during OS/2 shutdown
285//******************************************************************************
286OSSRET OSS32_Shutdown()
287{
288 CallOSS16(IDC16_EXIT, 0, 0);
289
290 for(int i=0;i<nrCardsDetected;i++) {
291 if(fnCardExitCall[i]) fnCardExitCall[i]();
292 }
293
294 call_module_exit(alsa_mpu401_uart_exit);
295 call_module_exit(alsa_opl3_seq_exit);
296 call_module_exit(alsa_opl3_exit);
297 call_module_exit(alsa_seq_exit);
298 call_module_exit(alsa_rawmidi_exit);
299 call_module_exit(alsa_timer_exit);
300 call_module_exit(alsa_hwdep_exit);
301 call_module_exit(alsa_pcm_exit);
302 call_module_exit(alsa_sound_exit);
303
304 return OSSERR_SUCCESS;
305}
306//******************************************************************************
307//******************************************************************************
308int OSS32_ProcessIRQ()
309{
310 return CallOSS16(IDC16_PROCESS, 0, 0);
311}
312
313int OSS32_ProcessMIDIIRQ(int bytes)
314{
315 return CallOSS16(IDC16_MIDI_IRQ, bytes, 0);
316}
317
318int OSS32_CloseUNI16(void)
319{
320 return CallOSS16(IDC16_CLOSE_UNI16, 0, 0);
321}
322//******************************************************************************
323//******************************************************************************
324extern "C" int MyDevBlock(ULONG id, ULONG tout, char flag);
325
326int MyDevBlock(ULONG id, ULONG tout, char flag)
327{
328 return DevBlock(id,tout, flag);
329}
330
Note: See TracBrowser for help on using the repository browser.