|
|
1.1 root 1: /*++
2:
3: Copyright (c) 1991 Microsoft Corporation
4:
5: Module Name:
6:
7: isr.c
8:
9: Abstract:
10:
11: This module contains code for the interrupt service routine
12: for the SoundBlaster device driver.
13:
14: Author:
15:
16: Nigel Thompson (nigelt) 7-March-1991
17:
18: Environment:
19:
20: Kernel mode
21:
22: Revision History:
23:
24: Robin Speed (RobinSp) 29-Jan-1992
25: Add MIDI and Soundblaster 1 support.
26:
27: --*/
28:
29: #include "sound.h"
30:
31: //
32: // Driver ISR
33: //
34: // When we get here, we acknowledge the interrupt from the
35: // DSP and simply let the defered processing routine take over
36: // to complete the task.
37: //
38: // NOTE: If we were to be doing MIDI input, we would read the
39: // data port to extract the received character and save it.
40: //
41: // That was NigelT's note - currently MIDI input reads the
42: // byte in the Dpc routine - hasn't failed yet - RCBS
43: //
44:
45: #if DBG
46: ULONG sndBogusInterrupts = 0;
47: #endif // DBG
48:
49: //
50: // Internal routine
51: //
52:
53: VOID
54: SoundReProgramDMA(
55: IN OUT PWAVE_INFO WaveInfo
56: )
57: ;
58:
59: BOOLEAN
60: SoundISR(
61: IN PKINTERRUPT pInterrupt,
62: IN PVOID Context
63: )
64: /*++
65:
66: Routine Description:
67:
68: Interrupt service routine for the soundblaster card.
69:
70: Arguments:
71:
72: pInterrupt - our interrupt
73: Contest - Pointer to our global device info
74:
75:
76: Return Value:
77:
78: TRUE if we handled the interrupt
79:
80: --*/
81: {
82: PGLOBAL_DEVICE_INFO pGDI;
83: BOOLEAN Result;
84: PSOUND_HARDWARE pHw;
85:
86: pGDI = (PGLOBAL_DEVICE_INFO)Context;
87: ASSERT(pGDI->Key == GDI_KEY);
88:
89: pHw = &pGDI->Hw;
90:
91: dprintf5(("<"));
92:
93: //
94: // Acknowledge the interrupt from the DSP
95: //
96:
97: INPORT(pHw, DATA_AVAIL_PORT);
98:
99: //
100: // See who the interrupt is for and request the
101: // appropriate defered routine
102: //
103:
104: Result = TRUE;
105: switch (pGDI->Usage) {
106: case WaveInDevice:
107: dprintf5(("i"));
108: IoRequestDpc(pGDI->DeviceObject[WaveInDevice],
109: NULL,
110: NULL);
111: break;
112:
113: case WaveOutDevice:
114: dprintf5(("o"));
115: IoRequestDpc(pGDI->DeviceObject[WaveOutDevice],
116: NULL,
117: NULL);
118: break;
119:
120: case MidiInDevice:
121: // get all MIDI input chars available and save them for the DPC
122: // start the midi in dpc
123: IoRequestDpc(pGDI->DeviceObject[MidiInDevice],
124: NULL,
125: NULL);
126: break;
127:
128: default:
129: //
130: // Set interrupts in case of autodetect.
131: //
132: pGDI->InterruptsReceived++;
133: #if DBG
134: // We only get 10 valid interrupts when we test the interrupt
135: // for validity in init.c. If we get lots more here there
136: // may be a problem.
137:
138: sndBogusInterrupts++;
139: if ((sndBogusInterrupts % 20) == 0) {
140: dprintf(("%u bogus interrupts so far", sndBogusInterrupts - 10));
141: }
142: #endif // DBG
143:
144: //
145: // Set the return value to FALSE to say we didn't
146: // handle the interrupt.
147: //
148:
149: Result = FALSE;
150:
151: break;
152: }
153:
154: dprintf5((">"));
155:
156: return Result;
157:
158: DBG_UNREFERENCED_PARAMETER(pInterrupt);
159: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.