2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: ReactOS Virtual DOS Machine
5 * PURPOSE: PC Speaker emulation
6 * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
9 /* INCLUDES *******************************************************************/
18 /* Extra PSDK/NDK Headers */
19 #include <ndk/iofuncs.h>
20 #include <ndk/obfuncs.h>
21 #include <ndk/rtlfuncs.h>
23 /* DDK Driver Headers */
26 /* PRIVATE VARIABLES **********************************************************/
28 static HANDLE hBeep
= NULL
;
30 /* PRIVATE FUNCTIONS **********************************************************/
32 /* PUBLIC FUNCTIONS ***********************************************************/
34 VOID
SpeakerChange(VOID
)
36 BYTE Port61hState
= IOReadB(CONTROL_SYSTEM_PORT61H
);
37 BOOLEAN IsConnectedToPITChannel2
= !!(Port61hState
& 0x01);
38 BOOLEAN SpeakerDataOn
= !!(Port61hState
& 0x02);
40 if (PitChannel2
&& IsConnectedToPITChannel2
&& SpeakerDataOn
)
42 /* Start beeping - Adapted from kernel32:Beep() */
44 IO_STATUS_BLOCK IoStatusBlock
;
45 BEEP_SET_PARAMETERS BeepSetParameters
;
47 DWORD PitChannel2ReloadValue
= PitChannel2
->ReloadValue
;
48 if (PitChannel2ReloadValue
== 0) PitChannel2ReloadValue
= 65536;
51 BeepSetParameters
.Frequency
= (PIT_BASE_FREQUENCY
/ PitChannel2ReloadValue
) *
52 (PitChannel2
->Mode
== PIT_MODE_SQUARE_WAVE
? 2 : 1);
53 BeepSetParameters
.Duration
= INFINITE
;
56 Status
= NtDeviceIoControlFile(hBeep
,
63 sizeof(BeepSetParameters
),
66 if (!NT_SUCCESS(Status
))
68 DPRINT1("Beep (%lu, %lu) failed, Status 0x%08lx\n",
69 BeepSetParameters
.Frequency
,
70 BeepSetParameters
.Duration
,
78 IO_STATUS_BLOCK IoStatusBlock
;
79 BEEP_SET_PARAMETERS BeepSetParameters
;
82 BeepSetParameters
.Frequency
= 0x00;
83 BeepSetParameters
.Duration
= 0x00;
86 Status
= NtDeviceIoControlFile(hBeep
,
93 sizeof(BeepSetParameters
),
96 if (!NT_SUCCESS(Status
))
98 DPRINT1("Beep (%lu, %lu) failed, Status 0x%08lx\n",
99 BeepSetParameters
.Frequency
,
100 BeepSetParameters
.Duration
,
106 VOID
SpeakerInitialize(VOID
)
109 UNICODE_STRING BeepDevice
;
110 OBJECT_ATTRIBUTES ObjectAttributes
;
111 IO_STATUS_BLOCK IoStatusBlock
;
113 /* Adapted from kernel32:Beep() */
116 // On TS systems, we need to Load Winsta.dll and call WinstationBeepOpen
117 // after doing a GetProcAddress for it
120 /* Open the device */
121 RtlInitUnicodeString(&BeepDevice
, L
"\\Device\\Beep");
122 InitializeObjectAttributes(&ObjectAttributes
, &BeepDevice
, 0, NULL
, NULL
);
123 Status
= NtCreateFile(&hBeep
,
124 FILE_READ_DATA
| FILE_WRITE_DATA
,
129 FILE_SHARE_READ
| FILE_SHARE_WRITE
,
134 if (!NT_SUCCESS(Status
))
136 DPRINT1("Failed to open Beep driver, Status 0x%08lx\n", Status
);
140 VOID
SpeakerCleanup(VOID
)