OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
BootAudio.c
Go to the documentation of this file.
1
16
17#include <Guid/AppleFile.h>
18#include <Guid/AppleVariable.h>
19#include <Guid/OcVariable.h>
20
22
26#include <Protocol/LoadedImage.h>
27#include <Protocol/OcAudio.h>
28#include <Protocol/SimpleTextOut.h>
29
30#include <Library/BaseLib.h>
31#include <Library/BaseMemoryLib.h>
32#include <Library/BaseOverflowLib.h>
34#include <Library/OcCryptoLib.h>
36#include <Library/DevicePathLib.h>
37#include <Library/OcTimerLib.h>
38#include <Library/MemoryAllocationLib.h>
42#include <Library/OcFileLib.h>
43#include <Library/OcMiscLib.h>
44#include <Library/OcRtcLib.h>
45#include <Library/OcStringLib.h>
46#include <Library/PrintLib.h>
47#include <Library/UefiBootServicesTableLib.h>
48#include <Library/UefiRuntimeServicesTableLib.h>
49#include <Library/UefiLib.h>
50
51EFI_STATUS
52EFIAPI
54 IN OC_PICKER_CONTEXT *Context
55 )
56{
57 EFI_STATUS Status;
58
59 if (Context->OcAudio == NULL) {
60 Status = gBS->LocateProtocol (
62 NULL,
63 (VOID **)&Context->OcAudio
64 );
65 if (EFI_ERROR (Status)) {
66 Context->OcAudio = NULL;
67 }
68 } else {
69 Status = EFI_SUCCESS;
70 }
71
72 return Status;
73}
74
75EFI_STATUS
76EFIAPI
78 IN OC_PICKER_CONTEXT *Context,
79 IN CONST CHAR8 *BasePath,
80 IN CONST CHAR8 *BaseType,
81 IN BOOLEAN Fallback
82 )
83{
84 EFI_STATUS Status;
85
86 if (!Context->PickerAudioAssist) {
87 return EFI_SUCCESS;
88 }
89
90 if (Context->OcAudio != NULL) {
91 Status = Context->OcAudio->PlayFile (Context->OcAudio, BasePath, BaseType, TRUE, 0, FALSE, TRUE);
92 } else {
93 Status = EFI_NOT_FOUND;
94 }
95
96 if (Fallback && EFI_ERROR (Status)) {
97 if (AsciiStrCmp (BaseType, OC_VOICE_OVER_AUDIO_BASE_TYPE_APPLE) == 0) {
98 if (AsciiStrCmp (BasePath, APPLE_VOICE_OVER_AUDIO_FILE_BEEP) == 0) {
99 Status = OcPlayAudioBeep (
100 Context,
104 );
105 }
106 } else if (AsciiStrCmp (BaseType, OC_VOICE_OVER_AUDIO_BASE_TYPE_OPEN_CORE) == 0) {
107 if (AsciiStrCmp (BasePath, OC_VOICE_OVER_AUDIO_FILE_ENTER_PASSWORD) == 0) {
108 Status = OcPlayAudioBeep (
109 Context,
113 );
114 } else if (AsciiStrCmp (BasePath, OC_VOICE_OVER_AUDIO_FILE_PASSWORD_ACCEPTED) == 0) {
115 Status = OcPlayAudioBeep (
116 Context,
120 );
121 } else if (AsciiStrCmp (BasePath, OC_VOICE_OVER_AUDIO_FILE_PASSWORD_INCORRECT) == 0) {
122 Status = OcPlayAudioBeep (
123 Context,
127 );
128 } else if (AsciiStrCmp (BasePath, OC_VOICE_OVER_AUDIO_FILE_PASSWORD_RETRY_LIMIT) == 0) {
129 Status = OcPlayAudioBeep (
130 Context,
134 );
135 } else if (AsciiStrCmp (BasePath, OC_VOICE_OVER_AUDIO_FILE_EXECUTION_FAILURE) == 0) {
136 Status = OcPlayAudioBeep (
137 Context,
141 );
142 }
143 }
144
145 //
146 // Should we introduce some fallback code?
147 //
148 }
149
150 return Status;
151}
152
153EFI_STATUS
154EFIAPI
156 IN OC_PICKER_CONTEXT *Context,
157 IN UINT32 ToneCount,
158 IN UINT32 ToneLength,
159 IN UINT32 SilenceLength
160 )
161{
162 EFI_STATUS Status;
163
164 if (!Context->PickerAudioAssist) {
165 return EFI_SUCCESS;
166 }
167
168 if (Context->BeepGen == NULL) {
169 Status = gBS->LocateProtocol (
171 NULL,
172 (VOID **)&Context->BeepGen
173 );
174 if (EFI_ERROR (Status)) {
175 return Status;
176 }
177 }
178
179 if (Context->BeepGen->GenBeep == NULL) {
180 return EFI_UNSUPPORTED;
181 }
182
183 return Context->BeepGen->GenBeep (ToneCount, ToneLength, SilenceLength);
184}
185
186EFI_STATUS
187EFIAPI
189 IN OC_PICKER_CONTEXT *Context,
190 IN OC_BOOT_ENTRY *Entry
191 )
192{
193 CHAR8 BasePath[ARRAY_SIZE ("Letter") + 1];
194
195 if ((Entry->EntryIndex > 0) && (Entry->EntryIndex <= 9 + 26)) {
197 BasePath,
198 sizeof (BasePath),
199 "%a%c",
200 Entry->EntryIndex > 9 ? "Letter" : "",
201 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[Entry->EntryIndex]
202 );
204 }
205
206 if (Entry->Type == OC_BOOT_APPLE_OS) {
208 } else if (Entry->Type == OC_BOOT_APPLE_RECOVERY) {
210 } else if (Entry->Type == OC_BOOT_APPLE_TIME_MACHINE) {
212 } else if (Entry->Type == OC_BOOT_APPLE_FW_UPDATE) {
214 } else if (Entry->Type == OC_BOOT_WINDOWS) {
216 } else if (Entry->Type == OC_BOOT_EXTERNAL_OS) {
217 if (OcAsciiStriStr (Entry->Flavour, OC_FLAVOUR_ID_NETWORK_BOOT) != NULL) {
219 } else {
221 }
222 } else if (Entry->Type == OC_BOOT_SYSTEM) {
223 OcPlayAudioFile (Context, Entry->AudioBasePath, Entry->AudioBaseType, FALSE);
224 } else if (Entry->Type == OC_BOOT_EXTERNAL_TOOL) {
225 if (OcAsciiStriStr (Entry->Flavour, OC_FLAVOUR_ID_RESET_NVRAM) != NULL) {
227 } else if (OcAsciiStriStr (Entry->Flavour, OC_FLAVOUR_ID_TOGGLE_SIP_ENABLED) != NULL) {
229 } else if (OcAsciiStriStr (Entry->Flavour, OC_FLAVOUR_ID_TOGGLE_SIP_DISABLED) != NULL) {
231 } else if (OcAsciiStriStr (Entry->Flavour, OC_FLAVOUR_ID_UEFI_SHELL) != NULL) {
233 } else if (OcAsciiStriStr (Entry->Flavour, OC_FLAVOUR_ID_FIRMWARE_SETTINGS) != NULL) {
235 } else {
237 }
238 } else {
240 }
241
242 if (Entry->IsExternal) {
244 }
245
246 if (Entry->IsFolder) {
248 }
249
250 return EFI_SUCCESS;
251}
252
253VOID
254EFIAPI
256 IN OC_PICKER_CONTEXT *Context,
257 IN CONST CHAR8 *BasePath OPTIONAL,
258 IN CONST CHAR8 *BaseType OPTIONAL
259 )
260{
261 if (!Context->PickerAudioAssist) {
262 Context->PickerAudioAssist = TRUE;
264
265 if ((BasePath != NULL) && (BaseType != NULL)) {
266 OcPlayAudioFile (Context, BasePath, BaseType, TRUE);
267 }
268 } else {
270 Context,
274 );
275 Context->PickerAudioAssist = FALSE;
276 }
277}
EFI_GUID gAppleBeepGenProtocolGuid
#define ARRAY_SIZE(Array)
Definition AppleMacEfi.h:34
#define APPLE_VOICE_OVER_AUDIO_FILE_BEEP
VOID EFIAPI OcToggleVoiceOver(IN OC_PICKER_CONTEXT *Context, IN CONST CHAR8 *BasePath OPTIONAL, IN CONST CHAR8 *BaseType OPTIONAL)
Definition BootAudio.c:255
EFI_STATUS EFIAPI OcPlayAudioFile(IN OC_PICKER_CONTEXT *Context, IN CONST CHAR8 *BasePath, IN CONST CHAR8 *BaseType, IN BOOLEAN Fallback)
Definition BootAudio.c:77
EFI_STATUS EFIAPI OcPreLocateAudioProtocol(IN OC_PICKER_CONTEXT *Context)
Definition BootAudio.c:53
EFI_STATUS EFIAPI OcPlayAudioBeep(IN OC_PICKER_CONTEXT *Context, IN UINT32 ToneCount, IN UINT32 ToneLength, IN UINT32 SilenceLength)
Definition BootAudio.c:155
EFI_STATUS EFIAPI OcPlayAudioEntry(IN OC_PICKER_CONTEXT *Context, IN OC_BOOT_ENTRY *Entry)
Definition BootAudio.c:188
#define OC_VOICE_OVER_AUDIO_FILE_DISK_IMAGE
Definition OcAudio.h:46
EFI_GUID gOcAudioProtocolGuid
#define OC_VOICE_OVER_AUDIO_FILE_RESET_NVRAM
Definition OcAudio.h:65
#define OC_VOICE_OVER_AUDIO_FILE_WINDOWS
Definition OcAudio.h:76
#define OC_VOICE_OVER_AUDIO_FILE_PASSWORD_RETRY_LIMIT
Definition OcAudio.h:63
#define OC_VOICE_OVER_AUDIO_FILE_NETWORK_BOOT
Definition OcAudio.h:59
#define OC_VOICE_OVER_AUDIO_FILE_PASSWORD_INCORRECT
Definition OcAudio.h:62
#define OC_VOICE_OVER_AUDIO_FILE_SIP_IS_ENABLED
Definition OcAudio.h:71
#define OC_VOICE_OVER_AUDIO_FILE_MAC_OS_TIME_MACHINE
Definition OcAudio.h:57
#define OC_VOICE_OVER_AUDIO_FILE_MAC_OS
Definition OcAudio.h:55
#define OC_VOICE_OVER_AUDIO_FILE_MAC_OS_RECOVERY
Definition OcAudio.h:56
#define OC_VOICE_OVER_AUDIO_FILE_UEFI_SHELL
Definition OcAudio.h:73
#define OC_VOICE_OVER_AUDIO_FILE_EXECUTION_FAILURE
Definition OcAudio.h:48
#define OC_VOICE_OVER_AUDIO_FILE_ENTER_PASSWORD
Definition OcAudio.h:47
#define OC_VOICE_OVER_AUDIO_FILE_MAC_OS_UPDATE_FW
Definition OcAudio.h:58
#define OC_VOICE_OVER_AUDIO_FILE_SIP_IS_DISABLED
Definition OcAudio.h:70
#define OC_VOICE_OVER_AUDIO_FILE_EXTERNAL_TOOL
Definition OcAudio.h:52
#define OC_VOICE_OVER_AUDIO_FILE_PASSWORD_ACCEPTED
Definition OcAudio.h:61
#define OC_VOICE_OVER_AUDIO_FILE_OTHER_OS
Definition OcAudio.h:60
#define OC_VOICE_OVER_AUDIO_BASE_TYPE_APPLE
Definition OcAudio.h:37
#define OC_VOICE_OVER_AUDIO_FILE_FIRMWARE_SETTINGS
Definition OcAudio.h:53
#define OC_VOICE_OVER_AUDIO_FILE_EXTERNAL
Definition OcAudio.h:50
#define OC_VOICE_OVER_AUDIO_FILE_EXTERNAL_OS
Definition OcAudio.h:51
#define OC_VOICE_OVER_AUDIO_BASE_TYPE_OPEN_CORE
Definition OcAudio.h:38
#define OC_VOICE_OVER_AUDIO_FILE_WELCOME
Definition OcAudio.h:75
#define OC_FLAVOUR_ID_RESET_NVRAM
#define OC_FLAVOUR_ID_TOGGLE_SIP_DISABLED
#define OC_BOOT_APPLE_TIME_MACHINE
#define OC_VOICE_OVER_SILENCE_NORMAL_MS
From boot.efi, constant.
#define OC_VOICE_OVER_SILENCE_ERROR_MS
#define OC_BOOT_EXTERNAL_TOOL
#define OC_VOICE_OVER_SIGNAL_NORMAL_MS
From boot.efi, constant.
#define OC_BOOT_EXTERNAL_OS
#define OC_VOICE_OVER_SIGNAL_ERROR_MS
#define OC_BOOT_APPLE_RECOVERY
#define OC_VOICE_OVER_SIGNALS_HWERROR
Hardware error.
#define OC_VOICE_OVER_SIGNALS_PASSWORD_OK
Password correct for boot.efi.
#define OC_BOOT_WINDOWS
#define OC_FLAVOUR_ID_FIRMWARE_SETTINGS
#define OC_FLAVOUR_ID_NETWORK_BOOT
#define OC_BOOT_APPLE_OS
#define OC_BOOT_APPLE_FW_UPDATE
#define OC_VOICE_OVER_SIGNALS_ERROR
Password verification error or boot failure.
#define OC_FLAVOUR_ID_TOGGLE_SIP_ENABLED
#define OC_FLAVOUR_ID_UEFI_SHELL
#define OC_BOOT_SYSTEM
#define OC_VOICE_OVER_SIGNALS_PASSWORD
Password prompt for boot.efi.
#define OC_VOICE_OVER_SIGNALS_NORMAL
Username prompt or any input for boot.efi.
EFI_BOOT_SERVICES * gBS
EFI_STATUS EFIAPI OcAsciiSafeSPrint(OUT CHAR8 *StartOfBuffer, IN UINTN BufferSize, IN CONST CHAR8 *FormatString,...)
Definition OcAsciiLib.c:190
CHAR8 *EFIAPI OcAsciiStriStr(IN CONST CHAR8 *String, IN CONST CHAR8 *SearchString)
Definition OcAsciiLib.c:327