OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OcAudioVoiceOver.c
Go to the documentation of this file.
1
15#include <Guid/AppleVariable.h>
16
17#include <Library/BaseLib.h>
18#include <Library/DebugLib.h>
19#include <Library/OcAudioLib.h>
20#include <Library/OcMiscLib.h>
21#include <Library/UefiBootServicesTableLib.h>
22#include <Library/UefiRuntimeServicesTableLib.h>
23
24#include <Protocol/AppleHda.h>
27
28#include "OcAudioInternal.h"
29
30//
31// Convert from Apple file id to file base name and type.
32//
33STATIC
34CONST
66
67STATIC
68CONST
88
89STATIC CONST CHAR8 *mLanguagePairing[] = {
90 NULL,
91 "ar",
92 "ca",
93 "cs",
94 "da",
95 "de",
96 "el",
97 "en",
98 "es",
99 "es-419",
100 "es-MX",
101 "fi",
102 "fr",
103 "he",
104 "hi",
105 "hr",
106 "hu",
107 "id",
108 "it",
109 "ja",
110 "ko",
111 "nl",
112 "no",
113 "my",
114 "pl",
115 "pt",
116 "pt-PT",
117 "ro",
118 "ru",
119 "sk",
120 "sv",
121 "th",
122 "tr",
123 "uk",
124 "vi",
125 "zh-CN",
126 "zh-TW"
127};
128
129CONST CHAR8 *
131 IN APPLE_VOICE_OVER_LANGUAGE_CODE LanguageCode
132 )
133{
134 return mLanguagePairing[LanguageCode];
135}
136
137EFI_STATUS
139 CONST CHAR8 *Language OPTIONAL
140 )
141{
142 EFI_STATUS Status;
143 UINTN LanguageSize;
144 CHAR8 LanguageData[16];
146
147 if (Language == NULL) {
148 LanguageSize = sizeof (LanguageData) - 1;
149 Status = gRT->GetVariable (
152 NULL,
153 &LanguageSize,
154 &LanguageData[0]
155 );
156 if (!EFI_ERROR (Status)) {
157 LanguageData[LanguageSize] = 0;
158 Language = LanguageData;
159 }
160 } else {
161 Status = EFI_SUCCESS;
162 }
163
164 if (!EFI_ERROR (Status)) {
165 Status = gBS->LocateProtocol (
167 NULL,
168 (VOID **)&VoiceOver
169 );
170
171 if (!EFI_ERROR (Status)) {
172 Status = VoiceOver->SetLanguageString (VoiceOver, Language);
173 }
174
175 DEBUG ((DEBUG_INFO, "OCAU: Language for audio %a - %r\n", Language, Status));
176 } else {
177 DEBUG ((DEBUG_INFO, "OCAU: No language for audio - %r\n", Status));
178 }
179
180 return Status;
181}
182
183EFI_STATUS
184EFIAPI
187 IN UINT8 File
188 )
189{
191 CONST APPLE_VOICE_OVER_FILE_MAP *Map;
192 BOOLEAN Localised;
193
194 Localised = FALSE;
195 Map = NULL;
196
199 {
200 Localised = TRUE;
204 {
206 }
207
208 if ((Map == NULL) || (Map->BasePath == NULL) || (Map->BaseType == NULL)) {
209 DEBUG ((DEBUG_INFO, "OCAU: Unsupported Apple voice over file index %u\n", File));
210 return EFI_UNSUPPORTED;
211 }
212
214 return Private->OcAudio.PlayFile (&Private->OcAudio, Map->BasePath, Map->BaseType, Localised, 0, FALSE, TRUE);
215}
216
217EFI_STATUS
218EFIAPI
221 IN UINT8 LanguageCode
222 )
223{
225
226 if ((LanguageCode == 0) || (LanguageCode >= ARRAY_SIZE (mLanguagePairing))) {
227 return EFI_INVALID_PARAMETER;
228 }
229
231 Private->Language = LanguageCode;
232 return EFI_SUCCESS;
233}
234
235EFI_STATUS
236EFIAPI
239 IN CONST CHAR8 *LanguageString
240 )
241{
243 UINTN Index;
244
245 DEBUG ((DEBUG_INFO, "OCAU: Setting language to %a\n", LanguageString));
246
248
249 for (Index = 1; Index < ARRAY_SIZE (mLanguagePairing); ++Index) {
250 if (AsciiStrCmp (mLanguagePairing[Index], LanguageString) == 0) {
251 Private->Language = (UINT8)Index;
252 return EFI_SUCCESS;
253 }
254 }
255
256 for (Index = 1; Index < ARRAY_SIZE (mLanguagePairing); ++Index) {
257 if ( (AsciiStrLen (mLanguagePairing[Index]) == 2)
258 && (AsciiStrnCmp (mLanguagePairing[Index], LanguageString, 2) == 0))
259 {
260 Private->Language = (UINT8)Index;
261 return EFI_SUCCESS;
262 }
263 }
264
265 if (AsciiStrnCmp (LanguageString, "zh", 2) == 0) {
267 return EFI_SUCCESS;
268 }
269
270 return EFI_INVALID_PARAMETER;
271}
272
273EFI_STATUS
274EFIAPI
277 OUT UINT8 *LanguageCode,
278 OUT CONST CHAR8 **LanguageString
279 )
280{
282
284 *LanguageCode = Private->Language;
285 *LanguageString = mLanguagePairing[Private->Language];
286 return EFI_SUCCESS;
287}
#define ARRAY_SIZE(Array)
Definition AppleMacEfi.h:34
EFI_GUID gAppleBootVariableGuid
#define APPLE_PREV_LANG_KBD_VARIABLE_NAME
#define APPLE_VOICE_OVER_AUDIO_FILE_VOICE_OVER_ON
@ AppleVoiceOverAudioFileIndexNonLocalisedMax
After last valid non-localised file.
@ AppleVoiceOverAudioFileVoiceOverOff
VoiceOverOff.
@ AppleVoiceOverAudioFileClick
Click (*)
@ AppleVoiceOverAudioFileUsernameOrPasswordIncorrect
UsernameOrPasswordIncorrect.
@ AppleVoiceOverAudioFileAccountLockedTryLater
AccountLockedTryLater (*)
@ AppleVoiceOverAudioFileUsername
Username.
@ AppleVoiceOverAudioFileAccountLocked
AccountLocked (*)
@ AppleVoiceOverAudioFileIndexNonLocalisedMin
First valid non-localised file.
@ AppleVoiceOverAudioFileVoiceOverBoot2
VoiceOver_Boot (*)
@ AppleVoiceOverAudioFileIndexLocalisedMin
First valid localised file.
@ AppleVoiceOverAudioFileVoiceOverOn
VoiceOverOn.
@ AppleVoiceOverAudioFileVoiceOverBoot
VoiceOver_Boot (*)
@ AppleVoiceOverAudioFileIndexLocalisedMax
After last valid localised file.
@ AppleVoiceOverAudioFilePassword
Password.
@ AppleVoiceOverAudioFileBeep
Beep.
#define APPLE_VOICE_OVER_AUDIO_FILE_PASSWORD
#define APPLE_VOICE_OVER_AUDIO_FILE_VOICE_OVER_BOOT
#define APPLE_VOICE_OVER_AUDIO_FILE_ACCOUNT_LOCKED
#define APPLE_VOICE_OVER_AUDIO_FILE_USERNAME_OR_PASSWORD_INCORRECT
#define APPLE_VOICE_OVER_AUDIO_FILE_CLICK
APPLE_VOICE_OVER_LANGUAGE_CODE
@ AppleVoiceOverLanguageZhHans
zh-Hans
EFI_GUID gAppleVOAudioProtocolGuid
#define APPLE_VOICE_OVER_AUDIO_FILE_USERNAME
#define APPLE_VOICE_OVER_AUDIO_FILE_BEEP
#define APPLE_VOICE_OVER_AUDIO_FILE_VOICE_OVER_OFF
#define APPLE_VOICE_OVER_AUDIO_FILE_ACCOUNT_LOCKED_TRY_LATER
#define OC_VOICE_OVER_AUDIO_BASE_TYPE_APPLE
Definition OcAudio.h:37
#define OC_VOICE_OVER_AUDIO_FILE_VOICE_OVER_BOOT
Definition OcAudio.h:74
#define OC_VOICE_OVER_AUDIO_BASE_TYPE_OPEN_CORE
Definition OcAudio.h:38
#define OC_AUDIO_PROTOCOL_PRIVATE_FROM_VOICE_OVER(Proto)
STATIC CONST APPLE_VOICE_OVER_FILE_MAP mAppleVoiceOverNonLocalisedAudioFiles[AppleVoiceOverAudioFileIndexNonLocalisedMax - AppleVoiceOverAudioFileIndexNonLocalisedMin]
EFI_STATUS EFIAPI InternalOcAudioVoiceOverPlay(IN APPLE_VOICE_OVER_AUDIO_PROTOCOL *This, IN UINT8 File)
EFI_STATUS EFIAPI InternalOcAudioVoiceOverGetLanguage(IN APPLE_VOICE_OVER_AUDIO_PROTOCOL *This, OUT UINT8 *LanguageCode, OUT CONST CHAR8 **LanguageString)
STATIC CONST CHAR8 * mLanguagePairing[]
EFI_STATUS EFIAPI InternalOcAudioVoiceOverSetLanguageCode(IN APPLE_VOICE_OVER_AUDIO_PROTOCOL *This, IN UINT8 LanguageCode)
CONST CHAR8 * OcLanguageCodeToString(IN APPLE_VOICE_OVER_LANGUAGE_CODE LanguageCode)
EFI_STATUS OcSetVoiceOverLanguage(CONST CHAR8 *Language OPTIONAL)
STATIC CONST APPLE_VOICE_OVER_FILE_MAP mAppleVoiceOverLocalisedAudioFiles[AppleVoiceOverAudioFileIndexLocalisedMax - AppleVoiceOverAudioFileIndexLocalisedMin]
EFI_STATUS EFIAPI InternalOcAudioVoiceOverSetLanguageString(IN APPLE_VOICE_OVER_AUDIO_PROTOCOL *This, IN CONST CHAR8 *LanguageString)
EFI_BOOT_SERVICES * gBS
EFI_RUNTIME_SERVICES * gRT
OC_AUDIO_PLAY_FILE PlayFile
Definition OcAudio.h:262
OC_AUDIO_PROTOCOL OcAudio