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

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

Latest ALSA patches
HDA patches
Patch for Intel from Rudy's
Fixes locks on NM256 chipsets
Fixes PM on Maestro3 chipsets

File size: 13.5 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_SBLIVE) &&
157 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_emu10k1_init) == 0)
158 {
159 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_emu10k1_exit);
160 }
161// else //Check for C-Media 8738 Audio
162 if((ForceCard == CARD_NONE || ForceCard == CARD_CMEDIA) &&
163 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_cmipci_init) == 0)
164 {
165 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_cmipci_exit);
166 }
167// else //Check for Avance Logic ALS4000 Audio
168 if((ForceCard == CARD_NONE || ForceCard == CARD_ALS4000) &&
169 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_als4000_init) == 0)
170 {
171 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_als4000_exit);
172 }
173// else //Check for Crystal Semi 4281 Audio
174 if((ForceCard == CARD_NONE || ForceCard == CARD_CS4281) &&
175 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_cs4281_init) == 0)
176 {
177 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_cs4281_exit);
178 }
179// else //check for Crystal CS46XX
180 //Check for Intel ICH Audio
181 if((ForceCard == CARD_NONE || ForceCard == CARD_ICH) &&
182 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_intel8x0_init) == 0)
183 {
184 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_intel8x0_exit);
185 }
186// else
187 if((ForceCard == CARD_NONE || ForceCard == CARD_CS46XX) &&
188 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_cs46xx_init) == 0)
189 {
190 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_cs46xx_exit);
191 }
192// else //check for ESS 1938
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// else //check for ENSONIQ
199 if((ForceCard == CARD_NONE || ForceCard == CARD_ENSONIQ) &&
200 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_ens137x_init) == 0)
201 {
202 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_ens137x_exit);
203 }
204// else //check for VIA 82XX
205 if((ForceCard == CARD_NONE || ForceCard == CARD_VIA82XX) &&
206 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_via82xx_init) == 0)
207 {
208 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_via82xx_exit);
209 }
210// else //check for YAMAHA
211 if((ForceCard == CARD_NONE || ForceCard == CARD_YAMAHA) &&
212 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_ymfpci_init) == 0)
213 {
214 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_ymfpci_exit);
215 }
216// else //check for MAESTRO
217 if((ForceCard == CARD_NONE || ForceCard == CARD_MAESTRO) &&
218 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_es1968_init) == 0)
219 {
220 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_es1968_exit);
221 }
222// else //check for MAESTRO3
223 if((ForceCard == CARD_NONE || ForceCard == CARD_MAESTRO3) &&
224 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_m3_init) == 0)
225 {
226 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_m3_exit);
227 }
228// else //check for ALI5451
229 if((ForceCard == CARD_NONE || ForceCard == CARD_ALI5451) &&
230 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_ali_init) == 0)
231 {
232 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_ali_exit);
233 }
234// else
235 if((ForceCard == CARD_NONE || ForceCard == CARD_TRIDENT) &&
236 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_trident_init) == 0)
237 {
238 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_trident_exit);
239 }
240
241#ifdef VORTEX
242// else //check for Aureal VORTEX
243 if((ForceCard == CARD_NONE || ForceCard == CARD_VORTEX) &&
244 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_vortex_init) == 0)
245 {
246 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_vortex_exit);
247 }
248#endif
249// else //check for NeoMagik
250 if((ForceCard == CARD_NONE || ForceCard == CARD_NEOMAGIC) &&
251 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_nm256_init) == 0)
252 {
253 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_nm256_exit);
254 }
255 if((ForceCard == CARD_NONE || ForceCard == CARD_FM801) &&
256 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_fm801_init) == 0)
257 {
258 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_fm801_exit);
259 }
260 if((ForceCard == CARD_NONE || ForceCard == CARD_ATIIXP) &&
261 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_atiixp_init) == 0)
262 {
263 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_atiixp_exit);
264 }
265 if((ForceCard == CARD_NONE || ForceCard == CARD_AUDIGYLS) &&
266 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_ca0106_init) == 0)
267 {
268 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_ca0106_exit);
269 }
270 if((ForceCard == CARD_NONE || ForceCard == CARD_AZX) &&
271 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_azx_init) == 0)
272 {
273 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_azx_exit);
274 }
275 if((ForceCard == CARD_NONE || ForceCard == CARD_BT87X) &&
276 nrCardsDetected < (OSS32_MAX_AUDIOCARDS-1) && call_module_init(alsa_card_bt87x_init) == 0)
277 {
278 fnCardExitCall[nrCardsDetected] = name_module_exit(alsa_card_bt87x_exit);
279 }
280
281#endif
282 fStrategyInit = FALSE;
283
284 if(nrCardsDetected != 0) {
285 pcm_info();
286 for(int i=0;i<nrCardsDetected;i++) {
287 FillCaps(i);
288 }
289 return OSSERR_SUCCESS;
290 }
291 return OSSERR_INIT_FAILED;
292}
293//******************************************************************************
294//Called during OS/2 shutdown
295//******************************************************************************
296OSSRET OSS32_Shutdown()
297{
298 CallOSS16(IDC16_EXIT, 0, 0);
299
300 for(int i=0;i<nrCardsDetected;i++) {
301 if(fnCardExitCall[i]) fnCardExitCall[i]();
302 }
303
304 call_module_exit(alsa_mpu401_uart_exit);
305 call_module_exit(alsa_opl3_seq_exit);
306 call_module_exit(alsa_opl3_exit);
307 call_module_exit(alsa_seq_exit);
308 call_module_exit(alsa_rawmidi_exit);
309 call_module_exit(alsa_timer_exit);
310 call_module_exit(alsa_hwdep_exit);
311 call_module_exit(alsa_pcm_exit);
312 call_module_exit(alsa_sound_exit);
313
314 return OSSERR_SUCCESS;
315}
316//******************************************************************************
317//******************************************************************************
318int OSS32_ProcessIRQ()
319{
320 return CallOSS16(IDC16_PROCESS, 0, 0);
321}
322
323int OSS32_ProcessMIDIIRQ(int bytes)
324{
325 return CallOSS16(IDC16_MIDI_IRQ, bytes, 0);
326}
327
328int OSS32_CloseUNI16(void)
329{
330 return CallOSS16(IDC16_CLOSE_UNI16, 0, 0);
331}
332//******************************************************************************
333//******************************************************************************
334extern "C" int MyDevBlock(ULONG id, ULONG tout, char flag);
335
336int MyDevBlock(ULONG id, ULONG tout, char flag)
337{
338 return DevBlock(id,tout, flag);
339}
340
Note: See TracBrowser for help on using the repository browser.