MCPcopy Create free account
hub / github.com/CloverHackyColor/CloverBootloader / WaveGetFileData

Function WaveGetFileData

Library/WaveLib/WaveLib.c:34–98  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

32#include <Library/MemoryAllocationLib.h>
33
34EFI_STATUS
35EFIAPI
36WaveGetFileData(
37 IN CONST VOID *FileData,
38 IN UINTN FileLength,
39 OUT WAVE_FILE_DATA *WaveFileData)
40{
41
42 // Create variables.
43 UINT8 *FilePtr = NULL;
44 RIFF_CHUNK *RiffChunk = NULL;
45 RIFF_CHUNK *FormatChunk = NULL;
46 RIFF_CHUNK *DataChunk = NULL;
47
48 // Ensure parameters are valid.
49 if ((FileData == NULL) || (FileLength == 0) || (WaveFileData == NULL))
50 return EFI_INVALID_PARAMETER;
51 FilePtr = (UINT8*)FileData;
52
53 // Get RIFF chunk (should be first).
54 RiffChunk = (RIFF_CHUNK*)FilePtr;
55
56 // Ensure chunk ID is RIFF and the first 4 bytes of data are WAVE.
57 if (AsciiStrnCmp(RiffChunk->Id, RIFF_CHUNK_ID, RIFF_CHUNK_ID_SIZE) ||
58 AsciiStrnCmp((CHAR8*)RiffChunk->Data, WAVE_CHUNK_ID, RIFF_CHUNK_ID_SIZE) || (
59 (RiffChunk->Size + sizeof(RiffChunk->Id) + sizeof(RiffChunk->Size)) != FileLength))
60 return EFI_UNSUPPORTED;
61
62 // Move to data area.
63 FilePtr += sizeof(RIFF_CHUNK);
64
65 // Get index of format chunk.
66 for (UINTN i = FilePtr - (UINT8*)FileData; i < FileLength; i++) {
67 if (AsciiStrnCmp((CHAR8*)(((UINT8*)FileData) + i), WAVE_FORMAT_CHUNK_ID, RIFF_CHUNK_ID_SIZE) == 0) {
68 FilePtr = (UINT8*)FileData + i;
69 FormatChunk = (RIFF_CHUNK*)FilePtr;
70 break;
71 }
72 }
73 if (FormatChunk == NULL)
74 return EFI_UNSUPPORTED;
75
76 // Get index of data chunk.
77 for (UINTN i = FilePtr - (UINT8*)FileData; i < FileLength; i++) {
78 if (AsciiStrnCmp((CHAR8*)(((UINT8*)FileData) + i), WAVE_DATA_CHUNK_ID, RIFF_CHUNK_ID_SIZE) == 0) {
79 FilePtr = (UINT8*)FileData + i;
80 DataChunk = (RIFF_CHUNK*)FilePtr;
81 break;
82 }
83 }
84 if (DataChunk == NULL)
85 return EFI_UNSUPPORTED;
86
87 // Copy to output structure.
88 ZeroMem(WaveFileData, sizeof(WAVE_FILE_DATA));
89 WaveFileData->FileLength = FileLength;
90 WaveFileData->DataLength = RiffChunk->Size;
91 WaveFileData->Format = (WAVE_FORMAT_DATA*)AllocateCopyPool(sizeof(WAVE_FORMAT_DATA), FormatChunk->Data);

Callers 1

StartupSoundPlayFunction · 0.85

Calls 4

AsciiStrnCmpFunction · 0.85
AllocateCopyPoolFunction · 0.85
ZeroMemFunction · 0.50
CopyMemFunction · 0.50

Tested by

no test coverage detected