| 32 | #include <Library/MemoryAllocationLib.h> |
| 33 | |
| 34 | EFI_STATUS |
| 35 | EFIAPI |
| 36 | WaveGetFileData( |
| 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); |
no test coverage detected