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 static DWORD OldReloadValue
= 0;
33 static PIT_MODE OldMode
= 0;
35 /* PUBLIC FUNCTIONS ***********************************************************/
37 VOID
PlaySound(DWORD Frequency
,
40 /* Adapted from kernel32:Beep() */
42 IO_STATUS_BLOCK IoStatusBlock
;
43 BEEP_SET_PARAMETERS BeepSetParameters
;
46 BeepSetParameters
.Frequency
= Frequency
;
47 BeepSetParameters
.Duration
= Duration
;
50 NtDeviceIoControlFile(hBeep
,
57 sizeof(BeepSetParameters
),
62 VOID
SpeakerChange(VOID
)
64 BYTE Port61hState
= IOReadB(CONTROL_SYSTEM_PORT61H
);
65 BOOLEAN IsConnectedToPITChannel2
= !!(Port61hState
& 0x01);
66 BOOLEAN SpeakerDataOn
= !!(Port61hState
& 0x02);
68 if (PitChannel2
&& IsConnectedToPITChannel2
&& SpeakerDataOn
)
72 DWORD Frequency
, Duration
;
74 DWORD PitChannel2ReloadValue
= PitChannel2
->ReloadValue
;
75 if (PitChannel2ReloadValue
== 0) PitChannel2ReloadValue
= 65536;
77 DPRINT("(1) PitChannel2(Mode = %d ; ReloadValue = %d)\n", PitChannel2
->Mode
, PitChannel2ReloadValue
);
79 if (OldMode
== PitChannel2
->Mode
&& OldReloadValue
== PitChannel2ReloadValue
)
82 OldMode
= PitChannel2
->Mode
;
83 OldReloadValue
= PitChannel2ReloadValue
;
85 DPRINT("(2) PitChannel2(Mode = %d ; ReloadValue = %d)\n", PitChannel2
->Mode
, PitChannel2ReloadValue
);
87 Frequency
= (PIT_BASE_FREQUENCY
/ PitChannel2ReloadValue
);
90 PlaySound(Frequency
, Duration
);
99 PlaySound(0x00, 0x00);
103 VOID
SpeakerInitialize(VOID
)
106 UNICODE_STRING BeepDevice
;
107 OBJECT_ATTRIBUTES ObjectAttributes
;
108 IO_STATUS_BLOCK IoStatusBlock
;
110 /* Adapted from kernel32:Beep() */
112 /* Open the device */
113 RtlInitUnicodeString(&BeepDevice
, L
"\\Device\\Beep");
114 InitializeObjectAttributes(&ObjectAttributes
, &BeepDevice
, 0, NULL
, NULL
);
115 Status
= NtCreateFile(&hBeep
,
116 FILE_READ_DATA
| FILE_WRITE_DATA
,
121 FILE_SHARE_READ
| FILE_SHARE_WRITE
,
126 if (!NT_SUCCESS(Status
))
128 DPRINT1("Failed to open Beep driver, Status 0x%08lx\n", Status
);
132 VOID
SpeakerCleanup(VOID
)