OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OcWaveLib.c
Go to the documentation of this file.
1
16#include <Uefi.h>
17
19
20#include <Library/BaseLib.h>
21#include <Library/BaseMemoryLib.h>
22#include <Library/BaseOverflowLib.h>
23#include <Library/DebugLib.h>
24#include <Library/MemoryAllocationLib.h>
25#include <Library/OcWaveLib.h>
26
27EFI_STATUS
29 IN UINT8 *Buffer,
30 IN UINTN BufferSize,
31 OUT UINT8 **RawBuffer,
32 OUT UINT32 *RawBufferSize,
33 OUT EFI_AUDIO_IO_PROTOCOL_FREQ *Frequency,
35 OUT UINT8 *Channels
36 )
37{
38 RIFF_CHUNK *TmpChunk;
39 WAVE_FORMAT_DATA *WaveFormat;
40 RIFF_CHUNK *DataChunk;
41 UINT8 *BufferPtr;
42 UINT8 *BufferEnd;
43
44 if (BufferSize < sizeof (RIFF_CHUNK) + RIFF_CHUNK_ID_SIZE) {
45 return EFI_UNSUPPORTED;
46 }
47
48 TmpChunk = (RIFF_CHUNK *)Buffer;
49
50 //
51 // Ensure:
52 // - File size validity
53 // - Chunk ID is RIFF
54 // - First 4 bytes of data are WAVE.
55 //
56 if ( ((UINT64)TmpChunk->Size + sizeof (RIFF_CHUNK) != BufferSize)
57 || (AsciiStrnCmp (TmpChunk->Id, RIFF_CHUNK_ID, RIFF_CHUNK_ID_SIZE) != 0)
58 || (AsciiStrnCmp ((CHAR8 *)TmpChunk->Data, WAVE_CHUNK_ID, RIFF_CHUNK_ID_SIZE) != 0))
59 {
60 return EFI_UNSUPPORTED;
61 }
62
63 WaveFormat = NULL;
64 DataChunk = NULL;
65 BufferPtr = Buffer + sizeof (RIFF_CHUNK) + RIFF_CHUNK_ID_SIZE;
66 BufferEnd = Buffer + BufferSize;
67
68 //
69 // Find format and data chunks.
70 //
71 while (BufferEnd - BufferPtr >= sizeof (RIFF_CHUNK)) {
72 TmpChunk = (RIFF_CHUNK *)BufferPtr;
73
74 //
75 // If chunk size exceeds file size, abort.
76 //
77 if ((UINT64)TmpChunk->Size + sizeof (RIFF_CHUNK) > (UINTN)(BufferEnd - BufferPtr)) {
78 return EFI_INVALID_PARAMETER;
79 }
80
81 if (AsciiStrnCmp (TmpChunk->Id, WAVE_FORMAT_CHUNK_ID, RIFF_CHUNK_ID_SIZE) == 0) {
82 if (TmpChunk->Size < sizeof (WAVE_FORMAT_DATA)) {
83 return EFI_INVALID_PARAMETER;
84 }
85
86 WaveFormat = (WAVE_FORMAT_DATA *)TmpChunk->Data;
87 } else if (AsciiStrnCmp (TmpChunk->Id, WAVE_DATA_CHUNK_ID, RIFF_CHUNK_ID_SIZE) == 0) {
88 DataChunk = TmpChunk;
89 }
90
91 if ((WaveFormat != NULL) && (DataChunk != NULL)) {
92 break;
93 }
94
95 BufferPtr += TmpChunk->Size + sizeof (RIFF_CHUNK);
96 }
97
98 if ((WaveFormat == NULL) || (DataChunk == NULL)) {
99 return EFI_UNSUPPORTED;
100 }
101
102 *RawBuffer = DataChunk->Data;
103 *RawBufferSize = DataChunk->Size;
104
105 switch (WaveFormat->SamplesPerSec) {
106 case 8000:
107 *Frequency = EfiAudioIoFreq8kHz;
108 break;
109 case 11000:
110 *Frequency = EfiAudioIoFreq11kHz;
111 break;
112 case 16000:
113 *Frequency = EfiAudioIoFreq16kHz;
114 break;
115 case 22050:
116 *Frequency = EfiAudioIoFreq22kHz;
117 break;
118 case 32000:
119 *Frequency = EfiAudioIoFreq32kHz;
120 break;
121 case 44100:
122 *Frequency = EfiAudioIoFreq44kHz;
123 break;
124 case 48000:
125 *Frequency = EfiAudioIoFreq48kHz;
126 break;
127 case 88000:
128 *Frequency = EfiAudioIoFreq88kHz;
129 break;
130 case 96000:
131 *Frequency = EfiAudioIoFreq96kHz;
132 break;
133 case 192000:
134 *Frequency = EfiAudioIoFreq192kHz;
135 break;
136 default:
137 return EFI_UNSUPPORTED;
138 }
139
140 switch (WaveFormat->BitsPerSample) {
141 case 8:
142 *Bits = EfiAudioIoBits8;
143 break;
144 case 16:
145 *Bits = EfiAudioIoBits16;
146 break;
147 case 20:
148 *Bits = EfiAudioIoBits20;
149 break;
150 case 24:
151 *Bits = EfiAudioIoBits24;
152 break;
153 case 32:
154 *Bits = EfiAudioIoBits32;
155 break;
156 default:
157 return EFI_UNSUPPORTED;
158 }
159
160 *Channels = (UINT8)WaveFormat->Channels;
161
162 return EFI_SUCCESS;
163}
EFI_AUDIO_IO_PROTOCOL_FREQ
Definition AudioIo.h:104
@ EfiAudioIoFreq11kHz
Definition AudioIo.h:106
@ EfiAudioIoFreq96kHz
Definition AudioIo.h:113
@ EfiAudioIoFreq22kHz
Definition AudioIo.h:108
@ EfiAudioIoFreq44kHz
Definition AudioIo.h:110
@ EfiAudioIoFreq88kHz
Definition AudioIo.h:112
@ EfiAudioIoFreq192kHz
Definition AudioIo.h:114
@ EfiAudioIoFreq16kHz
Definition AudioIo.h:107
@ EfiAudioIoFreq48kHz
Definition AudioIo.h:111
@ EfiAudioIoFreq32kHz
Definition AudioIo.h:109
@ EfiAudioIoFreq8kHz
Definition AudioIo.h:105
EFI_AUDIO_IO_PROTOCOL_BITS
Definition AudioIo.h:93
@ EfiAudioIoBits24
Definition AudioIo.h:97
@ EfiAudioIoBits20
Definition AudioIo.h:96
@ EfiAudioIoBits16
Definition AudioIo.h:95
@ EfiAudioIoBits8
Definition AudioIo.h:94
@ EfiAudioIoBits32
Definition AudioIo.h:98
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
EFI_STATUS OcDecodeWave(IN UINT8 *Buffer, IN UINTN BufferSize, OUT UINT8 **RawBuffer, OUT UINT32 *RawBufferSize, OUT EFI_AUDIO_IO_PROTOCOL_FREQ *Frequency, OUT EFI_AUDIO_IO_PROTOCOL_BITS *Bits, OUT UINT8 *Channels)
Definition OcWaveLib.c:28
#define WAVE_FORMAT_CHUNK_ID
Definition Riff.h:55
#define WAVE_DATA_CHUNK_ID
Definition Riff.h:52
#define RIFF_CHUNK_ID
Definition Riff.h:40
#define WAVE_CHUNK_ID
Definition Riff.h:50
#define RIFF_CHUNK_ID_SIZE
Definition Riff.h:39
UINT8 Data[]
Definition Riff.h:77
UINT32 Size
Definition Riff.h:76
CHAR8 Id[RIFF_CHUNK_ID_SIZE]
Definition Riff.h:75
UINT16 BitsPerSample
Definition Riff.h:89
UINT16 Channels
Definition Riff.h:85
UINT32 SamplesPerSec
Definition Riff.h:86