-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwinmm.cpp
More file actions
228 lines (197 loc) · 6.17 KB
/
winmm.cpp
File metadata and controls
228 lines (197 loc) · 6.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
#include <efi.h>
#include <efilib.h>
#include <intrin.h>
#include "print.h"
typedef unsigned long DWORD;
typedef int BOOL;
typedef DWORD (*timeGetTime_t)();
timeGetTime_t ptimeGetTime = nullptr;
DWORD timeGetTime() {
EFI_TIME t;
if (EFI_SUCCESS == gRT->GetTime(&t, nullptr)) {
// convert to milliseconds since midnight
return (DWORD)(
((t.Hour * 3600 + t.Minute * 60 + t.Second) * 1000ULL) +
(t.Nanosecond / 1000000ULL)
);
}
return 0;
}
//
// HDA I/O protocol.
//
//
// HDA I/O protocol GUID.
//
#define EFI_HDA_IO_PROTOCOL_GUID \
{ 0xA090D7F9, 0xB50A, 0x4EA1, \
{ 0xBD, 0xE9, 0x1A, 0xA5, 0xE9, 0x81, 0x2F, 0x45 } }
typedef struct EFI_HDA_IO_PROTOCOL_ EFI_HDA_IO_PROTOCOL;
typedef enum {
EfiHdaIoTypeInput,
EfiHdaIoTypeOutput,
EfiHdaIoTypeMaximum
} EFI_HDA_IO_PROTOCOL_TYPE;
typedef struct {
UINT32 Count;
UINT32 *Verbs;
UINT32 *Responses;
} EFI_HDA_IO_VERB_LIST;
typedef
VOID
(EFIAPI *EFI_HDA_IO_STREAM_CALLBACK)(
IN EFI_HDA_IO_PROTOCOL_TYPE Type,
IN VOID *Context1,
IN VOID *Context2,
IN VOID *Context3
);
typedef
EFI_STATUS
(EFIAPI *EFI_HDA_IO_GET_ADDRESS)(
IN EFI_HDA_IO_PROTOCOL *This,
OUT UINT8 *CodecAddress
);
typedef
EFI_STATUS
(EFIAPI *EFI_HDA_IO_SEND_COMMAND)(
IN EFI_HDA_IO_PROTOCOL *This,
IN UINT8 Node,
IN UINT32 Verb,
OUT UINT32 *Response
);
typedef
EFI_STATUS
(EFIAPI *EFI_HDA_IO_SEND_COMMANDS)(
IN EFI_HDA_IO_PROTOCOL *This,
IN UINT8 Node,
IN OUT EFI_HDA_IO_VERB_LIST *Verbs
);
typedef
EFI_STATUS
(EFIAPI *EFI_HDA_IO_SETUP_STREAM)(
IN EFI_HDA_IO_PROTOCOL *This,
IN EFI_HDA_IO_PROTOCOL_TYPE Type,
IN UINT16 Format,
OUT UINT8 *StreamId
);
typedef
EFI_STATUS
(EFIAPI *EFI_HDA_IO_CLOSE_STREAM)(
IN EFI_HDA_IO_PROTOCOL *This,
IN EFI_HDA_IO_PROTOCOL_TYPE Type
);
typedef
EFI_STATUS
(EFIAPI *EFI_HDA_IO_GET_STREAM)(
IN EFI_HDA_IO_PROTOCOL *This,
IN EFI_HDA_IO_PROTOCOL_TYPE Type,
OUT BOOLEAN *State
);
typedef
EFI_STATUS
(EFIAPI *EFI_HDA_IO_START_STREAM)(
IN EFI_HDA_IO_PROTOCOL *This,
IN EFI_HDA_IO_PROTOCOL_TYPE Type,
IN VOID *Buffer,
IN UINTN BufferLength,
IN UINTN BufferPosition OPTIONAL,
IN EFI_HDA_IO_STREAM_CALLBACK Callback OPTIONAL,
IN VOID *Context1 OPTIONAL,
IN VOID *Context2 OPTIONAL,
IN VOID *Context3 OPTIONAL
);
typedef
EFI_STATUS
(EFIAPI *EFI_HDA_IO_STOP_STREAM)(
IN EFI_HDA_IO_PROTOCOL *This,
IN EFI_HDA_IO_PROTOCOL_TYPE Type
);
struct EFI_HDA_IO_PROTOCOL_ {
EFI_HDA_IO_GET_ADDRESS GetAddress;
EFI_HDA_IO_SEND_COMMAND SendCommand;
EFI_HDA_IO_SEND_COMMANDS SendCommands;
EFI_HDA_IO_SETUP_STREAM SetupStream;
EFI_HDA_IO_CLOSE_STREAM CloseStream;
EFI_HDA_IO_GET_STREAM GetStream;
EFI_HDA_IO_START_STREAM StartStream;
EFI_HDA_IO_STOP_STREAM StopStream;
};
EFI_GUID gEfiHdaIoProtocolGuid = EFI_HDA_IO_PROTOCOL_GUID;
//
// HDA I/O Device Path protocol.
//
#define EFI_HDA_IO_DEVICE_PATH_GUID \
{ 0xA9003FEB, 0xD806, 0x41DB, \
{ 0xA4, 0x91, 0x54, 0x05, 0xFE, 0xEF, 0x46, 0xC3 } }
typedef struct {
EFI_DEVICE_PATH_PROTOCOL Header;
EFI_GUID Guid;
UINT32 Address;
} EFI_HDA_IO_DEVICE_PATH;
static_assert (
sizeof (EFI_HDA_IO_DEVICE_PATH)
== sizeof (EFI_DEVICE_PATH_PROTOCOL) + sizeof (EFI_GUID) + sizeof (UINT32),
"Unexpected EFI_HDA_IO_DEVICE_PATH size"
);
EFI_GUID gEfiHdaIoDevicePathGuid = EFI_HDA_IO_DEVICE_PATH_GUID;
#define EFI_HDA_IO_DEVICE_PATH_TEMPLATE \
{ \
{ \
MESSAGING_DEVICE_PATH, \
MSG_VENDOR_DP, \
{ \
(UINT8) (sizeof (EFI_HDA_IO_DEVICE_PATH) & 0xFFU), \
(UINT8) ((sizeof (EFI_HDA_IO_DEVICE_PATH) >> 8U) & 0xFFU) \
} \
}, \
gEfiHdaIoDevicePathGuid, \
0 \
}
#define VERB_SET_STREAM_FMT 0x20000
#define VERB_SET_AMP_GAIN 0x30000
#define VERB_SET_CONN_SELECT 0x70100
#define VERB_SET_PIN_CONTROL 0x70700
#define VERB_SET_EAPD_BTL 0x70C00
#define VERB_SET_CHAN_STREAMID 0x70600
#define PIN_OUT_ENABLE 0x40
#define AMP_OUT_UNMUTE_MAX 0xB07F
#define HDA_FMT_48K_16B_STEREO 0x0011 // 48kHz, 16-bit, Stereo
typedef union _LARGE_INTEGER {
struct {
unsigned long LowPart;
long HighPart;
};
long long QuadPart;
} LARGE_INTEGER;
UINT32 waveOutOpen() { return 0; }
UINT32 waveOutWrite() { return 0; }
UINT32 waveOutPause() { return 0; }
UINT32 waveOutRestart() { return 0; }
UINT32 waveOutSetVolume() { return 0; }
UINT32 waveOutPrepareHeader() { return 0; }
UINT32 waveOutUnprepareHeader() { return 0; }
UINT32 waveOutGetPosition() { return 0; }
UINT32 waveOutReset() { return 0; }
UINT32 waveOutClose() { return 0; }
extern int stricmp(const char *s1, const char *s2);
void* ResolveWinMM(const char* functionName) {
if (stricmp(functionName, "timeGetTime") == 0) {
return timeGetTime;
} else if (stricmp(functionName, "waveOutOpen") == 0) {
return waveOutOpen;
} else if (stricmp(functionName, "waveOutWrite") == 0) {
return waveOutWrite;
} else if (stricmp(functionName, "waveOutPause") == 0) {
return waveOutPause;
} else if (stricmp(functionName, "waveOutRestart") == 0) {
return waveOutRestart;
} else if (stricmp(functionName, "waveOutSetVolume") == 0) {
return waveOutSetVolume;
} else if (stricmp(functionName, "waveOutGetPosition") == 0) {
return waveOutGetPosition;
} else if (stricmp(functionName, "waveOutReset") == 0) {
return waveOutReset;
}
printf("Unknown function: %s\n", functionName);
return NULL;
}