mirror of
https://github.com/libretro/RetroArch.git
synced 2026-11-08 08:10:30 -10:00
Compare commits
2107
Commits
v1.8.0
...
SAPI_NVDA_auto
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fca7bc52ed | ||
|
|
159190cc14 | ||
|
|
984c3a22a3 | ||
|
|
1d7cae2ceb | ||
|
|
1f2e42cdc2 | ||
|
|
2cb67d1172 | ||
|
|
5813228c6c | ||
|
|
dea5b5347d | ||
|
|
f39e554586 | ||
|
|
f646fea03f | ||
|
|
f9ae48c3f6 | ||
|
|
1e11cbf6b4 | ||
|
|
ecebcf8215 | ||
|
|
8f7646ded8 | ||
|
|
b96fd5933c | ||
|
|
03676061b4 | ||
|
|
777ba7c5c3 | ||
|
|
bfb5f58b90 | ||
|
|
2004545f96 | ||
|
|
e80fb4f386 | ||
|
|
83958a4402 | ||
|
|
8292f31ea0 | ||
|
|
d0a9de01a3 | ||
|
|
c809ecd623 | ||
|
|
2ff9bfb24d | ||
|
|
ab34a0a34f | ||
|
|
c5e2099dd9 | ||
|
|
5a2e4237c4 | ||
|
|
9d0585a280 | ||
|
|
f0ef3904d5 | ||
|
|
7fe952ddeb | ||
|
|
73bcd7a692 | ||
|
|
316c07c226 | ||
|
|
2a579f4418 | ||
|
|
8f8fbab4f9 | ||
|
|
411ff301c7 | ||
|
|
2fb7ba22e5 | ||
|
|
761a17ccd8 | ||
|
|
f466cc5143 | ||
|
|
47067b691e | ||
|
|
83a262ceae | ||
|
|
15c661a374 | ||
|
|
43d24114b3 | ||
|
|
e4a3946998 | ||
|
|
0087928aa5 | ||
|
|
2d2bd625c6 | ||
|
|
6e4228b054 | ||
|
|
5972ed9cc6 | ||
|
|
2dc0fdcfee | ||
|
|
4fd3cac319 | ||
|
|
66eed86ccf | ||
|
|
79dc998a7b | ||
|
|
75a33b3662 | ||
|
|
ac72d19f5c | ||
|
|
49e584c6f6 | ||
|
|
d30d2abe10 | ||
|
|
637266be03 | ||
|
|
05744bb69f | ||
|
|
7531223846 | ||
|
|
7ba551864b | ||
|
|
0988f7fb8a | ||
|
|
d016a0929b | ||
|
|
b01ae6b366 | ||
|
|
309af5d526 | ||
|
|
66d98af48b | ||
|
|
97ee822f35 | ||
|
|
4646da6df8 | ||
|
|
6f6a4e59df | ||
|
|
4a95cb7b54 | ||
|
|
e81e53bdf6 | ||
|
|
ae48da5ebf | ||
|
|
3d24439276 | ||
|
|
6b0a46d5d2 | ||
|
|
456346e0c6 | ||
|
|
1440b46eb0 | ||
|
|
9f7e55e59d | ||
|
|
ef13fc1b9e | ||
|
|
513dcdc502 | ||
|
|
b17e274ff6 | ||
|
|
29774bd84a | ||
|
|
95f0b6e0b8 | ||
|
|
ab8af924c0 | ||
|
|
a0e12fecde | ||
|
|
af52212e6d | ||
|
|
ff7f56e996 | ||
|
|
261adaf100 | ||
|
|
b9c32276bf | ||
|
|
e639d2b09a | ||
|
|
2cc841a6cb | ||
|
|
9194a3b24d | ||
|
|
b5d9ed60e7 | ||
|
|
7a1e97f8c0 | ||
|
|
fb7b1ec1a0 | ||
|
|
9729b5a917 | ||
|
|
53fffbd670 | ||
|
|
8643cb22dd | ||
|
|
47582ffa41 | ||
|
|
f48c668447 | ||
|
|
8bcd74bf42 | ||
|
|
92f6c33d34 | ||
|
|
c61f6aafc1 | ||
|
|
e24274a314 | ||
|
|
00590f2077 | ||
|
|
353ca34a49 | ||
|
|
bc01a94f07 | ||
|
|
5a8106308e | ||
|
|
532fd88e2f | ||
|
|
42e8890c91 | ||
|
|
8d3f25f20f | ||
|
|
fe03ba76f9 | ||
|
|
9b9e0a03fa | ||
|
|
d078a7131f | ||
|
|
be1b97c7c0 | ||
|
|
249c0f4fb5 | ||
|
|
3a1510ca88 | ||
|
|
19331636bd | ||
|
|
997136c029 | ||
|
|
3c4a959b83 | ||
|
|
157260d05d | ||
|
|
f65fefb462 | ||
|
|
3180cbd103 | ||
|
|
c0c9caec22 | ||
|
|
4d79396cc3 | ||
|
|
7c5cca2dba | ||
|
|
1e0c74e818 | ||
|
|
f0faedddf9 | ||
|
|
b4aca85a0c | ||
|
|
e12655915d | ||
|
|
58e7355942 | ||
|
|
cfbc3d4317 | ||
|
|
7e6fc5ab4d | ||
|
|
8b6c330253 | ||
|
|
ef78f5b3c3 | ||
|
|
a8a88efcb2 | ||
|
|
e93857cd9b | ||
|
|
0310f6dafd | ||
|
|
9c06b1a0fb | ||
|
|
7c57124aed | ||
|
|
856eb3df89 | ||
|
|
e7f5423d53 | ||
|
|
442101e7ae | ||
|
|
0d8c4ce3ae | ||
|
|
1197104b60 | ||
|
|
ab5bb981df | ||
|
|
2509d8e88f | ||
|
|
a33353399f | ||
|
|
c4a98a62d3 | ||
|
|
497180e506 | ||
|
|
f0e1ab37cc | ||
|
|
53194e10b5 | ||
|
|
25231d5c92 | ||
|
|
400f97a163 | ||
|
|
d857fb3234 | ||
|
|
5dc3f40451 | ||
|
|
e138bfbfaf | ||
|
|
c9b39a41e9 | ||
|
|
cf0f16596c | ||
|
|
8b138d8bb1 | ||
|
|
320d4917bd | ||
|
|
a780755af7 | ||
|
|
7246d0d053 | ||
|
|
8794360b65 | ||
|
|
6b9f8be3fb | ||
|
|
bae318dbc2 | ||
|
|
11ece8b373 | ||
|
|
efb0b87c1d | ||
|
|
7986561598 | ||
|
|
0aecf033b6 | ||
|
|
3c6bea1113 | ||
|
|
7f8c13ae09 | ||
|
|
7403b3de8a | ||
|
|
925ec7bc82 | ||
|
|
30e8ec6543 | ||
|
|
91fd05133b | ||
|
|
c796f3268b | ||
|
|
b4da4940eb | ||
|
|
26bb0105c0 | ||
|
|
2e215c4efd | ||
|
|
d9dccf0c78 | ||
|
|
6b279a2581 | ||
|
|
66f621f810 | ||
|
|
dfa1288988 | ||
|
|
fdad03e878 | ||
|
|
ee92c6d679 | ||
|
|
4ccff43919 | ||
|
|
050ac1e9cf | ||
|
|
28eec1489a | ||
|
|
76f0c14289 | ||
|
|
c20e83e50a | ||
|
|
e1debd6f11 | ||
|
|
932d12a684 | ||
|
|
a9bb8d08f2 | ||
|
|
927d801463 | ||
|
|
018209d6c2 | ||
|
|
375621394c | ||
|
|
37a5e7ff08 | ||
|
|
7fb7d4e74c | ||
|
|
649aee49ba | ||
|
|
67ea016c09 | ||
|
|
38135c505b | ||
|
|
f13a4b10ee | ||
|
|
0611581b28 | ||
|
|
3bfd6ababd | ||
|
|
ea53d4ab38 | ||
|
|
4a533447a1 | ||
|
|
16d62001e0 | ||
|
|
00577b8950 | ||
|
|
27ab57bc05 | ||
|
|
b92dcd1334 | ||
|
|
086c68bca7 | ||
|
|
2a0833378d | ||
|
|
c4dfa1e12a | ||
|
|
ae18fc808d | ||
|
|
92b09a9f60 | ||
|
|
abcfe03059 | ||
|
|
9e8dd390b2 | ||
|
|
ee5e7f8034 | ||
|
|
3b3eaa1e24 | ||
|
|
1e315bb61b | ||
|
|
e2a703896f | ||
|
|
d2f3af69f4 | ||
|
|
84eb05c917 | ||
|
|
bbe688cd05 | ||
|
|
d81e756fa7 | ||
|
|
8a4e8f4ae9 | ||
|
|
f4c5036c3c | ||
|
|
35a528a3e0 | ||
|
|
783f16b198 | ||
|
|
238d72d187 | ||
|
|
dde5f67962 | ||
|
|
f2df63e246 | ||
|
|
083a0453c6 | ||
|
|
1a854021a4 | ||
|
|
2da2dd3b0b | ||
|
|
c77861126f | ||
|
|
867bdad010 | ||
|
|
a395bf9355 | ||
|
|
43feea3496 | ||
|
|
0ee8119459 | ||
|
|
adfef2a503 | ||
|
|
252bb3a905 | ||
|
|
c007b68e6b | ||
|
|
4e6f26d2e4 | ||
|
|
9e9ad8d5eb | ||
|
|
b7da58b40b | ||
|
|
7dc961bdd9 | ||
|
|
17bb6f7354 | ||
|
|
68678987c4 | ||
|
|
cd152399a3 | ||
|
|
a4cced8fde | ||
|
|
9786e08228 | ||
|
|
448b988e62 | ||
|
|
92054bcd09 | ||
|
|
540f0d2646 | ||
|
|
b4ea5d3cd5 | ||
|
|
8e3ef34c1f | ||
|
|
3c1e9372ab | ||
|
|
82b327420d | ||
|
|
fb5f557d91 | ||
|
|
b3d5551ad2 | ||
|
|
999f862a6d | ||
|
|
ee2f25b1dc | ||
|
|
006735395c | ||
|
|
cdbae18ae5 | ||
|
|
07416f1a0e | ||
|
|
7c7fe66dfc | ||
|
|
87bf32e889 | ||
|
|
43e608760a | ||
|
|
7d4e5b8ce5 | ||
|
|
6a0a68f8df | ||
|
|
7f958862fe | ||
|
|
e08689ed98 | ||
|
|
c3be8f45fc | ||
|
|
e5ab0f33d1 | ||
|
|
2413c1b8d5 | ||
|
|
ba73bebf3d | ||
|
|
d91800038d | ||
|
|
a0446f778c | ||
|
|
5388448cf3 | ||
|
|
8c39c804ee | ||
|
|
13249f6011 | ||
|
|
d72596142e | ||
|
|
b24d1f06aa | ||
|
|
044619281c | ||
|
|
d42a76dec1 | ||
|
|
6cb6f76add | ||
|
|
e4aa0fd544 | ||
|
|
c16568cf32 | ||
|
|
7a9684b6ea | ||
|
|
7efe1160e1 | ||
|
|
df0f334b97 | ||
|
|
e7cbc2cd5c | ||
|
|
436fc6706b | ||
|
|
591bb36e03 | ||
|
|
809e22ec1a | ||
|
|
874510152e | ||
|
|
3e706fe5b2 | ||
|
|
c465fda58a | ||
|
|
7c7eeff0fb | ||
|
|
2497ac4584 | ||
|
|
b8b2a2dae4 | ||
|
|
3cb73ccd03 | ||
|
|
f5c5b872db | ||
|
|
c32cb51755 | ||
|
|
cfa90a4a36 | ||
|
|
f0bf2df92f | ||
|
|
935393b391 | ||
|
|
212f32e2fd | ||
|
|
ead6c2b0dc | ||
|
|
a8a2294f27 | ||
|
|
f9c81f358a | ||
|
|
9b76446b48 | ||
|
|
9b0ff1fd0d | ||
|
|
6505080d64 | ||
|
|
be861cf55d | ||
|
|
681443cc45 | ||
|
|
4c92d43fe2 | ||
|
|
9e31c2de34 | ||
|
|
83ac24e7f1 | ||
|
|
9ae4031d13 | ||
|
|
20366f3d3c | ||
|
|
000eaf712a | ||
|
|
888a4bfe37 | ||
|
|
4ad03e6553 | ||
|
|
5a147fe46f | ||
|
|
577e254e9e | ||
|
|
c5fc9cf5ce | ||
|
|
0d543baa4b | ||
|
|
3aa8afd60d | ||
|
|
1aa95f6cc4 | ||
|
|
daea169e5d | ||
|
|
b1337d0a21 | ||
|
|
8ec6447b18 | ||
|
|
87f34eb12f | ||
|
|
788ae60d12 | ||
|
|
3e35fb8672 | ||
|
|
d63daacdf9 | ||
|
|
efe72dea94 | ||
|
|
a7dd320653 | ||
|
|
203b4d7f80 | ||
|
|
2b0164f551 | ||
|
|
31263970ad | ||
|
|
7be7815933 | ||
|
|
bdc31234d5 | ||
|
|
e8ff0fddca | ||
|
|
f3c6799b4e | ||
|
|
3e891c6237 | ||
|
|
f588e7f646 | ||
|
|
b4b758466f | ||
|
|
d4d19555e0 | ||
|
|
ee9c6ef5ba | ||
|
|
267800abaa | ||
|
|
5c25cf1ad6 | ||
|
|
4598f186a8 | ||
|
|
83b815df17 | ||
|
|
7f75bcfcb5 | ||
|
|
4f27a740ba | ||
|
|
250468a1ba | ||
|
|
304cd05dc6 | ||
|
|
4d7b627421 | ||
|
|
e20151a048 | ||
|
|
68664fdf1d | ||
|
|
8b43e1b4ef | ||
|
|
4aae293e3d | ||
|
|
3de0bf27d2 | ||
|
|
49e07b3e82 | ||
|
|
c1b5860320 | ||
|
|
801fa3459c | ||
|
|
05cf2ee8ba | ||
|
|
ad725cefc2 | ||
|
|
b99838b06b | ||
|
|
dcf1138040 | ||
|
|
869a8cfcba | ||
|
|
26f6e0bccf | ||
|
|
9a78994fe2 | ||
|
|
1f553ac1c4 | ||
|
|
814835aa8f | ||
|
|
5b59f0dcda | ||
|
|
544df2f03c | ||
|
|
a6995c0336 | ||
|
|
e06a6b62c8 | ||
|
|
fb04376722 | ||
|
|
d1276258ea | ||
|
|
ffca8af2c6 | ||
|
|
e678b39de6 | ||
|
|
9d9c24f94b | ||
|
|
7873b5f044 | ||
|
|
69b84d9d02 | ||
|
|
bdc999ca45 | ||
|
|
d5985c35ae | ||
|
|
ddd12aab36 | ||
|
|
8f65c2cf72 | ||
|
|
f581260daa | ||
|
|
62bd4960e1 | ||
|
|
bd5f151077 | ||
|
|
70d0c1ce6f | ||
|
|
18a90d81d2 | ||
|
|
6fd784375a | ||
|
|
6ad38b4140 | ||
|
|
8fd43c0927 | ||
|
|
534f09373e | ||
|
|
52fae101e8 | ||
|
|
8d5d91a5a4 | ||
|
|
e65c816ed0 | ||
|
|
a7d679d391 | ||
|
|
c5cb509f1b | ||
|
|
c6f3b4a6da | ||
|
|
be39981ba3 | ||
|
|
da1ace4668 | ||
|
|
ca4ce9f136 | ||
|
|
dd6cbce0eb | ||
|
|
e75e2ede92 | ||
|
|
5f8020b32e | ||
|
|
860f94e914 | ||
|
|
dc24530382 | ||
|
|
84f04ae984 | ||
|
|
48ffe8dac3 | ||
|
|
1c302f26b3 | ||
|
|
dfe64e3735 | ||
|
|
d7ddeeb40c | ||
|
|
1215f4eb59 | ||
|
|
10ec720686 | ||
|
|
6d5fc4a36b | ||
|
|
4933b89736 | ||
|
|
3958235c89 | ||
|
|
d3bc82d2c3 | ||
|
|
da60c1bb96 | ||
|
|
2e034c1574 | ||
|
|
35001e64c2 | ||
|
|
bdfd6d3175 | ||
|
|
7841b639ec | ||
|
|
35977efe43 | ||
|
|
b5c87aaef8 | ||
|
|
c66b4249ca | ||
|
|
a451d6927a | ||
|
|
178e4e7d29 | ||
|
|
d592959be8 | ||
|
|
f87bd0c190 | ||
|
|
3c9664f099 | ||
|
|
43b65be030 | ||
|
|
899c21257c | ||
|
|
1bda81560e | ||
|
|
09f595e0a8 | ||
|
|
2333b7f31a | ||
|
|
8f42e5f9a7 | ||
|
|
a18b29743e | ||
|
|
8baf0f6340 | ||
|
|
a1951b51b6 | ||
|
|
8bad0b6b7e | ||
|
|
a03d4485b0 | ||
|
|
c0e088ca07 | ||
|
|
97d8db7aae | ||
|
|
bea4f8aad3 | ||
|
|
8d3b22091c | ||
|
|
cbeb8944eb | ||
|
|
dcfa8cc7ba | ||
|
|
32e4aea068 | ||
|
|
2f25db03ba | ||
|
|
570884dc2b | ||
|
|
70602487be | ||
|
|
2077ffa2ca | ||
|
|
2637bd648b | ||
|
|
ee4d86237f | ||
|
|
55bc96e00b | ||
|
|
29f8189d0e | ||
|
|
e10ae3dca1 | ||
|
|
d74398b262 | ||
|
|
a1fe704d22 | ||
|
|
b96bdeeed7 | ||
|
|
9678b1f9ed | ||
|
|
a10c7e3ac2 | ||
|
|
f7217702e2 | ||
|
|
9d59fcaded | ||
|
|
e2378680ef | ||
|
|
e7d6c63863 | ||
|
|
9954ae57a9 | ||
|
|
f61621f753 | ||
|
|
c02f922c10 | ||
|
|
a62ec9217f | ||
|
|
6232e0abd3 | ||
|
|
d5f7839d12 | ||
|
|
d1ebb58580 | ||
|
|
67d00f4772 | ||
|
|
0138398f0c | ||
|
|
040ded3443 | ||
|
|
09d8cce474 | ||
|
|
09df109531 | ||
|
|
e895b9f101 | ||
|
|
f74126ec77 | ||
|
|
ae21ebddc8 | ||
|
|
def374c2b9 | ||
|
|
f638fff16d | ||
|
|
4f5b16b245 | ||
|
|
1167a06a5a | ||
|
|
80991a00f0 | ||
|
|
0ef1b342e4 | ||
|
|
13ed047e13 | ||
|
|
50c3673dfc | ||
|
|
670cbc8903 | ||
|
|
96f2f24ce3 | ||
|
|
d4c9768138 | ||
|
|
254dacb66b | ||
|
|
92bd0fc47a | ||
|
|
4d3507097a | ||
|
|
8dc2ea114f | ||
|
|
db5358f70f | ||
|
|
ccb8b98008 | ||
|
|
795be81f4a | ||
|
|
cc50cefd30 | ||
|
|
5b2ed8a08d | ||
|
|
adbd442448 | ||
|
|
f642066f05 | ||
|
|
b1d0fec02e | ||
|
|
a4ca31e197 | ||
|
|
40b17e4875 | ||
|
|
b99501d5d7 | ||
|
|
0c1568c4ab | ||
|
|
45b02df36b | ||
|
|
182afe9561 | ||
|
|
38bbb2b3e1 | ||
|
|
177d2a5903 | ||
|
|
29d954bab2 | ||
|
|
69ffcf5648 | ||
|
|
360fdfedbc | ||
|
|
cd495a09f1 | ||
|
|
4914a41c2c | ||
|
|
105bfcafe5 | ||
|
|
0bd8629baa | ||
|
|
81ab6d575a | ||
|
|
daad8bcca0 | ||
|
|
0524d4ae49 | ||
|
|
63b7d74272 | ||
|
|
42d3dd68ed | ||
|
|
ca6b07cc47 | ||
|
|
22ada33990 | ||
|
|
c4583a62fb | ||
|
|
a326be71f3 | ||
|
|
212318f95b | ||
|
|
8ce4ed7164 | ||
|
|
9dcc941ec5 | ||
|
|
6802fa1324 | ||
|
|
341cd0da36 | ||
|
|
8476fd0559 | ||
|
|
6c8d87ac04 | ||
|
|
a438d4f4da | ||
|
|
b03f1d4c7f | ||
|
|
a4bad00133 | ||
|
|
b1fa971d35 | ||
|
|
a96be2cdce | ||
|
|
160d90f22a | ||
|
|
3a1c59d461 | ||
|
|
7d908da30f | ||
|
|
add0cedc48 | ||
|
|
fe51b44d98 | ||
|
|
7effd2171c | ||
|
|
1557b15c40 | ||
|
|
897809cc75 | ||
|
|
ad03277e3c | ||
|
|
ad523ebae0 | ||
|
|
472fe9a991 | ||
|
|
a10db7c280 | ||
|
|
71c12aab32 | ||
|
|
385b0b71e7 | ||
|
|
0913849b87 | ||
|
|
d67666f9fa | ||
|
|
5128237228 | ||
|
|
5bb85ee5d5 | ||
|
|
227a4585af | ||
|
|
172f49437f | ||
|
|
deb1151f04 | ||
|
|
b6a79462d5 | ||
|
|
4c9e2d98c1 | ||
|
|
55a1837494 | ||
|
|
74547c0a81 | ||
|
|
f00fb6d1ea | ||
|
|
a75059f94b | ||
|
|
765f8d4c8c | ||
|
|
602623dc50 | ||
|
|
fb223ac377 | ||
|
|
26b3ccf2e5 | ||
|
|
c2ed8783ee | ||
|
|
94cefaf1c5 | ||
|
|
cd29beb00d | ||
|
|
0ae51061f6 | ||
|
|
a6c9bb95f0 | ||
|
|
fd7bc416ce | ||
|
|
f5bc061b26 | ||
|
|
3a76aac226 | ||
|
|
b23863ae85 | ||
|
|
d19dd12b30 | ||
|
|
795801b1f5 | ||
|
|
01a65fa5ba | ||
|
|
e43f34376d | ||
|
|
58fc9ce9ca | ||
|
|
dc5afdccf9 | ||
|
|
a7e4bfe479 | ||
|
|
010b2cb109 | ||
|
|
283c95399c | ||
|
|
dd07038e14 | ||
|
|
a5a0437bda | ||
|
|
314de68297 | ||
|
|
bdc159f0b4 | ||
|
|
2d99847529 | ||
|
|
02a6243718 | ||
|
|
d7e6152d45 | ||
|
|
27c5ffeb76 | ||
|
|
0c17faa78f | ||
|
|
d4e9abe363 | ||
|
|
5ecc426741 | ||
|
|
f671c37a0d | ||
|
|
1933bc1eaf | ||
|
|
c356e71b0a | ||
|
|
a3eef7442f | ||
|
|
d3419e7490 | ||
|
|
4e27394b87 | ||
|
|
f21412ab59 | ||
|
|
b89663e213 | ||
|
|
8ae08cf23d | ||
|
|
6c82a3802e | ||
|
|
387cb8bf8b | ||
|
|
19f9ffc99f | ||
|
|
65d2c53bfe | ||
|
|
976b659e2b | ||
|
|
3b207990ce | ||
|
|
0ec3a8a449 | ||
|
|
8b11d9f039 | ||
|
|
3be4eac555 | ||
|
|
a2a5ca0d01 | ||
|
|
79536a4767 | ||
|
|
8fe2fe7b62 | ||
|
|
41230c05b1 | ||
|
|
2dbb13d8dd | ||
|
|
8d6c7d6753 | ||
|
|
8525b9e9cb | ||
|
|
c8c05306a3 | ||
|
|
0f06e44b90 | ||
|
|
cb3d4ac722 | ||
|
|
e00449c410 | ||
|
|
3ee89a16ef | ||
|
|
4f50b2c698 | ||
|
|
428b3a8cc0 | ||
|
|
d8b3132a3c | ||
|
|
c2ca8b3a2d | ||
|
|
a4c19457ce | ||
|
|
22dda9f398 | ||
|
|
d3e62c62f2 | ||
|
|
cee58b354d | ||
|
|
92f93e9e4f | ||
|
|
d79b6e8574 | ||
|
|
1b0ab1c05f | ||
|
|
391a02fe45 | ||
|
|
2ec6d189ff | ||
|
|
903668aecf | ||
|
|
47dc7e3db8 | ||
|
|
23d521935f | ||
|
|
6b7f794494 | ||
|
|
573fb445c4 | ||
|
|
90ad9c567b | ||
|
|
b1db052bea | ||
|
|
c182916554 | ||
|
|
068529929b | ||
|
|
b3d3e5dd06 | ||
|
|
85c672a0f6 | ||
|
|
ab94af68c1 | ||
|
|
682462fb20 | ||
|
|
75eef8a2c9 | ||
|
|
0cb791ad5b | ||
|
|
c6bd3da1c3 | ||
|
|
5280286415 | ||
|
|
08f26eb097 | ||
|
|
d36941b81d | ||
|
|
3ea96c2587 | ||
|
|
51b9854a19 | ||
|
|
72b2da20e8 | ||
|
|
7f2d8742c2 | ||
|
|
3a94c52426 | ||
|
|
9af520fa54 | ||
|
|
c1a5bf944a | ||
|
|
d7113372cb | ||
|
|
46cacfc60e | ||
|
|
d3aae85014 | ||
|
|
2ba45d0acb | ||
|
|
cf8f2ac56c | ||
|
|
2ed50d2579 | ||
|
|
6d09d29093 | ||
|
|
bd63d28b0f | ||
|
|
1a55b37046 | ||
|
|
63a0f7a637 | ||
|
|
49b908e3c6 | ||
|
|
6609a749a3 | ||
|
|
4224900f47 | ||
|
|
71d5f120a9 | ||
|
|
5684c72e35 | ||
|
|
53356fe61a | ||
|
|
898044933a | ||
|
|
f4dd0f27ed | ||
|
|
e3af337a78 | ||
|
|
ebc335319e | ||
|
|
7c7d0f596a | ||
|
|
561012c3ba | ||
|
|
7a37476b9a | ||
|
|
65564b415d | ||
|
|
25d428fde0 | ||
|
|
f7675bb48a | ||
|
|
10d09eaed3 | ||
|
|
4d148ff078 | ||
|
|
b10d4e9412 | ||
|
|
166c0c2311 | ||
|
|
d5cd51644e | ||
|
|
903648f1fe | ||
|
|
3cc0c5a60a | ||
|
|
97627559a6 | ||
|
|
e497b8f534 | ||
|
|
12cd9e5c88 | ||
|
|
cec672a71d | ||
|
|
cccf8a9870 | ||
|
|
a0f3010159 | ||
|
|
4e5509e206 | ||
|
|
c855eb38d8 | ||
|
|
a59eec01e1 | ||
|
|
6e880ef686 | ||
|
|
8980d92efa | ||
|
|
43561dc389 | ||
|
|
b00bf17153 | ||
|
|
b229f267e4 | ||
|
|
6b82089d6c | ||
|
|
550e8fff6b | ||
|
|
633277ddd0 | ||
|
|
5d5200d20b | ||
|
|
31a7e5628c | ||
|
|
481e970424 | ||
|
|
ec302bc4fc | ||
|
|
47af95469a | ||
|
|
4ac25e09ce | ||
|
|
4493ece2f2 | ||
|
|
26dea23b5d | ||
|
|
1cea12bf57 | ||
|
|
05dd4bbb51 | ||
|
|
09da302b8d | ||
|
|
95286408ed | ||
|
|
26543a3636 | ||
|
|
7bf5da8de4 | ||
|
|
e7149effa7 | ||
|
|
808a54e217 | ||
|
|
bb2251a7b2 | ||
|
|
2f525187a1 | ||
|
|
13ea2ceaa6 | ||
|
|
5c15b306d6 | ||
|
|
b7ced5763b | ||
|
|
f74225721d | ||
|
|
f0bdb61fd8 | ||
|
|
9a6ab81739 | ||
|
|
c71469c715 | ||
|
|
e6d64f72ec | ||
|
|
fc9edda0ef | ||
|
|
084bad5aaa | ||
|
|
98227a886b | ||
|
|
3a1abbed4c | ||
|
|
45a012eb71 | ||
|
|
980058ea4c | ||
|
|
8e59430f93 | ||
|
|
4f91a12f73 | ||
|
|
4b8f3ec5b5 | ||
|
|
bba8d9cd30 | ||
|
|
46d876d607 | ||
|
|
205eb10f43 | ||
|
|
01e01f480e | ||
|
|
1c031466fc | ||
|
|
ff96d914f4 | ||
|
|
278498da48 | ||
|
|
b030f044f4 | ||
|
|
1d86fc07b1 | ||
|
|
5d56d09b8d | ||
|
|
386199e422 | ||
|
|
851ee94c5c | ||
|
|
9526e3f14b | ||
|
|
d86eb46f15 | ||
|
|
2992cbd261 | ||
|
|
914e330ef2 | ||
|
|
f320eb45d8 | ||
|
|
60f335cf02 | ||
|
|
1b395e664f | ||
|
|
8040e7d168 | ||
|
|
9d5d7edf9a | ||
|
|
136163ba4f | ||
|
|
23c9b86f64 | ||
|
|
afb2a4abbf | ||
|
|
c4f69b1eb7 | ||
|
|
d6e7ae3769 | ||
|
|
0ea75894c1 | ||
|
|
0278e78989 | ||
|
|
3b977c8747 | ||
|
|
789db436bb | ||
|
|
2be5ffe4e9 | ||
|
|
369348ebaf | ||
|
|
dad077adf3 | ||
|
|
3b2a3c1277 | ||
|
|
e5674b146d | ||
|
|
ebd3e65f46 | ||
|
|
2d946d0d95 | ||
|
|
cb0c145e3d | ||
|
|
de604a79ab | ||
|
|
172f75e5c0 | ||
|
|
df62b6d78f | ||
|
|
2d274f1369 | ||
|
|
e47b7526bc | ||
|
|
310bf3328e | ||
|
|
4467f811e0 | ||
|
|
637ff87e3f | ||
|
|
c9c50f286c | ||
|
|
59d6ad6b05 | ||
|
|
950f6bb752 | ||
|
|
9c37356267 | ||
|
|
835acec8f3 | ||
|
|
a6d64696e3 | ||
|
|
f4d93587a3 | ||
|
|
d0c40e3295 | ||
|
|
a92943d66c | ||
|
|
3f34f5072f | ||
|
|
bf35c1faf5 | ||
|
|
108643473d | ||
|
|
e8a2a39d72 | ||
|
|
e0cfa01e99 | ||
|
|
d645478f89 | ||
|
|
a0ab7ab6fc | ||
|
|
7090de541a | ||
|
|
5cb7d29c17 | ||
|
|
2f64329c98 | ||
|
|
732fe2e996 | ||
|
|
d02dbcfedd | ||
|
|
a97557f2e4 | ||
|
|
b004202cbf | ||
|
|
2e0f921ded | ||
|
|
b7a17442d9 | ||
|
|
699a21fa87 | ||
|
|
4c95d1af4e | ||
|
|
013117318c | ||
|
|
e93244e0cb | ||
|
|
71030e4d81 | ||
|
|
7eb41e7057 | ||
|
|
ec53a400a7 | ||
|
|
bb0840956f | ||
|
|
dd01ae8ebc | ||
|
|
1105d1019d | ||
|
|
d918c1791a | ||
|
|
b1773cc73b | ||
|
|
83a03b6679 | ||
|
|
f3b3fc3935 | ||
|
|
fff9a4f0c5 | ||
|
|
1f6b90a4f9 | ||
|
|
bc5349061f | ||
|
|
70e3ddb224 | ||
|
|
5e20a7ef5e | ||
|
|
0fd00ca82f | ||
|
|
1fafdb2843 | ||
|
|
c142ee19ba | ||
|
|
880391d0c5 | ||
|
|
9dbad614a5 | ||
|
|
0c6bb6660a | ||
|
|
a4bb8f130b | ||
|
|
dce610747b | ||
|
|
84e6c2a185 | ||
|
|
446e44cb09 | ||
|
|
eb58b8c0b5 | ||
|
|
51964eee20 | ||
|
|
8bda4553ed | ||
|
|
b8951b9934 | ||
|
|
0b7edbad28 | ||
|
|
baf065b789 | ||
|
|
609dde0988 | ||
|
|
41b5387203 | ||
|
|
2311936580 | ||
|
|
ed4558fadd | ||
|
|
b1d56207e3 | ||
|
|
0d5a8c6aaa | ||
|
|
9de9a79925 | ||
|
|
ed0a624b12 | ||
|
|
8627d638e1 | ||
|
|
3990254a7c | ||
|
|
51290457dd | ||
|
|
2c2ab2a7b9 | ||
|
|
a7f21e6cea | ||
|
|
309dbacb67 | ||
|
|
110dda6e48 | ||
|
|
58457ef16c | ||
|
|
55e7c16dea | ||
|
|
51bc64559b | ||
|
|
4c6d46137c | ||
|
|
debbd9f15b | ||
|
|
712910dec0 | ||
|
|
8999235373 | ||
|
|
8c2fe0a9ae | ||
|
|
9651299e79 | ||
|
|
fdb7f972a6 | ||
|
|
12e82baeb3 | ||
|
|
a41ee25518 | ||
|
|
cd20966fc8 | ||
|
|
d3e0d03301 | ||
|
|
2cb6416572 | ||
|
|
3fd40c03bf | ||
|
|
e5b236898f | ||
|
|
67cfff2520 | ||
|
|
68467da7ac | ||
|
|
6b0a62d6ff | ||
|
|
5ff4ee96e4 | ||
|
|
e1603c0f44 | ||
|
|
5ceb73c1cf | ||
|
|
5f631b3499 | ||
|
|
076fddd9d9 | ||
|
|
bcfa6d7e0e | ||
|
|
2c37fb1f5e | ||
|
|
e0fdd8d39e | ||
|
|
cb48ae6989 | ||
|
|
cde2d7c18c | ||
|
|
28b2a34191 | ||
|
|
07a2dc5aa9 | ||
|
|
bfbbd858fb | ||
|
|
564a4758de | ||
|
|
f1b9b8cb73 | ||
|
|
5bb084c32b | ||
|
|
97beb90b8f | ||
|
|
8eca1a0459 | ||
|
|
e7e7a284f5 | ||
|
|
baf7013941 | ||
|
|
7bf6bac63f | ||
|
|
74a09844c2 | ||
|
|
65e071e470 | ||
|
|
e005044f64 | ||
|
|
d788531ae5 | ||
|
|
5ed63521b1 | ||
|
|
3b492142db | ||
|
|
6b99e07043 | ||
|
|
85d64602ff | ||
|
|
c2852bdefe | ||
|
|
e5ffeff36e | ||
|
|
bece92abb2 | ||
|
|
79b51595a5 | ||
|
|
d89fb0e7c4 | ||
|
|
ca83be1db4 | ||
|
|
64c515bac4 | ||
|
|
ff6d79b2cc | ||
|
|
96018412c0 | ||
|
|
35b8c4cb05 | ||
|
|
063e1a5d33 | ||
|
|
f54cd38f2e | ||
|
|
04a5cbab4f | ||
|
|
823f6b1047 | ||
|
|
2db0d1f518 | ||
|
|
cd9ca691ca | ||
|
|
ec254f817d | ||
|
|
84251b02bd | ||
|
|
f0e889b552 | ||
|
|
b490c774bf | ||
|
|
9f66968d1b | ||
|
|
12da79730f | ||
|
|
982e35db45 | ||
|
|
941b5f83f3 | ||
|
|
3fc8aa7071 | ||
|
|
8c76e82e2f | ||
|
|
5ef559f6d8 | ||
|
|
0421d463f8 | ||
|
|
bb3e7fad66 | ||
|
|
d7c2eba4fd | ||
|
|
e31ba43b5a | ||
|
|
5d428d471c | ||
|
|
a934e13309 | ||
|
|
d631da7d11 | ||
|
|
08239ead20 | ||
|
|
7c0e80a415 | ||
|
|
0ff69ec3df | ||
|
|
cad21249e0 | ||
|
|
acfe7ab16d | ||
|
|
652923d056 | ||
|
|
4d18f3e9b7 | ||
|
|
df06a0effe | ||
|
|
e13ffc7507 | ||
|
|
12ec690044 | ||
|
|
7f4139c427 | ||
|
|
74cd84399f | ||
|
|
f762ea6412 | ||
|
|
46e26d9682 | ||
|
|
057e57e0b6 | ||
|
|
7f6b9fb31a | ||
|
|
a034909ae9 | ||
|
|
f785e4b045 | ||
|
|
8870632918 | ||
|
|
3ff13783fa | ||
|
|
54c7109cee | ||
|
|
fe98aab910 | ||
|
|
260be59c9e | ||
|
|
2688805872 | ||
|
|
ed84fd73a3 | ||
|
|
255790b664 | ||
|
|
491c0457a6 | ||
|
|
764990bb59 | ||
|
|
ac72ba5af8 | ||
|
|
846d9ed391 | ||
|
|
21381ff990 | ||
|
|
f43d7cc2d4 | ||
|
|
193d40bae4 | ||
|
|
6d8cbd2c4b | ||
|
|
14c24e1fab | ||
|
|
d0a2315098 | ||
|
|
3d510bcaba | ||
|
|
f75b588b0f | ||
|
|
399f039b9e | ||
|
|
e290e9193d | ||
|
|
646eba5a92 | ||
|
|
096f992cc0 | ||
|
|
f538e04fd2 | ||
|
|
f72e127f5f | ||
|
|
7e7429cadd | ||
|
|
4d36f0d356 | ||
|
|
7867b09a0e | ||
|
|
eb4e365820 | ||
|
|
f57ca1abba | ||
|
|
e8bc606c20 | ||
|
|
9f9191819d | ||
|
|
17cdbc305c | ||
|
|
a0faec186d | ||
|
|
6b4b5ec2a1 | ||
|
|
4a931c3bef | ||
|
|
0e20be17cc | ||
|
|
36cbcb12b2 | ||
|
|
e54e12876b | ||
|
|
d198bef37b | ||
|
|
cfcce71392 | ||
|
|
571eafd149 | ||
|
|
3f598a0f9c | ||
|
|
c0482ff2ea | ||
|
|
3952761812 | ||
|
|
f8ac94353a | ||
|
|
d0d1c5bb37 | ||
|
|
24aa0f7fe6 | ||
|
|
60e087b8e7 | ||
|
|
9ddd8417c8 | ||
|
|
363e7294b6 | ||
|
|
b0aa447d5f | ||
|
|
a96672c0fc | ||
|
|
bf5d3437f0 | ||
|
|
689805ecbb | ||
|
|
a4564b8939 | ||
|
|
ff9701685f | ||
|
|
528edf7e82 | ||
|
|
00397a33f0 | ||
|
|
276b7a03f1 | ||
|
|
6d0286efbd | ||
|
|
920e89a506 | ||
|
|
8f1aa8c2c3 | ||
|
|
376ad6d61d | ||
|
|
90874b434e | ||
|
|
bcf8ff3d0a | ||
|
|
c8227c95dd | ||
|
|
b8cd37aef7 | ||
|
|
f853632260 | ||
|
|
e9c73bd9a6 | ||
|
|
ef27a660a7 | ||
|
|
d4a1f2ef85 | ||
|
|
60faeffde0 | ||
|
|
481f31fe8f | ||
|
|
8a989b65ee | ||
|
|
826b2245ec | ||
|
|
61c6dc5a70 | ||
|
|
bfc46120bb | ||
|
|
b63387ca4f | ||
|
|
4e2f2e0458 | ||
|
|
72a6e71e72 | ||
|
|
7748ac207c | ||
|
|
f852209040 | ||
|
|
32c62a7fe1 | ||
|
|
51d6b467d6 | ||
|
|
638b65c828 | ||
|
|
4e7a8a6478 | ||
|
|
17153b4aae | ||
|
|
ee95aa401d | ||
|
|
ff81118ffc | ||
|
|
fdac368153 | ||
|
|
7f3bf75788 | ||
|
|
506b524db0 | ||
|
|
21b8ae9e52 | ||
|
|
14c67fde7f | ||
|
|
7ca666a0e9 | ||
|
|
c26c9483ec | ||
|
|
a01e6652df | ||
|
|
57c00e7e26 | ||
|
|
a67896ab2b | ||
|
|
142503d3b5 | ||
|
|
fe9022afe0 | ||
|
|
64d3408188 | ||
|
|
ffd9b1bede | ||
|
|
daf52cb32e | ||
|
|
92d572285e | ||
|
|
59302e816c | ||
|
|
7325147d83 | ||
|
|
d6592b6b0a | ||
|
|
3460214467 | ||
|
|
38b486eb6b | ||
|
|
a2e1d622e1 | ||
|
|
c6139b7285 | ||
|
|
dbe0705880 | ||
|
|
4b471a6e01 | ||
|
|
a87192f8d0 | ||
|
|
f425d8dc8b | ||
|
|
9e25601a56 | ||
|
|
fca5af7ac3 | ||
|
|
1af0ede1a6 | ||
|
|
e7733abc40 | ||
|
|
4171c93bff | ||
|
|
dd2c9c911b | ||
|
|
de052537ec | ||
|
|
68bc6b37ae | ||
|
|
548d1bae9e | ||
|
|
c89e557158 | ||
|
|
62dda5fdbf | ||
|
|
22f24bd48f | ||
|
|
eeb0c65b6e | ||
|
|
b23fcf238b | ||
|
|
79698981ad | ||
|
|
ab4e3e8c75 | ||
|
|
4bee4429aa | ||
|
|
269ee7e672 | ||
|
|
8d6b70c22c | ||
|
|
e786059506 | ||
|
|
d48d4385d9 | ||
|
|
1521be8acb | ||
|
|
76c97bbfad | ||
|
|
1b931dd410 | ||
|
|
77baa1c930 | ||
|
|
d41b7770c4 | ||
|
|
4f145a4f4f | ||
|
|
fc7dc3cef7 | ||
|
|
0dbfd721b3 | ||
|
|
243505b7cb | ||
|
|
04af898fe5 | ||
|
|
9e1c5747f6 | ||
|
|
ab49806a5f | ||
|
|
e24934d5ea | ||
|
|
8ab162ffb1 | ||
|
|
614e5bc44f | ||
|
|
c1137ee3fa | ||
|
|
6cfe0ea77c | ||
|
|
d89b7f93b2 | ||
|
|
a6b114e423 | ||
|
|
90f2ebeac1 | ||
|
|
60cca4d9d2 | ||
|
|
9b2752ff07 | ||
|
|
16c4035e1c | ||
|
|
b5eba22aaf | ||
|
|
98b572d17a | ||
|
|
76c6e01534 | ||
|
|
15b1281075 | ||
|
|
e4ef930b47 | ||
|
|
19e86a2b19 | ||
|
|
46b62b4a63 | ||
|
|
7874d179da | ||
|
|
341a4d50ea | ||
|
|
b8328a9fdf | ||
|
|
5b8411fe77 | ||
|
|
682d8f23e9 | ||
|
|
34a9224334 | ||
|
|
88ee7cbfa8 | ||
|
|
70e472e9e2 | ||
|
|
e9adb44c4a | ||
|
|
81f8cae52a | ||
|
|
36e67108fb | ||
|
|
f0bad7b091 | ||
|
|
354c50039b | ||
|
|
b9c69e24a9 | ||
|
|
6319262b9c | ||
|
|
78e02bf3dd | ||
|
|
3492ba5fd6 | ||
|
|
f9ed6cbbfe | ||
|
|
98a573033d | ||
|
|
066089873b | ||
|
|
8032ff6e19 | ||
|
|
99d5dba6ae | ||
|
|
0b0455975b | ||
|
|
4b34894b59 | ||
|
|
311ee2db62 | ||
|
|
dfafcb0513 | ||
|
|
28520af599 | ||
|
|
207795abfd | ||
|
|
495ad41741 | ||
|
|
d591529e7a | ||
|
|
3a5dace583 | ||
|
|
e2952586d1 | ||
|
|
16f25c2e06 | ||
|
|
8fea733a1f | ||
|
|
bbb09f7557 | ||
|
|
1fc1acd3d0 | ||
|
|
0923985516 | ||
|
|
2b1d1bc8cb | ||
|
|
38e3cc2087 | ||
|
|
be3acb902b | ||
|
|
617940fb8d | ||
|
|
a96ae6e987 | ||
|
|
a65396ba56 | ||
|
|
61c4e3a5e4 | ||
|
|
df8f93e9d5 | ||
|
|
577e1bd693 | ||
|
|
1012d07e7f | ||
|
|
edec9448c4 | ||
|
|
5f456d067e | ||
|
|
19ea50843c | ||
|
|
e9db190baa | ||
|
|
fd5d9a0710 | ||
|
|
1f673be3c8 | ||
|
|
a82582e859 | ||
|
|
40ecfbcdfa | ||
|
|
1e54379141 | ||
|
|
291012d2a9 | ||
|
|
5296f4aebd | ||
|
|
c86de916cb | ||
|
|
c014fc20a1 | ||
|
|
39f089f374 | ||
|
|
1fe7898add | ||
|
|
3b2ec53100 | ||
|
|
3a8f12dff3 | ||
|
|
02d1eeb400 | ||
|
|
261f1b72d4 | ||
|
|
15f7ba4d99 | ||
|
|
ea49348db2 | ||
|
|
af6208be29 | ||
|
|
5f81200067 | ||
|
|
3901c2d63a | ||
|
|
b1ad6014f0 | ||
|
|
572611f1ca | ||
|
|
6d4b1b69e5 | ||
|
|
dcb6bae868 | ||
|
|
69208d0fca | ||
|
|
60c8edd39c | ||
|
|
d2e2c289a6 | ||
|
|
562bf11946 | ||
|
|
3d80838754 | ||
|
|
85f25574fb | ||
|
|
2986e9ff37 | ||
|
|
9b87456d3e | ||
|
|
8a64df5763 | ||
|
|
376547044c | ||
|
|
2b22eaa7e6 | ||
|
|
da4c95531e | ||
|
|
707aafa1e6 | ||
|
|
e5169eee71 | ||
|
|
665b98bd28 | ||
|
|
0817fb3d18 | ||
|
|
29e9546b7d | ||
|
|
2653a9bed3 | ||
|
|
72a44078ce | ||
|
|
501954c6f6 | ||
|
|
fa7859ad13 | ||
|
|
600776012d | ||
|
|
37044dd387 | ||
|
|
a11d955dd8 | ||
|
|
c0daf56963 | ||
|
|
bbdf586f18 | ||
|
|
4a93cb2007 | ||
|
|
203bea3fe6 | ||
|
|
641662d77c | ||
|
|
2ad394148a | ||
|
|
bbd1e6a6a5 | ||
|
|
bef72a19d0 | ||
|
|
3efa83a646 | ||
|
|
1d2150cb45 | ||
|
|
56236f7372 | ||
|
|
246863279a | ||
|
|
a986b71947 | ||
|
|
3eba8da4e9 | ||
|
|
94261da70a | ||
|
|
5dcdee5faa | ||
|
|
8386c06e07 | ||
|
|
85d11eac30 | ||
|
|
755cc94489 | ||
|
|
ef2ddf6912 | ||
|
|
05c1f9c9aa | ||
|
|
f97e557194 | ||
|
|
0029598822 | ||
|
|
e23cd0e7e7 | ||
|
|
4c9ae245a4 | ||
|
|
4380b73ca6 | ||
|
|
fa2a748631 | ||
|
|
bdc866d6d5 | ||
|
|
0c2fbd178d | ||
|
|
85814137ea | ||
|
|
34792a3493 | ||
|
|
148e15bca0 | ||
|
|
a3806194ee | ||
|
|
c4c8778017 | ||
|
|
ecd117d80d | ||
|
|
554bbb5fd0 | ||
|
|
6e0971fc61 | ||
|
|
d5cdfbb7ba | ||
|
|
063986a4b3 | ||
|
|
fdb859276b | ||
|
|
9a14c28056 | ||
|
|
210833006f | ||
|
|
4ca5af4ac9 | ||
|
|
decd374c15 | ||
|
|
1216c3ef6d | ||
|
|
0f72a07b9e | ||
|
|
c4fafaebec | ||
|
|
c0160095fa | ||
|
|
f559e931cf | ||
|
|
f92a507a9b | ||
|
|
be7e074856 | ||
|
|
3e1f56d57f | ||
|
|
aae2e6fd7d | ||
|
|
91baea201a | ||
|
|
cf58c09d6e | ||
|
|
53dbd69751 | ||
|
|
3d950b2324 | ||
|
|
96395f7d39 | ||
|
|
e4eb5a9bb9 | ||
|
|
27c45b1b7a | ||
|
|
278dc75285 | ||
|
|
9c6c10da22 | ||
|
|
1d6f547e7f | ||
|
|
ee7051891b | ||
|
|
22b789cca6 | ||
|
|
40a6c978ce | ||
|
|
688629d108 | ||
|
|
65e8b28d02 | ||
|
|
1561ed8022 | ||
|
|
1630affbdd | ||
|
|
d88e37a2f1 | ||
|
|
fa00cdba20 | ||
|
|
6c97a7514c | ||
|
|
83057301c2 | ||
|
|
6e6fbc5ad3 | ||
|
|
d567b0ca25 | ||
|
|
3667690027 | ||
|
|
2936b1940a | ||
|
|
07700d77bd | ||
|
|
776568a429 | ||
|
|
8f39fb2adf | ||
|
|
91ee8c8ee6 | ||
|
|
a4e810795c | ||
|
|
0418e49757 | ||
|
|
0096b9e6f0 | ||
|
|
47e1f0f2b1 | ||
|
|
f2a64aa8e7 | ||
|
|
c25e3ab3f9 | ||
|
|
b6d01ce448 | ||
|
|
090919490a | ||
|
|
2ba1f3547c | ||
|
|
556fa9a499 | ||
|
|
ec3ab80da8 | ||
|
|
41e32ea949 | ||
|
|
42c3072ff9 | ||
|
|
0b0ac03bed | ||
|
|
ef8427cc23 | ||
|
|
c73daa6a1c | ||
|
|
6b6233944b | ||
|
|
a6245185b9 | ||
|
|
bfd283e2a6 | ||
|
|
54675938ce | ||
|
|
758a6c76ae | ||
|
|
05d71ebb67 | ||
|
|
19406af87f | ||
|
|
fa328c1590 | ||
|
|
c4e04a6d09 | ||
|
|
b1579dd8d9 | ||
|
|
6ca24c412d | ||
|
|
fc4a5ad691 | ||
|
|
4b183f84b2 | ||
|
|
bf01a2d6e5 | ||
|
|
4c38228359 | ||
|
|
ef9501a40d | ||
|
|
195c9f6ab6 | ||
|
|
cc0b7c42d1 | ||
|
|
4ec9fe5a57 | ||
|
|
643b3a73a4 | ||
|
|
dcd5dd6492 | ||
|
|
39db52b4f4 | ||
|
|
3955009b08 | ||
|
|
f1dc0b6d8e | ||
|
|
a30e53d911 | ||
|
|
568c55aca2 | ||
|
|
62af393cd8 | ||
|
|
7ed61ca766 | ||
|
|
f9580c245d | ||
|
|
88b28b6458 | ||
|
|
7c63889b26 | ||
|
|
55de2803a4 | ||
|
|
4de34a53e7 | ||
|
|
0e22651c48 | ||
|
|
fa6ce5bc68 | ||
|
|
db7431f3fa | ||
|
|
7747e3a6b4 | ||
|
|
0d2d8f4d41 | ||
|
|
f4f339c4d5 | ||
|
|
48fddcb7bd | ||
|
|
0a6f6cb281 | ||
|
|
eb51b0c383 | ||
|
|
5f1fcf51a6 | ||
|
|
569014c5d2 | ||
|
|
1d6ebacfaa | ||
|
|
80f494b961 | ||
|
|
f4d1732137 | ||
|
|
2fc3a6fc1a | ||
|
|
dc8f8cd401 | ||
|
|
88c331ea99 | ||
|
|
9d16264ba1 | ||
|
|
d809cc6a31 | ||
|
|
5c0cca9783 | ||
|
|
a0e7fe19af | ||
|
|
960ff23843 | ||
|
|
0996e13352 | ||
|
|
81972149fc | ||
|
|
48af253a06 | ||
|
|
1e45692f0b | ||
|
|
096a420e7b | ||
|
|
ecb3301b19 | ||
|
|
ad397671a7 | ||
|
|
8b5db9fdaf | ||
|
|
4137273002 | ||
|
|
f6db9ce04d | ||
|
|
106c912eb5 | ||
|
|
3fe8806018 | ||
|
|
f3742a101c | ||
|
|
b09a22360c | ||
|
|
f01afe72c6 | ||
|
|
a2fd581dad | ||
|
|
2169a25b0a | ||
|
|
fdd4915718 | ||
|
|
9e9fa1f7df | ||
|
|
5e8ab7b287 | ||
|
|
0e47f4efb8 | ||
|
|
080b3ea184 | ||
|
|
13d44720e0 | ||
|
|
57f5d04126 | ||
|
|
463d68163e | ||
|
|
7ad4becedb | ||
|
|
7fa6247770 | ||
|
|
17c827adfb | ||
|
|
a30a53f12a | ||
|
|
7e83f4a531 | ||
|
|
3c3e6978b8 | ||
|
|
19f53d96a2 | ||
|
|
98618c052b | ||
|
|
69e5e97bdf | ||
|
|
99850df96e | ||
|
|
dd658a05b4 | ||
|
|
3ce38ffe91 | ||
|
|
89b04d255e | ||
|
|
410e94aa89 | ||
|
|
7c8d831497 | ||
|
|
c84d02830c | ||
|
|
b3e8d6e9ca | ||
|
|
cf97f39cac | ||
|
|
96fd6f8617 | ||
|
|
cde4ecd08b | ||
|
|
a05ebd4bbc | ||
|
|
9e749ee63a | ||
|
|
e785bff78d | ||
|
|
3aedbe6989 | ||
|
|
b6a45645d8 | ||
|
|
3d3c848ba7 | ||
|
|
c98dc7ef34 | ||
|
|
586f54a0f7 | ||
|
|
75f3a79aa6 | ||
|
|
27c3c1f684 | ||
|
|
5ee803682f | ||
|
|
e52daa8602 | ||
|
|
65cddce865 | ||
|
|
973ae36fe5 | ||
|
|
7b1819e988 | ||
|
|
538f0c534f | ||
|
|
921e470b05 | ||
|
|
ea4e5ab9ef | ||
|
|
96d0de4e7c | ||
|
|
04bd684258 | ||
|
|
58852ec9bb | ||
|
|
e4fcce118c | ||
|
|
ef149605cd | ||
|
|
c240449b10 | ||
|
|
8d63faa74d | ||
|
|
226f2d52ff | ||
|
|
1165f8dfe9 | ||
|
|
4e34611d1d | ||
|
|
0df043aff1 | ||
|
|
9573b53390 | ||
|
|
ca0edad8c2 | ||
|
|
f47b07e35a | ||
|
|
45db2122c9 | ||
|
|
d33624c623 | ||
|
|
abb1b28e96 | ||
|
|
a19da4bf22 | ||
|
|
347cb15722 | ||
|
|
20f3b8d404 | ||
|
|
31a7f2b4d9 | ||
|
|
e5a6517897 | ||
|
|
80f3f99845 | ||
|
|
4322d0c3fe | ||
|
|
764f1d846e | ||
|
|
1d0be580c5 | ||
|
|
44f2986665 | ||
|
|
9d6490e38a | ||
|
|
7aa914fde7 | ||
|
|
0930cd29fb | ||
|
|
695749f155 | ||
|
|
3ca8623b29 | ||
|
|
c6309d963d | ||
|
|
305aee2c33 | ||
|
|
cbcdfa572a | ||
|
|
2512365012 | ||
|
|
9988bae6f4 | ||
|
|
18f2b9c63e | ||
|
|
b5cc71720c | ||
|
|
6eed40f80c | ||
|
|
e93d90bc45 | ||
|
|
d057d2a202 | ||
|
|
cb67ace703 | ||
|
|
759724facb | ||
|
|
3033491f3d | ||
|
|
751ff8f72c | ||
|
|
d6d76a53b9 | ||
|
|
3224eefdf1 | ||
|
|
776ae626a6 | ||
|
|
8ad44acc5d | ||
|
|
ecbbf1e3bb | ||
|
|
2d31377ba8 | ||
|
|
e55692d74f | ||
|
|
6164e33b07 | ||
|
|
4850cc0f97 | ||
|
|
5674c46f38 | ||
|
|
a33280b08e | ||
|
|
48799b73d5 | ||
|
|
7c028596fb | ||
|
|
d93200d2eb | ||
|
|
aafee65238 | ||
|
|
f5a7504c38 | ||
|
|
ef4d24600e | ||
|
|
28ec64e200 | ||
|
|
1fcded67ef | ||
|
|
3be60539ce | ||
|
|
779c0a01d3 | ||
|
|
e1a5b80ae1 | ||
|
|
021102c62d | ||
|
|
de1e66f7a9 | ||
|
|
13793885f3 | ||
|
|
cdeef9dc95 | ||
|
|
55400e9b42 | ||
|
|
110bc5abbe | ||
|
|
21ffbc0cca | ||
|
|
559c6df0c3 | ||
|
|
b7b0348c3c | ||
|
|
779b8b32cf | ||
|
|
a73555f672 | ||
|
|
03d0e0d799 | ||
|
|
64597e47c6 | ||
|
|
6713c6ebed | ||
|
|
051342cc8b | ||
|
|
94cf920751 | ||
|
|
dcac9de58b | ||
|
|
23ce202d38 | ||
|
|
362dd7241a | ||
|
|
94907678eb | ||
|
|
9cb94e00b0 | ||
|
|
3b4e55d0e5 | ||
|
|
8779151fef | ||
|
|
923c19356b | ||
|
|
3d95f3c7b1 | ||
|
|
6f6bd95a84 | ||
|
|
aa537310ad | ||
|
|
39ebd6e8d1 | ||
|
|
faf8c83f54 | ||
|
|
e8babede53 | ||
|
|
36af159991 | ||
|
|
7150d6ef59 | ||
|
|
2a500baaca | ||
|
|
cb85b3e8dd | ||
|
|
ea9d5e3a5e | ||
|
|
d96409ff37 | ||
|
|
95e11234a7 | ||
|
|
97329367e4 | ||
|
|
4217369709 | ||
|
|
09832d09fb | ||
|
|
168395af74 | ||
|
|
60b182b821 | ||
|
|
587a56026e | ||
|
|
3e8e6d35d6 | ||
|
|
9a7a8efb39 | ||
|
|
4db4d5e8bc | ||
|
|
d046594591 | ||
|
|
417d1b7de7 | ||
|
|
a88e6f4e1f | ||
|
|
96723c6f70 | ||
|
|
5062374c72 | ||
|
|
76bb0031cb | ||
|
|
8ba17dd985 | ||
|
|
4437cd1eac | ||
|
|
3cfed7ba01 | ||
|
|
e9a264217a | ||
|
|
15ffffa835 | ||
|
|
79ce997156 | ||
|
|
15838c2850 | ||
|
|
0545c42db9 | ||
|
|
f3001c9bba | ||
|
|
42aa83b2a5 | ||
|
|
15e8be4074 | ||
|
|
3c27300a4e | ||
|
|
65f406a39e | ||
|
|
0d06dfa948 | ||
|
|
b4be7b0c74 | ||
|
|
9ad874eef8 | ||
|
|
d52f3ba3e9 | ||
|
|
3d44faf6c3 | ||
|
|
8ad3cb14f8 | ||
|
|
0be7e96437 | ||
|
|
d1aa7dbedc | ||
|
|
eef7611cf1 | ||
|
|
758b3ad2cc | ||
|
|
b468aa8c01 | ||
|
|
31d86e6e78 | ||
|
|
1617cd7e2a | ||
|
|
ac318f2c8c | ||
|
|
42d02565af | ||
|
|
18d3eba614 | ||
|
|
3171c71639 | ||
|
|
32444f8188 | ||
|
|
73729e7a33 | ||
|
|
c6f55eeb94 | ||
|
|
5e156b9d73 | ||
|
|
004d100ed8 | ||
|
|
1f866dbad4 | ||
|
|
127e07c210 | ||
|
|
745fb4b40c | ||
|
|
a96ea2492d | ||
|
|
3b8e3c613f | ||
|
|
f7445bcc98 | ||
|
|
0fd2cfbab6 | ||
|
|
d5d643ca28 | ||
|
|
2dc9616509 | ||
|
|
739f7b47fe | ||
|
|
82df0c3aa3 | ||
|
|
3e22d7bbd5 | ||
|
|
b67894586f | ||
|
|
5e20d16ef8 | ||
|
|
83235dc484 | ||
|
|
bd0d8fd8ea | ||
|
|
ec7faddd26 | ||
|
|
6591844b3e | ||
|
|
14c5825769 | ||
|
|
dfda4f3519 | ||
|
|
7117cb8f8e | ||
|
|
00f755a822 | ||
|
|
328d5bf648 | ||
|
|
7f1c1db651 | ||
|
|
b90bd91731 | ||
|
|
5aa87c1734 | ||
|
|
1fd6d024eb | ||
|
|
c6b325e4d6 | ||
|
|
df588ca422 | ||
|
|
17a161afa2 | ||
|
|
5628d3ba91 | ||
|
|
94f82ece4e | ||
|
|
6b2ac3afcd | ||
|
|
1aaf933a1a | ||
|
|
3af86cab07 | ||
|
|
d0ed4e90b3 | ||
|
|
355aaac73a | ||
|
|
fbd973147b | ||
|
|
6d2b81c6b3 | ||
|
|
b01b4de91d | ||
|
|
36e7cc4bbd | ||
|
|
7429124cd4 | ||
|
|
e3658cbc7b | ||
|
|
3031556e73 | ||
|
|
105fadd668 | ||
|
|
a8a4e60171 | ||
|
|
bfe167fae8 | ||
|
|
7cbdd845ad | ||
|
|
de203390be | ||
|
|
55916a40ab | ||
|
|
002f2ab6e7 | ||
|
|
e61fc4e427 | ||
|
|
c198c0737a | ||
|
|
03b18dbfc4 | ||
|
|
c88f2b31ee | ||
|
|
a01e99aa63 | ||
|
|
1ea82b8b5d | ||
|
|
4b393eb22a | ||
|
|
bb6f13a725 | ||
|
|
7519d3562b | ||
|
|
0f924bd083 | ||
|
|
004d782323 | ||
|
|
1bd9d503f0 | ||
|
|
918b08e910 | ||
|
|
83cb526153 | ||
|
|
aa19d5180b | ||
|
|
d44d1537d9 | ||
|
|
1392143d14 | ||
|
|
ca03491e63 | ||
|
|
25fb69a7a5 | ||
|
|
c1717fc028 | ||
|
|
49fb0d7909 | ||
|
|
28e88c95ec | ||
|
|
4c198a7cb3 | ||
|
|
e1f8b66c05 | ||
|
|
f03f6d6a63 | ||
|
|
b06314cda3 | ||
|
|
fc6580200a | ||
|
|
ed20c14f23 | ||
|
|
cbe46dfd99 | ||
|
|
1223f74f5c | ||
|
|
8c2135f2bb | ||
|
|
d20dc01aff | ||
|
|
cd29485d6e | ||
|
|
a8430acd66 | ||
|
|
3a67e072bb | ||
|
|
535f2f23f3 | ||
|
|
a27ee73622 | ||
|
|
9b012e907a | ||
|
|
ebe9f1861e | ||
|
|
9462fd301a | ||
|
|
6992f580e8 | ||
|
|
6dd7f65322 | ||
|
|
72e6601702 | ||
|
|
cab8663713 | ||
|
|
8d9419128e | ||
|
|
e3bf70dc10 | ||
|
|
0647e0d2c2 | ||
|
|
2f43a1b5f4 | ||
|
|
831e33739e | ||
|
|
90008242eb | ||
|
|
43017cb65b | ||
|
|
2f17cbaef3 | ||
|
|
688acb1e41 | ||
|
|
7b2d7a9ec7 | ||
|
|
01e62efb72 | ||
|
|
82391b6ac1 | ||
|
|
2ad2983b25 | ||
|
|
5df0516318 | ||
|
|
56014a6bf7 | ||
|
|
dd923d55f2 | ||
|
|
3c2d30c510 | ||
|
|
a4982cd460 | ||
|
|
e6a3785b01 | ||
|
|
d09ae22147 | ||
|
|
d2e83df498 | ||
|
|
c490b06fe9 | ||
|
|
c9a97d255c | ||
|
|
f0a9f4e6a4 | ||
|
|
177ca956f1 | ||
|
|
e13febc82b | ||
|
|
04ee55f202 | ||
|
|
ee6c2393c1 | ||
|
|
52fe3d2c7d | ||
|
|
1dbc7cdc9a | ||
|
|
07f3abfda1 | ||
|
|
a2c7b17cd3 | ||
|
|
56393bd253 | ||
|
|
3d52d7a8f6 | ||
|
|
b5958359d2 | ||
|
|
e7257c1855 | ||
|
|
6329b28e4a | ||
|
|
c3743a74f6 | ||
|
|
e7d2e7ebcb | ||
|
|
71f4ff6b84 | ||
|
|
bfe00ac6f3 | ||
|
|
2b2d6742e0 | ||
|
|
aa9934a722 | ||
|
|
ec4ecb5d34 | ||
|
|
8551d175ab | ||
|
|
d0bce8bc9f | ||
|
|
12ae92ef66 | ||
|
|
c1a2dd81c7 | ||
|
|
a4d8ecf2b8 | ||
|
|
c80d18c446 | ||
|
|
2a41f1fb99 | ||
|
|
901932a8e1 | ||
|
|
e57e4dbf57 | ||
|
|
00ca7297f3 | ||
|
|
cfc2a15d41 | ||
|
|
e8f55e8b24 | ||
|
|
c09c4299ba | ||
|
|
dda12da672 | ||
|
|
96b6789855 | ||
|
|
17107a1563 | ||
|
|
c3c2f5bfb6 | ||
|
|
3953659901 | ||
|
|
c3f2469832 | ||
|
|
2e0c1daf1b | ||
|
|
93df88a5d6 | ||
|
|
3ed2cf7812 | ||
|
|
c0dfcd2adf | ||
|
|
f349784bd6 | ||
|
|
ba2c870d95 | ||
|
|
b382ea2a33 | ||
|
|
b6094d6f3b | ||
|
|
170397456c | ||
|
|
944485b9ae | ||
|
|
c8adaaaab2 | ||
|
|
d8ba2839c4 | ||
|
|
576213b048 | ||
|
|
1f97d31f2a | ||
|
|
1e6e7a698f | ||
|
|
9170bca9b3 | ||
|
|
388879da38 | ||
|
|
4476d3e971 | ||
|
|
4e4802e5c6 | ||
|
|
203a80aeaa | ||
|
|
50a50b8519 | ||
|
|
4203b4fb78 | ||
|
|
a990c0bca4 | ||
|
|
4eec21b4d1 | ||
|
|
6625eff3d8 | ||
|
|
677f13a2fe | ||
|
|
ba74747860 | ||
|
|
de3ac2c549 | ||
|
|
ccaba7d465 | ||
|
|
e553e19996 | ||
|
|
ce9ba045ff | ||
|
|
c69a11a219 | ||
|
|
4aa936ce33 | ||
|
|
f09561026a | ||
|
|
5cdef89b86 | ||
|
|
b1d5542d77 | ||
|
|
1671f16b0c | ||
|
|
5a5640155a | ||
|
|
822eb3bb86 | ||
|
|
3e55d598db | ||
|
|
def1e352d4 | ||
|
|
34b744aff6 | ||
|
|
bff8e8204d | ||
|
|
4cd3934610 | ||
|
|
33206b8847 | ||
|
|
b26fa714a8 | ||
|
|
9983976ddb | ||
|
|
d3ed02dd87 | ||
|
|
d392d90a6e | ||
|
|
c8067ba0c0 | ||
|
|
932071952d | ||
|
|
f081cfa314 | ||
|
|
861379d8e3 | ||
|
|
64b23937d3 | ||
|
|
11a4a4cffb | ||
|
|
8da54e2349 | ||
|
|
87cc90741d | ||
|
|
27da1c94f2 | ||
|
|
d2d240ecf5 | ||
|
|
540edd7b5d | ||
|
|
81c020d300 | ||
|
|
e3506ed06b | ||
|
|
387e18b528 | ||
|
|
bac58c99c4 | ||
|
|
964fcda79a | ||
|
|
b241b5769b | ||
|
|
376598a6e0 | ||
|
|
ed8e440b0d | ||
|
|
442608981d | ||
|
|
8191f2775f | ||
|
|
f142caea11 | ||
|
|
d2f381d121 | ||
|
|
90b56fb487 | ||
|
|
8533512a82 | ||
|
|
dbe4be7e7f | ||
|
|
912ab4ff00 | ||
|
|
460cfc9efd | ||
|
|
309045e0ac | ||
|
|
944e89bdc8 | ||
|
|
885eb4f15b | ||
|
|
27ecc119e0 | ||
|
|
ded406984f | ||
|
|
2a7b76249c | ||
|
|
e49d505254 | ||
|
|
79c336b6fd | ||
|
|
249c73d68c | ||
|
|
5d8c566dbc | ||
|
|
aa2348823c | ||
|
|
10a234908f | ||
|
|
6d5104f6d7 | ||
|
|
fbdc53f926 | ||
|
|
8e028f4db3 | ||
|
|
29ced2a72f | ||
|
|
77b05d6078 | ||
|
|
b351fac466 | ||
|
|
ffda27c8a7 | ||
|
|
72601103ba | ||
|
|
4736bef77b | ||
|
|
1581d23a6c | ||
|
|
15b6da2a17 | ||
|
|
f0784351c4 | ||
|
|
9df2a6fd99 | ||
|
|
8518b4f50b | ||
|
|
53b7fb2ba2 | ||
|
|
6a541125aa | ||
|
|
947e15f34f | ||
|
|
c7ce2c7053 | ||
|
|
d5a5380e6d | ||
|
|
496104005b | ||
|
|
33ab147514 | ||
|
|
c0bc8d2df2 | ||
|
|
d2a1d96f59 | ||
|
|
9d0356dd73 | ||
|
|
a46027bed7 | ||
|
|
a68e9b5014 | ||
|
|
88d4ae6790 | ||
|
|
48cca00d91 | ||
|
|
9555f70440 | ||
|
|
db9a067e64 | ||
|
|
0aa9bd9c22 | ||
|
|
aba96fbf03 | ||
|
|
2a72d90e8a | ||
|
|
479ba58042 | ||
|
|
9c0028c1d1 | ||
|
|
53d18cf95e | ||
|
|
63e437d58f | ||
|
|
ddd9fbf6ae | ||
|
|
68719ac8d4 | ||
|
|
934697b0da | ||
|
|
cbe68cbf88 | ||
|
|
9e547699c6 | ||
|
|
f9bc57bcf8 | ||
|
|
09b7202c54 | ||
|
|
8c799f978b | ||
|
|
34125a6d14 | ||
|
|
c252cbe9e0 | ||
|
|
8e6e30370d | ||
|
|
154c2d388d | ||
|
|
e8c027cbc3 | ||
|
|
e3a8e28edc | ||
|
|
1c9d0dbf48 | ||
|
|
939770929f | ||
|
|
756b4636f6 | ||
|
|
80e49531b1 | ||
|
|
b6aa9f2fd1 | ||
|
|
09a9b7d254 | ||
|
|
f804e0738f | ||
|
|
a28e57e42d | ||
|
|
7088281b52 | ||
|
|
ba183cf7a6 | ||
|
|
9df755bdb4 | ||
|
|
4eebfa237b | ||
|
|
cc99b9f949 | ||
|
|
6c47f02bdf | ||
|
|
30f36a30f2 | ||
|
|
b6dc887d52 | ||
|
|
9b192dc3c1 | ||
|
|
686a0ce199 | ||
|
|
27f88abb02 | ||
|
|
3b0cbc1e41 | ||
|
|
0d284c42bc | ||
|
|
11f054e646 | ||
|
|
6ec7eddfc9 | ||
|
|
7eefec6945 | ||
|
|
95dede9039 | ||
|
|
82898ea194 | ||
|
|
666ebb0ae1 | ||
|
|
8548771025 | ||
|
|
6adfff6995 | ||
|
|
724865a8fc | ||
|
|
eab80384ab | ||
|
|
cbf0bc9cfc | ||
|
|
474110b818 | ||
|
|
52b3a4fe17 | ||
|
|
2f7a6fa394 | ||
|
|
2a77dc5600 | ||
|
|
d84dfee044 | ||
|
|
616759ed8c | ||
|
|
637319c938 | ||
|
|
d7572399cc | ||
|
|
2678789bd8 | ||
|
|
96845f4a7e | ||
|
|
baaf27c268 | ||
|
|
3038e9e1ce | ||
|
|
a30f7dc79f | ||
|
|
2b20c8d350 | ||
|
|
3f88a49bdc | ||
|
|
bed9847b48 | ||
|
|
66bdf711f4 | ||
|
|
f3ca57e6f0 | ||
|
|
6b7673f806 | ||
|
|
312f143253 | ||
|
|
3a552e08ff | ||
|
|
1533d618e5 | ||
|
|
6394342b9c | ||
|
|
9c27f0e7c3 | ||
|
|
a0486c3cd7 | ||
|
|
4cca0c1eb7 | ||
|
|
b142a44fd0 | ||
|
|
ed4aae2d18 | ||
|
|
a75491375c | ||
|
|
d31dcbed81 | ||
|
|
25a417cdd7 | ||
|
|
df6d65e061 | ||
|
|
95f68b0625 | ||
|
|
f9f7092370 | ||
|
|
9e2ac1100c | ||
|
|
8f492adac3 | ||
|
|
0a4795f6d5 | ||
|
|
8a26931622 | ||
|
|
52db3779c7 | ||
|
|
84de1ce2f2 | ||
|
|
6443169bac | ||
|
|
08ce33eed0 | ||
|
|
1fc1a48bfe | ||
|
|
e4bcfa6a2a | ||
|
|
cf586b7273 | ||
|
|
bc657778fe | ||
|
|
ad5874b94d | ||
|
|
0e6f33103a | ||
|
|
455982da91 | ||
|
|
0c83d2a7cf | ||
|
|
dbd1e70410 | ||
|
|
c62af7dc49 | ||
|
|
946713100a | ||
|
|
a3aef0f3f5 | ||
|
|
f3506054a1 | ||
|
|
a5f1e9f817 | ||
|
|
ff03272e07 | ||
|
|
bba454207e | ||
|
|
f2898f4404 | ||
|
|
a247ee14cd | ||
|
|
42a85938e7 | ||
|
|
4d6555d58b | ||
|
|
0493ecc7a6 | ||
|
|
44219c00aa | ||
|
|
545996f52e | ||
|
|
16e7fe41dc | ||
|
|
4a4b76111f | ||
|
|
38716b518c | ||
|
|
a28bbf5d14 | ||
|
|
6afd684ae5 | ||
|
|
ab56aca3ef | ||
|
|
7e6ce4e279 | ||
|
|
67e9fba9d7 | ||
|
|
d326828fd6 | ||
|
|
82b31c12c1 | ||
|
|
bfdc8e6a62 | ||
|
|
078961648f | ||
|
|
044851f608 | ||
|
|
dc696ab112 | ||
|
|
ec4f49d860 | ||
|
|
73e3620d20 | ||
|
|
112483e824 | ||
|
|
36f13e0520 | ||
|
|
f0aafce88b | ||
|
|
e9643d189b | ||
|
|
79b2b098b1 | ||
|
|
e60f72388e | ||
|
|
26f1e8be95 | ||
|
|
697d16dd01 | ||
|
|
841b3d620f | ||
|
|
b427f44908 | ||
|
|
98de418b7a | ||
|
|
8fc4a788e1 | ||
|
|
b590d0a219 | ||
|
|
eb2a881d55 | ||
|
|
b8d6e1d2c3 | ||
|
|
72d416d5f2 | ||
|
|
98b04b99dc | ||
|
|
14e159decf | ||
|
|
8809932b49 | ||
|
|
5a9f435863 | ||
|
|
72a087384b | ||
|
|
c356969c3a | ||
|
|
9ba48d8a4e | ||
|
|
01bf1c9710 | ||
|
|
370c28f0d4 | ||
|
|
c10175030f | ||
|
|
3a8e58ada4 | ||
|
|
d915787c9c | ||
|
|
7d5e24806c | ||
|
|
ee39d62031 | ||
|
|
064f821cf0 | ||
|
|
9a3512df31 | ||
|
|
fad8a0f29c | ||
|
|
7021a4909e | ||
|
|
d4b7be4ae4 | ||
|
|
eb77d84716 | ||
|
|
5639b3ebbd | ||
|
|
d215d3ff44 | ||
|
|
a488876a6a | ||
|
|
9c0f4c737e | ||
|
|
1f56d944ae | ||
|
|
7dbd46c978 | ||
|
|
b854201bc1 | ||
|
|
0719f9861c | ||
|
|
d15f8e0dc5 | ||
|
|
86a7e500e9 | ||
|
|
d641e67876 | ||
|
|
eb72061b27 | ||
|
|
b64289bd5f | ||
|
|
b3df81e791 | ||
|
|
eae8470dce | ||
|
|
6456b5dcb1 | ||
|
|
2ebf1a2c67 | ||
|
|
640a2b8991 | ||
|
|
6b4d76fc26 | ||
|
|
49b87724eb | ||
|
|
f7f0499601 | ||
|
|
0e79aa80d9 | ||
|
|
c9b8164b0c | ||
|
|
1436dcfb30 | ||
|
|
1ccd4d56fa | ||
|
|
a4f0176089 | ||
|
|
4a76399583 | ||
|
|
5e2f0428c7 | ||
|
|
8d4d69e218 | ||
|
|
14f8ee1e40 | ||
|
|
0615d655af | ||
|
|
0b92224c36 | ||
|
|
37ea3d0cee | ||
|
|
ef464d9785 | ||
|
|
e24ee95558 | ||
|
|
41d3dfc591 |
No files matched your search
+1
-1
@@ -1,6 +1,6 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: [twinaphex]
|
||||
github: [libretro]
|
||||
patreon: libretro
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
|
||||
+31
-3
@@ -1,3 +1,9 @@
|
||||
# This setting is to prevent travis to launch duplicate builds on PRs
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- /^v.*$/
|
||||
|
||||
# Use 'generic' to be able to override CC/CXX for clang
|
||||
language: generic
|
||||
|
||||
@@ -26,6 +32,8 @@ matrix:
|
||||
env: CXX_BUILD=1 CROSS_COMPILE=x86_64-w64-mingw32- CFLAGS="-D_WIN32_WINNT=0x0501"
|
||||
- compiler: gcc
|
||||
env: CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
env: CC="gcc-8 --sysroot=/" CXX="g++-8 --sysroot=/"
|
||||
- compiler: gcc
|
||||
env: C89_BUILD=1 CC=gcc-8 CXX=g++-8
|
||||
- compiler: gcc
|
||||
@@ -52,15 +60,28 @@ matrix:
|
||||
env: CXX_BUILD=1 CC=clang-6.0 CXX=clang++-6.0
|
||||
- os: osx
|
||||
env: CC=clang CXX=clang++
|
||||
- name: OSX OpenGL Make
|
||||
os: osx
|
||||
osx_image: xcode11.2
|
||||
script:
|
||||
- ./configure --enable-opengl --disable-metal
|
||||
- make
|
||||
- os: osx
|
||||
osx_image: xcode8
|
||||
script:
|
||||
- xcodebuild -target RetroArch -configuration Release -project pkg/apple/RetroArch.xcodeproj
|
||||
- os: osx
|
||||
osx_image: xcode10.1
|
||||
osx_image: xcode11.2
|
||||
script:
|
||||
- brew update-reset
|
||||
- brew install --force-bottle qt5
|
||||
- security create-keychain -p travis build.keychain
|
||||
- security default-keychain -s build.keychain
|
||||
- security unlock-keychain -p travis build.keychain
|
||||
- echo $OSX_CERT | base64 --decode > dev.p12
|
||||
- security import dev.p12 -k build.keychain -P $OSX_CERT_PASS -T /usr/bin/codesign
|
||||
- rm dev.p12
|
||||
- security set-key-partition-list -S "apple-tool:,apple:,codesign:" -s -k travis build.keychain
|
||||
- xcodebuild -target RetroArchQt -configuration Release -project pkg/apple/RetroArch_Metal.xcodeproj
|
||||
deploy:
|
||||
skip_cleanup: true
|
||||
@@ -84,9 +105,13 @@ matrix:
|
||||
- cd pkg/android/phoenix
|
||||
- ./gradlew assembleNormalRelease
|
||||
|
||||
jobs:
|
||||
allow_failure:
|
||||
- os: osx
|
||||
|
||||
before_install:
|
||||
- |
|
||||
if [ "$CC" = gcc-8 ]; then
|
||||
if [[ "$CC" =~ ^gcc-8.* ]]; then
|
||||
# Install a more recent gcc than the default
|
||||
sudo apt-get install -y g++-8
|
||||
elif [ "$CC" = clang-6.0 ]; then
|
||||
@@ -98,7 +123,7 @@ before_install:
|
||||
sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix
|
||||
fi
|
||||
|
||||
script:
|
||||
before_script:
|
||||
- |
|
||||
if [ -n "$CROSS_COMPILE" ]; then
|
||||
ARGS="$ARGS --disable-d3d8 --disable-d3d9 --disable-d3d10 --disable-d3d11 --disable-d3d12"
|
||||
@@ -131,6 +156,9 @@ script:
|
||||
if [ -n "$ENABLE_GLES3" ]; then
|
||||
ARGS="$ARGS --enable-opengles3"
|
||||
fi
|
||||
- echo "Configure arguments = $ARGS"
|
||||
|
||||
script:
|
||||
- ./configure $ARGS
|
||||
- |
|
||||
if [ -n "$C89_BUILD" ]; then
|
||||
|
||||
Vendored
+26
-1
@@ -40,6 +40,31 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
{
|
||||
"name": "PSP-GDB Debugger",
|
||||
"type": "cppdbg",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/retroarchpsp.elf",
|
||||
"stopAtEntry": false,
|
||||
"cwd": "${workspaceFolder}",
|
||||
"environment": [],
|
||||
"setupCommands": [
|
||||
{
|
||||
"text": "symbol-file ${workspaceFolder}/retroarchpsp.elf",
|
||||
"description": "read symbols for elf file",
|
||||
"ignoreFailures": true
|
||||
},
|
||||
{
|
||||
"description": "Enable all-exceptions",
|
||||
"text": "-exec \"catch throw\"",
|
||||
"ignoreFailures": true
|
||||
}
|
||||
],
|
||||
"showDisplayString": true,
|
||||
"targetArchitecture": "mips",
|
||||
"MIMode": "gdb",
|
||||
"miDebuggerPath": "/usr/local/pspdev/bin/psp-gdb",
|
||||
"miDebuggerServerAddress": "127.0.0.1:10001",
|
||||
}
|
||||
]
|
||||
}
|
||||
Vendored
+2
-2
@@ -42,7 +42,7 @@
|
||||
"core_info.h": "c",
|
||||
"thread": "c",
|
||||
"xlocale": "c",
|
||||
"menu_widgets.h": "c",
|
||||
"gfx_widgets.h": "c",
|
||||
"message_queue.h": "c",
|
||||
"task_queue.h": "c",
|
||||
"fifo_queue.h": "c",
|
||||
@@ -52,7 +52,7 @@
|
||||
"ozone_display.h": "c",
|
||||
"verbosity.h": "c",
|
||||
"retroarch.h": "c",
|
||||
"menu_animation.h": "c",
|
||||
"gfx_animation.h": "c",
|
||||
"netplay.h": "c",
|
||||
"scaler.h": "c",
|
||||
"deque": "c",
|
||||
|
||||
+291
-2
@@ -1,10 +1,298 @@
|
||||
# Future (1.7.9) [v3]
|
||||
# Future
|
||||
- AUTOCONFIG: Use correct port index in input device configured/disconnected notifications
|
||||
- CHD: Fixes a crash caused by ignoring the return value from one of the CHD library functions.
|
||||
- MENU: Prevent font-related segfaults when using extremely small scales/window sizes
|
||||
- MENU: Fix 'gfx_display_draw_texture_slice()'
|
||||
- MENU/FONT: Enable correct vertical alignment of text (+ font rendering fixes)
|
||||
- MENU/OZONE: Update timedate style options for Last Played sublabel metadata
|
||||
- MENU/OZONE: Hide 'Menu Color Theme' setting when 'Use preferred system color theme' is enabled
|
||||
- MENU/OZONE: Fix thumbnail switching via 'scan' button functionality
|
||||
- MENU/OZONE: Prevent glitches when rendering Ozone's selection cursor
|
||||
- MENU/XMB: Fix thumbnail switching via 'scan' button functionality
|
||||
- ODROID GO ADVANCE: Add DRM HW context driver
|
||||
- PSL1GHT: Initial port
|
||||
- SCANNER: Prevent redundant playlist entries when handling M3U content
|
||||
- SCANNER/ANDROID: Fix content scanner being unable to identify certain games from CHD images (raw data sector/subcode)
|
||||
|
||||
# 1.8.5
|
||||
- 3DS: Keep the bottom screen hidden on sleep/wakeup. When the 3DS wakes back up after being closed, the bottom screen needs to be reinitialized. Adding the condition here will cause the screen to be turned on or off based on the state of ctr_bottom_screen_enabled, as you'd expect
|
||||
- ANDROID/CHROMEBOOK/CRASH: Fix Chromebook crashes (on x86 x64) when touching the screen
|
||||
- BUGFIX: Prevent double input when using 'return' key (hardware) to close on-screen keyboard
|
||||
- BUGFIX: Fix mouse capture hotkey not working
|
||||
- BUGFIX: Avoid overflow when calculating multiplying performance counter
|
||||
- BUGFIX: Retroarch overlay displaying "Game remap file loaded." on the overlay instead of "Core remap file loaded." when only a core remap file is present
|
||||
- CHEEVOS/BUGFIX: Achievement triggers could cause Retroarch to Crash
|
||||
- CHEEVOS: Don't block Sameboy core because it only exposes some memory
|
||||
- CHEEVOS: Support for extended Sega CD memory
|
||||
- CHEEVOS: Show RetroAchievements Hash in content information list
|
||||
- CHEEVOS: If the core says it's exposing SYSTEM_RAM, give it the benefit of the doubt
|
||||
- CHEEVOS: RetroAchievements rich presence for RA.org website/Discord
|
||||
- CHEEVOS: Reset token when username or password changes
|
||||
- CHEEVOS: Display measured progress on locked achievements
|
||||
- CHEEVOS: Queue multiple popups
|
||||
- CHEEVOS: Add delay retries to leaderboard submits
|
||||
- CHEEVOS: Prevent buffer overflow when encountering an unknown macro
|
||||
- CORE UPDATER: Prevent hang when fetching core list if HTTP transfer fails
|
||||
- DISK CONTROL: Add disk labels to 'disk inserted' notifications
|
||||
- EMSCRIPTEN: Recreate input event listeners properly
|
||||
- FFMPEG CORE: Fix crash on seeking when using HW decoding in some cases
|
||||
- LIBRETRO: Add disk control interface API extension
|
||||
- LINUX: Avoid possible crash when running retroarch at startup
|
||||
- LINUX/GLX: Fix threaded video crashes/instability because of GLX OML sync callbacks
|
||||
- LOCALIZATION: Update French translation
|
||||
- LOCALIZATION: Update Korean translation
|
||||
- LOCALIZATION: Update Polish translation
|
||||
- LOCALIZATION: Update Spanish translation
|
||||
- LOCALIZATION: Update Portuguese Brazilian translation
|
||||
- MENU: Add Menu Scroll Acceleration option
|
||||
- MENU: Automatically select currently checked item when opening drop-down lists
|
||||
- MENU: Fix smooth (vertical) line ticker scroll speed
|
||||
- MENU: Don't flush on override/remap messages
|
||||
- MENU/DATETIME: Adds some new timedate styles that follow the DD/MM/YYYY format, found in several European countries
|
||||
- MENU/DATETIME: Modifies the existing translation files in order to accommodate the new options that are now available
|
||||
- MENU/DATETIME: Reorders the timedate view options based on a decreasing order of the quantity of information displayed, so that they are more convenient to switch around and easily categorized
|
||||
- MENU/BUGFIX: Fix bug - if you were in XMB and you would set menu driver to RGUI, you could no longer go to the left or right tab
|
||||
- MENU/MATERIALUI: Add option to remove navigation bar
|
||||
- MENU/OZONE: Add DPI-based scaling
|
||||
- MENU/OZONE: Add rudimentary pointer support
|
||||
- MENU/OZONE: Add 'Nord' and 'Gruvbox Dark' themes
|
||||
- MENU/OZONE/POINTER: Pointer can be used to switch between sidebar and entries list
|
||||
- MENU/OZONE/POINTER: Pointer can be used to select sidebar and entries list items
|
||||
- MENU/OZONE/POINTER: Both sidebar and entries list can be scrolled by dragging
|
||||
- MENU/OZONE/POINTER: Clicking/pressing the header or footer produces a 'cancel' action
|
||||
- MENU/OZONE/POINTER: Cursor focus follows mouse pointer from sidebar to entries list (and vice versa)
|
||||
- MENU/OZONE/POINTER: In entries list, item under cursor is automatically selected (with some fudging to ensure this doesn't break mouse wheel scrolling)
|
||||
- MENU/OZONE/POINTER: In sidebar, item under cursor is not automatically selected (this is too jarring)
|
||||
- MENU/RGUI: Add 'Flux' theme
|
||||
- MENU/XMB: New color themes 'Cube Purple', 'Family Red', etc
|
||||
- NETPLAY/MENU/BUGFIX: Fix Netplay Stateless Mode doesn't save. Affects other netplay settings which can be overridden by commandline option
|
||||
- ODROID GO ADVANCE: Rotation support
|
||||
- NETPLAY/ROOMS/BUGFIX: Prevent out-of-bounds array indexing when displaying/selecting netplay rooms in menus
|
||||
- SCANNER: Add 'Arcade DAT Filter' Option
|
||||
- SCANNER: Add scanning Korea and Asia PS1 discs
|
||||
- SCANNER: Add support for scanning PSP Korean
|
||||
- VIDEO: Set hardware 'Bilinear filtering' off by default
|
||||
- VIDEO/WIDGETS: Widgets are now menu-independent
|
||||
- VIDEO/WIDGETS: Allow notifications to use full screen width when not displaying menu
|
||||
- VIDEO/WIDGETS: DPI-based scaling
|
||||
- VIDEO/WIDGETS: Fix volume widget scaling
|
||||
- VIDEO/WIDGETS: Add independent widget scale override settings for fullscreen/windowed modes
|
||||
- VIDEO/WIDGETS/BUGFIX: Prevent improper display of (old style) OSD text when widgets are enabled
|
||||
- VIDEO/WIDGETS/THREADED/BUGFIX: Fix issue - corruption of menu widgets when running some cores (e.g. VICE) with threaded video enabled
|
||||
- WIFI/CONNMANCTL: Display more characters from SSID
|
||||
|
||||
# 1.8.4
|
||||
- ANDROID/BUGFIX: Prevent crash when Android device is minimized and you go back to the app
|
||||
- CAMERA/BUGFIX: Fix crash when a core requires the camera driver and the platform only has a null driver. This would crash mgba on Wii for example
|
||||
- DISK CONTROL: Cycle Disk Tray now becomes Eject Disk or Insert Disk depending upon current drive state
|
||||
- DISK CONTROL: Current Disk Index is only shown when the current disk has been ejected
|
||||
- DISK CONTROL: The old Insert Disk entry has been changed to Load New Disk, and is only shown when a disk is currently inserted (this is because loading a new disk from the filesystem - i.e. bypassing the m3u playlist disk index interface - automatically ejects and inserts disks, and so cannot be done while the virtual drive is empty)
|
||||
- DISK CONTROL: The Current Disk Index may now be set more easily via a drop-down list.
|
||||
- DISK CONTROL: Selecting Eject Disk automatically moves the menu selection to the Current Disk Index entry
|
||||
- DISK CONTROL: Selecting an index via the Current Disk Index drop-down list automatically moves the menu selection back to Insert Disk
|
||||
- DISK CONTROL: The Disk Control entry sublabels have been changed for greater clarity
|
||||
- DISK CONTROL: All of the horrendous notification spam has been removed. Notifications are now only shown in the event of an error, or when the menu itself does not provide sufficient visual feedback (note that using hotkeys to swap disks still produces the old style notifications, since this is typically only done while content is running - i.e. no menu). The duration of disk-related info notifications has also been reduced to a more sane level.
|
||||
- DISK CONTROL: A new Resume content after changing disks option has been added under Settings > User Interface. When enabled (default setting), content is resumed automatically after selecting either Insert Disk or Load New Disk (when disabled, the menu remains open, obviously...)
|
||||
- DISK CONTROL/BUGFIX: The Disk Control menu now has the correct title
|
||||
- DISK CONTROL/BUGFIX: Selecting a disk via the Load New Disk file browser no longer flushes the user back to the top level menu (it now correctly returns to the Disk Control menu)
|
||||
- LIBNX/SWITCH: Updated libnx integration to v3.0.0. This also cherry-picks libnx commit 583d6bb92dcbb33b6bb4a0fa1a9df6e3725d6ef6, which should fix the requirement having to turn rumble off and on in the system settings once per reboot
|
||||
- PLAYLISTS: Add 'Clean Playlist' option
|
||||
|
||||
# 1.8.3
|
||||
- ANDROID/BUGFIX: Fix 'Install or Restore Core' regression
|
||||
- BUGFIX: Ensure core info is always initialised when calling 'drivers_init()'. This bug could prevent cores from doing content runtime logging
|
||||
- BUGFIX/MENU: History size can only be set to 1 at a minimum
|
||||
- BUGFIX/MENU: (XMB/OZONE) Fix 'quick menu' detection. XMB would not display savestate thumbnails in the quick menu if it was accessed via the main menu
|
||||
- BUGFIX/CRASH/CORE UPDATER: Fix potential double free error
|
||||
- BUGFIX/CRASH/OPENGL/WINDOWS: Fix regression in 1.8.2 that would cause GL-based cores to fail because it would try to erroneously load libGLESv2.dll instead of OpenGL32.dll (cores affected: VitaQuake 2/3/Dhewm3, possibly more)
|
||||
- BUGFIX/MENU/DESKTOP UI: Show desktop menu on startup does not launch Qt UI on Linux
|
||||
- BUGFIX: Entries in the Playlist Thumbnails Updater list were displaying improper sublabels. I have no idea when this broke... The issue is now fixed
|
||||
- CHEEVOS: Don't disable achievement when AddAddress generates an out-of-range address
|
||||
- CHEEVOS: Don't reset triggers/leaderboards that failed to load
|
||||
- CHEEVOS: Don't count unsupported achievements as unlocked
|
||||
- CORE UPDATER: Display number of cores updated when updating installed cores
|
||||
- DINGUX: Initial port
|
||||
- D3D11: Block FL9_3 devices from D3D11 driver because they don't work anyway (current D3D11 driver uses SM4.0 which requires FL10_0 and up)
|
||||
- D3D11: Fallback to GL driver when D3D11 fails
|
||||
- EMSCRIPTEN: Fix assets
|
||||
- HISTORY/FAVORITES: Bump up default to 200 entries from 100
|
||||
- FFMPEG CORE: Implement packet buffer, fixes MP4 video playback for many files
|
||||
- LOCALIZATION: Update Italian translation
|
||||
- LOCALIZATION: Update Polish translation
|
||||
- LOCALIZATION: Update Russian translation
|
||||
- LOCALIZATION: Update Spanish translation
|
||||
- MENU: Added 'Hosting' menu under Netplay menu
|
||||
- MENU: Added 'Subsystems' menu
|
||||
- MENU/FILEBROWSER: Fix file selection issues when starting from (or navigating to) the top level directory
|
||||
- MENU/WIDGETS: Prevent looping of task title text
|
||||
- RASPBERRY PI: Fix BGRA8888 color inversion issues in the menu and elsewhere with VideoCore GL drivers
|
||||
- NETPLAY/RELAY: Add Sao Paulo (Brazil) relay server
|
||||
- NETPLAY/RELAY: Fix the “spectator” bug when using the relay server – When a player switches into the spectator mode (pressing “i”) while using the relay server, all players will disconnect.
|
||||
- NETPLAY/RELAY: Overall stability has improved. Fixed a memory leak that would cause the relay server to become unresponsive after some time.
|
||||
- NETPLAY/RELAY: Fixed critical bug that would cause all players to be disconnected from the relay server if one player was leaving the game. That bug had been open for one year and we were finally able to fix it.
|
||||
- SWITCH/LIBNX/BUGFIX: Fix onscreen keyboard input regression
|
||||
- THUMBNAIL UPDATER: When waiting for individual thumbnail file http transfers to complete, the task status checking is more accurate. This uses the same method as the new core updater - we now wait until the task is 'really' complete, instead of relying on the (slightly nebulous) 'task finished' state
|
||||
- UWP: Add ANGLE support
|
||||
- UWP: Wire up get_metrics to the fake context of D3D9/10/11/12 driver, enabling proper scaling and mouse/touch gestures
|
||||
- VITA: Re-add Online Updater
|
||||
- VULKAN: Fix font driver 'vulkan_get_message_width()' function
|
||||
- VIDEO FILTERS: Only use threads when the number exceeds 1. Fixes race conditions with some CPU filters on Vita
|
||||
- WINDOWS: Add ANGLE support for x64, separate binary (for now?)
|
||||
|
||||
# 1.8.2
|
||||
- BUG/CRASH/GLSLANG: Fix glslang crashing error - managed to reproduce an issue which has been plaguing
|
||||
users for a while, where glslang throws an assert after closing a game (and starting a new one). This would affect all video drivers that use Slang for shaders, such as D3D10/11/12/Vulkan/Metal
|
||||
- CHEEVOS: Display Unofficial and Unsupported achievement states
|
||||
- CHEEVOS: Pass RetroArch and core versions through User-Agent HTTP header
|
||||
- CHEEVOS: Use PSX.EXE if SYSTEM.CNF cannot be found
|
||||
- CHEEVOS: Prevent loading state while achievements are still being fetched from server
|
||||
- CHEEVOS: Pause hardcore if core doesn't support achievements
|
||||
- CHEEVOS/CRASH: Fix AddressSanitizer + CHD cause hard crash when Cheevos are enabled
|
||||
- CORE UPDATER: Only download when new core is available
|
||||
- CORE UPDATER: Add option to update all installed cores
|
||||
- DRM/KMS: Better detection for the current video mode
|
||||
- DYNAMIC RATE CONTROL: Support DRC even when using a vsync swap interval higher than 1
|
||||
- EMSCRIPTEN: Fix bug in Emscripten input code
|
||||
- EMSCRIPTEN: Changes to support upgraded emscripten SDK
|
||||
- FFMPEG CORE: Hardware accelerated video decoding
|
||||
- FFMPEG CORE: Implement send/receive encoding API, will allow for hardware accelerated AMD video encoding
|
||||
- FFMPEG CORE: The video FIFO can be removed, since we have a ring buffer in its place. This removes unneeded copy operations and as a positive side improves overall decoding speed. Makes 8k60p SW and 4k60p HW decoding feasible on many systems. For now the ring buffer is 32 images deep. This limitation will be removed, once audio and video decoder have their own packet handling.
|
||||
- INPUT: Fix 'Analog stick controls menu even if autoconfig disabled'
|
||||
- INPUT/TURBO: Added alternate Turbo-Mode 'Single Button' - For systems supporting only a single button, the turbo-button will toggle firing that button without the need to hold it. When holding the button turbo will be suspended and resumed when the button is released. Holding the button may have a different function to just tapping it.
|
||||
- IOS: Forcibly disable Threaded Video until UIWindow concurrency issues are fixed
|
||||
- INPUT/ANALOG: Fix radial analog deadzone scaling
|
||||
- INPUT/ANALOG: Implement proper analog button deadzone
|
||||
- INPUT/MENU: Analog stick controls menu even if autoconfig disabled
|
||||
- LOCALIZATION: Update Italian translation
|
||||
- LOCALIZATION: Update French translation
|
||||
- LOCALIZATION: Update Polish translation
|
||||
- LOCALIZATION: Update Portuguese Brazilian Translation
|
||||
- LOCALIZATION: Update Turkish translation
|
||||
- LINUX/LOCALIZATION: Correct Droid Sans Fallback font path in Linux. This should fix Chinese/Korean font display issues on Fedora/RHEL/CentOS/openSUSE/SLE
|
||||
- MENU/BUGFIX: When using a keyboard/gamepad/mouse wheel to navigate, the menu scroll position is always maintained and updated in a consistent (and expected) fashion
|
||||
- MENU/BUGFIX: When resizing the window, or changing the orientation of a mobile device, the current scroll position is correctly preserved
|
||||
- MENU/BUGFIX: All 'normal' pointer input is now inhibited when showing message boxes
|
||||
- MENU/BUGFIX: The pointer actions 'select' and 'cancel' both now properly close a message box if it is currently being shown
|
||||
- MENU/BUGFIX: Pointer 'select' and 'cancel' actions are now inhibited when an input bind dialog is active
|
||||
- MENU/INPUT: Change 'User' terminology to 'Port' for input binding
|
||||
- MENU/LINUX: Add proper drives to Load Content
|
||||
- MENU/MATERIALUI: Halt scrolling when pointer is pressed/stationary
|
||||
- MENU/MATERIALUI: Dual thumbnail view
|
||||
- MENU/MATERIALUI: Fullscreen thumbnail viewer for boxart
|
||||
- MENU/MATERIALUI: Scroll rapidly by press and holding the scrollbar
|
||||
- MENU/RGUI: New theme 'Flux'
|
||||
- MENU/OZONE: Thumbnails now have a fade-in animation
|
||||
- MENU/OZONE: Fullscreen thumbnail viewer for boxart and pictures
|
||||
- MENU/QT/WIMP: Fix dock titles getting cut off
|
||||
- MENU/XMB: Fullscreen thumbnail viewer for boxart and pictures
|
||||
- MENU/USABILITY: Selectively hide 'Disallow Non-Slave Mode Clients' if 'Allow Slave-Mode Clients' is disabled
|
||||
- MENU/USABILITY: Hide 'Show desktop menu on startup' if 'Desktop menu' setting itself is disabled
|
||||
- MENU/USABILITY: Reimplement Quick Menu - > Shaders -> Watch shader files for changes - can now be turned on/off through touch
|
||||
- MENU/USABILITY: Refactor Quick Menu - Controls - each port now has its own submenu
|
||||
- MENU/USABILITY: Quick Menu - Cheats - Delete All no longer requires five right button presses - this should fix this functionality for mobile touch users too
|
||||
- MENU/USABILITY: Hide Refresh Rate options when Threaded Video is enabled - these settings do nothing with Threaded Video
|
||||
- MENU/USABILITY: Hide Logging Verbosity levels behind Logging Verbosity
|
||||
- MENU/USABILITY: Get rid of 'Port Number' label for Port Binds screen
|
||||
- MENU/USABILITY/MOBILE: Should no longer crash when clicking on a cheat entry
|
||||
- MENU/USABILITY: Shader parameters now have a dropdown list
|
||||
- MENU/USABILITY: Shader passes now has a dropdown list
|
||||
- MENU/USABILITY: Video - Hide Windowed Mode settings selectively
|
||||
- MENU/USABILITY: Video - Hide Fullscreen Mode settings if windowed mode is not supported by context driver
|
||||
- MENU/USABILITY: Selectively hide Network Command Port
|
||||
- MENU/USABILITY: Selectively hide Relay Server Location
|
||||
- MENU/USABILITY: User Interface -> Appearance - Selectively hide XMB Horizontal Animation setting
|
||||
- MENU/USABILITY: Playlists - more selective hiding
|
||||
- MENU/USABILITY: Selectively hide Rewind Settings
|
||||
- MENU/USABILITY: Selectively hide Overlay Settings
|
||||
- MENU/USABILITY: Selectively hide FPS Update Interval based on Display Framerate being enabled
|
||||
- MENU/USABILITY: Selectively hide Onscreen Notifications BG Color Settings
|
||||
- MENU/USABILITY: Settings -> Logging - Hide 'Log To File Timestamp' if 'Log To File' is disabled
|
||||
- MENU/USABILITY: Video -> Scaling - Hide Custom Viewport X/Y when Integer Scale is enabled as description indicates
|
||||
- MENU/USABILITY: Achievement submenu - selectively hide
|
||||
- MENU/USABILITY: Settings -> Video -> Aspect ratio - selectively hide/show values based on whether you have Custom or Config selected
|
||||
- MENU/USABILITY: Settings -> Video -> Selectively hide Hard Sync
|
||||
- MENU/USABILITY: Settings -> Video -> Implement selective hiding for VSync and Hard Sync
|
||||
- MENU/USABILITY: Selective hiding of Runahead settings based on global setting
|
||||
- MENU/USABILITY: Add Input -> Haptic Feedback submenu
|
||||
- MENU/USABILITY: Add Input -> Menu Controls submenu
|
||||
- MENU/USABILITY: Settings -> Video -> Max Swapchain Images - Add OK action
|
||||
- MENU/USABILITY: Input - Implement OK action for Bind Hold, Turbo Period and Duty Cycle
|
||||
- MENU/USABILITY: Input - Hotkey Binds refactor
|
||||
- MENU/USABILITY: Move 'Press Quit Twice' and 'Menu Toggle Gamepad Combo' to Input -> Hotkey Binds
|
||||
- MENU/USABILITY: Video - Add sublabel for Video Output submenu
|
||||
- MENU/USABILITY: If 'Favorites Tab' is disabled, don't show 'Add To Favorites' option in Quick Menu/Playlist menu
|
||||
- MENU/USABILITY: If On-Demand Thumbnail Downloader is enabled, hide 'Download Thumbnails' from playlist menu screen
|
||||
- MENU/USABILITY: Add Audio Driver setting to Audio -> Output
|
||||
- MENU/USABILITY: Add Audio -> Resampler settings
|
||||
- MENU/USABILITY: Add Audio -> Output and Audio -> Synchronization
|
||||
- OPENGL: Shaders are now working properly (only in OpenGL) when rotating both from Core API rotation and from menu video rotation. The fix is clearly visible with crt-royale for example
|
||||
- OPENGL: 1:1 PAR is now correct when rotating (both from Core API rotation and from menu video rotation, as you said, in the latter case you currently have to change Aspect Ratio after menu video rotation for it to work)
|
||||
- OPENGL: When using Custom Aspect Ratio and rotation (both from Core API rotation and from menu video rotation), Integer Scaling is now working properly (correct multiples of internal resolution). Even when Integer Scaling is not activated, the Custom AR width / height are now correctly labeled using (1x), (2x), ... suffixes. You also have to activate Integer Scaling after menu video rotation for it to work
|
||||
- OPENGL: For all other Aspect Ratio options, Integer Scaling and rotation (both from Core API rotation and from menu video rotation) are now working properly together (correct multiples of internal resolution). You also have to activate Integer Scaling after menu video rotation for it to work
|
||||
- OPENBSD/POWERPC: Should build now on OpenBSD PowerPC
|
||||
- PLAYLISTS: Pressing 'Start' or long touching a playlist will bring you to a Playlist submenu where you can set a default core, setup thumbnail view, delete the playlist, etc
|
||||
- OSX: Forcibly disable Threaded Video until NSWindow concurrency issues are fixed
|
||||
- PSP: Solving issue exiting RetroArch by HOME button
|
||||
- SCANNER: Manual scanner, not dependent on database files
|
||||
- SCANNER/MANUAL: Add option to scan inside archives
|
||||
- SCANNER/MANUAL: Enable automatic naming of arcade content via DAT files. This is compatible with DAT files in either Logiqx XML or MAME List XML format.
|
||||
- VIDEO: Do not reinit video driver on SET_SYSTEM_AV_INFO unless needed
|
||||
- VIDEO: Support DRC even when using a vsync swap interval higher than 1
|
||||
- VIDEO LAYOUT: Fixed XML parsing of attributes with spaces, should fix issues with several video layouts
|
||||
- VITA: GL1 driver support
|
||||
- VITA/VITA2D: Several improvements to Vita 2D driver - menu widgets implemented
|
||||
- VITA/VITA2D: Fix clipping and reduce number of calls
|
||||
- VULKAN/ANDROID: Workaround weird WSI return codes in landscape mode - Android WSI wants you to use preTransform, and if it is not used correctly, Android 10 will return VK_SUBOPTIMAL_KHR, and we would create a new swapchain every frame. This workaround just ignores this error, since it's not really an error. A more "proper" fix is to use prerotate and modify the MVP matrices,
|
||||
which might help certain devices with crummy display processors
|
||||
- VULKAN/ANDROID: Recreate swapchain on orientation change. ANativeWindow getWidth/Height does not detect any changes when using
|
||||
Vulkan, so use the old onContentRectChanged callback to get notified when size changed. Use those values instead when figuring out how large swapchain to create
|
||||
- WINDOWS/XINPUT: Get rid of 128 byte device name limit for XInput device discover - when device name was too long, it would not be picked up by the XInput driver and would instead fallback to DirectInput
|
||||
- WINDOWS: ANGLE OpenGL ES 2 support
|
||||
- UWP: Fix crashes on startup / prompt for folder permissions when trying to load custom.ini
|
||||
- UWP: Fix - Mouse input is offset on high DPI monitors
|
||||
- UWP: Fix - Keyboard input hangs sometimes
|
||||
- UWP: Fix - Multi-touch support
|
||||
- UWP: Fix - Enable menu touch input by default
|
||||
- UWP: Fix - Get user language
|
||||
- UWP: Fix - Get CPU model name
|
||||
- UWP: Fix - Use GLUI instead of XMB on Windows Mobile 10
|
||||
- UWP: ANGLE OpenGL ES 2 support
|
||||
|
||||
# (1.8.1)
|
||||
- BUGFIX/MENU: Fix menu rendering with Mali GPUs after changing video dimensions
|
||||
- CDROM: Adds pregap support to cdfs helper methods
|
||||
- CHEEVOS: Provides the new PCEngine hashing algorithm for RetroAchievements
|
||||
- LOCALIZATION: Update French translation
|
||||
- LOCALIZATION: Update Polish translation
|
||||
- LOCALIZATION: Update Spanish translation
|
||||
- MENU/MATERIALUI: Initial thumbnail support
|
||||
- MENU/MATERIALUI: Cutie / Virtual Boy theme added
|
||||
- MENU/MATERIALUI: Bugfix - Under certain extreme circumstances, entries with very long sublabel strings could have their text prematurely 'clipped' as the entry is scrolled beyond the top of the screen
|
||||
- MENU/MATERIALUI: Bugfix - Certain setting value strings were unnecessarily truncated (with a ...) when using smooth ticker text
|
||||
- MENU/XMB: Sunbeam theme added
|
||||
- SWITCH: Accelerometer, gyroscope and illuminance sensor support
|
||||
- VITA: Accelerometer and gyroscope sensor support
|
||||
|
||||
# (1.8.0)
|
||||
- AI SERVICE: Added in fix for BMP returns to AI service. Added in label passing to AI service call
|
||||
- BSV: Fix BSV recording/playback
|
||||
- BUGFIX: Fix crash when setting Thumbnail Directory
|
||||
- BUGFIX/STABILITY: Set "Automatically Add Content to Playlist" to false by default, this was unstable on PS3 and Mac and other platforms potentially as well.
|
||||
- COMMON: Graceful driver switching for Windows and Linux
|
||||
- COMMON: Cache frame before converting 0RGB1555
|
||||
- LAKKA: Wi-Fi Access Point settings
|
||||
- MENU: Menu scaling improvements
|
||||
- MENU/MATERIALUI: There are no longer any animation glitches when 'wraparound' scrolling from the last entry in a list to the first, or when performing horizontal swipe navigation gestures on certain settings-type entries
|
||||
- MENU/MATERIALUI: List entries underneath the title and navigation bars are no longer highlighted when touching the title/navigation bars (this was only a cosmetic issue, but it was annoying...)
|
||||
- MENU/MATERIALUI: The current menu list is no longer reloaded when pressing the currently active tab on the navigation bar
|
||||
- MENU/MATERIALUI: The ticker text spacer has been set to a 'bullet' character (same as Ozone)
|
||||
- MENU/MATERIALUI: The default colour theme has been set to 'Ozone Dark'
|
||||
- MENU/MATERIALUI: Three new colour themes have been added.
|
||||
- MENU/MATERIALUI: A new Menu Transition Animation option has been added under User Interface > Appearance. When this is enabled, menu transition events are animated
|
||||
- MENU/MATERIALUI: The navigation bar is now shown at all times - i.e. it is an actual navigation tool, rather than a 'top-level-menu' curiosity
|
||||
- MENU/MATERIALUI: Two new context-sensitive buttons have been added to the navigation bar - back button and resume button
|
||||
- MENU/MATERIALUI: A new Auto-Rotate Navigation Bar option has been added under User Interface > Appearance. When enabled (this is the default setting), the navigation bar is moved to the right hand side of the screen when using landscape screen orientations.
|
||||
- MENU/MATERIALUI: The playlists tab is now correctly hidden when User Interface > Views > Show Playlist Tabs is disabled
|
||||
- MENU/MATERIALUI: Material UI now correctly readjusts its layout when screen orientation changes on mobile devices
|
||||
- MENU/MATERIALUI: Material UI now resizes in real-time when the user manually sets the Menu Scale Factor (this never worked properly with the old DPI override)
|
||||
- MENU/MATERIALUI: Material UI no longer leaks memory on 'context reset' (fonts were previously never free()'d)
|
||||
@@ -16,7 +304,7 @@
|
||||
- OSD: Fix fast forward indicator when not using menu widgets
|
||||
- PSP1: Remove duplicated FPS indicator on the screen
|
||||
- SWITCH: Make audren threaded audio driver the new default
|
||||
- VIDEO LAYOUT: Add video layout mame overlay compatibility. Enabled for Windows/Linux/OSX/iOS/Android/libnx. Only works with GL driver for now
|
||||
- VIDEO LAYOUT: Add video layout mame overlay compatibility. Enabled for Windows/Linux/OSX/iOS/Android/libnx. Only works with GL driver for now, no glcore yet
|
||||
|
||||
# (1.7.9) (v2)
|
||||
- 3DS: Fix 3DS screen flickering when OSD is enabled
|
||||
@@ -962,3 +1250,4 @@ Skipped this one
|
||||
|
||||
# 1.4.1
|
||||
|
||||
|
||||
+2
-2
@@ -38,7 +38,7 @@ A pull request may be asked to fix the coding style before submission.
|
||||
In other cases, a pull request may be followed up with a "style nit commit".
|
||||
|
||||
## Non-obvious things:
|
||||
- Code should be both ISO C99 and ISO C++ compatible. This dual requirement is for XBox360 and MSVC in general. Think of it as a C++ compatible subset of C99.
|
||||
- Code should be both C89 and ISO C++ compatible. This dual requirement is for XBox360 and MSVC in general. Think of it as a C++ compatible subset of C99.
|
||||
- Warnings are not allowed (-Wall). Make sure your code is warning-free. Note that warning sensitivity differs a bit across compiler versions.
|
||||
- Using deprecated APIs is discouraged.
|
||||
|
||||
@@ -55,4 +55,4 @@ We value discussing things in "real-time".
|
||||
|
||||
# Commit Access
|
||||
Contributors who show a track record of making good pull requests over time will eventually get commit access to the repo.
|
||||
This typically happens when the "overhead" of looking through pull requests over time becomes a burden.
|
||||
This typically happens when the "overhead" of looking through pull requests over time becomes a burden.
|
||||
@@ -14,7 +14,11 @@ include config.mk
|
||||
# (It'd be better to put this comment in that file, but .gitignore doesn't work on files that exist in the repo.)
|
||||
-include Makefile.local
|
||||
|
||||
ifeq ($(HAVE_ANGLE), 1)
|
||||
TARGET = retroarch_angle
|
||||
else
|
||||
TARGET = retroarch
|
||||
endif
|
||||
|
||||
OBJ :=
|
||||
LIBS :=
|
||||
@@ -41,6 +45,8 @@ else
|
||||
DEF_FLAGS += -ffast-math
|
||||
endif
|
||||
|
||||
DEF_FLAGS += -Wall
|
||||
|
||||
ifneq ($(findstring BSD,$(OS)),)
|
||||
DEF_FLAGS += -DBSD
|
||||
LDFLAGS += -L/usr/local/lib
|
||||
@@ -64,7 +70,7 @@ endif
|
||||
include Makefile.common
|
||||
|
||||
ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang"),1)
|
||||
DEFINES += -Wno-invalid-source-encoding -Wno-incompatible-ms-struct
|
||||
DEF_FLAGS += -Wno-invalid-source-encoding -Wno-incompatible-ms-struct
|
||||
endif
|
||||
|
||||
ifeq ($(shell $(CC) -v 2>&1 | grep -c "tcc"),1)
|
||||
@@ -76,7 +82,7 @@ endif
|
||||
HEADERS = $(wildcard */*/*.h) $(wildcard */*.h) $(wildcard *.h)
|
||||
|
||||
ifeq ($(MISSING_DECLS), 1)
|
||||
DEFINES += -Werror=missing-declarations
|
||||
DEF_FLAGS += -Werror=missing-declarations
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_DYLIB), 1)
|
||||
@@ -102,10 +108,20 @@ ifneq ($(findstring Win32,$(OS)),)
|
||||
LDFLAGS += -mwindows
|
||||
endif
|
||||
|
||||
DEF_FLAGS += -Wall $(INCLUDE_DIRS) -I. -Ideps -Ideps/stb
|
||||
ifneq ($(CXX_BUILD), 1)
|
||||
ifneq ($(C89_BUILD),)
|
||||
CFLAGS += -std=c89 -ansi -pedantic -Werror=pedantic -Wno-long-long
|
||||
else ifeq ($(HAVE_C99), 1)
|
||||
CFLAGS += $(C99_CFLAGS)
|
||||
endif
|
||||
|
||||
CFLAGS += -D_GNU_SOURCE
|
||||
endif
|
||||
|
||||
DEF_FLAGS += $(INCLUDE_DIRS) -I. -Ideps -Ideps/stb
|
||||
|
||||
CFLAGS += $(DEF_FLAGS)
|
||||
CXXFLAGS += $(DEF_FLAGS) -std=c++11 -D__STDC_CONSTANT_MACROS
|
||||
CXXFLAGS += $(DEF_FLAGS) -D__STDC_CONSTANT_MACROS
|
||||
OBJCFLAGS := $(CFLAGS) -D__STDC_CONSTANT_MACROS
|
||||
|
||||
ifeq ($(HAVE_CXX), 1)
|
||||
@@ -123,29 +139,6 @@ else
|
||||
LINK = $(CC)
|
||||
endif
|
||||
|
||||
ifneq ($(CXX_BUILD), 1)
|
||||
ifneq ($(GNU90_BUILD), 1)
|
||||
ifneq ($(findstring icc,$(CC)),)
|
||||
CFLAGS += -std=c99 -D_GNU_SOURCE
|
||||
else
|
||||
CFLAGS += -std=gnu99 -D_GNU_SOURCE
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq ($(C89_BUILD),)
|
||||
CFLAGS += -std=c89 -ansi -pedantic -Werror=pedantic -Wno-long-long
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(NOUNUSED), yes)
|
||||
CFLAGS += -Wno-unused-result
|
||||
CXXFLAGS += -Wno-unused-result
|
||||
endif
|
||||
ifeq ($(NOUNUSED_VARIABLE), yes)
|
||||
CFLAGS += -Wno-unused-variable
|
||||
CXXFLAGS += -Wno-unused-variable
|
||||
endif
|
||||
|
||||
RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
|
||||
|
||||
ifneq ($(X86),)
|
||||
@@ -203,7 +196,7 @@ endif
|
||||
|
||||
SYMBOL_MAP := -Wl,-Map=output.map
|
||||
|
||||
retroarch: $(RARCH_OBJ)
|
||||
$(TARGET): $(RARCH_OBJ)
|
||||
@$(if $(Q), $(shell echo echo LD $@),)
|
||||
$(Q)$(LINK) -o $@ $(RARCH_OBJ) $(LIBS) $(LDFLAGS) $(LIBRARY_DIRS)
|
||||
|
||||
@@ -280,7 +273,7 @@ install: $(TARGET)
|
||||
fi
|
||||
|
||||
uninstall:
|
||||
rm -f $(DESTDIR)$(BIN_DIR)/retroarch
|
||||
rm -f $(DESTDIR)$(BIN_DIR)/$(TARGET)
|
||||
rm -f $(DESTDIR)$(BIN_DIR)/retroarch-cg2glsl
|
||||
rm -f $(DESTDIR)$(GLOBAL_CONFIG_DIR)/retroarch.cfg
|
||||
rm -f $(DESTDIR)$(DATA_DIR)/applications/retroarch.desktop
|
||||
|
||||
+179
-119
@@ -7,6 +7,18 @@ ifeq ($(HAVE_STACK_USAGE), 1)
|
||||
DEF_FLAGS += -fstack-usage
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_NOUNUSED), 1)
|
||||
DEF_FLAGS += $(NOUNUSED_CFLAGS)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_NOUNUSED_VARIABLE), 1)
|
||||
DEF_FLAGS += $(NOUNUSED_VARIABLE_CFLAGS)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_CXX11), 1)
|
||||
CXXFLAGS += $(CXX11_CFLAGS)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_GL_CONTEXT),)
|
||||
HAVE_GL_CONTEXT = 0
|
||||
HAVE_GL_MODERN = 0
|
||||
@@ -153,17 +165,17 @@ ifeq ($(HAVE_DR_MP3), 1)
|
||||
endif
|
||||
|
||||
OBJ += frontend/frontend_driver.o \
|
||||
frontend/drivers/platform_null.o \
|
||||
retroarch.o \
|
||||
paths.o \
|
||||
msg_hash.o \
|
||||
intl/msg_hash_us.o \
|
||||
$(LIBRETRO_COMM_DIR)/queues/task_queue.o \
|
||||
tasks/task_content.o \
|
||||
tasks/task_patch.o \
|
||||
tasks/task_save.o \
|
||||
tasks/task_file_transfer.o \
|
||||
tasks/task_image.o \
|
||||
tasks/task_playlist_manager.o \
|
||||
tasks/task_manual_content_scan.o \
|
||||
$(LIBRETRO_COMM_DIR)/encodings/encoding_utf.o \
|
||||
$(LIBRETRO_COMM_DIR)/encodings/encoding_crc32.o \
|
||||
$(LIBRETRO_COMM_DIR)/encodings/encoding_base64.o \
|
||||
@@ -181,7 +193,6 @@ OBJ += frontend/frontend_driver.o \
|
||||
$(LIBRETRO_COMM_DIR)/lists/string_list.o \
|
||||
$(LIBRETRO_COMM_DIR)/string/stdstring.o \
|
||||
$(LIBRETRO_COMM_DIR)/memmap/memalign.o \
|
||||
list_special.o \
|
||||
$(LIBRETRO_COMM_DIR)/file/nbio/nbio_stdio.o
|
||||
|
||||
ifneq ($(findstring Linux,$(OS)),)
|
||||
@@ -203,16 +214,19 @@ endif
|
||||
OBJ += \
|
||||
$(LIBRETRO_COMM_DIR)/file/nbio/nbio_intf.o \
|
||||
$(LIBRETRO_COMM_DIR)/file/file_path.o \
|
||||
$(LIBRETRO_COMM_DIR)/file/file_path_io.o \
|
||||
file_path_special.o \
|
||||
file_path_str.o \
|
||||
$(LIBRETRO_COMM_DIR)/hash/rhash.o \
|
||||
input/common/input_hid_common.o \
|
||||
input/input_mapper.o \
|
||||
led/led_driver.o \
|
||||
led/drivers/led_null.o \
|
||||
gfx/video_coord_array.o \
|
||||
gfx/video_display_server.o \
|
||||
gfx/video_crt_switch.o \
|
||||
gfx/gfx_display.o \
|
||||
gfx/gfx_animation.o \
|
||||
gfx/gfx_thumbnail_path.o \
|
||||
gfx/gfx_thumbnail.o \
|
||||
configuration.o \
|
||||
$(LIBRETRO_COMM_DIR)/dynamic/dylib.o \
|
||||
cores/dynamic_dummy.o \
|
||||
@@ -222,7 +236,6 @@ OBJ += \
|
||||
tasks/task_autodetect.o \
|
||||
input/input_autodetect_builtin.o \
|
||||
input/input_keymaps.o \
|
||||
input/input_remapping.o \
|
||||
$(LIBRETRO_COMM_DIR)/queues/fifo_queue.o \
|
||||
$(LIBRETRO_COMM_DIR)/compat/compat_fnmatch.o \
|
||||
$(LIBRETRO_COMM_DIR)/compat/compat_posix_string.o \
|
||||
@@ -231,6 +244,7 @@ OBJ += \
|
||||
$(LIBRETRO_COMM_DIR)/file/config_file.o \
|
||||
$(LIBRETRO_COMM_DIR)/file/config_file_userdata.o \
|
||||
runtime_file.o \
|
||||
disk_index_file.o \
|
||||
tasks/task_screenshot.o \
|
||||
tasks/task_powerstate.o \
|
||||
$(LIBRETRO_COMM_DIR)/gfx/scaler/scaler.o \
|
||||
@@ -243,25 +257,24 @@ OBJ += \
|
||||
$(LIBRETRO_COMM_DIR)/audio/dsp_filter.o \
|
||||
$(LIBRETRO_COMM_DIR)/audio/resampler/drivers/sinc_resampler.o \
|
||||
$(LIBRETRO_COMM_DIR)/audio/resampler/drivers/nearest_resampler.o \
|
||||
$(LIBRETRO_COMM_DIR)/audio/resampler/drivers/null_resampler.o \
|
||||
$(LIBRETRO_COMM_DIR)/utils/md5.o \
|
||||
location/drivers/nulllocation.o \
|
||||
camera/drivers/nullcamera.o \
|
||||
wifi/drivers/nullwifi.o \
|
||||
gfx/drivers/nullgfx.o \
|
||||
gfx/display_servers/dispserv_null.o \
|
||||
audio/drivers/nullaudio.o \
|
||||
input/drivers/nullinput.o \
|
||||
input/drivers_hid/null_hid.o \
|
||||
input/drivers_joypad/null_joypad.o \
|
||||
playlist.o \
|
||||
record/drivers/record_null.o \
|
||||
$(LIBRETRO_COMM_DIR)/features/features_cpu.o \
|
||||
performance_counters.o \
|
||||
verbosity.o \
|
||||
midi/drivers/null_midi.o \
|
||||
$(LIBRETRO_COMM_DIR)/playlists/label_sanitization.o
|
||||
$(LIBRETRO_COMM_DIR)/playlists/label_sanitization.o \
|
||||
manual_content_scan.o \
|
||||
disk_control_interface.o
|
||||
|
||||
ifeq ($(HAVE_CONFIGFILE), 1)
|
||||
DEFINES += -DHAVE_CONFIGFILE
|
||||
OBJ += input/input_remapping.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_BLISSBOX), 1)
|
||||
DEFINES += -DHAVE_BLISSBOX
|
||||
OBJ += tasks/task_autodetect_blissbox.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_AUDIOMIXER), 1)
|
||||
DEFINES += -DHAVE_AUDIOMIXER
|
||||
@@ -272,8 +285,6 @@ endif
|
||||
|
||||
ifeq ($(HAVE_RUNAHEAD), 1)
|
||||
DEFINES += -DHAVE_RUNAHEAD
|
||||
OBJ += runahead/mem_util.o \
|
||||
runahead/mylist.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_CC_RESAMPLER), 1)
|
||||
@@ -415,6 +426,8 @@ ifeq ($(HAVE_QT), 1)
|
||||
|
||||
ifneq ($(findstring Linux,$(OS)),)
|
||||
DEF_FLAGS += -fPIC
|
||||
else ifneq ($(findstring BSD,$(OS)),)
|
||||
DEF_FLAGS += -fPIC
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -748,8 +761,8 @@ ifeq ($(HAVE_MENU), 1)
|
||||
DEFINES += -DHAVE_MENU
|
||||
HAVE_MENU_COMMON = 1
|
||||
|
||||
ifeq ($(HAVE_MENU_WIDGETS), 1)
|
||||
DEFINES += -DHAVE_MENU_WIDGETS
|
||||
ifeq ($(HAVE_GFX_WIDGETS), 1)
|
||||
DEFINES += -DHAVE_GFX_WIDGETS
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_RGUI), 1)
|
||||
@@ -805,7 +818,6 @@ ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
menu/widgets/menu_filebrowser.o \
|
||||
menu/widgets/menu_dialog.o \
|
||||
menu/widgets/menu_input_bind_dialog.o \
|
||||
menu/widgets/menu_osk.o \
|
||||
menu/menu_cbs.o \
|
||||
menu/cbs/menu_cbs_ok.o \
|
||||
menu/cbs/menu_cbs_cancel.o \
|
||||
@@ -824,16 +836,17 @@ ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
menu/cbs/menu_cbs_up.o \
|
||||
menu/cbs/menu_cbs_down.o \
|
||||
menu/cbs/menu_cbs_contentlist_switch.o \
|
||||
menu/menu_displaylist.o \
|
||||
menu/menu_animation.o \
|
||||
menu/drivers/menu_generic.o \
|
||||
menu/drivers/null.o \
|
||||
menu/menu_thumbnail_path.o \
|
||||
menu/drivers_display/menu_display_null.o
|
||||
menu/menu_displaylist.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_MENU_WIDGETS), 1)
|
||||
OBJ += menu/widgets/menu_widgets.o
|
||||
endif
|
||||
OBJ += input/input_osk.o
|
||||
|
||||
ifeq ($(HAVE_GFX_WIDGETS), 1)
|
||||
OBJ += gfx/gfx_widgets.o \
|
||||
gfx/widgets/gfx_widget_screenshot.o \
|
||||
gfx/widgets/gfx_widget_volume.o \
|
||||
gfx/widgets/gfx_widget_generic_message.o \
|
||||
gfx/widgets/gfx_widget_libretro_message.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_OVERLAY), 1)
|
||||
@@ -892,11 +905,10 @@ ifeq ($(HAVE_VITA2D), 1)
|
||||
$(DEPS_DIR)/libvita2d/shader/color_f_gxp.o \
|
||||
$(DEPS_DIR)/libvita2d/shader/texture_v_gxp.o \
|
||||
$(DEPS_DIR)/libvita2d/shader/texture_f_gxp.o \
|
||||
$(DEPS_DIR)/libvita2d/shader/texture_tint_v_gxp.o \
|
||||
$(DEPS_DIR)/libvita2d/shader/texture_tint_f_gxp.o
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON),1)
|
||||
OBJ += menu/drivers_display/menu_display_vita2d.o
|
||||
endif
|
||||
OBJ += gfx/drivers_display/gfx_display_vita2d.o
|
||||
|
||||
OBJ += gfx/drivers/vita2d_gfx.o \
|
||||
gfx/drivers_font/vita2d_font.o
|
||||
@@ -906,7 +918,7 @@ endif
|
||||
|
||||
ifeq ($(TARGET), retroarch_3ds)
|
||||
OBJ += gfx/drivers/ctr_gfx.o \
|
||||
menu/drivers_display/menu_display_ctr.o \
|
||||
gfx/drivers_display/gfx_display_ctr.o \
|
||||
input/drivers/ctr_input.o \
|
||||
input/drivers_joypad/ctr_joypad.o
|
||||
endif
|
||||
@@ -927,7 +939,7 @@ endif
|
||||
ifeq ($(TARGET), retroarch_wiiu)
|
||||
OBJ += gfx/drivers/gx2_gfx.o \
|
||||
gfx/drivers_font/wiiu_font.o \
|
||||
menu/drivers_display/menu_display_wiiu.o \
|
||||
gfx/drivers_display/gfx_display_wiiu.o \
|
||||
input/drivers/wiiu_input.o \
|
||||
input/drivers_joypad/wiiu_joypad.o \
|
||||
input/drivers_joypad/wiiu/wpad_driver.o \
|
||||
@@ -952,7 +964,7 @@ endif
|
||||
|
||||
ifeq ($(TARGET), retroarch_switch)
|
||||
ifeq ($(HAVE_LIBNX), 1)
|
||||
OBJ += menu/drivers_display/menu_display_switch.o \
|
||||
OBJ += gfx/drivers_display/gfx_display_switch.o \
|
||||
gfx/drivers/switch_nx_gfx.o \
|
||||
audio/drivers/switch_libnx_audren_audio.o \
|
||||
audio/drivers/switch_libnx_audren_thread_audio.o
|
||||
@@ -986,6 +998,12 @@ ifeq ($(HAVE_WAYLAND), 1)
|
||||
|
||||
endif
|
||||
|
||||
# XML
|
||||
OBJ += \
|
||||
$(LIBRETRO_COMM_DIR)/formats/xml/rxml.o \
|
||||
$(LIBRETRO_COMM_DIR)/formats/logiqx_dat/logiqx_dat.o \
|
||||
deps/yxml/yxml.o
|
||||
|
||||
#Input
|
||||
|
||||
ifeq ($(HAVE_DINPUT), 1)
|
||||
@@ -1102,7 +1120,12 @@ OBJ += gfx/drivers_context/gfx_null_ctx.o
|
||||
|
||||
ifeq ($(HAVE_KMS), 1)
|
||||
HAVE_AND_WILL_USE_DRM = 1
|
||||
|
||||
ifeq ($(HAVE_ODROIDGO2), 1)
|
||||
OBJ += gfx/drivers_context/drm_go2_ctx.o
|
||||
else
|
||||
OBJ += gfx/drivers_context/drm_ctx.o
|
||||
endif
|
||||
DEF_FLAGS += $(GBM_CFLAGS) $(DRM_CFLAGS)
|
||||
LIBS += $(GBM_LIBS) $(DRM_LIBS)
|
||||
endif
|
||||
@@ -1112,10 +1135,6 @@ ifeq ($(HAVE_CACA), 1)
|
||||
OBJ += gfx/drivers/caca_gfx.o gfx/drivers_font/caca_font.o
|
||||
LIBS += $(CACA_LIBS)
|
||||
DEF_FLAGS += $(CACA_CFLAGS)
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_caca.o
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_SIXEL), 1)
|
||||
@@ -1125,10 +1144,6 @@ ifeq ($(HAVE_SIXEL), 1)
|
||||
gfx/drivers_context/sixel_ctx.o
|
||||
LIBS += $(SIXEL_LIBS)
|
||||
DEF_FLAGS += $(SIXEL_CFLAGS)
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_sixel.o
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_NETWORK_VIDEO), 1)
|
||||
@@ -1155,12 +1170,21 @@ ifeq ($(HAVE_PLAIN_DRM), 1)
|
||||
LIBS += -ldrm
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_VITAGL), 1)
|
||||
DEFINES += -DHAVE_OPENGL1
|
||||
OBJ += gfx/drivers/gl1.o \
|
||||
gfx/drivers_font/gl1_raster_font.o \
|
||||
gfx/drivers_context/vita_ctx.o \
|
||||
gfx/drivers_display/gfx_display_gl1.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_GL_CONTEXT), 1)
|
||||
ifeq ($(HAVE_GL_MODERN), 1)
|
||||
DEFINES += -DHAVE_OPENGL
|
||||
OBJ += gfx/drivers/gl.o \
|
||||
$(LIBRETRO_COMM_DIR)/gfx/gl_capabilities.o \
|
||||
gfx/drivers_font/gl_raster_font.o
|
||||
gfx/drivers_font/gl_raster_font.o \
|
||||
gfx/drivers_display/gfx_display_gl.o
|
||||
endif
|
||||
|
||||
OBJ += $(LIBRETRO_COMM_DIR)/glsym/rglgen.o
|
||||
@@ -1168,17 +1192,8 @@ ifeq ($(HAVE_GL_CONTEXT), 1)
|
||||
ifeq ($(HAVE_OPENGL1), 1)
|
||||
DEFINES += -DHAVE_OPENGL1
|
||||
OBJ += gfx/drivers/gl1.o \
|
||||
gfx/drivers_font/gl1_raster_font.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
ifeq ($(HAVE_GL_MODERN), 1)
|
||||
OBJ += menu/drivers_display/menu_display_gl.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_OPENGL1), 1)
|
||||
OBJ += menu/drivers_display/menu_display_gl1.o
|
||||
endif
|
||||
gfx/drivers_font/gl1_raster_font.o \
|
||||
gfx/drivers_display/gfx_display_gl1.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_VIDEOCORE), 1)
|
||||
@@ -1226,11 +1241,8 @@ ifeq ($(HAVE_GL_CONTEXT), 1)
|
||||
gfx/common/metal/MenuDisplay.o \
|
||||
gfx/common/metal_common.o \
|
||||
gfx/drivers/metal.o \
|
||||
gfx/drivers_font/metal_raster_font.o
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_metal.o
|
||||
endif
|
||||
gfx/drivers_font/metal_raster_font.o \
|
||||
gfx/drivers_display/gfx_display_metal.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_MPV), 1)
|
||||
@@ -1269,8 +1281,14 @@ endif
|
||||
ifeq ($(HAVE_EGL), 1)
|
||||
DEFINES += -DHAVE_EGL
|
||||
DEF_FLAGS += $(EGL_CFLAGS)
|
||||
LIBS += $(EGL_LIBS)
|
||||
OBJ += gfx/common/egl_common.o
|
||||
|
||||
ifeq ($(HAVE_DYNAMIC_EGL), 1)
|
||||
DEFINES += -DHAVE_DYNAMIC_EGL
|
||||
else
|
||||
LIBS += $(EGL_LIBS)
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_SDL2), 1)
|
||||
@@ -1284,6 +1302,12 @@ else ifeq ($(HAVE_SDL), 1)
|
||||
OBJ += gfx/drivers/sdl_gfx.o
|
||||
DEF_FLAGS += $(SDL_CFLAGS)
|
||||
LIBS += $(SDL_LIBS)
|
||||
else ifeq ($(HAVE_SDL_DINGUX), 1)
|
||||
HAVE_SDL_COMMON = 1
|
||||
DEF_FLAGS += -DHAVE_SDL -DHAVE_SDL_DINGUX
|
||||
OBJ += gfx/drivers/sdl_dingux_gfx.o
|
||||
DEF_FLAGS += $(SDL_DINGUX_CFLAGS)
|
||||
LIBS += $(SDL_DINGUX_LIBS)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_SDL_COMMON), 1)
|
||||
@@ -1314,7 +1338,8 @@ ifeq ($(HAVE_VULKAN), 1)
|
||||
OBJ += gfx/drivers/vulkan.o \
|
||||
gfx/common/vulkan_common.o \
|
||||
$(LIBRETRO_COMM_DIR)/vulkan/vulkan_symbol_wrapper.o \
|
||||
gfx/drivers_font/vulkan_raster_font.o
|
||||
gfx/drivers_font/vulkan_raster_font.o \
|
||||
gfx/drivers_display/gfx_display_vulkan.o
|
||||
|
||||
ifeq ($(HAVE_SLANG), 1)
|
||||
OBJ += gfx/drivers_shader/shader_vulkan.o
|
||||
@@ -1323,9 +1348,6 @@ ifeq ($(HAVE_VULKAN), 1)
|
||||
ifeq ($(HAVE_VULKAN_DISPLAY), 1)
|
||||
OBJ += gfx/drivers_context/khr_display_ctx.o
|
||||
endif
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_vulkan.o
|
||||
endif
|
||||
NEED_CXX_LINKER = 1
|
||||
DEFINES += -DHAVE_VULKAN
|
||||
INCLUDE_DIRS += -Igfx/include
|
||||
@@ -1334,10 +1356,8 @@ endif
|
||||
ifeq ($(HAVE_OPENGL_CORE), 1)
|
||||
OBJ += gfx/drivers/gl_core.o \
|
||||
gfx/drivers_font/gl_core_raster_font.o \
|
||||
gfx/drivers_shader/shader_gl_core.o
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_gl_core.o
|
||||
endif
|
||||
gfx/drivers_shader/shader_gl_core.o \
|
||||
gfx/drivers_display/gfx_display_gl_core.o
|
||||
|
||||
DEFINES += -DHAVE_OPENGL_CORE
|
||||
NEED_CXX_LINKER = 1
|
||||
@@ -1404,10 +1424,8 @@ ifeq ($(HAVE_D3D10), 1)
|
||||
HAVE_D3D_COMMON = 1
|
||||
OBJ += gfx/drivers/d3d10.o \
|
||||
gfx/common/d3d10_common.o \
|
||||
gfx/drivers_font/d3d10_font.o
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_d3d10.o
|
||||
endif
|
||||
gfx/drivers_font/d3d10_font.o \
|
||||
gfx/drivers_display/gfx_display_d3d10.o
|
||||
DEFINES += -DHAVE_D3D10
|
||||
endif
|
||||
|
||||
@@ -1415,10 +1433,8 @@ ifeq ($(HAVE_D3D11), 1)
|
||||
HAVE_D3D_COMMON = 1
|
||||
OBJ += gfx/drivers/d3d11.o \
|
||||
gfx/common/d3d11_common.o \
|
||||
gfx/drivers_font/d3d11_font.o
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_d3d11.o
|
||||
endif
|
||||
gfx/drivers_font/d3d11_font.o \
|
||||
gfx/drivers_display/gfx_display_d3d11.o
|
||||
DEFINES += -DHAVE_D3D11
|
||||
endif
|
||||
|
||||
@@ -1426,10 +1442,8 @@ ifeq ($(HAVE_D3D12), 1)
|
||||
HAVE_D3D_COMMON = 1
|
||||
OBJ += gfx/drivers/d3d12.o \
|
||||
gfx/common/d3d12_common.o \
|
||||
gfx/drivers_font/d3d12_font.o
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_d3d12.o
|
||||
endif
|
||||
gfx/drivers_font/d3d12_font.o \
|
||||
gfx/drivers_display/gfx_display_d3d12.o
|
||||
DEFINES += -DHAVE_D3D12
|
||||
endif
|
||||
|
||||
@@ -1467,20 +1481,14 @@ ifeq ($(HAVE_D3D8), 1)
|
||||
DEFINES += -DHAVE_D3D8
|
||||
OBJ += gfx/drivers/d3d8.o
|
||||
OBJ += gfx/common/d3d8_common.o
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_d3d8.o
|
||||
endif
|
||||
OBJ += gfx/drivers_display/gfx_display_d3d8.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_D3D9), 1)
|
||||
DEFINES += -DHAVE_D3D9
|
||||
OBJ += gfx/drivers/d3d9.o
|
||||
OBJ += gfx/common/d3d9_common.o
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_d3d9.o
|
||||
endif
|
||||
OBJ += gfx/drivers_display/gfx_display_d3d9.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_D3D_COMMON), 1)
|
||||
@@ -1516,8 +1524,9 @@ ifeq ($(HAVE_SHADERS_COMMON), 1)
|
||||
OBJ += gfx/video_shader_parse.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_GLSLANG), 1)
|
||||
DEFINES += -DHAVE_GLSLANG
|
||||
ifeq ($(HAVE_BUILTINGLSLANG), 1)
|
||||
NEED_CXX_LINKER = 1
|
||||
HAVE_GLSLANG_COMMON = 1
|
||||
|
||||
ifneq ($(findstring Win32,$(OS)),)
|
||||
GLSLANG_PLATFORM := Windows
|
||||
@@ -1525,17 +1534,17 @@ ifeq ($(HAVE_GLSLANG), 1)
|
||||
GLSLANG_PLATFORM := Unix
|
||||
endif
|
||||
|
||||
DEFINES += -DHAVE_BUILTINGLSLANG
|
||||
|
||||
INCLUDE_DIRS += \
|
||||
-I$(DEPS_DIR)/glslang/glslang/glslang/OSDependent/$(GLSLANG_PLATFORM) \
|
||||
-I$(DEPS_DIR)/glslang/glslang/OGLCompilersDLL \
|
||||
-I$(DEPS_DIR)/glslang/glslang \
|
||||
-I$(DEPS_DIR)/glslang/glslang/glslang/MachineIndependent \
|
||||
-I$(DEPS_DIR)/glslang/glslang/glslang/Public \
|
||||
-I$(DEPS_DIR)/glslang/glslang/SPIRV \
|
||||
-I$(DEPS_DIR)/glslang
|
||||
-I$(DEPS_DIR)/glslang/glslang/SPIRV
|
||||
|
||||
GLSLANG_SOURCES := \
|
||||
$(wildcard $(DEPS_DIR)/glslang/*.cpp) \
|
||||
gfx/drivers_shader/glslang.cpp \
|
||||
$(wildcard $(DEPS_DIR)/glslang/glslang/SPIRV/*.cpp) \
|
||||
$(wildcard $(DEPS_DIR)/glslang/glslang/glslang/GenericCodeGen/*.cpp) \
|
||||
$(wildcard $(DEPS_DIR)/glslang/glslang/OGLCompilersDLL/*.cpp) \
|
||||
@@ -1547,7 +1556,22 @@ ifeq ($(HAVE_GLSLANG), 1)
|
||||
DEFINES += -DENABLE_HLSL
|
||||
GLSLANG_SOURCES += $(wildcard $(DEPS_DIR)/glslang/glslang/hlsl/*.cpp)
|
||||
endif
|
||||
else ifeq ($(HAVE_GLSLANG),1)
|
||||
HAVE_GLSLANG_COMMON = 1
|
||||
GLSLANG_SOURCES := gfx/drivers_shader/glslang.cpp
|
||||
|
||||
# The order of these libs are somewhat specific
|
||||
LIBS += $(GLSLANG_LIBS) \
|
||||
$(GLSLANG_OSDEPENDENT_LIBS) \
|
||||
$(GLSLANG_OGLCOMPILER_LIBS) \
|
||||
$(GLSLANG_HLSL_LIBS) \
|
||||
$(GLSLANG_SPIRV_LIBS) \
|
||||
$(GLSLANG_SPIRV_TOOLS_OPT_LIBS) \
|
||||
$(GLSLANG_SPIRV_TOOLS_LIBS)
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_GLSLANG_COMMON), 1)
|
||||
DEFINES += -DHAVE_GLSLANG
|
||||
OBJ += $(GLSLANG_SOURCES:.cpp=.o)
|
||||
endif
|
||||
|
||||
@@ -1716,12 +1740,12 @@ endif
|
||||
OBJ += $(LIBRETRO_COMM_DIR)/formats/bmp/rbmp_encode.o \
|
||||
$(LIBRETRO_COMM_DIR)/formats/json/jsonsax.o \
|
||||
$(LIBRETRO_COMM_DIR)/formats/json/jsonsax_full.o \
|
||||
$(LIBRETRO_COMM_DIR)/formats/xml/rxml.o \
|
||||
$(LIBRETRO_COMM_DIR)/formats/image_transfer.o
|
||||
$(LIBRETRO_COMM_DIR)/formats/image_transfer.o \
|
||||
$(LIBRETRO_COMM_DIR)/formats/m3u/m3u_file.o
|
||||
|
||||
# Easter Egg
|
||||
ifeq ($(HAVE_EASTEREGG),1)
|
||||
DEFINES += -DHAVE_EASTEREGG
|
||||
# Gong embedded core
|
||||
ifeq ($(HAVE_GONG),1)
|
||||
DEFINES += -DHAVE_GONG
|
||||
OBJ += cores/libretro-gong/gong.o
|
||||
endif
|
||||
|
||||
@@ -1737,6 +1761,17 @@ ifeq ($(HAVE_V4L2),1)
|
||||
LIBS += $(V4L2_LIBS)
|
||||
endif
|
||||
|
||||
# Accessibility
|
||||
ifeq ($(HAVE_ACCESSIBILITY), 1)
|
||||
DEFINES += -DHAVE_ACCESSIBILITY
|
||||
|
||||
ifneq ($(findstring Win32,$(OS)),)
|
||||
LIBS += -lsapi
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
|
||||
# Things that depend on network availability
|
||||
|
||||
ifeq ($(HAVE_NETWORKING), 1)
|
||||
@@ -1746,16 +1781,19 @@ ifeq ($(HAVE_NETWORKING), 1)
|
||||
$(LIBRETRO_COMM_DIR)/net/net_http_parse.o \
|
||||
$(LIBRETRO_COMM_DIR)/net/net_socket.o \
|
||||
$(LIBRETRO_COMM_DIR)/net/net_natt.o \
|
||||
core_updater_list.o \
|
||||
network/net_http_special.o \
|
||||
tasks/task_http.o \
|
||||
tasks/task_netplay_lan_scan.o \
|
||||
tasks/task_netplay_nat_traversal.o \
|
||||
tasks/task_wifi.o \
|
||||
tasks/task_pl_thumbnail_download.o \
|
||||
tasks/task_netplay_find_content.o
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += tasks/task_pl_thumbnail_download.o \
|
||||
menu/menu_networking.o
|
||||
OBJ += \
|
||||
tasks/task_core_updater.o \
|
||||
menu/menu_networking.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_SSL), 1)
|
||||
@@ -1778,7 +1816,6 @@ ifeq ($(HAVE_NETWORKING), 1)
|
||||
# Netplay
|
||||
DEFINES += -DHAVE_NETWORK_CMD
|
||||
OBJ += network/netplay/netplay_delta.o \
|
||||
network/netplay/netplay_frontend.o \
|
||||
network/netplay/netplay_handshake.o \
|
||||
network/netplay/netplay_init.o \
|
||||
network/netplay/netplay_io.o \
|
||||
@@ -1917,9 +1954,7 @@ endif
|
||||
|
||||
ifneq ($(findstring FPGA,$(OS)),)
|
||||
OBJ += gfx/drivers/fpga_gfx.o \
|
||||
gfx/drivers_context/fpga_ctx.o \
|
||||
gfx/drivers_font/fpga_font.o \
|
||||
menu/drivers_display/menu_display_fpga.o
|
||||
gfx/drivers_context/fpga_ctx.o
|
||||
endif
|
||||
|
||||
ifneq ($(findstring Win32,$(OS)),)
|
||||
@@ -1931,20 +1966,26 @@ ifneq ($(findstring Win32,$(OS)),)
|
||||
ifeq ($(HAVE_GDI), 1)
|
||||
OBJ += gfx/drivers/gdi_gfx.o \
|
||||
gfx/drivers_context/gdi_ctx.o \
|
||||
gfx/drivers_font/gdi_font.o
|
||||
gfx/drivers_font/gdi_font.o \
|
||||
gfx/drivers_display/gfx_display_gdi.o
|
||||
LIBS += -lmsimg32
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_gdi.o
|
||||
endif
|
||||
endif
|
||||
LIBS += -lhid -lsetupapi
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_ANGLE), 1)
|
||||
OBJ += gfx/common/angle_common.o
|
||||
DEFINES += -DHAVE_ANGLE
|
||||
endif
|
||||
|
||||
# Record
|
||||
|
||||
ifeq ($(HAVE_FFMPEG), 1)
|
||||
OBJ += record/drivers/record_ffmpeg.o \
|
||||
cores/libretro-ffmpeg/ffmpeg_core.o
|
||||
cores/libretro-ffmpeg/ffmpeg_core.o \
|
||||
cores/libretro-ffmpeg/packet_buffer.o \
|
||||
cores/libretro-ffmpeg/video_buffer.o \
|
||||
$(LIBRETRO_COMM_DIR)/rthreads/tpool.o
|
||||
|
||||
LIBS += $(AVCODEC_LIBS) $(AVFORMAT_LIBS) $(AVUTIL_LIBS) $(SWSCALE_LIBS) $(SWRESAMPLE_LIBS) $(FFMPEG_LIBS)
|
||||
DEFINES += -DHAVE_FFMPEG
|
||||
@@ -1977,10 +2018,6 @@ ifneq ($(findstring DOS,$(OS)),)
|
||||
input/drivers/dos_input.o \
|
||||
input/drivers_joypad/dos_joypad.o \
|
||||
frontend/drivers/platform_dos.o
|
||||
|
||||
ifeq ($(HAVE_MENU_COMMON), 1)
|
||||
OBJ += menu/drivers_display/menu_display_vga.o
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_STATIC_VIDEO_FILTERS), 1)
|
||||
@@ -2036,6 +2073,20 @@ ifeq ($(HAVE_RPILED), 1)
|
||||
OBJ += led/drivers/led_rpi.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_MATH_NEON), 1)
|
||||
DEFINES += -DHAVE_MATH_NEON
|
||||
INCLUDE_DIRS += -I$(DEPS_DIR)/math-neon/source
|
||||
SOURCES := $(DEPS_DIR)/math-neon/source
|
||||
OBJ += $(patsubst %.c,%.o,$(foreach dir,$(SOURCES), $(wildcard $(dir)/*.c)))
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_VITAGL), 1)
|
||||
DEFINES += -DHAVE_VITAGL -DTRANSPOSE_MATRICES
|
||||
INCLUDE_DIRS += -I$(DEPS_DIR)/vitaGL/source
|
||||
SOURCES := $(DEPS_DIR)/vitaGL/source $(DEPS_DIR)/vitaGL/source/utils
|
||||
OBJ += $(patsubst %.c,%.o,$(foreach dir,$(SOURCES), $(wildcard $(dir)/*.c)))
|
||||
endif
|
||||
|
||||
##################################
|
||||
### Classic Platform specifics ###
|
||||
###############WIP################
|
||||
@@ -2073,4 +2124,13 @@ endif
|
||||
ifeq ($(HAVE_SEGAM), 1)
|
||||
DEFINES += -DHAVE_SEGAM
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_ODROIDGO2), 1)
|
||||
DEFINES += -DHAVE_ODROIDGO2
|
||||
LIBS += -lrga -lpng -lz
|
||||
INCLUDE_DIRS += -I$(DEPS_DIR)/libgo2/include
|
||||
OBJ += $(DEPS_DIR)/libgo2/src/display.o \
|
||||
$(DEPS_DIR)/libgo2/src/queue.o \
|
||||
gfx/drivers/oga_gfx.o
|
||||
endif
|
||||
##################################
|
||||
+1
-1
@@ -50,7 +50,7 @@ endif
|
||||
DEFINES :=
|
||||
ifeq ($(GRIFFIN_BUILD), 1)
|
||||
OBJ += griffin/griffin.o
|
||||
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_RGUI -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB -DHAVE_CC_RESAMPLER
|
||||
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_CONFIGFILE -DHAVE_RGUI -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB -DHAVE_CC_RESAMPLER
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA
|
||||
#DEFINES += -DHAVE_NETWORKING -DHAVE_CHEEVOS -DRC_DISABLE_LUA -DHAVE_SOCKET_LEGACY -DHAVE_THREADS
|
||||
#-DHAVE_SSL -DHAVE_BUILTINMBEDTLS -DMBEDTLS_SSL_DEBUG_ALL
|
||||
|
||||
@@ -24,11 +24,11 @@ OBJ := ctr/ctr_system.o \
|
||||
frontend/frontend_salamander.o \
|
||||
frontend/frontend_driver.o \
|
||||
frontend/drivers/platform_ctr.o \
|
||||
frontend/drivers/platform_null.o \
|
||||
libretro-common/encodings/encoding_utf.o \
|
||||
libretro-common/compat/compat_strcasestr.o \
|
||||
libretro-common/compat/fopen_utf8.o \
|
||||
libretro-common/file/file_path.o \
|
||||
libretro-common/file/file_path_io.o \
|
||||
libretro-common/string/stdstring.o \
|
||||
libretro-common/lists/string_list.o \
|
||||
libretro-common/lists/dir_list.o \
|
||||
|
||||
+189
@@ -0,0 +1,189 @@
|
||||
CC = /opt/gcw0-toolchain/usr/bin/mipsel-gcw0-linux-uclibc-gcc
|
||||
CXX = /opt/gcw0-toolchain/usr/bin/mipsel-gcw0-linux-uclibc-g++
|
||||
PACKAGE_NAME = retroarch
|
||||
|
||||
DEBUG ?= 0
|
||||
|
||||
HAVE_7ZIP = 1
|
||||
HAVE_AL = 1
|
||||
# this freezes when switching back from menu
|
||||
HAVE_ALSA = 0
|
||||
HAVE_BUILTINMBEDTLS = 1
|
||||
HAVE_BUILTINZLIB = 1
|
||||
HAVE_C99 = 1
|
||||
HAVE_CC = 1
|
||||
HAVE_CC_RESAMPLER = 1
|
||||
HAVE_CHD = 1
|
||||
HAVE_CHEEVOS = 1
|
||||
HAVE_COMMAND = 1
|
||||
HAVE_CXX = 1
|
||||
HAVE_DR_MP3 = 1
|
||||
HAVE_DYNAMIC = 1
|
||||
HAVE_EGL = 1
|
||||
HAVE_FREETYPE = 1
|
||||
HAVE_GDI = 1
|
||||
HAVE_GETADDRINFO = 1
|
||||
HAVE_GETOPT_LONG = 1
|
||||
HAVE_GLSL = 1
|
||||
HAVE_HID = 1
|
||||
HAVE_IBXM = 1
|
||||
HAVE_IMAGEVIEWER = 1
|
||||
HAVE_LANGEXTRA = 1
|
||||
HAVE_LIBRETRODB = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_MENU_COMMON = 1
|
||||
HAVE_GFX_WIDGETS = 1
|
||||
HAVE_MMAP = 1
|
||||
HAVE_NETWORKING = 1
|
||||
HAVE_OPENDINGUX_FBDEV = 1
|
||||
HAVE_OPENGL = 1
|
||||
HAVE_OPENGL1 = 0
|
||||
HAVE_OPENGLES = 1
|
||||
HAVE_OPENGLES3 = 0
|
||||
HAVE_OPENGL_CORE = 0
|
||||
HAVE_OPENSSL = 1
|
||||
HAVE_OVERLAY = 1
|
||||
HAVE_RBMP = 1
|
||||
HAVE_RJPEG = 1
|
||||
HAVE_RPILED = 1
|
||||
HAVE_RPNG = 1
|
||||
HAVE_RUNAHEAD = 1
|
||||
HAVE_SDL_DINGUX = 1
|
||||
HAVE_SHADERPIPELINE = 1
|
||||
HAVE_STB_FONT = 1
|
||||
HAVE_STB_IMAGE = 1
|
||||
HAVE_STB_VORBIS = 1
|
||||
HAVE_STDIN_CMD = 1
|
||||
HAVE_STRCASESTR = 1
|
||||
HAVE_THREADS = 1
|
||||
HAVE_TRANSLATE = 1
|
||||
HAVE_UDEV = 1
|
||||
HAVE_VIDEO_LAYOUT = 1
|
||||
HAVE_XMB = 1
|
||||
HAVE_ZLIB = 1
|
||||
HAVE_CONFIGFILE = 1
|
||||
|
||||
OS = Linux
|
||||
TARGET = retroarch
|
||||
OPK_NAME = retroarch.opk
|
||||
|
||||
OBJ :=
|
||||
LINK := $(CXX)
|
||||
DEF_FLAGS := -march=mips32 -mtune=mips32r2 -mhard-float -ffast-math -fomit-frame-pointer -fdata-sections
|
||||
DEF_FLAGS += -I. -Ideps -Ideps/stb -DDINGUX=1 -MMD
|
||||
DEF_FLAGS += -Wall -Wno-unused-variable
|
||||
DEF_FLAGS += -std=gnu99 -D_GNU_SOURCE
|
||||
LIBS := -ldl -lz -lrt -lcrypto -lssl -ludev -pthread
|
||||
CFLAGS :=
|
||||
CXXFLAGS := -fno-exceptions -fno-rtti -std=c++11 -D__STDC_CONSTANT_MACROS
|
||||
ASFLAGS :=
|
||||
LDFLAGS := -flto
|
||||
INCLUDE_DIRS = -I/opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/include
|
||||
LIBRARY_DIRS = -L/opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/lib
|
||||
DEFINES := -DRARCH_INTERNAL -D_FILE_OFFSET_BITS=64 -UHAVE_STATIC_DUMMY
|
||||
DEFINES += -DHAVE_C99=1 -DHAVE_CXX=1 -DHAVE_OPENDINGUX_FBDEV=1
|
||||
DEFINES += -DHAVE_GETOPT_LONG=1 -DHAVE_STRCASESTR=1 -DHAVE_DYNAMIC=1
|
||||
DEFINES += -DHAVE_AL=1
|
||||
DEFINES += -DHAVE_ONLINE_UPDATER=1
|
||||
DEFINES += -DHAVE_UPDATE_ASSETS=1
|
||||
DEFINES += -DHAVE_UDEV=1
|
||||
|
||||
SDL_DINGUX_CFLAGS := $(shell /opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/sdl-config --cflags)
|
||||
SDL_DINGUX_LIBS := $(shell /opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/sdl-config --libs)
|
||||
FREETYPE_CFLAGS := $(shell /opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/freetype-config --cflags)
|
||||
FREETYPE_LIBS := $(shell /opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/freetype-config --libs)
|
||||
AL_LIBS := -lopenal
|
||||
OPENGLES_CFLAGS := -DMESA_EGL_NO_X11_HEADERS
|
||||
OPENGLES_LIBS := -lGLESv2 -lEGL
|
||||
MMAP_LIBS = -lc
|
||||
|
||||
OBJDIR_BASE := obj-unix
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
OBJDIR := $(OBJDIR_BASE)/debug
|
||||
DEF_FLAGS += -O0 -g -DDEBUG -D_DEBUG
|
||||
else
|
||||
OBJDIR := $(OBJDIR_BASE)/release
|
||||
DEF_FLAGS += -O2 -DNDEBUG
|
||||
endif
|
||||
|
||||
include Makefile.common
|
||||
|
||||
DEF_FLAGS += $(INCLUDE_DIRS)
|
||||
CFLAGS += $(DEF_FLAGS)
|
||||
CXXFLAGS += $(DEF_FLAGS)
|
||||
|
||||
HEADERS = $(wildcard */*/*.h) $(wildcard */*.h) $(wildcard *.h)
|
||||
|
||||
Q := @
|
||||
|
||||
RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
|
||||
|
||||
define DESKTOP_ENTRY
|
||||
[Desktop Entry]
|
||||
Name=retroarch
|
||||
Comment=Retroarch
|
||||
Exec=retroarch
|
||||
Terminal=false
|
||||
Type=Application
|
||||
StartupNotify=true
|
||||
Icon=retroarch
|
||||
Categories=emulators;
|
||||
X-OD-NeedsDownscaling=true
|
||||
endef
|
||||
export DESKTOP_ENTRY
|
||||
|
||||
all: $(TARGET) opk
|
||||
|
||||
-include $(RARCH_OBJ:.o=.d)
|
||||
|
||||
SYMBOL_MAP := -Wl,-Map=output.map
|
||||
|
||||
$(TARGET): $(RARCH_OBJ)
|
||||
@$(if $(Q), $(shell echo echo LD $@),)
|
||||
$(LINK) -o $@ $(RARCH_OBJ) $(LIBS) $(LDFLAGS) $(LIBRARY_DIRS)
|
||||
|
||||
$(OBJDIR)/%.o: %.c
|
||||
@mkdir -p $(dir $@)
|
||||
@$(if $(Q), $(shell echo echo CC $<),)
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) $(DEFINES) -c -o $@ $<
|
||||
|
||||
$(OBJDIR)/%.o: %.cpp
|
||||
@mkdir -p $(dir $@)
|
||||
@$(if $(Q), $(shell echo echo CXX $<),)
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(DEFINES) -MMD -c -o $@ $<
|
||||
|
||||
$(OBJDIR)/%.o: %.m
|
||||
@mkdir -p $(dir $@)
|
||||
@$(if $(Q), $(shell echo echo OBJC $<),)
|
||||
$(CXX) $(OBJCFLAGS) $(DEFINES) -MMD -c -o $@ $<
|
||||
|
||||
.FORCE:
|
||||
|
||||
$(OBJDIR)/git_version.o: git_version.c .FORCE
|
||||
@mkdir -p $(dir $@)
|
||||
@$(if $(Q), $(shell echo echo CC $<),)
|
||||
$(CC) $(CFLAGS) $(DEFINES) -MMD -c -o $@ $<
|
||||
|
||||
$(OBJDIR)/%.o: %.S $(HEADERS)
|
||||
@mkdir -p $(dir $@)
|
||||
@$(if $(Q), $(shell echo echo AS $<),)
|
||||
$(CC) $(CFLAGS) $(ASFLAGS) $(DEFINES) -c -o $@ $<
|
||||
|
||||
clean:
|
||||
rm -rf $(OBJDIR_BASE)
|
||||
rm -f $(TARGET)
|
||||
rm -f *.d
|
||||
rm -rf $(OPK_NAME)
|
||||
|
||||
opk: $(TARGET)
|
||||
echo "$$DESKTOP_ENTRY" > default.gcw0.desktop
|
||||
rm -f $(OPK_NAME)
|
||||
cp media/ico_src/icon32.png retroarch.png
|
||||
mksquashfs retroarch default.gcw0.desktop retroarch.png $(OPK_NAME) -all-root -no-xattrs -noappend -no-exports
|
||||
rm -f default.gcw0.desktop retroarch.png
|
||||
|
||||
.PHONY: all clean opk
|
||||
|
||||
print-%:
|
||||
@echo '$*=$($*)'
|
||||
+8
-7
@@ -20,7 +20,7 @@ HAVE_RJPEG = 0
|
||||
HAVE_RPNG = 1
|
||||
HAVE_EMSCRIPTEN = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_MENU_WIDGETS = 1
|
||||
HAVE_GFX_WIDGETS = 1
|
||||
HAVE_RGUI = 1
|
||||
HAVE_SDL = 0
|
||||
HAVE_SDL2 = 0
|
||||
@@ -29,8 +29,9 @@ HAVE_SHADERPIPELINE = 1
|
||||
HAVE_STATIC_VIDEO_FILTERS = 1
|
||||
HAVE_STATIC_AUDIO_FILTERS = 1
|
||||
HAVE_STB_FONT = 1
|
||||
HAVE_CONFIGFILE = 1
|
||||
|
||||
MEMORY = 536870912
|
||||
MEMORY = 134217728
|
||||
|
||||
PRECISE_F32 = 1
|
||||
|
||||
@@ -39,8 +40,8 @@ OBJDIR := obj-emscripten
|
||||
#if you compile with SDL2 flag add this Emscripten flag "-s USE_SDL=2" to LDFLAGS:
|
||||
|
||||
LIBS := -s USE_ZLIB=1
|
||||
LDFLAGS := -L. --no-heap-copy -s USE_ZLIB=1 -s TOTAL_MEMORY=$(MEMORY) -s NO_EXIT_RUNTIME=0 -s FULL_ES2=1 \
|
||||
-s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_load_state', '_cmd_take_screenshot']" \
|
||||
LDFLAGS := -L. --no-heap-copy -s $(LIBS) -s TOTAL_MEMORY=$(MEMORY) -s NO_EXIT_RUNTIME=0 -s FULL_ES2=1 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['callMain']" \
|
||||
-s ALLOW_MEMORY_GROWTH=1 -s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_load_state', '_cmd_take_screenshot']" \
|
||||
--js-library emscripten/library_rwebaudio.js \
|
||||
--js-library emscripten/library_rwebcam.js \
|
||||
--js-library emscripten/library_errno_codes.js
|
||||
@@ -70,16 +71,16 @@ ifeq ($(DEBUG), 1)
|
||||
LDFLAGS += -O0 -g
|
||||
CFLAGS += -O0 -g
|
||||
else
|
||||
LDFLAGS += -O2 -s WASM=1
|
||||
LDFLAGS += -O3 -s WASM=1
|
||||
# WARNING: some optimizations can break some cores (ex: LTO breaks tyrquake)
|
||||
LDFLAGS += -s PRECISE_F32=$(PRECISE_F32)
|
||||
ifeq ($(LTO), 1)
|
||||
LDFLAGS += --llvm-lto 3
|
||||
endif
|
||||
CFLAGS += -O2
|
||||
CFLAGS += -O3
|
||||
endif
|
||||
|
||||
CFLAGS += -DHAVE_RPNG -Wall -I. -Ilibretro-common/include -std=gnu99 -s USE_ZLIB=1 \
|
||||
CFLAGS += -Wall -I. -Ilibretro-common/include -std=gnu99 $(LIBS) \
|
||||
-s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_take_screenshot']"
|
||||
|
||||
RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
|
||||
|
||||
+90
-12
@@ -75,15 +75,22 @@ ifeq ($(WHOLE_ARCHIVE_LINK), 1)
|
||||
WHOLE_END := -Wl,--no-whole-archive
|
||||
endif
|
||||
|
||||
STATIC_BUILD = 1
|
||||
ifneq (,$(findstring msvc,$(platform)))
|
||||
LIBS := $(WHOLE_START) $(WHOLE_END)
|
||||
else
|
||||
STATIC_BUILD = 0
|
||||
endif
|
||||
ifneq (,$(findstring unix,$(platform)))
|
||||
STATIC_BUILD = 0
|
||||
endif
|
||||
ifeq (qnx, $(platform))
|
||||
STATIC_BUILD = 0
|
||||
endif
|
||||
|
||||
ifeq ($(STATIC_BUILD), 0)
|
||||
LIBS := $(WHOLE_START) $(WHOLE_END)
|
||||
else
|
||||
LIBS := $(WHOLE_START) -lretro_$(platform) $(WHOLE_END)
|
||||
endif
|
||||
endif
|
||||
|
||||
libogc_platform :=
|
||||
|
||||
@@ -93,7 +100,7 @@ else ifeq ($(platform), wii)
|
||||
libogc_platform := 1
|
||||
endif
|
||||
|
||||
HAVE_MENU_WIDGETS := 1
|
||||
HAVE_GFX_WIDGETS := 1
|
||||
|
||||
# PS3
|
||||
ifeq ($(platform), ps3)
|
||||
@@ -197,6 +204,7 @@ else ifeq ($(libogc_platform), 1)
|
||||
HAVE_VIDEO_LAYOUT := 0
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
RARCH_CONSOLE = 1
|
||||
|
||||
ifeq ($(platform), wii)
|
||||
@@ -236,6 +244,7 @@ else ifeq ($(platform), xenon360)
|
||||
HAVE_THREADS := 1
|
||||
HAVE_GETOPT_LONG := 1
|
||||
RARCH_CONSOLE = 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
# PSP
|
||||
else ifeq ($(platform), psp1)
|
||||
@@ -260,6 +269,7 @@ else ifeq ($(platform), psp1)
|
||||
HAVE_KERNEL_PRX := 1
|
||||
#HAVE_LANGEXTRA := 1
|
||||
RARCH_CONSOLE = 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
ifeq ($(BUILD_PRX), 1)
|
||||
LDFLAGS += $(addprefix -L,$(PSPSDK)/lib) -specs=$(PSPSDK)/lib/prxspecs -Wl,-q,-T$(PSPSDK)/lib/linkfile.prx $(LDFLAGS)
|
||||
@@ -317,6 +327,7 @@ else ifeq ($(platform), vita)
|
||||
HAVE_THREADS := 1
|
||||
HAVE_LIBRETRODB := 1
|
||||
RARCH_CONSOLE = 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
else ifeq ($(platform), windows_msvc6_x86)
|
||||
HAVE_RPNG := 1
|
||||
HAVE_RJPEG := 1
|
||||
@@ -340,6 +351,7 @@ else ifeq ($(platform), windows_msvc6_x86)
|
||||
HAVE_DYLIB := 1
|
||||
HAVE_DYNAMIC := 1
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -383,6 +395,7 @@ else ifeq ($(platform), windows_msvc2003_x86)
|
||||
HAVE_DYLIB := 1
|
||||
HAVE_DYNAMIC := 1
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -432,6 +445,7 @@ else ifeq ($(platform), windows_msvc2005_x86)
|
||||
HAVE_DYNAMIC := 1
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_DIRECTX ?= 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -439,7 +453,7 @@ else ifeq ($(platform), windows_msvc2005_x86)
|
||||
CXX = cl.exe
|
||||
LD = link.exe
|
||||
|
||||
PLATCFLAGS += -D_WIN32 -D_WIN32_WINNT=0x0410 -D__STDC_CONSTANT_MACROS -D_MBCS -DHAVE_EASTEREGG -D__MMX__ -D__SSE__ -DHAVE_OPENGL -DHAVE_OPENGL1 -DHAVE_GLSL -DHAVE_SHADERPIPELINE -DHAVE_OZONE
|
||||
PLATCFLAGS += -D_WIN32 -D_WIN32_WINNT=0x0410 -D__STDC_CONSTANT_MACROS -D_MBCS -D__MMX__ -D__SSE__ -DHAVE_OPENGL -DHAVE_OPENGL1 -DHAVE_GLSL -DHAVE_SHADERPIPELINE -DHAVE_OZONE
|
||||
LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib msimg32.lib
|
||||
|
||||
PATH := $(shell IFS=$$'\n'; cygpath "$(VS80COMNTOOLS)../../VC/bin"):$(PATH)
|
||||
@@ -483,6 +497,7 @@ else ifneq (,$(findstring windows_msvc2010,$(platform)))
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_RUNAHEAD := 1
|
||||
HAVE_DIRECTX ?= 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -491,7 +506,7 @@ else ifneq (,$(findstring windows_msvc2010,$(platform)))
|
||||
LD = link.exe
|
||||
|
||||
PLATCFLAGS += -D_WIN32 -D__STDC_CONSTANT_MACROS -D_MBCS
|
||||
PLATCFLAGS += -D__i686__ -D__MMX__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DWIN32 -DHAVE_EASTEREGG -DHAVE_CDROM
|
||||
PLATCFLAGS += -D__i686__ -D__MMX__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES -DWIN32 -DHAVE_CDROM
|
||||
LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib iphlpapi.lib msimg32.lib
|
||||
|
||||
PlatformSuffix = $(subst windows_msvc2010_,,$(platform))
|
||||
@@ -557,6 +572,7 @@ else ifneq (,$(findstring windows_msvc2012,$(platform)))
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_RUNAHEAD := 1
|
||||
HAVE_DIRECTX ?= 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -565,7 +581,7 @@ else ifneq (,$(findstring windows_msvc2012,$(platform)))
|
||||
LD = link.exe
|
||||
|
||||
PLATCFLAGS += -D_WIN32 -D__STDC_CONSTANT_MACROS -D_MBCS
|
||||
PLATCFLAGS += -D__i686__ -D__MMX__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DWIN32 -DHAVE_EASTEREGG -DHAVE_CDROM
|
||||
PLATCFLAGS += -D__i686__ -D__MMX__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES -DWIN32 -DHAVE_CDROM
|
||||
LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib iphlpapi.lib
|
||||
|
||||
PlatformSuffix = $(subst windows_msvc2012_,,$(platform))
|
||||
@@ -635,6 +651,7 @@ else ifneq (,$(findstring windows_msvc2013,$(platform)))
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_RUNAHEAD := 1
|
||||
HAVE_DIRECTX ?= 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -643,7 +660,7 @@ else ifneq (,$(findstring windows_msvc2013,$(platform)))
|
||||
LD = link.exe
|
||||
|
||||
PLATCFLAGS += -D_WIN32 -D__STDC_CONSTANT_MACROS -D_MBCS
|
||||
PLATCFLAGS += -D__i686__ -D__MMX__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DWIN32 -DHAVE_EASTEREGG -DHAVE_CDROM
|
||||
PLATCFLAGS += -D__i686__ -D__MMX__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES -DWIN32 -DHAVE_CDROM
|
||||
LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib iphlpapi.lib
|
||||
|
||||
PlatformSuffix = $(subst windows_msvc2013_,,$(platform))
|
||||
@@ -713,6 +730,7 @@ else ifneq (,$(findstring windows_msvc2015,$(platform)))
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
HAVE_RUNAHEAD := 1
|
||||
HAVE_DIRECTX ?= 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
EXT_TARGET := $(TARGET_NAME).exe
|
||||
EXT_INTER_TARGET := $(TARGET_NAME).exe
|
||||
@@ -722,7 +740,7 @@ else ifneq (,$(findstring windows_msvc2015,$(platform)))
|
||||
|
||||
PLATCFLAGS += -utf-8
|
||||
PLATCFLAGS += -D_WIN32 -D__STDC_CONSTANT_MACROS -D_MBCS
|
||||
PLATCFLAGS += -D__i686__ -D__MMX__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DWIN32 -DHAVE_EASTEREGG -DHAVE_CDROM
|
||||
PLATCFLAGS += -D__i686__ -D__MMX__ -D__SSE__ -D_CRT_NONSTDC_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DHAVE_CC_RESAMPLER -DHAVE_GL_SYNC -DHAVE_GLSL -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_OPENGL -DHAVE_SHADERPIPELINE -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES -DWIN32 -DHAVE_CDROM
|
||||
LDFLAGS += shell32.lib user32.lib gdi32.lib comdlg32.lib winmm.lib ole32.lib iphlpapi.lib
|
||||
|
||||
PlatformSuffix = $(subst windows_msvc2015_,,$(platform))
|
||||
@@ -780,6 +798,44 @@ else ifneq (,$(findstring windows_msvc2015,$(platform)))
|
||||
export INCLUDE := $(INCLUDE);libretro-common\include;libretro-common\include\compat\msvc;gfx\include;deps;deps\stb
|
||||
export LIB := $(LIB)
|
||||
endif
|
||||
else ifeq (qnx,$(platform))
|
||||
HAVE_AUDIOMIXER := 1
|
||||
HAVE_RPNG := 1
|
||||
HAVE_RJPEG := 1
|
||||
HAVE_RBMP := 1
|
||||
HAVE_RTGA := 1
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_NETWORK_CMD := 1
|
||||
HAVE_NETPLAYDISCOVERY := 1
|
||||
HAVE_OVERLAY := 1
|
||||
HAVE_VIDEO_LAYOUT := 0
|
||||
HAVE_MATERIALUI := 1
|
||||
HAVE_XMB := 1
|
||||
HAVE_STB_FONT := 1
|
||||
HAVE_THREADS := 1
|
||||
HAVE_LIBRETRODB := 1
|
||||
HAVE_COMMAND := 1
|
||||
HAVE_STDIN_CMD := 1
|
||||
HAVE_CMD := 1
|
||||
HAVE_DYLIB := 1
|
||||
HAVE_DYNAMIC := 1
|
||||
HAVE_GRIFFIN_CPP := 0
|
||||
WANT_GLSLANG := 0
|
||||
HAVE_CONFIGFILE := 1
|
||||
CC=qcc -Vgcc_ntoarmv7le
|
||||
CXX=QCC -Vgcc_ntoarmv7le
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
LDFLAGS += -g
|
||||
endif
|
||||
|
||||
PLATCFLAGS += -DHAVE_SHADERPIPELINE -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_OZONE -DHAVE_CC_RESAMPLER -DHAVE_CHEEVOS -DRC_DISABLE_LUA -DHAVE_FBO -DHAVE_GL_SYNC -DHAVE_GLSLANG -DHAVE_BUILTINGLSLANG -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_RUNAHEAD -DHAVE_GFX_WIDGETS -DHAVE_CONFIGFILE -DHAVE_SPIRV_CROSS -DHAVE_STB_FONT -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES -DHAVE_XMB -DRARCH_INTERNAL -DWANT_GLSLANG -DHAVE_XCB -DHAVE_EGL -DHAVE_BB10 -DHAVE_GLSL -DHAVE_AL -DRARCH_MOBILE
|
||||
EXT_TARGET := $(TARGET_NAME)
|
||||
EXT_INTER_TARGET := $(TARGET_NAME)
|
||||
INCLUDE += -Ilibretro-common/include -Igfx/include -Ideps -Ideps/stb -Ideps/rcheevos/include -Ideps/SPIRV-Cross -Ideps/glslang -I.
|
||||
LIBS += -lEGL -lbps -lscreen -lsocket -lm -lGLESv2 -lOpenAL
|
||||
else ifneq (,$(findstring unix,$(platform)))
|
||||
HAVE_AUDIOMIXER := 1
|
||||
HAVE_RPNG := 1
|
||||
@@ -804,9 +860,10 @@ else ifneq (,$(findstring unix,$(platform)))
|
||||
HAVE_DYLIB := 1
|
||||
HAVE_DYNAMIC := 1
|
||||
HAVE_GRIFFIN_CPP := 1
|
||||
WANT_GLSLANG := 1
|
||||
WANT_GLSLANG := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
|
||||
PLATCFLAGS += -DHAVE_EASTEREGG -D__MMX__ -D__SSE__ -DHAVE_OPENGL -DHAVE_OPENGL1 -DHAVE_GLSL -DHAVE_SHADERPIPELINE -DHAVE_OZONE -DHAVE_CC_RESAMPLER -DHAVE_CHEEVOS -DRC_DISABLE_LUA -DHAVE_FBO -DHAVE_GL_SYNC -DHAVE_SLANG -DHAVE_GLSLANG -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_RUNAHEAD -DHAVE_MENU_WIDGETS -DHAVE_SPIRV_CROSS -DHAVE_STB_FONT -DHAVE_UPDATE_ASSETS -DHAVE_VULKAN -DHAVE_XMB -DRARCH_INTERNAL -DWANT_GLSLANG -DHAVE_X11 -DHAVE_XCB -DHAVE_UDEV -DHAVE_PULSE
|
||||
PLATCFLAGS += -D__MMX__ -D__SSE__ -DHAVE_OPENGL -DHAVE_OPENGL1 -DHAVE_GLSL -DHAVE_SHADERPIPELINE -DHAVE_OZONE -DHAVE_CC_RESAMPLER -DHAVE_CHEEVOS -DRC_DISABLE_LUA -DHAVE_FBO -DHAVE_GL_SYNC -DHAVE_SLANG -DHAVE_GLSLANG -DHAVE_BUILTINGLSLANG -DHAVE_IMAGEVIEWER -DHAVE_LANGEXTRA -DHAVE_RUNAHEAD -DHAVE_GFX_WIDGETS -DHAVE_CONFIGFILE -DHAVE_SPIRV_CROSS -DHAVE_STB_FONT -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES -DHAVE_VULKAN -DHAVE_XMB -DRARCH_INTERNAL -DWANT_GLSLANG -DHAVE_X11 -DHAVE_XCB -DHAVE_UDEV -DHAVE_PULSE
|
||||
EXT_TARGET := $(TARGET_NAME)
|
||||
EXT_INTER_TARGET := $(TARGET_NAME)
|
||||
INCLUDE += -Ilibretro-common/include -Igfx/include -Ideps -Ideps/stb -Ideps/rcheevos/include -Ideps/SPIRV-Cross -Ideps/glslang -I.
|
||||
@@ -972,6 +1029,10 @@ ifeq ($(HAVE_THREADS), 1)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_CONFIGFILE), 1)
|
||||
CFLAGS += -DHAVE_CONFIGFILE
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_RSOUND), 1)
|
||||
CFLAGS += -DHAVE_RSOUND
|
||||
endif
|
||||
@@ -1080,7 +1141,12 @@ $(APP_BOOTER_DIR)/app_booter.bin:
|
||||
$(MAKE) -C $(APP_BOOTER_DIR)
|
||||
|
||||
pkg: all
|
||||
ifeq ($(platform), wii)
|
||||
ifeq ($(platform), qnx)
|
||||
mkdir -p pkg/qnx/pkg
|
||||
cp -r $(EXT_TARGET) pkg/qnx/pkg/RetroArch
|
||||
cp -r media/canvas.png pkg/qnx/pkg/canvas.png
|
||||
cp -r media/retroarch-96x96.png pkg/qnx/pkg/retroarch-96x96.png
|
||||
else ifeq ($(platform), wii)
|
||||
cp -r $(EXT_TARGET) pkg/wii/CORE.dol
|
||||
else ifeq ($(platform), ngc)
|
||||
cp -r $(EXT_TARGET) pkg/ngc/CORE.dol
|
||||
@@ -1088,6 +1154,18 @@ else ifeq ($(platform), psp1)
|
||||
psp-fixup-imports$(EXT) $(EXT_TARGET)
|
||||
endif
|
||||
|
||||
ifeq ($(platform), qnx)
|
||||
retroarch-dev.bar: pkg
|
||||
ifeq ($(QNX_DEBUGTOKEN),)
|
||||
blackberry-nativepackager -package $@ -devMode pkg/qnx/bar-descriptor.xml -C pkg/qnx/pkg pkg/qnx/pkg/*
|
||||
else
|
||||
blackberry-nativepackager -package $@ -devMode -debugToken $(QNX_DEBUGTOKEN) pkg/qnx/bar-descriptor.xml -C pkg/qnx/pkg pkg/qnx/pkg/*
|
||||
endif
|
||||
|
||||
retroarch-release.bar: pkg
|
||||
blackberry-nativepackager -package $@ pkg/qnx/bar-descriptor.xml -C pkg/qnx/pkg pkg/qnx/pkg/*
|
||||
endif
|
||||
|
||||
shaders-checkout:
|
||||
@if test -d $(SHADER_CG_DIR); then \
|
||||
echo "[SHADER CHECKOUT::] Git pulling common-shaders..."; \
|
||||
|
||||
+5
-3
@@ -21,6 +21,7 @@ OBJ :=
|
||||
|
||||
DEFINES := -D__SWITCH__=1 -U__linux__ -U__linux -DGLM_FORCE_PURE=1 -DRARCH_CONSOLE -DRARCH_INTERNAL -DGLOBAL_CONFIG_DIR='"/switch"' -DHAVE_STB_VORBIS
|
||||
|
||||
HAVE_DR_MP3 = 1
|
||||
HAVE_TRANSLATE = 1
|
||||
HAVE_AUDIOMIXER = 1
|
||||
HAVE_CC_RESAMPLER = 1
|
||||
@@ -35,6 +36,7 @@ HAVE_LIBRETRODB = 1
|
||||
HAVE_STATIC_VIDEO_FILTERS = 1
|
||||
HAVE_STATIC_AUDIO_FILTERS = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_CONFIGFILE = 1
|
||||
HAVE_RUNAHEAD = 1
|
||||
HAVE_NETWORKING = 1
|
||||
HAVE_NETPLAYDISCOVERY = 1
|
||||
@@ -51,7 +53,7 @@ HAVE_SWITCH = 1
|
||||
HAVE_LIBNX = 1
|
||||
HAVE_OPENGL = 1
|
||||
HAVE_LANGEXTRA = 1
|
||||
HAVE_MENU_WIDGETS = 1
|
||||
HAVE_GFX_WIDGETS = 1
|
||||
|
||||
ifeq ($(HAVE_OPENGL), 1)
|
||||
HAVE_EGL = 1
|
||||
@@ -117,7 +119,7 @@ ARCH := -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE -mcpu=cortex-a57+crc+fp
|
||||
CFLAGS := -g -Wall -O3 -ffast-math -ffunction-sections \
|
||||
$(ARCH) $(DEFINES) $(INCLUDE_DIRS) -I$(LIBNX)/include -I$(PORTLIBS)/include/ -include $(LIBNX)/include/switch.h #$(shell $(PORTLIBS)/bin/freetype-config --cflags)
|
||||
|
||||
CFLAGS += $(INCLUDE) -DSWITCH=1 -DHAVE_LIBNX=1 -DNXLINK=1 -DHAVE_SHADERPIPELINE -DHAVE_UPDATE_ASSETS -DHAVE_STB_FONT #-DHAVE_FREETYPE
|
||||
CFLAGS += $(INCLUDE) -DSWITCH=1 -DHAVE_LIBNX=1 -DNXLINK=1 -DHAVE_SHADERPIPELINE -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES -DHAVE_STB_FONT #-DHAVE_FREETYPE
|
||||
|
||||
ifeq ($(strip $(HAVE_STATIC_DUMMY)),1)
|
||||
CFLAGS += -DHAVE_STATIC_DUMMY=1
|
||||
@@ -131,7 +133,7 @@ LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs $(ARCH) -Wl,--allow-multiple-de
|
||||
# add things from Makefile.common
|
||||
CFLAGS += $(DEF_FLAGS)
|
||||
|
||||
LIBS := -lswresample -lavformat -lavcodec -lavutil -lswscale -lstdc++ -lbz2 -lpng -lz -lnx -lm
|
||||
LIBS := -lswresample -lavformat -lavcodec -lavutil -lswscale -lstdc++ -lbz2 -lpng -lz -lnx -lvpx -lopus -llzma -lm
|
||||
|
||||
ifeq ($(HAVE_OPENGL), 1)
|
||||
LIBS := -lEGL -lglapi -ldrm_nouveau $(LIBS)
|
||||
|
||||
+2
-1
@@ -21,7 +21,7 @@ HAVE_D3D12 := 1
|
||||
HAVE_CG := 1
|
||||
HAVE_OPENGL := 1
|
||||
HAVE_OPENGL1 := 1
|
||||
HAVE_MENU_WIDGETS := 1
|
||||
HAVE_GFX_WIDGETS := 1
|
||||
HAVE_VULKAN := 1
|
||||
HAVE_XAUDIO := 1
|
||||
HAVE_XINPUT := 1
|
||||
@@ -31,6 +31,7 @@ HAVE_WINMM := 1
|
||||
|
||||
HAVE_RPNG := 1
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
HAVE_MENU := 1
|
||||
HAVE_RGUI := 1
|
||||
HAVE_XMB := 1
|
||||
|
||||
@@ -15,7 +15,7 @@ LDFLAGS = -L$(PNDSDK)/usr/lib -Wl,-rpath,$(PNDSDK)/usr/lib
|
||||
|
||||
LIBS = -lGLESv2 -lEGL -ldl -lm -lpthread -lrt -lasound
|
||||
DEFINES = -std=gnu99 -DHAVE_THREADS -DHAVE_GETOPT_LONG=1 -DHAVE_GRIFFIN -DRARCH_INTERNAL
|
||||
DEFINES += -D__ARM_ARCH_6__ -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_GLSL -DHAVE_DYNAMIC -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_OVERLAY -DHAVE_VIDEO_LAYOUT -DHAVE_ALSA -DHAVE_ZLIB -D__linux__
|
||||
DEFINES += -DHAVE_CONFIGFILE -D__ARM_ARCH_6__ -DHAVE_OPENGL -DHAVE_OPENGLES -DHAVE_OPENGLES2 -DHAVE_GLSL -DHAVE_DYNAMIC -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_OVERLAY -DHAVE_VIDEO_LAYOUT -DHAVE_ALSA -DHAVE_ZLIB -D__linux__
|
||||
DEFINES += $(INCDIRS)
|
||||
DEFINES += -D__OPENPANDORA__ -DPANDORA
|
||||
DEFINES += -marm -march=armv7-a -mcpu=cortex-a8 -mtune=cortex-a8 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize
|
||||
|
||||
+3
-2
@@ -16,7 +16,7 @@ DEFINES :=
|
||||
ifeq ($(GRIFFIN_BUILD), 1)
|
||||
OBJ += griffin/griffin.o
|
||||
DEFINES += -DHAVE_GRIFFIN=1
|
||||
DEFINES += -DHAVE_MENU -DHAVE_LIBRETRODB
|
||||
DEFINES += -DHAVE_MENU -DHAVE_LIBRETRODB -DHAVE_CONFIGFILE
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_CC_RESAMPLER
|
||||
ifeq ($(DEBUG), 1)
|
||||
DEFINES += -DHAVE_NETLOGGER
|
||||
@@ -34,13 +34,14 @@ else
|
||||
HAVE_VIDEO_LAYOUT := 0
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_EGL := 1
|
||||
HAVE_MENU_WIDGETS := 1
|
||||
HAVE_GFX_WIDGETS := 1
|
||||
HAVE_GLSL := 1
|
||||
HAVE_OPENGLES := 1
|
||||
HAVE_NETWORKING := 0
|
||||
HAVE_SOCKET_LEGACY := 0
|
||||
HAVE_MENU := 1
|
||||
HAVE_MENU_COMMON := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
HAVE_RGUI := 0
|
||||
HAVE_MATERIALUI := 0
|
||||
HAVE_XMB := 1
|
||||
|
||||
+1
-1
@@ -38,7 +38,7 @@ CFLAGS = $(OPTIMIZE_LV) $(DISABLE_WARNINGS) -ffast-math -fsingle-precision-const
|
||||
ASFLAGS = $(CFLAGS)
|
||||
|
||||
RARCH_DEFINES += -DPS2 -DUSE_IOP_CTYPE_MACRO -D_MIPS_ARCH_R5900 -DHAVE_ZLIB -DHAVE_NO_BUILTINZLIB -DHAVE_RPNG -DHAVE_RJPEG
|
||||
RARCH_DEFINES += -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP -DHAVE_CC_RESAMPLER
|
||||
RARCH_DEFINES += -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_CONFIGFILE -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP -DHAVE_CC_RESAMPLER
|
||||
|
||||
LIBDIR =
|
||||
LDFLAGS += -L$(PS2SDK)/ports/lib -L$(PS2DEV)/gsKit/lib -L$(PS2SDK)/ee/lib -L$(CDVD_DIR)/lib -L.
|
||||
|
||||
+3
-2
@@ -69,8 +69,9 @@ endif
|
||||
|
||||
PPU_SRCS = griffin/griffin.c
|
||||
|
||||
#DEFINES += -DHAVE_VIDEO_LAYOUT
|
||||
DEFINES += -DHAVE_MENU -DHAVE_MENU_WIDGETS -DHAVE_RGUI -DHAVE_XMB -DHAVE_OZONE -DHAVE_LIBRETRODB -DHAVE_MATERIALUI -DHAVE_SHADERPIPELINE -DRARCH_INTERNAL -DMSB_FIRST -DHAVE_OVERLAY -DHAVE_CC_RESAMPLER -DHAVE_STB_VORBIS -DHAVE_STB_FONT -DHAVE_RUNAHEAD -DHAVE_DR_MP3 -DHAVE_DR_FLAC
|
||||
DEFINES += -DHAVE_VIDEO_LAYOUT
|
||||
DEFINES += -DHAVE_MENU -DHAVE_CONFIGFILE -DHAVE_GFX_WIDGETS -DHAVE_RGUI -DHAVE_XMB -DHAVE_OZONE -DHAVE_LIBRETRODB -DHAVE_MATERIALUI -DHAVE_SHADERPIPELINE -DRARCH_INTERNAL -DMSB_FIRST -DHAVE_OVERLAY -DHAVE_CC_RESAMPLER -DHAVE_STB_VORBIS -DHAVE_STB_FONT -DHAVE_RUNAHEAD -DHAVE_DR_MP3 -DHAVE_DR_FLAC
|
||||
DEFINES += -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES
|
||||
|
||||
ifeq ($(DEX_BUILD), 1)
|
||||
DEFINES += -DDEX_BUILD
|
||||
|
||||
@@ -45,8 +45,8 @@ PPU_CXXFLAGS := $(PPU_OPTIMIZE_LV) $(INCFLAGS) $(DEFINES)
|
||||
PPU_SRCS = frontend/frontend_salamander.c \
|
||||
frontend/frontend_driver.c \
|
||||
frontend/drivers/platform_ps3.c \
|
||||
frontend/drivers/platform_null.c \
|
||||
libretro-common/file/file_path.c \
|
||||
libretro-common/file/file_path_io.c \
|
||||
libretro-common/lists/dir_list.c \
|
||||
libretro-common/lists/string_list.c \
|
||||
libretro-common/file/retro_dirent.c \
|
||||
|
||||
+31
-67
@@ -1,29 +1,39 @@
|
||||
#-------------------------------------------------------------------------------
|
||||
# Clear the implicit built in rules
|
||||
#-------------------------------------------------------------------------------
|
||||
.SUFFIXES:
|
||||
#-------------------------------------------------------------------------------
|
||||
ifeq ($(strip $(PSL1GHT)),)
|
||||
$(error "Please set PSL1GHT in your environment. export PSL1GHT=<path>")
|
||||
endif
|
||||
|
||||
include $(PSL1GHT)/ppu_rules
|
||||
|
||||
include version.all
|
||||
|
||||
DEBUG = 0
|
||||
HAVE_LOGGER = 0
|
||||
HAVE_FILE_LOGGER = 0
|
||||
HAVE_FILE_LOGGER = 1
|
||||
|
||||
PC_DEVELOPMENT_IP_ADDRESS = "192.168.1.7"
|
||||
PC_DEVELOPMENT_UDP_PORT = 3490
|
||||
|
||||
CC = $(PS3DEV)/ppu/bin/ppu-gcc
|
||||
CXX = $(PS3DEV)/ppu/bin/ppu-g++
|
||||
LD = $(PS3DEV)/ppu/bin/ppu-ld
|
||||
|
||||
CONTENT_ID_FULL = UP0001-SSNE10000_00-0000000000000001
|
||||
CONTENTID = UP0001-SSNE10001_00-0000000000000001
|
||||
APPID = SSNE10001
|
||||
TITLE = Retroarch PSL1GHT
|
||||
PACKAGE_BASENAME := retroarch_psl1ght
|
||||
|
||||
ELF_TARGET := retroarch_psl1ght.elf
|
||||
EBOOT_PATH = pkg/ps3/USRDIR/EBOOT.BIN
|
||||
CORE_PATH = pkg/ps3/USRDIR/cores/CORE.SELF
|
||||
SELF_TARGET := $(ELF_TARGET:.elf=.self)
|
||||
CORE_PATH = pkg/psl1ght/pkg/USRDIR/cores/CORE.SELF
|
||||
|
||||
INCLUDE := -I. -I$(PS3DEV)/ppu/include -Ips3/gcmgl/include/export -Ips3/include -Ideps -Ideps/stb -Ilibretro-common/include/compat/zlib
|
||||
LIBDIRS := -L$(PS3DEV)/ppu/lib -L$(PS3DEV)/portlibs/ppu/lib -L.
|
||||
INCLUDE += -I. -Ips3/gcmgl/include/export -Ips3/include -Ideps -Ideps/stb -Ilibretro-common/include/compat/zlib -Ilibretro-common/include $(LIBPSL1GHT_INC) -Iinclude
|
||||
LIBDIRS += -L.
|
||||
|
||||
MACHDEP := -D__CELLOS_LV2__ -D__PSL1GHT__
|
||||
MACHDEP := -D__CELLOS_LV2__ -D__PSL1GHT__ -mcpu=cell
|
||||
CFLAGS += -Wall $(MACHDEP) $(INCLUDE)
|
||||
LDFLAGS := $(MACHDEP)
|
||||
LIBS := -lrgl_ps3 -lretro_psl1ght -laudio -lrsx -lgcm_sys -lnet -lio -lsysutil -lsysmodule -lm -ljpgdec -lpngdec -llv2 -lnet -lnetctl
|
||||
LIBS := -lretro_psl1ght -laudio -lrsx -lgcm_sys -lnet -lio -lsysutil -lsysmodule -lm -ljpgdec -lpngdec -llv2 -lnet -lnetctl
|
||||
|
||||
# system platform
|
||||
system_platform = unix
|
||||
@@ -38,46 +48,10 @@ endif
|
||||
|
||||
PKG_SCRIPT = tools/ps3/ps3py/pkg.py
|
||||
ifeq ($(shell uname), Linux)
|
||||
PKG_FINALIZE = package_finalize
|
||||
MAKE_SELF_WC = make_self_wc
|
||||
MAKE_SELF = make_self_npdrm
|
||||
PYTHON2 = python2
|
||||
GIT = git
|
||||
else
|
||||
PKG_FINALIZE = package_finalize.exe
|
||||
MAKE_SELF_WC = make_self_wc.exe
|
||||
MAKE_SELF = make_self_npdrm.exe
|
||||
PYTHON2 = python2.exe
|
||||
GIT = git.exe
|
||||
endif
|
||||
# system platform
|
||||
system_platform = unix
|
||||
ifeq ($(shell uname -a),)
|
||||
EXE_EXT = .exe
|
||||
system_platform = win
|
||||
else ifneq ($(findstring Darwin,$(shell uname -a)),)
|
||||
system_platform = osx
|
||||
else ifneq ($(findstring MINGW,$(shell uname -a)),)
|
||||
system_platform = win
|
||||
endif
|
||||
|
||||
PKG_SCRIPT = tools/ps3/ps3py/pkg.py
|
||||
ifeq ($(shell uname), Linux)
|
||||
PKG_FINALIZE = package_finalize
|
||||
MAKE_SELF_WC = make_self_wc
|
||||
MAKE_SELF = make_self_npdrm
|
||||
PYTHON2 = python2
|
||||
GIT = git
|
||||
else
|
||||
PKG_FINALIZE = package_finalize.exe
|
||||
MAKE_SELF_WC = make_self_wc.exe
|
||||
MAKE_SELF = make_self_npdrm.exe
|
||||
PYTHON2 = python2.exe
|
||||
GIT = git.exe
|
||||
endif
|
||||
|
||||
MAKE_FSELF_NPDRM = $(CELL_SDK)/host-win32/bin/make_fself_npdrm.exe
|
||||
MAKE_PACKAGE_NPDRM = $(CELL_SDK)/host-win32/bin/make_package_npdrm.exe
|
||||
|
||||
OBJ = griffin/griffin.o
|
||||
|
||||
@@ -91,8 +65,8 @@ endif
|
||||
|
||||
SHARED_FLAGS :=
|
||||
|
||||
#SHARED_FLAGS += -DHAVE_VIDEO_LAYOUT
|
||||
SHARED_FLAGS += -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_GCMGL -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_MOUSE -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_GRIFFIN=1 -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -Wno-char-subscripts -DHAVE_CC_RESAMPLER
|
||||
SHARED_FLAGS += -DHAVE_VIDEO_LAYOUT
|
||||
SHARED_FLAGS += -DHAVE_MENU -DHAVE_CONFIGFILE -DRARCH_CONSOLE -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_GCMGL -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_MOUSE -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_GRIFFIN=1 -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -Wno-char-subscripts -DHAVE_CC_RESAMPLER -DRARCH_INTERNAL -DHAVE_MULTIMAN -DHAVE_RGUI
|
||||
CFLAGS += -std=gnu99 $(SHARED_FLAGS)
|
||||
CXXFLAGS += $(SHARED_FLAGS)
|
||||
|
||||
@@ -103,28 +77,18 @@ else
|
||||
CXXFLAGS += -03 -g
|
||||
endif
|
||||
|
||||
all: $(ELF_TARGET)
|
||||
all: $(SELF_TARGET)
|
||||
|
||||
$(ELF_TARGET): $(OBJ)
|
||||
$(CXX) -o $@ $(LDFLAGS) $(LIBDIRS) $(OBJ) $(LIBS)
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
create-core: $(SELF_TARGET)
|
||||
cp $(SELF_TARGET) $(CORE_PATH)
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
create-npdrm-core:
|
||||
$(MAKE_FSELF_NPDRM) $(ELF_TARGET) $(CORE_PATH)
|
||||
|
||||
create-core:
|
||||
$(MAKE_SELF_WC) $(ELF_TARGET) $(CORE_PATH)
|
||||
|
||||
pkg: $(ELF_TARGET) create-npdrm-core
|
||||
$(MAKE_PACKAGE_NPDRM) pkg/ps3/package.conf ps3/pkg
|
||||
|
||||
pkg-signed: $(ELF_TARGET) create-core
|
||||
$(PYTHON2) $(PKG_SCRIPT) --contentid $(CONTENT_ID_FULL) pkg/ps3 retroarch-ps3-cfw-$(PACKAGE_VERSION).pkg
|
||||
pkg: create-core
|
||||
$(PKG) --contentid $(CONTENTID) pkg/psl1ght/pkg/ $(PACKAGE_BASENAME).pkg
|
||||
# cp $(PACKAGE_BASENAME).pkg $(PACKAGE_BASENAME).gnpdrm.pkg
|
||||
# $(PACKAGE_FINALIZE) $(PACKAGE_BASENAME).gnpdrm.pkg
|
||||
|
||||
clean:
|
||||
rm -f $(ELF_TARGET)
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
#-------------------------------------------------------------------------------
|
||||
# Clear the implicit built in rules
|
||||
#-------------------------------------------------------------------------------
|
||||
.SUFFIXES:
|
||||
#-------------------------------------------------------------------------------
|
||||
ifeq ($(strip $(PSL1GHT)),)
|
||||
$(error "Please set PSL1GHT in your environment. export PSL1GHT=<path>")
|
||||
endif
|
||||
|
||||
include $(PSL1GHT)/ppu_rules
|
||||
|
||||
include version.all
|
||||
|
||||
DEBUG = 0
|
||||
HAVE_LOGGER = 0
|
||||
HAVE_FILE_LOGGER = 1
|
||||
|
||||
PC_DEVELOPMENT_IP_ADDRESS = "192.168.1.7"
|
||||
PC_DEVELOPMENT_UDP_PORT = 3490
|
||||
|
||||
CONTENTID = UP0001-SSNE10001_00-0000000000000001
|
||||
APPID = SSNE10001
|
||||
TITLE = Retroarch PSL1GHT
|
||||
PACKAGE_BASENAME := retroarch_psl1ght
|
||||
|
||||
ELF_TARGET := retroarch_psl1ght_salamander.elf
|
||||
ELF_TARGET_NONSTRIPPED := retroarch_psl1ght_salamander_nonstripped.elf
|
||||
EBOOT_PATH = pkg/psl1ght/pkg/USRDIR/EBOOT.BIN
|
||||
|
||||
INCLUDE += -I. -Ips3/gcmgl/include/export -Ips3/include -Ideps -Ideps/stb -Ilibretro-common/include/compat/zlib -Ilibretro-common/include $(LIBPSL1GHT_INC) -Iinclude
|
||||
LIBDIRS += -L.
|
||||
|
||||
MACHDEP := -D__CELLOS_LV2__ -D__PSL1GHT__ -mcpu=cell -mhard-float -fmodulo-sched -ffunction-sections -fdata-sections
|
||||
CFLAGS += -Wall $(MACHDEP) $(INCLUDE)
|
||||
LDFLAGS := $(MACHDEP)
|
||||
LIBS := -lgcm_sys -lrsx -lsysutil -lio -lnet -lsysmodule -lrt -llv2 -lm
|
||||
|
||||
# system platform
|
||||
system_platform = unix
|
||||
ifeq ($(shell uname -a),)
|
||||
EXE_EXT = .exe
|
||||
system_platform = win
|
||||
else ifneq ($(findstring Darwin,$(shell uname -a)),)
|
||||
system_platform = osx
|
||||
else ifneq ($(findstring MINGW,$(shell uname -a)),)
|
||||
system_platform = win
|
||||
endif
|
||||
|
||||
PKG_SCRIPT = tools/ps3/ps3py/pkg.py
|
||||
ifeq ($(shell uname), Linux)
|
||||
GIT = git
|
||||
else
|
||||
GIT = git.exe
|
||||
endif
|
||||
|
||||
OBJ = frontend/frontend_salamander.o \
|
||||
frontend/frontend_driver.o \
|
||||
frontend/drivers/platform_ps3.o \
|
||||
libretro-common/file/file_path.o \
|
||||
libretro-common/file/file_path_io.o \
|
||||
libretro-common/lists/dir_list.o \
|
||||
libretro-common/lists/string_list.o \
|
||||
libretro-common/file/retro_dirent.o \
|
||||
libretro-common/hash/rhash.o \
|
||||
libretro-common/string/stdstring.o \
|
||||
libretro-common/encodings/encoding_utf.o \
|
||||
libretro-common/compat/compat_strl.o \
|
||||
libretro-common/compat/compat_strcasestr.o \
|
||||
libretro-common/compat/fopen_utf8.o \
|
||||
libretro-common/streams/file_stream.o \
|
||||
libretro-common/vfs/vfs_implementation.o \
|
||||
libretro-common/file/config_file.o \
|
||||
file_path_str.o \
|
||||
verbosity.o
|
||||
|
||||
ifeq ($(HAVE_LOGGER), 1)
|
||||
CFLAGS += -DHAVE_LOGGER
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_FILE_LOGGER), 1)
|
||||
CFLAGS += -DHAVE_FILE_LOGGER
|
||||
endif
|
||||
|
||||
SHARED_FLAGS :=
|
||||
|
||||
SHARED_FLAGS += -DHAVE_VIDEO_LAYOUT
|
||||
SHARED_FLAGS += -DHAVE_MENU -DHAVE_CONFIGFILE -DRARCH_CONSOLE -DHAVE_OVERLAY -DHAVE_HEADSET -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_GCMGL -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_MOUSE -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_GRIFFIN=1 -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -Wno-char-subscripts -DHAVE_CC_RESAMPLER -DHAVE_MULTIMAN -DHAVE_RGUI -DIS_SALAMANDER
|
||||
CFLAGS += -std=gnu99 $(SHARED_FLAGS)
|
||||
CXXFLAGS += $(SHARED_FLAGS)
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
CFLAGS += -O0 -g
|
||||
else
|
||||
CFLAGS += -O3 -g
|
||||
CXXFLAGS += -03 -g
|
||||
endif
|
||||
|
||||
all: create-salamander
|
||||
|
||||
$(ELF_TARGET_NONSTRIPPED): $(OBJ)
|
||||
$(CXX) -o $@ $(LDFLAGS) $(LIBDIRS) $(OBJ) $(LIBS)
|
||||
|
||||
$(ELF_TARGET): $(ELF_TARGET_NONSTRIPPED)
|
||||
$(STRIP) $< -o $@
|
||||
$(SPRX) $@
|
||||
|
||||
create-salamander: $(ELF_TARGET)
|
||||
$(SELF_NPDRM) $(ELF_TARGET) $(EBOOT_PATH) $(CONTENTID)
|
||||
|
||||
pkg: create-salamander
|
||||
$(PKG) --contentid $(CONTENTID) pkg/psl1ght/pkg/ $(PACKAGE_BASENAME).pkg
|
||||
# cp $(PACKAGE_BASENAME).pkg $(PACKAGE_BASENAME).gnpdrm.pkg
|
||||
# $(PACKAGE_FINALIZE) $(PACKAGE_BASENAME).gnpdrm.pkg
|
||||
|
||||
clean:
|
||||
rm -f $(ELF_TARGET)
|
||||
rm -f $(OBJ)
|
||||
|
||||
.PHONY: clean
|
||||
+16
-1
@@ -25,7 +25,7 @@ INCDIR = deps deps/stb deps/7zip deps/pthreads deps/pthreads/platform/psp deps/p
|
||||
CFLAGS = $(OPTIMIZE_LV) -G0 -std=gnu99 -ffast-math -fsingle-precision-constant
|
||||
ASFLAGS = $(CFLAGS)
|
||||
|
||||
RARCH_DEFINES = -DPSP -D_MIPS_ARCH_ALLEGREX -DHAVE_LANGEXTRA -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP -DHAVE_CC_RESAMPLER
|
||||
RARCH_DEFINES = -DPSP -D_MIPS_ARCH_ALLEGREX -DHAVE_LANGEXTRA -DHAVE_ZLIB -DHAVE_AUDIOMIXER -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_GRIFFIN=1 -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_MENU -DHAVE_CONFIGFILE -DHAVE_RGUI -DHAVE_FILTERS_BUILTIN -DHAVE_7ZIP -DHAVE_CC_RESAMPLER
|
||||
|
||||
LIBDIR =
|
||||
LDFLAGS =
|
||||
@@ -58,3 +58,18 @@ OBJS = $(PSP_OBJECTS)
|
||||
|
||||
PSPSDK=$(shell psp-config --pspsdk-path)
|
||||
include $(PSPSDK)/lib/build.mak
|
||||
|
||||
pspsh-debug:
|
||||
pspsh -e reset
|
||||
read -p "Start debugger in VSCode and press any key to continue... \n" -n1 -s
|
||||
pspsh -e debug ./retroarchpsp.prx
|
||||
pspsh
|
||||
|
||||
pspsh-run:
|
||||
pspsh -e reset
|
||||
pspsh -e ./retroarchpsp.prx
|
||||
pspsh
|
||||
|
||||
debug: clean all pspsh-debug
|
||||
|
||||
run: clean all pspsh-run
|
||||
@@ -35,8 +35,8 @@ PSP_EBOOT_PIC1 = pkg/psp1/PIC1.PNG
|
||||
OBJS = frontend/frontend_salamander.o \
|
||||
frontend/frontend_driver.o \
|
||||
frontend/drivers/platform_psp.o \
|
||||
frontend/drivers/platform_null.o \
|
||||
libretro-common/file/file_path.o \
|
||||
libretro-common/file/file_path_io.o \
|
||||
libretro-common/string/stdstring.o \
|
||||
libretro-common/lists/string_list.o \
|
||||
libretro-common/lists/dir_list.o \
|
||||
|
||||
@@ -13,6 +13,7 @@ ifeq ($(GRIFFIN_BUILD), 1)
|
||||
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_NEON -DHAVE_MATERIALUI -DHAVE_LIBRETRODB -DHAVE_CC_RESAMPLER
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA
|
||||
DEFINES += -DHAVE_RUNAHEAD -DHAVE_DYNAMIC
|
||||
DEFINES += -DHAVE_CONFIGFILE
|
||||
else
|
||||
HAVE_AUDIOMIXER = 1
|
||||
HAVE_CC_RESAMPLER = 1
|
||||
@@ -30,6 +31,7 @@ else
|
||||
HAVE_STATIC_VIDEO_FILTERS = 1
|
||||
HAVE_STATIC_AUDIO_FILTERS = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_CONFIGFILE = 1
|
||||
HAVE_RUNAHEAD = 1
|
||||
HAVE_DYNAMIC = 1
|
||||
|
||||
|
||||
+11
-4
@@ -11,21 +11,24 @@ PC_DEVELOPMENT_UDP_PORT =
|
||||
|
||||
OBJ :=
|
||||
|
||||
DEFINES :=
|
||||
DEFINES := -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS
|
||||
INCDIRS :=
|
||||
|
||||
ifeq ($(GRIFFIN_BUILD), 1)
|
||||
OBJ += griffin/griffin.o
|
||||
DEFINES += -DHAVE_GRIFFIN=1
|
||||
DEFINES += -DHAVE_NEON -DHAVE_MENU -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB DEFINES -DHAVE_KEYMAPPER
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_CC_RESAMPLER -DHAVE_UPDATE_ASSETS
|
||||
DEFINES += -DHAVE_NEON -DHAVE_MENU -DHAVE_CONFIGFILE -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB DEFINES -DHAVE_KEYMAPPER
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_CC_RESAMPLER
|
||||
ifeq ($(DEBUG), 1)
|
||||
DEFINES += -DHAVE_NETLOGGER
|
||||
endif
|
||||
INCDIRS += -I. -Ideps/7zip -Ilibretro-common/include -Ilibretro-common/include/compat/zlib -Ideps/stb
|
||||
else
|
||||
|
||||
HAVE_UPDATE_ASSETS := 1
|
||||
HAVE_ONLINE_UPDATER := 1
|
||||
HAVE_NEON := 1
|
||||
HAVE_MATH_NEON := 1
|
||||
HAVE_FILTERS_BUILTIN := 1
|
||||
HAVE_LANGEXTRA := 1
|
||||
HAVE_RPNG := 1
|
||||
@@ -35,10 +38,13 @@ else
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_VITA2D := 1
|
||||
HAVE_VITAGL := 1
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_SOCKET_LEGACY := 1
|
||||
HAVE_MENU := 1
|
||||
HAVE_MENU_COMMON := 1
|
||||
HAVE_GFX_WIDGETS := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
HAVE_OVERLAY := 1
|
||||
HAVE_VIDEO_LAYOUT := 0
|
||||
HAVE_MATERIALUI := 1
|
||||
@@ -53,6 +59,7 @@ else
|
||||
RARCH_CONSOLE := 1
|
||||
HAVE_STATIC_VIDEO_FILTERS = 1
|
||||
HAVE_STATIC_AUDIO_FILTERS = 1
|
||||
HAVE_AUDIOMIXER := 1
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
HAVE_NETLOGGER = 1
|
||||
@@ -114,7 +121,7 @@ CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions
|
||||
|
||||
VITA_LIBS := -lSceDisplay_stub -lSceGxm_stub -lSceNet_stub -lSceNetCtl_stub -lSceAppUtil_stub \
|
||||
-lSceSysmodule_stub -lSceCtrl_stub -lSceHid_stub -lSceTouch_stub -lSceAudio_stub \
|
||||
-lScePower_stub -lSceRtc_stub -lSceCommonDialog_stub -lScePgf_stub \
|
||||
-lScePower_stub -lSceRtc_stub -lSceCommonDialog_stub -lScePgf_stub -lSceMotion_stub \
|
||||
-lSceFiber_stub -lSceMotion_stub -lSceAppMgr_stub -lpthread -lpng -lz
|
||||
|
||||
LIBS := $(WHOLE_START) -lretro_vita $(WHOLE_END) $(VITA_LIBS) -lm -lc
|
||||
|
||||
@@ -23,7 +23,7 @@ LIBDIR =
|
||||
LDFLAGS =
|
||||
LIBS = -lSceDisplay_stub -lSceGxm_stub -lSceNet_stub -lSceNetCtl_stub -lSceAppUtil_stub\
|
||||
-lSceSysmodule_stub -lSceCtrl_stub -lSceHid_stub -lSceAudio_stub -lSceFiber_stub\
|
||||
-lScePower_stub -lSceRtc_stub -lSceCommonDialog_stub -lScePgf_stub \
|
||||
-lScePower_stub -lSceRtc_stub -lSceCommonDialog_stub -lScePgf_stub -lSceMotion_stub \
|
||||
-lSceMotion_stub -lSceAppMgr_stub -lfreetype -lpng -lm -lc
|
||||
|
||||
ifeq ($(HAVE_FILE_LOGGER), 1)
|
||||
@@ -35,8 +35,8 @@ CFLAGS += $(RARCH_DEFINES)
|
||||
OBJS = frontend/frontend_salamander.o \
|
||||
frontend/frontend_driver.o \
|
||||
frontend/drivers/platform_psp.o \
|
||||
frontend/drivers/platform_null.o \
|
||||
libretro-common/file/file_path.o \
|
||||
libretro-common/file/file_path_io.o \
|
||||
libretro-common/string/stdstring.o \
|
||||
libretro-common/lists/string_list.o \
|
||||
libretro-common/lists/dir_list.o \
|
||||
|
||||
@@ -55,8 +55,8 @@ OBJ = frontend/frontend_salamander.o \
|
||||
frontend/frontend_driver.o \
|
||||
frontend/drivers/platform_gx.o \
|
||||
frontend/drivers/platform_wii.o \
|
||||
frontend/drivers/platform_null.o \
|
||||
libretro-common/file/file_path.o \
|
||||
libretro-common/file/file_path_io.o \
|
||||
libretro-common/hash/rhash.o \
|
||||
libretro-common/string/stdstring.o \
|
||||
libretro-common/lists/string_list.o \
|
||||
|
||||
+5
-2
@@ -53,11 +53,11 @@ ifeq ($(SALAMANDER_BUILD),1)
|
||||
OBJ += frontend/frontend_salamander.o
|
||||
OBJ += frontend/frontend_driver.o
|
||||
OBJ += frontend/drivers/platform_wiiu.o
|
||||
OBJ += frontend/drivers/platform_null.o
|
||||
OBJ += libretro-common/encodings/encoding_utf.o
|
||||
OBJ += libretro-common/compat/compat_strcasestr.o
|
||||
OBJ += libretro-common/compat/fopen_utf8.o
|
||||
OBJ += libretro-common/file/file_path.o
|
||||
OBJ += libretro-common/file/file_path_io.o
|
||||
OBJ += libretro-common/string/stdstring.o
|
||||
OBJ += libretro-common/lists/string_list.o
|
||||
OBJ += libretro-common/lists/dir_list.o
|
||||
@@ -74,7 +74,9 @@ ifeq ($(SALAMANDER_BUILD),1)
|
||||
else
|
||||
DEFINES += -DRARCH_INTERNAL
|
||||
DEFINES += -DHAVE_KEYMAPPER
|
||||
DEFINES += -DHAVE_ONLINE_UPDATER
|
||||
DEFINES += -DHAVE_UPDATE_ASSETS
|
||||
DEFINES += -DHAVE_UPDATE_CORES
|
||||
DEFINES += -DHAVE_FILTERS_BUILTIN
|
||||
DEFINES += -DHAVE_SLANG
|
||||
DEFINES += -DHAVE_SHADERPIPELINE
|
||||
@@ -105,7 +107,7 @@ endif
|
||||
INCDIRS += -Ideps/SPIRV-Cross
|
||||
|
||||
DEFINES += -DHAVE_AUDIOMIXER
|
||||
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_RGUI -DHAVE_LIBRETRODB
|
||||
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_CONFIGFILE -DHAVE_RGUI -DHAVE_LIBRETRODB
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_CC_RESAMPLER
|
||||
DEFINES += -DHAVE_SPIRV_CROSS -DHAVE_SLANG
|
||||
DEFINES += -DHAVE_STB_FONT -DHAVE_STB_VORBIS -DHAVE_LANGEXTRA -DHAVE_LIBRETRODB -DHAVE_NETWORKING -DHAVE_NETPLAYDISCOVERY
|
||||
@@ -124,6 +126,7 @@ endif
|
||||
HAVE_RPNG = 1
|
||||
HAVE_RJPEG = 1
|
||||
HAVE_RBMP = 1
|
||||
HAVE_CONFIGFILE = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_RGUI = 1
|
||||
HAVE_7ZIP = 1
|
||||
|
||||
@@ -14,6 +14,7 @@ HAVE_STDIN_CMD = 1
|
||||
HAVE_COMMAND = 1
|
||||
HAVE_THREADS = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_CONFIGFILE = 1
|
||||
HAVE_RGUI = 1
|
||||
HAVE_MATERIALUI = 1
|
||||
HAVE_7ZIP = 1
|
||||
|
||||
@@ -8,15 +8,17 @@ Popular examples of implementations for this API includes video game system emul
|
||||
more generalized 3D programs.
|
||||
These programs are instantiated as dynamic libraries. We refer to these as "libretro cores".
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||
|
||||
## libretro
|
||||
|
||||
[libretro](http://libretro.com) is an API that exposes generic audio/video/input callbacks.
|
||||
[libretro](https://www.libretro.com) is an API that exposes generic audio/video/input callbacks.
|
||||
A frontend for libretro (such as RetroArch) handles video output, audio output, input and application lifecycle.
|
||||
A libretro core written in portable C or C++ can run seamlessly on many platforms with very little to no porting effort.
|
||||
|
||||
@@ -31,12 +33,12 @@ Latest binaries are currently hosted on the [buildbot](http://buildbot.libretro.
|
||||
|
||||
## Support
|
||||
|
||||
To reach developers, either make an issue here on GitHub, make a thread on the [forum](http://www.libretro.com/forums/), chat on [discord](https://discord.gg/C4amCeV), or visit our IRC channel: #retroarch @ irc.freenode.org.
|
||||
To reach developers, either make an issue here on GitHub, make a thread on the [forum](https://www.libretro.com/forums/), chat on [discord](https://discord.gg/C4amCeV), or visit our IRC channel: #retroarch @ irc.freenode.org. You could create a post in [Reddit](https://www.reddit.com/r/RetroArch/) with *Technical Support* flair.
|
||||
|
||||
## Documentation
|
||||
|
||||
See our [Documentation Center](https://docs.libretro.com/). On Unix, man-pages are provided.
|
||||
More developer-centric stuff is found [here](https://github.com/libretro/libretro.github.com/wiki/Documentation-devs).
|
||||
More developer-centric stuff is found [here](https://docs.libretro.com/development/libretro-overview/).
|
||||
|
||||
## Related projects
|
||||
|
||||
@@ -72,6 +74,7 @@ RetroArch has been ported to the following platforms:
|
||||
- Haiku
|
||||
- Solaris
|
||||
- macOS (PPC, x86-32 and x86-64)
|
||||
- PlayStation 2
|
||||
- PlayStation 3
|
||||
- PlayStation Portable
|
||||
- PlayStation Vita
|
||||
@@ -80,7 +83,7 @@ RetroArch has been ported to the following platforms:
|
||||
- Nintendo GameCube
|
||||
- Nintendo Wii
|
||||
- Nintendo Wii U
|
||||
- Nintendo 3DS
|
||||
- Nintendo 3DS/2DS
|
||||
- Nintendo Switch
|
||||
- Nintendo NES/SNES Classic Edition
|
||||
- Raspberry Pi
|
||||
@@ -256,3 +259,23 @@ These modelines are more accurate giving exact hz. However, some games may have
|
||||
Some arcade resolutions can be very different from consumer CRTs. There is resolution detection to ensure MAME games will be displayed in the closest available resolution but drawn at their native resolution within this resolution. Meaning that the MAME game will look just like the original hardware.
|
||||
|
||||
MAME ROMs that run in a vertical aspect like DoDonPachi need to be rotated within MAME before resolution switching and aspect correction will work. Do this before enabling CRT SwitchRes so that RetroArch will run in your desktop resolution. Once you have rotated any games that may need it turn CRT SwitchRes on.
|
||||
|
||||
## Socials
|
||||
|
||||
The links below belong to our official channels. Links other than this may have been created by fans, independent members or followers. We seriously recommend using our original resources.
|
||||
|
||||
- [Website](https://www.retroarch.com/)
|
||||
- [Blog](https://libretro.com/)
|
||||
- [Facebook](https://www.facebook.com/libretro)
|
||||
- [Twitter](https://twitter.com/libretro)
|
||||
- [Reddit](https://www.reddit.com/r/RetroArch/)
|
||||
- [YouTube](https://www.youtube.com/Libretro)
|
||||
- [Google Post](https://posts.google.com/share/55Nhs2jG)
|
||||
- [Steam](https://store.steampowered.com/app/1118310/RetroArch/)
|
||||
- [YouTube Topic](https://www.youtube.com/channel/UC5q007PYyQPgin0HHbzF0zQ)
|
||||
- [Patreon](https://www.patreon.com/libretro)
|
||||
- [BOUNTYSOURCE](https://www.bountysource.com/teams/libretro/issues)
|
||||
- [Discord](https://discord.gg/27Xxm2h)
|
||||
- [Teespring](https://teespring.com/stores/retroarch)
|
||||
- [Documentation](https://docs.libretro.com/)
|
||||
- [Forum](https://forums.libretro.com/)
|
||||
@@ -1,7 +1,6 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
|
||||
* Copyright (C) 2011-2017 - Daniel De Matteis
|
||||
* Copyright (C) 2012-2015 - Michael Lelli
|
||||
* Copyright (C) 2011-2016 - Daniel De Matteis
|
||||
*
|
||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Found-
|
||||
@@ -15,24 +14,29 @@
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _MENU_GENERIC_H
|
||||
#define _MENU_GENERIC_H
|
||||
#ifndef __RETROARCH_ACCESSIBILITY_H
|
||||
#define __RETROARCH_ACCESSIBILITY_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <sys/types.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <boolean.h>
|
||||
#include <retro_inline.h>
|
||||
#include <retro_common_api.h>
|
||||
|
||||
#include "../menu_driver.h"
|
||||
#include "../menu_input.h"
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
enum action_iterate_type
|
||||
{
|
||||
ITERATE_TYPE_DEFAULT = 0,
|
||||
ITERATE_TYPE_HELP,
|
||||
ITERATE_TYPE_INFO,
|
||||
ITERATE_TYPE_BIND
|
||||
};
|
||||
|
||||
int generic_menu_iterate(void *data, void *userdata, enum menu_action action);
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
bool generic_menu_init_list(void *data);
|
||||
bool is_accessibility_enabled(void);
|
||||
|
||||
bool accessibility_speak_priority(const char* speak_text, int priority);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
||||
@@ -372,7 +372,7 @@ static void *alsa_device_list_new(void *data)
|
||||
|
||||
n = hints;
|
||||
|
||||
while (*n != NULL)
|
||||
while (*n)
|
||||
{
|
||||
char *name = snd_device_name_get_hint(*n, "NAME");
|
||||
char *io = snd_device_name_get_hint(*n, "IOID");
|
||||
|
||||
@@ -361,7 +361,7 @@ static void *alsa_thread_device_list_new(void *data)
|
||||
|
||||
n = hints;
|
||||
|
||||
while (*n != NULL)
|
||||
while (*n)
|
||||
{
|
||||
char *name = snd_device_name_get_hint(*n, "NAME");
|
||||
char *io = snd_device_name_get_hint(*n, "IOID");
|
||||
|
||||
@@ -52,7 +52,9 @@ typedef struct coreaudio
|
||||
size_t buffer_size;
|
||||
} coreaudio_t;
|
||||
|
||||
#if TARGET_OS_IOS
|
||||
static bool g_interrupted;
|
||||
#endif
|
||||
|
||||
static void coreaudio_free(void *data)
|
||||
{
|
||||
@@ -243,7 +245,7 @@ static void *coreaudio_init(const char *device,
|
||||
#else
|
||||
comp = AudioComponentFindNext(NULL, &desc);
|
||||
#endif
|
||||
if (comp == NULL)
|
||||
if (!comp)
|
||||
goto error;
|
||||
|
||||
#if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__)))
|
||||
@@ -344,7 +346,11 @@ static ssize_t coreaudio_write(void *data, const void *buf_, size_t size)
|
||||
const uint8_t *buf = (const uint8_t*)buf_;
|
||||
size_t written = 0;
|
||||
|
||||
#if TARGET_OS_IOS
|
||||
while (!g_interrupted && size > 0)
|
||||
#else
|
||||
while (size > 0)
|
||||
#endif
|
||||
{
|
||||
size_t write_avail;
|
||||
|
||||
@@ -365,7 +371,7 @@ static ssize_t coreaudio_write(void *data, const void *buf_, size_t size)
|
||||
break;
|
||||
}
|
||||
|
||||
#if TARGET_OS_IPHONE
|
||||
#if TARGET_OS_IOS
|
||||
if (write_avail == 0 && !scond_wait_timeout(
|
||||
dev->cond, dev->lock, 3000000))
|
||||
g_interrupted = true;
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bool nonblocking;
|
||||
bool nonblock;
|
||||
bool playing;
|
||||
int16_t* l;
|
||||
int16_t* r;
|
||||
@@ -180,7 +180,7 @@ static ssize_t ctr_csnd_audio_write(void *data, const void *buf, size_t size)
|
||||
(((ctr->pos - ctr->playpos ) & CTR_CSND_AUDIO_COUNT_MASK) < (CTR_CSND_AUDIO_COUNT >> 4)) ||
|
||||
(((ctr->playpos - ctr->pos) & CTR_CSND_AUDIO_COUNT_MASK) < (size >> 2)))
|
||||
{
|
||||
if (ctr->nonblocking)
|
||||
if (ctr->nonblock)
|
||||
ctr->pos = (ctr->playpos + (CTR_CSND_AUDIO_COUNT >> 1)) & CTR_CSND_AUDIO_COUNT_MASK;
|
||||
else
|
||||
{
|
||||
@@ -189,7 +189,7 @@ static ssize_t ctr_csnd_audio_write(void *data, const void *buf, size_t size)
|
||||
retro_sleep(1);
|
||||
ctr_csnd_audio_update_playpos(ctr);
|
||||
}while (((ctr->playpos - ctr->pos) & CTR_CSND_AUDIO_COUNT_MASK) < (CTR_CSND_AUDIO_COUNT >> 1)
|
||||
|| (((ctr->pos - ctr->playpos) & CTR_CSND_AUDIO_COUNT_MASK) < (CTR_CSND_AUDIO_COUNT >> 4)));
|
||||
|| (((ctr->pos - ctr->playpos) & CTR_CSND_AUDIO_COUNT_MASK) < (CTR_CSND_AUDIO_COUNT >> 4)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -265,7 +265,7 @@ static void ctr_csnd_audio_set_nonblock_state(void *data, bool state)
|
||||
{
|
||||
ctr_csnd_audio_t* ctr = (ctr_csnd_audio_t*)data;
|
||||
if (ctr)
|
||||
ctr->nonblocking = state;
|
||||
ctr->nonblock = state;
|
||||
}
|
||||
|
||||
static bool ctr_csnd_audio_use_float(void *data)
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bool nonblocking;
|
||||
bool nonblock;
|
||||
bool playing;
|
||||
int channel;
|
||||
ndspWaveBuf dsp_buf;
|
||||
@@ -102,7 +102,7 @@ static ssize_t ctr_dsp_audio_write(void *data, const void *buf, size_t size)
|
||||
(((ctr->pos - sample_pos ) & CTR_DSP_AUDIO_COUNT_MASK) < (CTR_DSP_AUDIO_COUNT >> 4)) ||
|
||||
(((sample_pos - ctr->pos) & CTR_DSP_AUDIO_COUNT_MASK) < (size >> 2)))
|
||||
{
|
||||
if (ctr->nonblocking)
|
||||
if (ctr->nonblock)
|
||||
ctr->pos = (sample_pos + (CTR_DSP_AUDIO_COUNT >> 1)) & CTR_DSP_AUDIO_COUNT_MASK;
|
||||
else
|
||||
{
|
||||
@@ -173,7 +173,7 @@ static void ctr_dsp_audio_set_nonblock_state(void *data, bool state)
|
||||
{
|
||||
ctr_dsp_audio_t* ctr = (ctr_dsp_audio_t*)data;
|
||||
if (ctr)
|
||||
ctr->nonblocking = state;
|
||||
ctr->nonblock = state;
|
||||
}
|
||||
|
||||
static bool ctr_dsp_audio_use_float(void *data)
|
||||
|
||||
+66
-36
@@ -94,30 +94,25 @@ struct audio_lock
|
||||
DWORD size2;
|
||||
};
|
||||
|
||||
static INLINE bool grab_region(dsound_t *ds, uint32_t write_ptr,
|
||||
struct audio_lock *region)
|
||||
static bool grab_region(dsound_t *ds, uint32_t write_ptr,
|
||||
struct audio_lock *region, HRESULT res)
|
||||
{
|
||||
HRESULT res = IDirectSoundBuffer_Lock(ds->dsb, write_ptr, CHUNK_SIZE,
|
||||
®ion->chunk1, ®ion->size1, ®ion->chunk2, ®ion->size2, 0);
|
||||
|
||||
if (res == DSERR_BUFFERLOST)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
RARCH_WARN("[DirectSound error]: %s\n", "DSERR_BUFFERLOST");
|
||||
#endif
|
||||
if ((res = IDirectSoundBuffer_Restore(ds->dsb)) != DS_OK)
|
||||
return false;
|
||||
if ((res = IDirectSoundBuffer_Lock(ds->dsb, write_ptr, CHUNK_SIZE,
|
||||
®ion->chunk1, ®ion->size1, ®ion->chunk2, ®ion->size2, 0)) != DS_OK)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (res == DS_OK)
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
switch (res)
|
||||
{
|
||||
case DSERR_BUFFERLOST:
|
||||
RARCH_WARN("[DirectSound error]: %s\n", "DSERR_BUFFERLOST");
|
||||
break;
|
||||
case DSERR_INVALIDCALL:
|
||||
RARCH_WARN("[DirectSound error]: %s\n", "DSERR_INVALIDCALL");
|
||||
break;
|
||||
@@ -151,6 +146,7 @@ static DWORD CALLBACK dsound_thread(PVOID data)
|
||||
|
||||
while (ds->thread_alive)
|
||||
{
|
||||
HRESULT res;
|
||||
bool is_pull = false;
|
||||
struct audio_lock region;
|
||||
DWORD read_ptr, avail, fifo_avail;
|
||||
@@ -175,11 +171,15 @@ static DWORD CALLBACK dsound_thread(PVOID data)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!grab_region(ds, write_ptr, ®ion))
|
||||
if ((res = IDirectSoundBuffer_Lock(ds->dsb, write_ptr, CHUNK_SIZE,
|
||||
®ion.chunk1, ®ion.size1, ®ion.chunk2, ®ion.size2, 0)) != DS_OK)
|
||||
{
|
||||
ds->thread_alive = false;
|
||||
SetEvent(ds->event);
|
||||
break;
|
||||
if (!grab_region(ds, write_ptr, ®ion, res))
|
||||
{
|
||||
ds->thread_alive = false;
|
||||
SetEvent(ds->event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (fifo_avail < CHUNK_SIZE)
|
||||
@@ -328,6 +328,19 @@ static BOOL CALLBACK enumerate_cb(LPGUID guid, LPCSTR desc, LPCSTR module, LPVOI
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void dsound_set_wavefmt(WAVEFORMATEX *wfx,
|
||||
unsigned channels, unsigned samplerate)
|
||||
{
|
||||
wfx->wFormatTag = WAVE_FORMAT_PCM;
|
||||
wfx->nBlockAlign = channels * sizeof(int16_t);
|
||||
wfx->wBitsPerSample = 16;
|
||||
|
||||
wfx->nChannels = channels;
|
||||
wfx->nSamplesPerSec = samplerate;
|
||||
wfx->nAvgBytesPerSec = wfx->nSamplesPerSec * wfx->nBlockAlign;
|
||||
wfx->cbSize = 0;
|
||||
}
|
||||
|
||||
static void *dsound_init(const char *dev, unsigned rate, unsigned latency,
|
||||
unsigned block_frames,
|
||||
unsigned *new_rate)
|
||||
@@ -390,12 +403,7 @@ static void *dsound_init(const char *dev, unsigned rate, unsigned latency,
|
||||
goto error;
|
||||
#endif
|
||||
|
||||
wfx.wFormatTag = WAVE_FORMAT_PCM;
|
||||
wfx.nChannels = 2;
|
||||
wfx.nSamplesPerSec = rate;
|
||||
wfx.wBitsPerSample = 16;
|
||||
wfx.nBlockAlign = 2 * sizeof(int16_t);
|
||||
wfx.nAvgBytesPerSec = rate * 2 * sizeof(int16_t);
|
||||
dsound_set_wavefmt(&wfx, 2, rate);
|
||||
|
||||
ds->buffer_size = (latency * wfx.nAvgBytesPerSec) / 1000;
|
||||
ds->buffer_size /= CHUNK_SIZE;
|
||||
@@ -496,27 +504,49 @@ static ssize_t dsound_write(void *data, const void *buf_, size_t size)
|
||||
if (!ds->thread_alive)
|
||||
return -1;
|
||||
|
||||
while (size > 0)
|
||||
if (ds->nonblock)
|
||||
{
|
||||
size_t avail;
|
||||
if (size > 0)
|
||||
{
|
||||
size_t avail;
|
||||
|
||||
EnterCriticalSection(&ds->crit);
|
||||
avail = fifo_write_avail(ds->buffer);
|
||||
if (avail > size)
|
||||
avail = size;
|
||||
EnterCriticalSection(&ds->crit);
|
||||
avail = fifo_write_avail(ds->buffer);
|
||||
if (avail > size)
|
||||
avail = size;
|
||||
|
||||
fifo_write(ds->buffer, buf, avail);
|
||||
LeaveCriticalSection(&ds->crit);
|
||||
fifo_write(ds->buffer, buf, avail);
|
||||
LeaveCriticalSection(&ds->crit);
|
||||
|
||||
buf += avail;
|
||||
size -= avail;
|
||||
written += avail;
|
||||
buf += avail;
|
||||
size -= avail;
|
||||
written += avail;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while (size > 0)
|
||||
{
|
||||
size_t avail;
|
||||
|
||||
if (ds->nonblock || !ds->thread_alive)
|
||||
break;
|
||||
EnterCriticalSection(&ds->crit);
|
||||
avail = fifo_write_avail(ds->buffer);
|
||||
if (avail > size)
|
||||
avail = size;
|
||||
|
||||
if (avail == 0)
|
||||
WaitForSingleObject(ds->event, INFINITE);
|
||||
fifo_write(ds->buffer, buf, avail);
|
||||
LeaveCriticalSection(&ds->crit);
|
||||
|
||||
buf += avail;
|
||||
size -= avail;
|
||||
written += avail;
|
||||
|
||||
if (!ds->thread_alive)
|
||||
break;
|
||||
|
||||
if (avail == 0)
|
||||
WaitForSingleObject(ds->event, INFINITE);
|
||||
}
|
||||
}
|
||||
|
||||
return written;
|
||||
|
||||
+13
-13
@@ -26,7 +26,6 @@
|
||||
#include <rthreads/rthreads.h>
|
||||
|
||||
#include "../../retroarch.h"
|
||||
#include "../../configuration.h"
|
||||
#include "../../verbosity.h"
|
||||
|
||||
#define FRAMES(x) (x / (sizeof(float) * 2))
|
||||
@@ -97,13 +96,13 @@ static void shutdown_cb(void *data)
|
||||
#endif
|
||||
}
|
||||
|
||||
static int parse_ports(char **dest_ports, const char **jports)
|
||||
static int parse_ports(const char *audio_device,
|
||||
char **dest_ports, const char **jports)
|
||||
{
|
||||
int i;
|
||||
char *save = NULL;
|
||||
int parsed = 0;
|
||||
settings_t *settings = config_get_ptr();
|
||||
char *audio_device_cpy = strdup(settings->arrays.audio_device);
|
||||
char *audio_device_cpy = strdup(audio_device);
|
||||
const char *con = strtok_r(audio_device_cpy, ",", &save);
|
||||
|
||||
if (con)
|
||||
@@ -146,7 +145,8 @@ static size_t find_buffersize(jack_t *jd, int latency, unsigned out_rate)
|
||||
return buffer_frames * sizeof(jack_default_audio_sample_t);
|
||||
}
|
||||
|
||||
static void *ja_init(const char *device, unsigned rate, unsigned latency,
|
||||
static void *ja_init(const char *device,
|
||||
unsigned rate, unsigned latency,
|
||||
unsigned block_frames,
|
||||
unsigned *new_rate)
|
||||
{
|
||||
@@ -166,7 +166,7 @@ static void *ja_init(const char *device, unsigned rate, unsigned latency,
|
||||
#endif
|
||||
|
||||
jd->client = jack_client_open("RetroArch", JackNullOption, NULL);
|
||||
if (jd->client == NULL)
|
||||
if (!jd->client)
|
||||
goto error;
|
||||
|
||||
*new_rate = jack_get_sample_rate(jd->client);
|
||||
@@ -176,14 +176,14 @@ static void *ja_init(const char *device, unsigned rate, unsigned latency,
|
||||
|
||||
jd->ports[0] = jack_port_register(jd->client, "left", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
|
||||
jd->ports[1] = jack_port_register(jd->client, "right", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
|
||||
if (jd->ports[0] == NULL || jd->ports[1] == NULL)
|
||||
if (!jd->ports[0] || !jd->ports[1])
|
||||
{
|
||||
RARCH_ERR("[JACK]: Failed to register ports.\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
jports = jack_get_ports(jd->client, NULL, NULL, JackPortIsPhysical | JackPortIsInput);
|
||||
if (jports == NULL)
|
||||
if (!jports)
|
||||
{
|
||||
RARCH_ERR("[JACK]: Failed to get ports.\n");
|
||||
goto error;
|
||||
@@ -196,14 +196,14 @@ static void *ja_init(const char *device, unsigned rate, unsigned latency,
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
jd->buffer[i] = jack_ringbuffer_create(bufsize);
|
||||
if (jd->buffer[i] == NULL)
|
||||
if (!jd->buffer[i])
|
||||
{
|
||||
RARCH_ERR("[JACK]: Failed to create buffers.\n");
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
parsed = parse_ports(dest_ports, jports);
|
||||
parsed = parse_ports(device, dest_ports, jports);
|
||||
|
||||
if (jack_activate(jd->client) < 0)
|
||||
{
|
||||
@@ -229,7 +229,7 @@ static void *ja_init(const char *device, unsigned rate, unsigned latency,
|
||||
error:
|
||||
for (i = 0; i < parsed; i++)
|
||||
free(dest_ports[i]);
|
||||
if (jports != NULL)
|
||||
if (jports)
|
||||
jack_free(jports);
|
||||
free(jd);
|
||||
return NULL;
|
||||
@@ -334,14 +334,14 @@ static void ja_free(void *data)
|
||||
|
||||
jd->shutdown = true;
|
||||
|
||||
if (jd->client != NULL)
|
||||
if (jd->client)
|
||||
{
|
||||
jack_deactivate(jd->client);
|
||||
jack_client_close(jd->client);
|
||||
}
|
||||
|
||||
for (i = 0; i < 2; i++)
|
||||
if (jd->buffer[i] != NULL)
|
||||
if (jd->buffer[i])
|
||||
jack_ringbuffer_free(jd->buffer[i]);
|
||||
|
||||
#ifdef HAVE_THREADS
|
||||
|
||||
@@ -1,96 +0,0 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
|
||||
* Copyright (C) 2011-2017 - Daniel De Matteis
|
||||
*
|
||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with RetroArch.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "../../retroarch.h"
|
||||
#include "../../verbosity.h"
|
||||
|
||||
static void *null_audio_init(const char *device, unsigned rate, unsigned latency,
|
||||
unsigned block_frames,
|
||||
unsigned *new_rate)
|
||||
{
|
||||
RARCH_ERR("Using the null audio driver. RetroArch will be silent.\n");
|
||||
|
||||
(void)device;
|
||||
(void)rate;
|
||||
(void)latency;
|
||||
(void)new_rate;
|
||||
return (void*)-1;
|
||||
}
|
||||
|
||||
static void null_audio_free(void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static ssize_t null_audio_write(void *data, const void *buf, size_t size)
|
||||
{
|
||||
(void)data;
|
||||
(void)buf;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static bool null_audio_stop(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool null_audio_alive(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool null_audio_start(void *data, bool is_shutdown)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void null_audio_set_nonblock_state(void *data, bool state)
|
||||
{
|
||||
(void)data;
|
||||
(void)state;
|
||||
}
|
||||
|
||||
static bool null_audio_use_float(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static size_t null_audio_write_avail(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return 0;
|
||||
}
|
||||
|
||||
audio_driver_t audio_null = {
|
||||
null_audio_init,
|
||||
null_audio_write,
|
||||
null_audio_stop,
|
||||
null_audio_start,
|
||||
null_audio_alive,
|
||||
null_audio_set_nonblock_state,
|
||||
null_audio_free,
|
||||
null_audio_use_float,
|
||||
"null",
|
||||
NULL,
|
||||
NULL,
|
||||
null_audio_write_avail,
|
||||
NULL
|
||||
};
|
||||
@@ -115,7 +115,7 @@ static void *al_init(const char *device, unsigned rate, unsigned latency,
|
||||
|
||||
al->buffers = (ALuint*)calloc(al->num_buffers, sizeof(ALuint));
|
||||
al->res_buf = (ALuint*)calloc(al->num_buffers, sizeof(ALuint));
|
||||
if (al->buffers == NULL || al->res_buf == NULL)
|
||||
if (!al->buffers || !al->res_buf)
|
||||
goto error;
|
||||
|
||||
alGenSources(1, &al->source);
|
||||
|
||||
@@ -29,7 +29,8 @@
|
||||
|
||||
typedef struct ps2_audio
|
||||
{
|
||||
bool nonblocking;
|
||||
/* TODO/FIXME - nonblock is not implemented */
|
||||
bool nonblock;
|
||||
bool running;
|
||||
|
||||
} ps2_audio_t;
|
||||
@@ -39,11 +40,11 @@ static void audioConfigure(ps2_audio_t *ps2, unsigned rate)
|
||||
int err;
|
||||
struct audsrv_fmt_t format;
|
||||
|
||||
format.bits = AUDIO_BITS;
|
||||
format.freq = rate;
|
||||
format.bits = AUDIO_BITS;
|
||||
format.freq = rate;
|
||||
format.channels = AUDIO_CHANNELS;
|
||||
|
||||
err = audsrv_set_format(&format);
|
||||
err = audsrv_set_format(&format);
|
||||
|
||||
if (err)
|
||||
{
|
||||
@@ -82,15 +83,12 @@ static void ps2_audio_free(void *data)
|
||||
|
||||
static ssize_t ps2_audio_write(void *data, const void *buf, size_t size)
|
||||
{
|
||||
int bytes_sent;
|
||||
ps2_audio_t* ps2 = (ps2_audio_t*)data;
|
||||
|
||||
if (!ps2->running)
|
||||
return -1;
|
||||
|
||||
bytes_sent = audsrv_play_audio(buf, size);
|
||||
|
||||
return bytes_sent;
|
||||
return audsrv_play_audio(buf, size);
|
||||
}
|
||||
|
||||
static bool ps2_audio_alive(void *data)
|
||||
@@ -134,7 +132,7 @@ static void ps2_audio_set_nonblock_state(void *data, bool toggle)
|
||||
ps2_audio_t* ps2 = (ps2_audio_t*)data;
|
||||
|
||||
if (ps2)
|
||||
ps2->nonblocking = toggle;
|
||||
ps2->nonblock = toggle;
|
||||
}
|
||||
|
||||
static bool ps2_audio_use_float(void *data)
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
typedef struct
|
||||
{
|
||||
uint32_t audio_port;
|
||||
bool nonblocking;
|
||||
bool nonblock;
|
||||
bool started;
|
||||
volatile bool quit_thread;
|
||||
fifo_buffer_t *buffer;
|
||||
@@ -150,7 +150,7 @@ static ssize_t ps3_audio_write(void *data, const void *buf, size_t size)
|
||||
{
|
||||
ps3_audio_t *aud = data;
|
||||
|
||||
if (aud->nonblocking)
|
||||
if (aud->nonblock)
|
||||
{
|
||||
if (fifo_write_avail(aud->buffer) < size)
|
||||
return 0;
|
||||
@@ -200,7 +200,7 @@ static void ps3_audio_set_nonblock_state(void *data, bool toggle)
|
||||
{
|
||||
ps3_audio_t *aud = data;
|
||||
if (aud)
|
||||
aud->nonblocking = toggle;
|
||||
aud->nonblock = toggle;
|
||||
}
|
||||
|
||||
static void ps3_audio_free(void *data)
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
typedef struct psp_audio
|
||||
{
|
||||
bool nonblocking;
|
||||
bool nonblock;
|
||||
|
||||
uint32_t* buffer;
|
||||
uint32_t* zeroBuffer;
|
||||
@@ -167,7 +167,7 @@ static void *psp_audio_init(const char *device,
|
||||
psp->cond_lock = slock_new();
|
||||
psp->cond = scond_new();
|
||||
|
||||
psp->nonblocking = false;
|
||||
psp->nonblock = false;
|
||||
psp->running = true;
|
||||
psp->worker_thread = sthread_create(audioMainLoop, psp);
|
||||
|
||||
@@ -202,18 +202,18 @@ static void psp_audio_free(void *data)
|
||||
|
||||
static ssize_t psp_audio_write(void *data, const void *buf, size_t size)
|
||||
{
|
||||
psp_audio_t* psp = (psp_audio_t*)data;
|
||||
psp_audio_t* psp = (psp_audio_t*)data;
|
||||
uint16_t write_pos = psp->write_pos;
|
||||
uint16_t sampleCount = size / sizeof(uint32_t);
|
||||
|
||||
if (!psp->running)
|
||||
return -1;
|
||||
|
||||
if (psp->nonblocking)
|
||||
if (psp->nonblock)
|
||||
{
|
||||
if (AUDIO_BUFFER_SIZE - ((uint16_t)
|
||||
(psp->write_pos - psp->read_pos) & AUDIO_BUFFER_SIZE_MASK) < size)
|
||||
return 0;
|
||||
(psp->write_pos - psp->read_pos) & AUDIO_BUFFER_SIZE_MASK) < size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
slock_lock(psp->cond_lock);
|
||||
@@ -287,7 +287,7 @@ static void psp_audio_set_nonblock_state(void *data, bool toggle)
|
||||
{
|
||||
psp_audio_t* psp = (psp_audio_t*)data;
|
||||
if (psp)
|
||||
psp->nonblocking = toggle;
|
||||
psp->nonblock = toggle;
|
||||
}
|
||||
|
||||
static bool psp_audio_use_float(void *data)
|
||||
|
||||
@@ -45,7 +45,7 @@ static void *ra_init(const char *device, unsigned rate, unsigned latency,
|
||||
|
||||
(void)latency;
|
||||
|
||||
if ((vss = roar_vs_new_simple(device, "RetroArch", rate, 2, ROAR_CODEC_PCM_S, 16, ROAR_DIR_PLAY, &err)) == NULL)
|
||||
if (!(vss = roar_vs_new_simple(device, "RetroArch", rate, 2, ROAR_CODEC_PCM_S, 16, ROAR_DIR_PLAY, &err)))
|
||||
{
|
||||
RARCH_ERR("RoarAudio: \"%s\"\n", roar_vs_strerr(err));
|
||||
free(roar);
|
||||
|
||||
@@ -165,7 +165,7 @@ static bool rs_stop(void *data)
|
||||
|
||||
static void rs_set_nonblock_state(void *data, bool state)
|
||||
{
|
||||
rsd_t *rsd = (rsd_t*)data;
|
||||
rsd_t *rsd = (rsd_t*)data;
|
||||
rsd->nonblock = state;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,9 @@
|
||||
static const int sample_rate = 48000;
|
||||
static const int max_num_samples = sample_rate;
|
||||
static const int num_channels = 2;
|
||||
#ifndef HAVE_LIBNX
|
||||
static const size_t sample_buffer_size = ((max_num_samples * num_channels * sizeof(uint16_t)) + 0xfff) & ~0xfff;
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@@ -92,27 +94,27 @@ static ssize_t switch_audio_write(void *data, const void *buf, size_t size)
|
||||
|
||||
if (!swa->current_buffer)
|
||||
{
|
||||
if (swa->blocking)
|
||||
/* no buffer, nonblocking... */
|
||||
if (!swa->blocking)
|
||||
return 0;
|
||||
|
||||
while (!swa->current_buffer)
|
||||
{
|
||||
while(swa->current_buffer == NULL)
|
||||
{
|
||||
uint32_t handle_idx = 0;
|
||||
num = 0;
|
||||
#ifndef HAVE_LIBNX
|
||||
uint32_t handle_idx = 0;
|
||||
#endif
|
||||
num = 0;
|
||||
|
||||
#ifdef HAVE_LIBNX
|
||||
if (audoutWaitPlayFinish(&swa->current_buffer, &num, U64_MAX) != 0) { }
|
||||
if (audoutWaitPlayFinish(&swa->current_buffer, &num, U64_MAX) != 0) { }
|
||||
#else
|
||||
svcWaitSynchronization(&handle_idx, &swa->event, 1, 33333333);
|
||||
svcResetSignal(swa->event);
|
||||
svcWaitSynchronization(&handle_idx, &swa->event, 1, 33333333);
|
||||
svcResetSignal(swa->event);
|
||||
|
||||
if (switch_audio_ipc_output_get_released_buffer(swa, num) != 0)
|
||||
return -1;
|
||||
if (switch_audio_ipc_output_get_released_buffer(swa, num) != 0)
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
/* no buffer, nonblocking... */
|
||||
return 0;
|
||||
}
|
||||
|
||||
swa->current_buffer->data_size = 0;
|
||||
@@ -238,7 +240,9 @@ static void *switch_audio_init(const char *device,
|
||||
{
|
||||
unsigned i;
|
||||
char names[8][0x20];
|
||||
#ifndef HAVE_LIBNX
|
||||
uint32_t num_names = 0;
|
||||
#endif
|
||||
switch_audio_t *swa = (switch_audio_t*) calloc(1, sizeof(*swa));
|
||||
|
||||
if (!swa)
|
||||
@@ -297,7 +301,7 @@ static void *switch_audio_init(const char *device,
|
||||
swa->buffers[i].data_offset = 0;
|
||||
swa->buffers[i].buffer = memalign(0x1000, switch_audio_buffer_size(NULL));
|
||||
|
||||
if (swa->buffers[i].buffer == NULL)
|
||||
if (!swa->buffers[i].buffer)
|
||||
goto fail_audio_output;
|
||||
|
||||
memset(swa->buffers[i].buffer, 0, switch_audio_buffer_size(NULL));
|
||||
@@ -306,7 +310,7 @@ static void *switch_audio_init(const char *device,
|
||||
swa->buffers[i].unknown = 0;
|
||||
swa->buffers[i].sample_data = alloc_pages(sample_buffer_size, switch_audio_buffer_size(NULL), NULL);
|
||||
|
||||
if (swa->buffers[i].sample_data == NULL)
|
||||
if (!swa->buffers[i].sample_data)
|
||||
goto fail_audio_output;
|
||||
#endif
|
||||
|
||||
@@ -335,8 +339,9 @@ fail_audio_output:
|
||||
/* TODO/FIXME - fix libnx codepath */
|
||||
#ifndef HAVE_LIBNX
|
||||
audio_ipc_output_close(&swa->output);
|
||||
#endif
|
||||
fail_audio_ipc:
|
||||
#endif
|
||||
|
||||
/* TODO/FIXME - fix libnx codepath */
|
||||
#ifndef HAVE_LIBNX
|
||||
audio_ipc_finalize();
|
||||
|
||||
@@ -17,7 +17,7 @@ typedef Thread compat_thread;
|
||||
typedef CondVar compat_condvar;
|
||||
|
||||
#define compat_thread_create(thread, func, data, stack_size, prio, cpu) \
|
||||
threadCreate(thread, func, data, stack_size, prio, cpu)
|
||||
threadCreate(thread, func, data, NULL, stack_size, prio, cpu)
|
||||
#define compat_thread_start(thread) \
|
||||
threadStart(thread)
|
||||
#define compat_thread_join(thread) \
|
||||
|
||||
@@ -42,7 +42,8 @@ static const AudioRendererConfig audio_renderer_config =
|
||||
.num_mix_buffers = 2,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
AudioDriver drv;
|
||||
void* mempool;
|
||||
AudioDriverWaveBuf wavebufs[BUFFER_COUNT];
|
||||
@@ -52,10 +53,11 @@ typedef struct {
|
||||
size_t buffer_size;
|
||||
size_t samples;
|
||||
Mutex update_lock;
|
||||
bool nonblocking;
|
||||
bool nonblock;
|
||||
} libnx_audren_t;
|
||||
|
||||
static void *libnx_audren_audio_init(const char *device, unsigned rate, unsigned latency,
|
||||
static void *libnx_audren_audio_init(
|
||||
const char *device, unsigned rate, unsigned latency,
|
||||
unsigned block_frames,
|
||||
unsigned *new_rate)
|
||||
{
|
||||
@@ -79,14 +81,14 @@ static void *libnx_audren_audio_init(const char *device, unsigned rate, unsigned
|
||||
real_latency = MAX(5, latency);
|
||||
RARCH_LOG("[Audio]: real_latency is %u\n", real_latency);
|
||||
|
||||
aud->nonblocking = !block_frames;
|
||||
aud->buffer_size = (real_latency * sample_rate / 1000);
|
||||
aud->samples = (aud->buffer_size / num_channels / sizeof(int16_t));
|
||||
aud->nonblock = !block_frames;
|
||||
aud->buffer_size = (real_latency * sample_rate / 1000);
|
||||
aud->samples = (aud->buffer_size / num_channels / sizeof(int16_t));
|
||||
aud->current_size = 0;
|
||||
*new_rate = sample_rate;
|
||||
*new_rate = sample_rate;
|
||||
|
||||
mempool_size = (aud->buffer_size * BUFFER_COUNT + (AUDREN_MEMPOOL_ALIGNMENT-1)) &~ (AUDREN_MEMPOOL_ALIGNMENT-1);
|
||||
aud->mempool = memalign(AUDREN_MEMPOOL_ALIGNMENT, mempool_size);
|
||||
mempool_size = (aud->buffer_size * BUFFER_COUNT + (AUDREN_MEMPOOL_ALIGNMENT-1)) &~ (AUDREN_MEMPOOL_ALIGNMENT-1);
|
||||
aud->mempool = memalign(AUDREN_MEMPOOL_ALIGNMENT, mempool_size);
|
||||
if (!aud->mempool)
|
||||
{
|
||||
RARCH_ERR("[Audio]: mempool alloc failed\n");
|
||||
@@ -94,14 +96,14 @@ static void *libnx_audren_audio_init(const char *device, unsigned rate, unsigned
|
||||
}
|
||||
|
||||
rc = audrenInitialize(&audio_renderer_config);
|
||||
if(R_FAILED(rc))
|
||||
if (R_FAILED(rc))
|
||||
{
|
||||
RARCH_ERR("[Audio]: audrenInitialize: %x\n", rc);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
rc = audrvCreate(&aud->drv, &audio_renderer_config, num_channels);
|
||||
if(R_FAILED(rc))
|
||||
if (R_FAILED(rc))
|
||||
{
|
||||
RARCH_ERR("[Audio]: audrvCreate: %x\n", rc);
|
||||
goto fail_init;
|
||||
@@ -123,7 +125,7 @@ static void *libnx_audren_audio_init(const char *device, unsigned rate, unsigned
|
||||
audrvDeviceSinkAdd(&aud->drv, AUDREN_DEFAULT_DEVICE_NAME, num_channels, sink_channels);
|
||||
|
||||
rc = audrenStartAudioRenderer();
|
||||
if(R_FAILED(rc))
|
||||
if (R_FAILED(rc))
|
||||
{
|
||||
RARCH_ERR("[Audio]: audrenStartAudioRenderer: %x\n", rc);
|
||||
}
|
||||
@@ -150,9 +152,7 @@ fail:
|
||||
if (aud)
|
||||
{
|
||||
if (aud->mempool)
|
||||
{
|
||||
free(aud->mempool);
|
||||
}
|
||||
|
||||
free(aud);
|
||||
}
|
||||
@@ -176,24 +176,25 @@ static ssize_t libnx_audren_audio_get_free_wavebuf_idx(libnx_audren_t* aud)
|
||||
|
||||
for (i = 0; i < BUFFER_COUNT; i++)
|
||||
{
|
||||
if (aud->wavebufs[i].state == AudioDriverWaveBufState_Free
|
||||
if (
|
||||
aud->wavebufs[i].state == AudioDriverWaveBufState_Free
|
||||
|| aud->wavebufs[i].state == AudioDriverWaveBufState_Done)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static size_t libnx_audren_audio_append(libnx_audren_t* aud, const void *buf, size_t size)
|
||||
static size_t libnx_audren_audio_append(
|
||||
libnx_audren_t* aud, const void *buf, size_t size)
|
||||
{
|
||||
void *dstbuf = NULL;
|
||||
ssize_t free_idx = -1;
|
||||
|
||||
if(!aud->current_wavebuf)
|
||||
if (!aud->current_wavebuf)
|
||||
{
|
||||
free_idx = libnx_audren_audio_get_free_wavebuf_idx(aud);
|
||||
if(free_idx == -1)
|
||||
if (free_idx == -1)
|
||||
return 0;
|
||||
|
||||
aud->current_wavebuf = &aud->wavebufs[free_idx];
|
||||
@@ -201,18 +202,16 @@ static size_t libnx_audren_audio_append(libnx_audren_t* aud, const void *buf, si
|
||||
aud->current_size = 0;
|
||||
}
|
||||
|
||||
if(size > aud->buffer_size - aud->current_size)
|
||||
{
|
||||
if (size > aud->buffer_size - aud->current_size)
|
||||
size = aud->buffer_size - aud->current_size;
|
||||
}
|
||||
|
||||
void *dstbuf = aud->current_pool_ptr + aud->current_size;
|
||||
dstbuf = aud->current_pool_ptr + aud->current_size;
|
||||
memcpy(dstbuf, buf, size);
|
||||
armDCacheFlush(dstbuf, size);
|
||||
|
||||
aud->current_size += size;
|
||||
|
||||
if(aud->current_size == aud->buffer_size)
|
||||
if (aud->current_size == aud->buffer_size)
|
||||
{
|
||||
audrvVoiceAddWaveBuf(&aud->drv, 0, aud->current_wavebuf);
|
||||
|
||||
@@ -231,24 +230,32 @@ static size_t libnx_audren_audio_append(libnx_audren_t* aud, const void *buf, si
|
||||
return size;
|
||||
}
|
||||
|
||||
static ssize_t libnx_audren_audio_write(void *data, const void *buf, size_t size)
|
||||
static ssize_t libnx_audren_audio_write(void *data,
|
||||
const void *buf, size_t size)
|
||||
{
|
||||
libnx_audren_t *aud = (libnx_audren_t*)data;
|
||||
size_t written = 0;
|
||||
size_t written = 0;
|
||||
|
||||
if (!aud)
|
||||
return -1;
|
||||
|
||||
while(written < size)
|
||||
if (aud->nonblock)
|
||||
{
|
||||
written += libnx_audren_audio_append(aud, buf + written, size - written);
|
||||
if(written != size)
|
||||
while(written < size)
|
||||
{
|
||||
if(aud->nonblocking)
|
||||
{
|
||||
written += libnx_audren_audio_append(
|
||||
aud, buf + written, size - written);
|
||||
if (written != size)
|
||||
break;
|
||||
}
|
||||
else
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while(written < size)
|
||||
{
|
||||
written += libnx_audren_audio_append(
|
||||
aud, buf + written, size - written);
|
||||
if (written != size)
|
||||
{
|
||||
mutexLock(&aud->update_lock);
|
||||
audrvUpdate(&aud->drv);
|
||||
@@ -341,7 +348,7 @@ static void libnx_audren_audio_set_nonblock_state(void *data, bool state)
|
||||
if (!aud)
|
||||
return;
|
||||
|
||||
aud->nonblocking = state;
|
||||
aud->nonblock = state;
|
||||
}
|
||||
|
||||
audio_driver_t audio_switch_libnx_audren = {
|
||||
|
||||
@@ -43,13 +43,14 @@ static const AudioRendererConfig audio_renderer_config =
|
||||
.num_mix_buffers = 2,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
typedef struct
|
||||
{
|
||||
AudioDriver drv;
|
||||
void* mempool;
|
||||
AudioDriverWaveBuf wavebufs[BUFFER_COUNT];
|
||||
size_t buffer_size;
|
||||
size_t samples;
|
||||
bool nonblocking;
|
||||
bool nonblock;
|
||||
|
||||
fifo_buffer_t* fifo;
|
||||
Mutex fifo_lock;
|
||||
@@ -63,21 +64,21 @@ typedef struct {
|
||||
|
||||
static void thread_job(void* data)
|
||||
{
|
||||
libnx_audren_thread_t *aud = (libnx_audren_thread_t*)data;
|
||||
size_t available = 0;
|
||||
size_t current_size = 0;
|
||||
size_t written_tmp = 0;
|
||||
AudioDriverWaveBuf* current_wavebuf = NULL;
|
||||
void* current_pool_ptr = NULL;
|
||||
void* dstbuf = NULL;
|
||||
unsigned i;
|
||||
libnx_audren_thread_t *aud = (libnx_audren_thread_t*)data;
|
||||
size_t available = 0;
|
||||
size_t current_size = 0;
|
||||
size_t written_tmp = 0;
|
||||
AudioDriverWaveBuf* current_wavebuf = NULL;
|
||||
void* current_pool_ptr = NULL;
|
||||
void* dstbuf = NULL;
|
||||
|
||||
if (!aud)
|
||||
return;
|
||||
|
||||
while(aud->running)
|
||||
while (aud->running)
|
||||
{
|
||||
if(!current_wavebuf)
|
||||
if (!current_wavebuf)
|
||||
{
|
||||
for (i = 0; i < BUFFER_COUNT; i++)
|
||||
{
|
||||
@@ -92,19 +93,17 @@ static void thread_job(void* data)
|
||||
}
|
||||
}
|
||||
|
||||
if(current_wavebuf)
|
||||
if (current_wavebuf)
|
||||
{
|
||||
mutexLock(&aud->fifo_lock);
|
||||
available = aud->paused ? 0 : fifo_read_avail(aud->fifo);
|
||||
written_tmp = MIN(available, aud->buffer_size - current_size);
|
||||
dstbuf = current_pool_ptr + current_size;
|
||||
if(written_tmp > 0)
|
||||
{
|
||||
if (written_tmp > 0)
|
||||
fifo_read(aud->fifo, dstbuf, written_tmp);
|
||||
}
|
||||
mutexUnlock(&aud->fifo_lock);
|
||||
|
||||
if(written_tmp > 0)
|
||||
if (written_tmp > 0)
|
||||
{
|
||||
condvarWakeAll(&aud->fifo_condvar);
|
||||
|
||||
@@ -112,7 +111,7 @@ static void thread_job(void* data)
|
||||
armDCacheFlush(dstbuf, written_tmp);
|
||||
}
|
||||
|
||||
if(current_size == aud->buffer_size)
|
||||
if (current_size == aud->buffer_size)
|
||||
{
|
||||
audrvVoiceAddWaveBuf(&aud->drv, 0, current_wavebuf);
|
||||
|
||||
@@ -157,17 +156,19 @@ static void *libnx_audren_thread_audio_init(const char *device, unsigned rate, u
|
||||
goto fail;
|
||||
}
|
||||
|
||||
real_latency = MAX(latency, 5);
|
||||
real_latency = MAX(latency, 5);
|
||||
RARCH_LOG("[Audio]: real_latency is %u\n", real_latency);
|
||||
|
||||
aud->running = true;
|
||||
aud->paused = false;
|
||||
aud->nonblocking = !block_frames;
|
||||
aud->running = true;
|
||||
aud->paused = false;
|
||||
aud->nonblock = !block_frames;
|
||||
aud->buffer_size = (real_latency * sample_rate / 1000);
|
||||
aud->samples = (aud->buffer_size / num_channels / sizeof(int16_t));
|
||||
aud->samples = (aud->buffer_size / num_channels / sizeof(int16_t));
|
||||
|
||||
mempool_size = (aud->buffer_size * BUFFER_COUNT +
|
||||
(AUDREN_MEMPOOL_ALIGNMENT-1)) &~ (AUDREN_MEMPOOL_ALIGNMENT-1);
|
||||
aud->mempool = memalign(AUDREN_MEMPOOL_ALIGNMENT, mempool_size);
|
||||
|
||||
mempool_size = (aud->buffer_size * BUFFER_COUNT + (AUDREN_MEMPOOL_ALIGNMENT-1)) &~ (AUDREN_MEMPOOL_ALIGNMENT-1);
|
||||
aud->mempool = memalign(AUDREN_MEMPOOL_ALIGNMENT, mempool_size);
|
||||
if (!aud->mempool)
|
||||
{
|
||||
RARCH_ERR("[Audio]: mempool alloc failed\n");
|
||||
@@ -175,43 +176,44 @@ static void *libnx_audren_thread_audio_init(const char *device, unsigned rate, u
|
||||
}
|
||||
|
||||
rc = audrenInitialize(&audio_renderer_config);
|
||||
if(R_FAILED(rc))
|
||||
if (R_FAILED(rc))
|
||||
{
|
||||
RARCH_ERR("[Audio]: audrenInitialize: %x\n", rc);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
rc = audrvCreate(&aud->drv, &audio_renderer_config, num_channels);
|
||||
if(R_FAILED(rc))
|
||||
if (R_FAILED(rc))
|
||||
{
|
||||
RARCH_ERR("[Audio]: audrvCreate: %x\n", rc);
|
||||
goto fail_init;
|
||||
}
|
||||
|
||||
for(i = 0; i < BUFFER_COUNT; i++)
|
||||
for (i = 0; i < BUFFER_COUNT; i++)
|
||||
{
|
||||
aud->wavebufs[i].data_raw = aud->mempool;
|
||||
aud->wavebufs[i].size = mempool_size;
|
||||
aud->wavebufs[i].data_raw = aud->mempool;
|
||||
aud->wavebufs[i].size = mempool_size;
|
||||
aud->wavebufs[i].start_sample_offset = i * aud->samples;
|
||||
aud->wavebufs[i].end_sample_offset = aud->wavebufs[i].start_sample_offset + aud->samples;
|
||||
aud->wavebufs[i].end_sample_offset = aud->wavebufs[i].start_sample_offset + aud->samples;
|
||||
}
|
||||
|
||||
mpid = audrvMemPoolAdd(&aud->drv, aud->mempool, mempool_size);
|
||||
audrvMemPoolAttach(&aud->drv, mpid);
|
||||
|
||||
audrvDeviceSinkAdd(&aud->drv, AUDREN_DEFAULT_DEVICE_NAME, num_channels, sink_channels);
|
||||
audrvDeviceSinkAdd(&aud->drv, AUDREN_DEFAULT_DEVICE_NAME,
|
||||
num_channels, sink_channels);
|
||||
|
||||
rc = audrenStartAudioRenderer();
|
||||
if(R_FAILED(rc))
|
||||
if (R_FAILED(rc))
|
||||
{
|
||||
RARCH_ERR("[Audio]: audrenStartAudioRenderer: %x\n", rc);
|
||||
}
|
||||
|
||||
audrvVoiceInit(&aud->drv, 0, num_channels, PcmFormat_Int16, sample_rate);
|
||||
audrvVoiceSetDestinationMix(&aud->drv, 0, AUDREN_FINAL_MIX_ID);
|
||||
for(i = 0; i < num_channels; i++)
|
||||
for (i = 0; i < num_channels; i++)
|
||||
{
|
||||
for(j = 0; j < num_channels; j++)
|
||||
for (j = 0; j < num_channels; j++)
|
||||
{
|
||||
audrvVoiceSetMixFactor(&aud->drv, 0, i == j ? 1.0f : 0.0f, i, j);
|
||||
}
|
||||
@@ -229,15 +231,17 @@ static void *libnx_audren_thread_audio_init(const char *device, unsigned rate, u
|
||||
mutexInit(&aud->fifo_condlock);
|
||||
|
||||
svcGetThreadPriority(&thread_priority, CUR_THREAD_HANDLE);
|
||||
rc = threadCreate(&aud->thread, &thread_job, (void*)aud, thread_stack_size, thread_priority - 1, thread_preferred_cpu);
|
||||
if(R_FAILED(rc))
|
||||
rc = threadCreate(&aud->thread, &thread_job,
|
||||
(void*)aud, NULL, thread_stack_size,
|
||||
thread_priority - 1, thread_preferred_cpu);
|
||||
if (R_FAILED(rc))
|
||||
{
|
||||
RARCH_ERR("[Audio]: threadCreate: %x\n", rc);
|
||||
goto fail_drv;
|
||||
}
|
||||
|
||||
rc = threadStart(&aud->thread);
|
||||
if(R_FAILED(rc))
|
||||
if (R_FAILED(rc))
|
||||
{
|
||||
RARCH_ERR("[Audio]: threadStart: %x\n", rc);
|
||||
threadClose(&aud->thread);
|
||||
@@ -258,9 +262,7 @@ fail:
|
||||
if (aud)
|
||||
{
|
||||
if (aud->mempool)
|
||||
{
|
||||
free(aud->mempool);
|
||||
}
|
||||
|
||||
free(aud);
|
||||
}
|
||||
@@ -278,7 +280,8 @@ static size_t libnx_audren_thread_audio_buffer_size(void *data)
|
||||
return aud->buffer_size;
|
||||
}
|
||||
|
||||
static ssize_t libnx_audren_thread_audio_write(void *data, const void *buf, size_t size)
|
||||
static ssize_t libnx_audren_thread_audio_write(void *data,
|
||||
const void *buf, size_t size)
|
||||
{
|
||||
libnx_audren_thread_t *aud = (libnx_audren_thread_t*)data;
|
||||
size_t available, written, written_tmp;
|
||||
@@ -286,18 +289,16 @@ static ssize_t libnx_audren_thread_audio_write(void *data, const void *buf, size
|
||||
if (!aud || !aud->running)
|
||||
return -1;
|
||||
|
||||
if(aud->paused)
|
||||
if (aud->paused)
|
||||
return 0;
|
||||
|
||||
if(aud->nonblocking)
|
||||
if (aud->nonblock)
|
||||
{
|
||||
mutexLock(&aud->fifo_lock);
|
||||
available = fifo_write_avail(aud->fifo);
|
||||
written = MIN(available, size);
|
||||
if(written > 0)
|
||||
{
|
||||
if (written > 0)
|
||||
fifo_write(aud->fifo, buf, written);
|
||||
}
|
||||
mutexUnlock(&aud->fifo_lock);
|
||||
}
|
||||
else
|
||||
@@ -307,7 +308,7 @@ static ssize_t libnx_audren_thread_audio_write(void *data, const void *buf, size
|
||||
{
|
||||
mutexLock(&aud->fifo_lock);
|
||||
available = fifo_write_avail(aud->fifo);
|
||||
if(available)
|
||||
if (available)
|
||||
{
|
||||
written_tmp = MIN(size - written, available);
|
||||
fifo_write(aud->fifo, (const char*)buf + written, written_tmp);
|
||||
@@ -419,7 +420,7 @@ static void libnx_audren_thread_audio_set_nonblock_state(void *data, bool state)
|
||||
if (!aud)
|
||||
return;
|
||||
|
||||
aud->nonblocking = state;
|
||||
aud->nonblock = state;
|
||||
}
|
||||
|
||||
audio_driver_t audio_switch_libnx_audren_thread = {
|
||||
|
||||
@@ -39,7 +39,6 @@ static const size_t thread_stack_size = 1024 * 8;
|
||||
static const int thread_preferred_cpu = 2;
|
||||
static const int channel_count = 2;
|
||||
static const size_t sample_size = sizeof(uint16_t);
|
||||
static const size_t frame_size = channel_count * sample_size;
|
||||
|
||||
#define AUDIO_BUFFER_COUNT 2
|
||||
|
||||
@@ -53,7 +52,7 @@ typedef struct
|
||||
size_t fifoSize;
|
||||
|
||||
volatile bool running;
|
||||
bool nonblocking;
|
||||
bool nonblock;
|
||||
bool is_paused;
|
||||
|
||||
compat_audio_out_buffer buffers[AUDIO_BUFFER_COUNT];
|
||||
@@ -144,15 +143,17 @@ static void *switch_thread_audio_init(const char *device, unsigned rate, unsigne
|
||||
Result rc;
|
||||
unsigned i;
|
||||
uint32_t prio;
|
||||
#ifndef HAVE_LIBNX
|
||||
char names[8][0x20];
|
||||
uint32_t num_names = 0;
|
||||
#endif
|
||||
switch_thread_audio_t *swa = (switch_thread_audio_t *)calloc(1, sizeof(*swa));
|
||||
|
||||
if (!swa)
|
||||
return NULL;
|
||||
|
||||
swa->running = true;
|
||||
swa->nonblocking = true;
|
||||
swa->nonblock = true;
|
||||
swa->is_paused = true;
|
||||
swa->latency = MAX(latency, 8);
|
||||
|
||||
@@ -217,7 +218,7 @@ static void *switch_thread_audio_init(const char *device, unsigned rate, unsigne
|
||||
swa->buffers[i].data_size = swa->buffers[i].buffer_size;
|
||||
swa->buffers[i].buffer = memalign(0x1000, swa->buffers[i].buffer_size);
|
||||
|
||||
if (swa->buffers[i].buffer == NULL)
|
||||
if (!swa->buffers[i].buffer)
|
||||
goto fail;
|
||||
|
||||
memset(swa->buffers[i].buffer, 0, swa->buffers[i].buffer_size);
|
||||
@@ -228,7 +229,7 @@ static void *switch_thread_audio_init(const char *device, unsigned rate, unsigne
|
||||
swa->buffers[i].data_size = swa->buffers[i].buffer_size;
|
||||
swa->buffers[i].sample_data = alloc_pages(swa->buffers[i].buffer_size, swa->buffers[i].buffer_size, NULL);
|
||||
|
||||
if (swa->buffers[i].sample_data == NULL)
|
||||
if (!swa->buffers[i].sample_data)
|
||||
goto fail_audio_output;
|
||||
|
||||
memset(swa->buffers[i].sample_data, 0, swa->buffers[i].buffer_size);
|
||||
@@ -345,7 +346,7 @@ static ssize_t switch_thread_audio_write(void *data, const void *buf, size_t siz
|
||||
if (!swa || !swa->running)
|
||||
return 0;
|
||||
|
||||
if (swa->nonblocking)
|
||||
if (swa->nonblock)
|
||||
{
|
||||
compat_mutex_lock(&swa->fifoLock);
|
||||
avail = fifo_write_avail(swa->fifo);
|
||||
@@ -397,7 +398,7 @@ static void switch_thread_audio_set_nonblock_state(void *data, bool state)
|
||||
switch_thread_audio_t *swa = (switch_thread_audio_t *)data;
|
||||
|
||||
if (swa)
|
||||
swa->nonblocking = state;
|
||||
swa->nonblock = state;
|
||||
}
|
||||
|
||||
static bool switch_thread_audio_use_float(void *data)
|
||||
|
||||
@@ -808,7 +808,7 @@ static unsigned int pcm_get_channels(const struct pcm *pcm)
|
||||
* */
|
||||
static const struct pcm_config * pcm_get_config(const struct pcm *pcm)
|
||||
{
|
||||
if (pcm == NULL)
|
||||
if (!pcm)
|
||||
return NULL;
|
||||
return &pcm->config;
|
||||
}
|
||||
@@ -929,7 +929,7 @@ static int pcm_set_config(struct pcm *pcm, const struct pcm_config *config)
|
||||
struct snd_pcm_sw_params sparams;
|
||||
struct snd_pcm_hw_params params;
|
||||
|
||||
if (pcm == NULL)
|
||||
if (!pcm)
|
||||
return -EFAULT;
|
||||
|
||||
if (config)
|
||||
@@ -1293,7 +1293,7 @@ static int pcm_get_htimestamp(struct pcm *pcm, unsigned int *avail,
|
||||
*/
|
||||
static int pcm_is_ready(const struct pcm *pcm)
|
||||
{
|
||||
if (pcm != NULL)
|
||||
if (pcm)
|
||||
return pcm->fd >= 0;
|
||||
return 0;
|
||||
}
|
||||
@@ -1582,7 +1582,7 @@ static const struct pcm_mask *pcm_params_get_mask(const struct pcm_params *pcm_p
|
||||
{
|
||||
int p;
|
||||
struct snd_pcm_hw_params *params = (struct snd_pcm_hw_params *)pcm_params;
|
||||
if (params == NULL)
|
||||
if (!params)
|
||||
return NULL;
|
||||
|
||||
p = pcm_param_to_alsa(param);
|
||||
@@ -2185,7 +2185,7 @@ static void * tinyalsa_init(const char *devicestr, unsigned rate,
|
||||
RARCH_LOG("[TINYALSA]: Using card: %u, device: %u.\n", card, device);
|
||||
|
||||
tinyalsa->params = pcm_params_get(card, device, PCM_OUT);
|
||||
if (tinyalsa->params == NULL)
|
||||
if (!tinyalsa->params)
|
||||
{
|
||||
RARCH_ERR("[TINYALSA]: params: Cannot open audio device.\n");
|
||||
goto error;
|
||||
@@ -2224,7 +2224,7 @@ static void * tinyalsa_init(const char *devicestr, unsigned rate,
|
||||
|
||||
tinyalsa->pcm = pcm_open(card, device, PCM_OUT, &config);
|
||||
|
||||
if (tinyalsa->pcm == NULL)
|
||||
if (!tinyalsa->pcm)
|
||||
{
|
||||
RARCH_ERR("[TINYALSA]: Failed to allocate memory for pcm.\n");
|
||||
goto error;
|
||||
|
||||
+111
-65
@@ -29,7 +29,7 @@
|
||||
typedef struct
|
||||
{
|
||||
bool exclusive;
|
||||
bool blocking;
|
||||
bool nonblock;
|
||||
bool running;
|
||||
size_t frame_size; /* 4 or 8 only */
|
||||
size_t engine_buffer_size;
|
||||
@@ -491,13 +491,14 @@ static void *wasapi_init(const char *dev_id, unsigned rate, unsigned latency,
|
||||
BYTE *dest = NULL;
|
||||
settings_t *settings = config_get_ptr();
|
||||
bool float_format = settings->bools.audio_wasapi_float_format;
|
||||
bool exclusive_mode = settings->bools.audio_wasapi_exclusive_mode;
|
||||
int sh_buffer_length = settings->ints.audio_wasapi_sh_buffer_length;
|
||||
wasapi_t *w = (wasapi_t*)calloc(1, sizeof(wasapi_t));
|
||||
|
||||
if (!w)
|
||||
return NULL;
|
||||
|
||||
w->exclusive = settings->bools.audio_wasapi_exclusive_mode;
|
||||
w->exclusive = exclusive_mode;
|
||||
w->device = wasapi_init_device(dev_id);
|
||||
if (!w->device && dev_id)
|
||||
w->device = wasapi_init_device(NULL);
|
||||
@@ -575,7 +576,7 @@ static void *wasapi_init(const char *dev_id, unsigned rate, unsigned latency,
|
||||
if (FAILED(hr))
|
||||
goto error;
|
||||
w->running = true;
|
||||
w->blocking = settings->bools.audio_sync;
|
||||
w->nonblock = !settings->bools.audio_sync;
|
||||
|
||||
return w;
|
||||
|
||||
@@ -596,16 +597,15 @@ static bool wasapi_flush(wasapi_t * w, const void * data, size_t size)
|
||||
{
|
||||
BYTE *dest = NULL;
|
||||
UINT32 frame_count = size / w->frame_size;
|
||||
HRESULT hr = _IAudioRenderClient_GetBuffer(
|
||||
w->renderer, frame_count, &dest);
|
||||
if (FAILED(hr))
|
||||
|
||||
if (FAILED(_IAudioRenderClient_GetBuffer(
|
||||
w->renderer, frame_count, &dest)))
|
||||
return false;
|
||||
|
||||
memcpy(dest, data, size);
|
||||
hr = _IAudioRenderClient_ReleaseBuffer(
|
||||
w->renderer, frame_count,
|
||||
0);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioRenderClient_ReleaseBuffer(
|
||||
w->renderer, frame_count,
|
||||
0)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@@ -615,25 +615,76 @@ static bool wasapi_flush_buffer(wasapi_t * w, size_t size)
|
||||
{
|
||||
BYTE *dest = NULL;
|
||||
UINT32 frame_count = size / w->frame_size;
|
||||
HRESULT hr = _IAudioRenderClient_GetBuffer(
|
||||
w->renderer, frame_count, &dest);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioRenderClient_GetBuffer(
|
||||
w->renderer, frame_count, &dest)))
|
||||
return false;
|
||||
|
||||
fifo_read(w->buffer, dest, size);
|
||||
hr = _IAudioRenderClient_ReleaseBuffer(
|
||||
if (FAILED(_IAudioRenderClient_ReleaseBuffer(
|
||||
w->renderer, frame_count,
|
||||
0);
|
||||
if (FAILED(hr))
|
||||
0)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static ssize_t wasapi_write_sh_buffer(wasapi_t *w, const void * data, size_t size)
|
||||
{
|
||||
ssize_t written = -1;
|
||||
UINT32 padding = 0;
|
||||
size_t write_avail = fifo_write_avail(w->buffer);
|
||||
|
||||
if (!write_avail)
|
||||
{
|
||||
size_t read_avail = 0;
|
||||
if (!(WaitForSingleObject(w->write_event, INFINITE) == WAIT_OBJECT_0))
|
||||
return -1;
|
||||
|
||||
if (FAILED(_IAudioClient_GetCurrentPadding(w->client, &padding)))
|
||||
return -1;
|
||||
|
||||
read_avail = fifo_read_avail(w->buffer);
|
||||
write_avail = w->engine_buffer_size - padding * w->frame_size;
|
||||
written = read_avail < write_avail ? read_avail : write_avail;
|
||||
if (written)
|
||||
if (!wasapi_flush_buffer(w, written))
|
||||
return -1;
|
||||
}
|
||||
|
||||
write_avail = fifo_write_avail(w->buffer);
|
||||
written = size < write_avail ? size : write_avail;
|
||||
if (written)
|
||||
fifo_write(w->buffer, data, written);
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
static ssize_t wasapi_write_sh(wasapi_t *w, const void * data, size_t size)
|
||||
{
|
||||
DWORD ir;
|
||||
HRESULT hr;
|
||||
size_t write_avail = 0;
|
||||
ssize_t written = -1;
|
||||
UINT32 padding = 0;
|
||||
|
||||
if (!(WaitForSingleObject(w->write_event, INFINITE) == WAIT_OBJECT_0))
|
||||
return -1;
|
||||
|
||||
if (FAILED(_IAudioClient_GetCurrentPadding(w->client, &padding)))
|
||||
return -1;
|
||||
|
||||
write_avail = w->engine_buffer_size - padding * w->frame_size;
|
||||
if (!write_avail)
|
||||
return 0;
|
||||
|
||||
written = size < write_avail ? size : write_avail;
|
||||
if (written)
|
||||
if (!wasapi_flush(w, data, written))
|
||||
return -1;
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
static ssize_t wasapi_write_sh_nonblock(wasapi_t *w, const void * data, size_t size)
|
||||
{
|
||||
size_t write_avail = 0;
|
||||
ssize_t written = -1;
|
||||
UINT32 padding = 0;
|
||||
@@ -644,16 +695,7 @@ static ssize_t wasapi_write_sh(wasapi_t *w, const void * data, size_t size)
|
||||
if (!write_avail)
|
||||
{
|
||||
size_t read_avail = 0;
|
||||
|
||||
if (w->blocking)
|
||||
{
|
||||
ir = WaitForSingleObject(w->write_event, INFINITE);
|
||||
if (!(ir == WAIT_OBJECT_0))
|
||||
return -1;
|
||||
}
|
||||
|
||||
hr = _IAudioClient_GetCurrentPadding(w->client, &padding);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioClient_GetCurrentPadding(w->client, &padding)))
|
||||
return -1;
|
||||
|
||||
read_avail = fifo_read_avail(w->buffer);
|
||||
@@ -671,19 +713,10 @@ static ssize_t wasapi_write_sh(wasapi_t *w, const void * data, size_t size)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (w->blocking)
|
||||
{
|
||||
ir = WaitForSingleObject(w->write_event, INFINITE);
|
||||
if (!(ir == WAIT_OBJECT_0))
|
||||
return -1;
|
||||
}
|
||||
|
||||
hr = _IAudioClient_GetCurrentPadding(w->client, &padding);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioClient_GetCurrentPadding(w->client, &padding)))
|
||||
return -1;
|
||||
|
||||
write_avail = w->engine_buffer_size - padding * w->frame_size;
|
||||
if (!write_avail)
|
||||
if (!(write_avail = w->engine_buffer_size - padding * w->frame_size))
|
||||
return 0;
|
||||
|
||||
written = size < write_avail ? size : write_avail;
|
||||
@@ -695,21 +728,15 @@ static ssize_t wasapi_write_sh(wasapi_t *w, const void * data, size_t size)
|
||||
return written;
|
||||
}
|
||||
|
||||
static ssize_t wasapi_write_ex(wasapi_t *w, const void * data, size_t size)
|
||||
static ssize_t wasapi_write_ex(wasapi_t *w, const void * data, size_t size, DWORD ms)
|
||||
{
|
||||
ssize_t written = 0;
|
||||
size_t write_avail = fifo_write_avail(w->buffer);
|
||||
|
||||
if (!write_avail)
|
||||
{
|
||||
DWORD ir = WaitForSingleObject(
|
||||
w->write_event, w->blocking ? INFINITE : 0);
|
||||
if (ir != WAIT_OBJECT_0)
|
||||
{
|
||||
if (w->blocking)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
if (WaitForSingleObject(w->write_event, ms) != WAIT_OBJECT_0)
|
||||
return -1;
|
||||
|
||||
if (!wasapi_flush_buffer(w, w->engine_buffer_size))
|
||||
return -1;
|
||||
@@ -725,26 +752,48 @@ static ssize_t wasapi_write_ex(wasapi_t *w, const void * data, size_t size)
|
||||
|
||||
static ssize_t wasapi_write(void *wh, const void *data, size_t size)
|
||||
{
|
||||
size_t written;
|
||||
wasapi_t *w = (wasapi_t*)wh;
|
||||
size_t written = 0;
|
||||
wasapi_t *w = (wasapi_t*)wh;
|
||||
|
||||
if (w->blocking)
|
||||
if (w->nonblock)
|
||||
{
|
||||
if (w->exclusive)
|
||||
return wasapi_write_ex(w, data, size, 0);
|
||||
return wasapi_write_sh_nonblock(w, data, size);
|
||||
}
|
||||
|
||||
if (w->exclusive)
|
||||
{
|
||||
ssize_t ir;
|
||||
for (written = 0, ir = -1; written < size; written += ir)
|
||||
for (ir = -1; written < size; written += ir)
|
||||
{
|
||||
if (w->exclusive)
|
||||
ir = wasapi_write_ex(w, (char*)data + written, size - written);
|
||||
else
|
||||
ir = wasapi_write_sh(w, (char*)data + written, size - written);
|
||||
ir = wasapi_write_ex(w, (char*)data + written, size - written, INFINITE);
|
||||
if (ir == -1)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else if (w->exclusive)
|
||||
written = wasapi_write_ex(w, data, size);
|
||||
else
|
||||
written = wasapi_write_sh(w, data, size);
|
||||
{
|
||||
ssize_t ir;
|
||||
if (w->buffer)
|
||||
{
|
||||
for (ir = -1; written < size; written += ir)
|
||||
{
|
||||
ir = wasapi_write_sh_buffer(w, (char*)data + written, size - written);
|
||||
if (ir == -1)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (ir = -1; written < size; written += ir)
|
||||
{
|
||||
ir = wasapi_write_sh(w, (char*)data + written, size - written);
|
||||
if (ir == -1)
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return written;
|
||||
}
|
||||
@@ -752,8 +801,7 @@ static ssize_t wasapi_write(void *wh, const void *data, size_t size)
|
||||
static bool wasapi_stop(void *wh)
|
||||
{
|
||||
wasapi_t *w = (wasapi_t*)wh;
|
||||
HRESULT hr = _IAudioClient_Stop(w->client);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioClient_Stop(w->client)))
|
||||
return !w->running;
|
||||
|
||||
w->running = false;
|
||||
@@ -790,7 +838,7 @@ static void wasapi_set_nonblock_state(void *wh, bool nonblock)
|
||||
|
||||
RARCH_LOG("[WASAPI]: Sync %s.\n", nonblock ? "off" : "on");
|
||||
|
||||
w->blocking = !nonblock;
|
||||
w->nonblock = nonblock;
|
||||
}
|
||||
|
||||
static void wasapi_free(void *wh)
|
||||
@@ -838,15 +886,13 @@ static void wasapi_device_list_free(void *u, void *slp)
|
||||
|
||||
static size_t wasapi_write_avail(void *wh)
|
||||
{
|
||||
HRESULT hr;
|
||||
wasapi_t *w = (wasapi_t*)wh;
|
||||
UINT32 padding = 0;
|
||||
|
||||
if (w->buffer)
|
||||
return fifo_write_avail(w->buffer);
|
||||
|
||||
hr = _IAudioClient_GetCurrentPadding(w->client, &padding);
|
||||
if (FAILED(hr))
|
||||
if (FAILED(_IAudioClient_GetCurrentPadding(w->client, &padding)))
|
||||
return 0;
|
||||
|
||||
return w->engine_buffer_size - padding * w->frame_size;
|
||||
|
||||
+43
-39
@@ -31,7 +31,7 @@ typedef struct
|
||||
AXMVoice* mvoice;
|
||||
uint16_t* buffer_l;
|
||||
uint16_t* buffer_r;
|
||||
bool nonblocking;
|
||||
bool nonblock;
|
||||
|
||||
uint32_t pos;
|
||||
uint32_t written;
|
||||
@@ -56,17 +56,19 @@ typedef struct
|
||||
static volatile ax_audio_t *wiiu_cb_ax = NULL;
|
||||
void wiiu_ax_callback(void)
|
||||
{
|
||||
ax_audio_t *ax = NULL;
|
||||
/*possibly called before unregister */
|
||||
if(wiiu_cb_ax == NULL)
|
||||
if (!wiiu_cb_ax)
|
||||
return;
|
||||
|
||||
ax_audio_t *ax = (ax_audio_t*)wiiu_cb_ax;
|
||||
if(AXIsMultiVoiceRunning(ax->mvoice))
|
||||
ax = (ax_audio_t*)wiiu_cb_ax;
|
||||
|
||||
if (AXIsMultiVoiceRunning(ax->mvoice))
|
||||
{
|
||||
if(OSUninterruptibleSpinLock_Acquire(&ax->spinlock))
|
||||
if (OSUninterruptibleSpinLock_Acquire(&ax->spinlock))
|
||||
{
|
||||
/* Buffer underrun, stop playback to let it fill up */
|
||||
if(ax->written < AX_AUDIO_SAMPLE_MIN)
|
||||
if (ax->written < AX_AUDIO_SAMPLE_MIN)
|
||||
AXSetMultiVoiceState(ax->mvoice, AX_VOICE_STATE_STOPPED);
|
||||
ax->written -= AX_AUDIO_SAMPLE_COUNT;
|
||||
OSUninterruptibleSpinLock_Release(&ax->spinlock);
|
||||
@@ -100,7 +102,7 @@ static void* ax_audio_init(const char* device, unsigned rate, unsigned latency,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ax->buffer_l = MEM1_alloc(AX_AUDIO_SIZE, 0x100);
|
||||
ax->buffer_l = MEM1_alloc(AX_AUDIO_SIZE, 0x100);
|
||||
ax->buffer_r = MEM1_alloc(AX_AUDIO_SIZE, 0x100);
|
||||
memset(ax->buffer_l,0,AX_AUDIO_SIZE);
|
||||
memset(ax->buffer_r,0,AX_AUDIO_SIZE);
|
||||
@@ -166,9 +168,9 @@ static bool ax_audio_stop(void* data)
|
||||
|
||||
static int ax_audio_limit(int in)
|
||||
{
|
||||
if(in < 0)
|
||||
if (in < 0)
|
||||
in += AX_AUDIO_COUNT;
|
||||
else if(in >= AX_AUDIO_COUNT)
|
||||
else if (in >= AX_AUDIO_COUNT)
|
||||
in -= AX_AUDIO_COUNT;
|
||||
return in;
|
||||
}
|
||||
@@ -183,57 +185,58 @@ static bool ax_audio_start(void* data, bool is_shutdown)
|
||||
return true;
|
||||
|
||||
/* Set back to playing on enough buffered data */
|
||||
if(ax->written > AX_AUDIO_SAMPLE_LOAD)
|
||||
if (ax->written > AX_AUDIO_SAMPLE_LOAD)
|
||||
{
|
||||
AXSetMultiVoiceCurrentOffset(ax->mvoice, ax_audio_limit(ax->pos - ax->written));
|
||||
AXSetMultiVoiceState(ax->mvoice, AX_VOICE_STATE_PLAYING);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static ssize_t ax_audio_write(void* data, const void* buf, size_t size)
|
||||
{
|
||||
uint32_t i;
|
||||
size_t countAvail = 0;
|
||||
size_t count_avail = 0;
|
||||
ax_audio_t* ax = (ax_audio_t*)data;
|
||||
const uint16_t* src = buf;
|
||||
size_t count = size >> 2;
|
||||
|
||||
if(!size || (size & 0x3))
|
||||
if (!size || (size & 0x3))
|
||||
return 0;
|
||||
|
||||
if(count > AX_AUDIO_MAX_FREE)
|
||||
if (count > AX_AUDIO_MAX_FREE)
|
||||
count = AX_AUDIO_MAX_FREE;
|
||||
|
||||
countAvail = ((ax->written > AX_AUDIO_MAX_FREE) ? 0 : (AX_AUDIO_MAX_FREE - ax->written));
|
||||
count_avail = ((ax->written > AX_AUDIO_MAX_FREE) ? 0 : (AX_AUDIO_MAX_FREE - ax->written));
|
||||
|
||||
if (ax->nonblocking)
|
||||
if (ax->nonblock)
|
||||
{
|
||||
/* Not enough available for 3ms of data */
|
||||
if(countAvail < AX_AUDIO_SAMPLE_COUNT)
|
||||
if (count_avail < AX_AUDIO_SAMPLE_COUNT)
|
||||
count = 0;
|
||||
}
|
||||
else if(countAvail < count)
|
||||
else if (count_avail < count)
|
||||
{
|
||||
/* Sync, wait for free memory */
|
||||
while(AXIsMultiVoiceRunning(ax->mvoice) && (countAvail < count))
|
||||
while(AXIsMultiVoiceRunning(ax->mvoice) && (count_avail < count))
|
||||
{
|
||||
OSYieldThread(); /* Gives threads with same priority time to run */
|
||||
countAvail = (ax->written > AX_AUDIO_MAX_FREE ? 0 : (AX_AUDIO_MAX_FREE - ax->written));
|
||||
count_avail = (ax->written > AX_AUDIO_MAX_FREE ? 0 : (AX_AUDIO_MAX_FREE - ax->written));
|
||||
}
|
||||
}
|
||||
|
||||
/* Over available space, do as much as possible */
|
||||
if(count > countAvail)
|
||||
count = countAvail;
|
||||
if (count > count_avail)
|
||||
count = count_avail;
|
||||
|
||||
/* make sure we have input size */
|
||||
if(count > 0)
|
||||
if (count > 0)
|
||||
{
|
||||
/* write in new data */
|
||||
size_t startPos = ax->pos;
|
||||
int flushP2needed = 0;
|
||||
int flushP2 = 0;
|
||||
size_t start_pos = ax->pos;
|
||||
int flush_p2_needed = 0;
|
||||
int flush_p2 = 0;
|
||||
|
||||
for (i = 0; i < (count << 1); i += 2)
|
||||
{
|
||||
@@ -242,30 +245,31 @@ static ssize_t ax_audio_write(void* data, const void* buf, size_t size)
|
||||
ax->pos = ax_audio_limit(ax->pos + 1);
|
||||
|
||||
/* wrapped around, make sure to store cache */
|
||||
if(ax->pos == 0)
|
||||
if (ax->pos == 0)
|
||||
{
|
||||
flushP2needed = 1;
|
||||
flushP2 = ((count << 1) - i);
|
||||
DCStoreRangeNoSync(ax->buffer_l+startPos, (AX_AUDIO_COUNT-startPos) << 1);
|
||||
DCStoreRangeNoSync(ax->buffer_r+startPos, (AX_AUDIO_COUNT-startPos) << 1);
|
||||
flush_p2_needed = 1;
|
||||
flush_p2 = ((count << 1) - i);
|
||||
DCStoreRangeNoSync(ax->buffer_l + start_pos,
|
||||
(AX_AUDIO_COUNT - start_pos) << 1);
|
||||
DCStoreRangeNoSync(ax->buffer_r + start_pos, (AX_AUDIO_COUNT - start_pos) << 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* standard cache store case */
|
||||
if(!flushP2needed)
|
||||
if (!flush_p2_needed)
|
||||
{
|
||||
DCStoreRangeNoSync(ax->buffer_l+startPos, count << 1);
|
||||
DCStoreRange(ax->buffer_r+startPos, count << 1);
|
||||
DCStoreRangeNoSync(ax->buffer_l + start_pos, count << 1);
|
||||
DCStoreRange(ax->buffer_r + start_pos, count << 1);
|
||||
}
|
||||
/* store the rest after wrap */
|
||||
else if(flushP2 > 0)
|
||||
else if (flush_p2 > 0)
|
||||
{
|
||||
DCStoreRangeNoSync(ax->buffer_l, flushP2);
|
||||
DCStoreRange(ax->buffer_r, flushP2);
|
||||
DCStoreRangeNoSync(ax->buffer_l, flush_p2);
|
||||
DCStoreRange(ax->buffer_r, flush_p2);
|
||||
}
|
||||
|
||||
/* add in new audio data */
|
||||
if(OSUninterruptibleSpinLock_Acquire(&ax->spinlock))
|
||||
if (OSUninterruptibleSpinLock_Acquire(&ax->spinlock))
|
||||
{
|
||||
ax->written += count;
|
||||
OSUninterruptibleSpinLock_Release(&ax->spinlock);
|
||||
@@ -276,7 +280,7 @@ static ssize_t ax_audio_write(void* data, const void* buf, size_t size)
|
||||
*
|
||||
* checks if it can be started
|
||||
*/
|
||||
if(!AXIsMultiVoiceRunning(ax->mvoice))
|
||||
if (!AXIsMultiVoiceRunning(ax->mvoice))
|
||||
ax_audio_start(ax, false);
|
||||
|
||||
/* return what was actually copied */
|
||||
@@ -294,7 +298,7 @@ static void ax_audio_set_nonblock_state(void* data, bool state)
|
||||
ax_audio_t* ax = (ax_audio_t*)data;
|
||||
|
||||
if (ax)
|
||||
ax->nonblocking = state;
|
||||
ax->nonblock = state;
|
||||
}
|
||||
|
||||
static bool ax_audio_use_float(void* data)
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -869,26 +869,27 @@ static INLINE HRESULT XAudio2Create(_Outptr_ IXAudio2** ppXAudio2,
|
||||
typedef HRESULT(__stdcall *XAudio2CreateWithVersionInfoFunc)(_Outptr_ IXAudio2**, UINT32, XAUDIO2_PROCESSOR, DWORD);
|
||||
typedef HRESULT(__stdcall *XAudio2CreateInfoFunc)(_Outptr_ IXAudio2**, UINT32, XAUDIO2_PROCESSOR);
|
||||
|
||||
static HMODULE s_dllInstance = NULL;
|
||||
static XAudio2CreateWithVersionInfoFunc s_pfnAudio2CreateWithVersion = NULL;
|
||||
static XAudio2CreateWithVersionInfoFunc
|
||||
s_pfnAudio2CreateWithVersion = NULL;
|
||||
static XAudio2CreateInfoFunc s_pfnAudio2Create = NULL;
|
||||
static HMODULE s_dllInstance = NULL;
|
||||
|
||||
if (s_dllInstance == NULL)
|
||||
if (!s_dllInstance)
|
||||
{
|
||||
s_dllInstance = LoadLibraryEx(XAUDIO2_DLL, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
|
||||
if (s_dllInstance == NULL)
|
||||
if (!s_dllInstance)
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
|
||||
s_pfnAudio2CreateWithVersion = (XAudio2CreateWithVersionInfoFunc)(void*)GetProcAddress(s_dllInstance, "XAudio2CreateWithVersionInfo");
|
||||
if (s_pfnAudio2CreateWithVersion == NULL)
|
||||
if (!s_pfnAudio2CreateWithVersion)
|
||||
{
|
||||
s_pfnAudio2Create = (XAudio2CreateInfoFunc)(void*)GetProcAddress(s_dllInstance, "XAudio2Create");
|
||||
if (s_pfnAudio2Create == NULL)
|
||||
if (!s_pfnAudio2Create)
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
}
|
||||
}
|
||||
|
||||
if (s_pfnAudio2CreateWithVersion != NULL)
|
||||
if (s_pfnAudio2CreateWithVersion)
|
||||
return (*s_pfnAudio2CreateWithVersion)(ppXAudio2, Flags, XAudio2Processor, NTDDI_VERSION);
|
||||
return (*s_pfnAudio2Create)(ppXAudio2, Flags, XAudio2Processor);
|
||||
}
|
||||
|
||||
@@ -66,7 +66,15 @@ static ssize_t xenon360_audio_write(void *data, const void *buf, size_t size)
|
||||
for (i = 0; i < (size >> 2); i++)
|
||||
xa->buffer[i] = bswap_32(in_buf[i]);
|
||||
|
||||
if (!xa->nonblock)
|
||||
if (xa->nonblock)
|
||||
{
|
||||
if (xenon_sound_get_unplayed() < MAX_BUFFER)
|
||||
{
|
||||
xenon_sound_submit(xa->buffer, size);
|
||||
written = size;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while (xenon_sound_get_unplayed() >= MAX_BUFFER)
|
||||
{
|
||||
@@ -78,14 +86,6 @@ static ssize_t xenon360_audio_write(void *data, const void *buf, size_t size)
|
||||
xenon_sound_submit(xa->buffer, size);
|
||||
written = size;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (xenon_sound_get_unplayed() < MAX_BUFFER)
|
||||
{
|
||||
xenon_sound_submit(xa->buffer, size);
|
||||
written = size;
|
||||
}
|
||||
}
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
+7
-7
@@ -234,7 +234,7 @@ static int rsnd_connect_server( rsound_t *rd )
|
||||
if (!isdigit(rd->host[0]))
|
||||
{
|
||||
struct hostent *host = gethostbyname(rd->host);
|
||||
if (host == NULL)
|
||||
if (!host)
|
||||
return -1;
|
||||
|
||||
addr.sin_addr.s_addr = inet_addr(host->h_addr_list[0]);
|
||||
@@ -295,7 +295,7 @@ static int rsnd_send_header_info(rsound_t *rd)
|
||||
/* Defines the size of a wave header */
|
||||
#define HEADER_SIZE 44
|
||||
char *header = calloc(1, HEADER_SIZE);
|
||||
if (header == NULL)
|
||||
if (!header)
|
||||
{
|
||||
RSD_ERR("[RSound] Could not allocate memory.");
|
||||
return -1;
|
||||
@@ -472,7 +472,7 @@ static int rsnd_get_backend_info ( rsound_t *rd )
|
||||
if ( rd->fifo_buffer != NULL )
|
||||
fifo_free(rd->fifo_buffer);
|
||||
rd->fifo_buffer = fifo_new (rd->buffer_size);
|
||||
if ( rd->fifo_buffer == NULL )
|
||||
if (!rd->fifo_buffer)
|
||||
{
|
||||
RSD_ERR("[RSound] Failed to create FIFO buffer.\n");
|
||||
return -1;
|
||||
@@ -963,7 +963,7 @@ static int rsnd_close_ctl(rsound_t *rd)
|
||||
return -1;
|
||||
|
||||
subchar = strrchr(buf, 'R');
|
||||
if ( subchar == NULL )
|
||||
if (!subchar)
|
||||
index = 0;
|
||||
else
|
||||
{
|
||||
@@ -1023,7 +1023,7 @@ static int rsnd_update_server_info(rsound_t *rd)
|
||||
|
||||
temp[RSD_PROTO_CHUNKSIZE] = '\0';
|
||||
|
||||
if ( (substr = strstr(temp, "RSD")) == NULL )
|
||||
if (!(substr = strstr(temp, "RSD")))
|
||||
return -1;
|
||||
|
||||
// Jump over "RSD" in header
|
||||
@@ -1038,7 +1038,7 @@ static int rsnd_update_server_info(rsound_t *rd)
|
||||
|
||||
// We only bother if this is an INFO message.
|
||||
substr = strstr(temp, "INFO");
|
||||
if ( substr == NULL )
|
||||
if (!substr)
|
||||
continue;
|
||||
|
||||
// Jump over "INFO" in header
|
||||
@@ -1548,7 +1548,7 @@ int rsd_pause(rsound_t* rsound, int enable)
|
||||
int rsd_init(rsound_t** rsound)
|
||||
{
|
||||
*rsound = calloc(1, sizeof(rsound_t));
|
||||
if ( *rsound == NULL )
|
||||
if (*rsound == NULL)
|
||||
return -1;
|
||||
|
||||
retro_assert(rsound != NULL);
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
#include <psp2/kernel/sysmem.h>
|
||||
#include <psp2/kernel/threadmgr.h>
|
||||
|
||||
#define RAM_THRESHOLD 0xA00000 // Memory left to the system for threads and other internal stuffs
|
||||
#define RAM_THRESHOLD 0x1000000 // Memory left to the system for threads and other internal stuffs
|
||||
|
||||
static int _newlib_heap_memblock;
|
||||
static unsigned _newlib_heap_size;
|
||||
int _newlib_heap_memblock;
|
||||
unsigned _newlib_heap_size;
|
||||
char *_newlib_heap_base, *_newlib_heap_end, *_newlib_heap_cur;
|
||||
static char _newlib_sbrk_mutex[32] __attribute__ ((aligned (8)));
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ static void *android_camera_init(const char *device, uint64_t caps,
|
||||
goto dealloc;
|
||||
|
||||
GET_OBJECT_CLASS(env, class, android_app->activity->clazz);
|
||||
if (class == NULL)
|
||||
if (!class)
|
||||
goto dealloc;
|
||||
|
||||
GET_METHOD_ID(env, androidcamera->onCameraInit, class,
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
/* RetroArch - A frontend for libretro.
|
||||
* Copyright (C) 2012-2015 - Michael Lelli
|
||||
* Copyright (C) 2011-2017 - Daniel De Matteis
|
||||
*
|
||||
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||
* of the GNU General Public License as published by the Free Software Found-
|
||||
* ation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with RetroArch.
|
||||
* If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "../../retroarch.h"
|
||||
|
||||
static void *nullcamera_init(const char *device, uint64_t caps,
|
||||
unsigned width, unsigned height)
|
||||
{
|
||||
(void)device;
|
||||
return (void*)-1;
|
||||
}
|
||||
|
||||
static void nullcamera_free(void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static bool nullcamera_start(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void nullcamera_stop(void *data)
|
||||
{
|
||||
(void)data;
|
||||
}
|
||||
|
||||
static bool nullcamera_poll(void *data,
|
||||
retro_camera_frame_raw_framebuffer_t frame_raw_cb,
|
||||
retro_camera_frame_opengl_texture_t frame_gl_cb)
|
||||
{
|
||||
(void)data;
|
||||
(void)frame_raw_cb;
|
||||
(void)frame_gl_cb;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
camera_driver_t camera_null = {
|
||||
nullcamera_init,
|
||||
nullcamera_free,
|
||||
nullcamera_start,
|
||||
nullcamera_stop,
|
||||
nullcamera_poll,
|
||||
"null",
|
||||
};
|
||||
+51
-41
@@ -14,60 +14,70 @@
|
||||
*/
|
||||
|
||||
#include <file/file_path.h>
|
||||
#include <string/stdstring.h>
|
||||
|
||||
#ifdef HAVE_MENU
|
||||
#include "../menu/menu_driver.h"
|
||||
#endif
|
||||
|
||||
#include "../file_path_special.h"
|
||||
#include "../configuration.h"
|
||||
#include "../verbosity.h"
|
||||
#include "../network/net_http_special.h"
|
||||
#include "../gfx/gfx_display.h"
|
||||
|
||||
#include "badges.h"
|
||||
|
||||
badges_ctx_t badges_ctx;
|
||||
|
||||
bool badge_exists(const char* filepath)
|
||||
{
|
||||
return path_is_valid(filepath);
|
||||
}
|
||||
|
||||
void set_badge_menu_texture(badges_ctx_t * badges, int i)
|
||||
{
|
||||
char badge_file[16];
|
||||
char fullpath[PATH_MAX_LENGTH];
|
||||
|
||||
snprintf(badge_file, sizeof(badge_file), "%s%s", badges->badge_id_list[i],
|
||||
badges->badge_locked[i] ? "_lock.png" : ".png");
|
||||
|
||||
fill_pathname_application_special(fullpath,
|
||||
PATH_MAX_LENGTH * sizeof(char),
|
||||
APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES);
|
||||
|
||||
#ifdef HAVE_MENU
|
||||
menu_display_reset_textures_list(badge_file, fullpath,
|
||||
&badges->menu_texture_list[i],TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
void set_badge_info (badges_ctx_t *badge_struct, int id,
|
||||
const char *badge_id, bool active)
|
||||
#define CHEEVOS_MENU_BADGE_LIMIT 256
|
||||
static uintptr_t cheevos_badge_menu_texture_list[CHEEVOS_MENU_BADGE_LIMIT] = { 0 };
|
||||
|
||||
void cheevos_reset_menu_badges(void)
|
||||
{
|
||||
if (!badge_struct)
|
||||
return;
|
||||
int index;
|
||||
for (index = 0; index < CHEEVOS_MENU_BADGE_LIMIT; ++index)
|
||||
{
|
||||
if (cheevos_badge_menu_texture_list[index])
|
||||
video_driver_texture_unload(&cheevos_badge_menu_texture_list[index]);
|
||||
}
|
||||
|
||||
badge_struct->badge_id_list[id] = badge_id;
|
||||
badge_struct->badge_locked[id] = active;
|
||||
set_badge_menu_texture(badge_struct, id);
|
||||
memset(&cheevos_badge_menu_texture_list, 0, sizeof(cheevos_badge_menu_texture_list));
|
||||
}
|
||||
|
||||
menu_texture_item get_badge_texture(int id)
|
||||
void cheevos_set_menu_badge(int index, const char *badge, bool locked)
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
if (!settings || !settings->bools.cheevos_badges_enable)
|
||||
return (menu_texture_item)NULL;
|
||||
|
||||
return badges_ctx.menu_texture_list[id];
|
||||
if (index >= CHEEVOS_MENU_BADGE_LIMIT)
|
||||
return;
|
||||
|
||||
if (!settings || !settings->bools.cheevos_badges_enable)
|
||||
cheevos_badge_menu_texture_list[index] = 0;
|
||||
else
|
||||
cheevos_badge_menu_texture_list[index] = cheevos_get_badge_texture(badge, locked);
|
||||
}
|
||||
|
||||
uintptr_t cheevos_get_menu_badge_texture(int index)
|
||||
{
|
||||
if (index < CHEEVOS_MENU_BADGE_LIMIT)
|
||||
return cheevos_badge_menu_texture_list[index];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
uintptr_t cheevos_get_badge_texture(const char *badge, bool locked)
|
||||
{
|
||||
char badge_file[24];
|
||||
char fullpath[PATH_MAX_LENGTH];
|
||||
uintptr_t tex;
|
||||
|
||||
if (!badge)
|
||||
return 0;
|
||||
|
||||
snprintf(badge_file, sizeof(badge_file), "%s%s.png", badge, locked ? "_lock" : "");
|
||||
|
||||
fill_pathname_application_special(fullpath,
|
||||
PATH_MAX_LENGTH * sizeof(char),
|
||||
APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES);
|
||||
|
||||
gfx_display_reset_textures_list(badge_file, fullpath,
|
||||
&tex, TEXTURE_FILTER_MIPMAP_LINEAR, NULL, NULL);
|
||||
|
||||
return tex;
|
||||
}
|
||||
+8
-17
@@ -16,28 +16,19 @@
|
||||
#ifndef __RARCH_CHEEVOS_BADGE_H
|
||||
#define __RARCH_CHEEVOS_BADGE_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <retro_common_api.h>
|
||||
|
||||
#include "../menu/menu_driver.h"
|
||||
#include <boolean.h>
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
#define CHEEVOS_BADGE_LIMIT 256
|
||||
#ifdef HAVE_MENU
|
||||
void cheevos_reset_menu_badges(void);
|
||||
void cheevos_set_menu_badge(int index, const char *badge, bool locked);
|
||||
uintptr_t cheevos_get_menu_badge_texture(int index);
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bool badge_locked[CHEEVOS_BADGE_LIMIT];
|
||||
const char * badge_id_list[CHEEVOS_BADGE_LIMIT];
|
||||
menu_texture_item menu_texture_list[CHEEVOS_BADGE_LIMIT];
|
||||
} badges_ctx_t;
|
||||
|
||||
bool badge_exists(const char* filepath);
|
||||
void set_badge_menu_texture(badges_ctx_t * badges, int i);
|
||||
extern void set_badge_info (badges_ctx_t *badge_struct, int id, const char *badge_id, bool active);
|
||||
extern menu_texture_item get_badge_texture(int id);
|
||||
|
||||
extern badges_ctx_t badges_ctx;
|
||||
static badges_ctx_t new_badges_ctx;
|
||||
uintptr_t cheevos_get_badge_texture(const char* badge, bool locked);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
|
||||
+1147
-499
File diff suppressed because it is too large.
Load diff
@@ -45,6 +45,7 @@ bool rcheevos_load(const void *data);
|
||||
void rcheevos_reset_game(void);
|
||||
|
||||
void rcheevos_populate_menu(void *data);
|
||||
void rcheevos_get_achievement_state(unsigned index, char* buffer, size_t buffer_size);
|
||||
|
||||
bool rcheevos_get_description(rcheevos_ctx_desc_t *desc);
|
||||
|
||||
@@ -64,6 +65,10 @@ bool rcheevos_get_support_cheevos(void);
|
||||
|
||||
int rcheevos_get_console(void);
|
||||
|
||||
const char* rcheevos_get_hash(void);
|
||||
|
||||
const char *rcheevos_get_richpresence(void);
|
||||
|
||||
extern bool rcheevos_loaded;
|
||||
extern bool rcheevos_hardcore_active;
|
||||
extern bool rcheevos_hardcore_paused;
|
||||
|
||||
+46
-9
@@ -124,6 +124,7 @@ const uint8_t* rcheevos_patch_address(unsigned address, int console)
|
||||
{
|
||||
rarch_system_info_t* system = runloop_get_system_info();
|
||||
const void* pointer = NULL;
|
||||
unsigned original_address = address;
|
||||
|
||||
if (console == RC_CONSOLE_NINTENDO)
|
||||
{
|
||||
@@ -168,9 +169,30 @@ const uint8_t* rcheevos_patch_address(unsigned address, int console)
|
||||
}
|
||||
else if (console == RC_CONSOLE_PC_ENGINE)
|
||||
{
|
||||
/* RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x1f0000);
|
||||
address += 0x1f0000;
|
||||
if (address < 0x002000)
|
||||
{
|
||||
/* RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x1f0000);
|
||||
address += 0x1f0000;
|
||||
}
|
||||
else if (address < 0x012000)
|
||||
{
|
||||
/* CD-ROM RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x100000 - 0x002000);
|
||||
address += 0x100000 - 0x002000;
|
||||
}
|
||||
else if (address < 0x042000)
|
||||
{
|
||||
/* Super System Card RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x0d0000 - 0x012000);
|
||||
address += 0x0d0000 - 0x012000;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* CD-ROM battery backed RAM. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "PCE memory address %X adjusted to %X\n", address, address + 0x1ee000 - 0x042000);
|
||||
address += 0x1ee000 - 0x042000;
|
||||
}
|
||||
}
|
||||
else if (console == RC_CONSOLE_SUPER_NINTENDO)
|
||||
{
|
||||
@@ -187,6 +209,21 @@ const uint8_t* rcheevos_patch_address(unsigned address, int console)
|
||||
address += 0x006000 - 0x020000;
|
||||
}
|
||||
}
|
||||
else if (console == RC_CONSOLE_SEGA_CD)
|
||||
{
|
||||
if (address < 0x010000)
|
||||
{
|
||||
/* Work RAM. */
|
||||
address += 0xFF0000;
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Sega CD memory address %X adjusted to %X\n", original_address, address);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* CD-ROM peripheral RAM - exposed at virtual address to avoid banking */
|
||||
address += 0x80020000 - 0x010000;
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Sega CD memory address %X adjusted to %X\n", original_address, address);
|
||||
}
|
||||
}
|
||||
|
||||
desc = system->mmaps.descriptors;
|
||||
end = desc + system->mmaps.num_descriptors;
|
||||
@@ -195,19 +232,18 @@ const uint8_t* rcheevos_patch_address(unsigned address, int console)
|
||||
{
|
||||
if (((desc->core.start ^ address) & desc->core.select) == 0)
|
||||
{
|
||||
unsigned addr = address;
|
||||
pointer = desc->core.ptr;
|
||||
pointer = desc->core.ptr;
|
||||
address -= desc->core.start;
|
||||
|
||||
address = (unsigned)rcheevos_var_reduce(
|
||||
(addr - desc->core.start) & desc->disconnect_mask,
|
||||
desc->core.disconnect);
|
||||
if (desc->disconnect_mask)
|
||||
address = (unsigned)rcheevos_var_reduce(address & desc->disconnect_mask, desc->core.disconnect);
|
||||
|
||||
if (address >= desc->core.len)
|
||||
address -= rcheevos_var_highest_bit(address);
|
||||
|
||||
address += desc->core.offset;
|
||||
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "address %X set to descriptor %d at offset %X\n", addr, (int)((desc - system->mmaps.descriptors) + 1), address);
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "address %X set to descriptor %d at offset %X\n", original_address, (int)((desc - system->mmaps.descriptors) + 1), address);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -257,6 +293,7 @@ const uint8_t* rcheevos_patch_address(unsigned address, int console)
|
||||
|
||||
if (pointer == NULL)
|
||||
{
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "address %X not supported\n", original_address);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
+129
-21
@@ -3,6 +3,7 @@
|
||||
#include "hash.h"
|
||||
#include "util.h"
|
||||
|
||||
#include <encodings/utf.h>
|
||||
#include <formats/jsonsax.h>
|
||||
#include <string/stdstring.h>
|
||||
#include <compat/strl.h>
|
||||
@@ -23,6 +24,7 @@
|
||||
#define CHEEVOS_JSON_KEY_TOKEN 0x0e2dbd26U
|
||||
#define CHEEVOS_JSON_KEY_FLAGS 0x0d2e96b2U
|
||||
#define CHEEVOS_JSON_KEY_LEADERBOARDS 0xf1247d2dU
|
||||
#define CHEEVOS_JSON_KEY_RICHPRESENCE 0xf18dd230U
|
||||
#define CHEEVOS_JSON_KEY_MEM 0x0b8807e4U
|
||||
#define CHEEVOS_JSON_KEY_FORMAT 0xb341208eU
|
||||
#define CHEEVOS_JSON_KEY_SUCCESS 0x110461deU
|
||||
@@ -139,7 +141,7 @@ static int rcheevos_get_value(const char* json, unsigned key_hash,
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Returns the token of the error message
|
||||
Returns the token or the error message
|
||||
*****************************************************************************/
|
||||
|
||||
int rcheevos_get_token(const char* json, char* token, size_t length)
|
||||
@@ -152,6 +154,11 @@ int rcheevos_get_token(const char* json, char* token, size_t length)
|
||||
return rcheevos_get_value(json, CHEEVOS_JSON_KEY_TOKEN, token, length);
|
||||
}
|
||||
|
||||
int rcheevos_get_json_error(const char* json, char* token, size_t length)
|
||||
{
|
||||
return rcheevos_get_value(json, CHEEVOS_JSON_KEY_ERROR, token, length);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
Count number of achievements in a JSON file
|
||||
*****************************************************************************/
|
||||
@@ -160,6 +167,7 @@ typedef struct
|
||||
{
|
||||
int in_cheevos;
|
||||
int in_lboards;
|
||||
int has_error;
|
||||
uint32_t field_hash;
|
||||
unsigned core_count;
|
||||
unsigned unofficial_count;
|
||||
@@ -183,9 +191,11 @@ static int rcheevos_count_key(void* userdata,
|
||||
ud->field_hash = rcheevos_djb2(name, length);
|
||||
|
||||
if (ud->field_hash == CHEEVOS_JSON_KEY_ACHIEVEMENTS)
|
||||
ud->in_cheevos = 1;
|
||||
ud->in_cheevos = 1;
|
||||
else if (ud->field_hash == CHEEVOS_JSON_KEY_LEADERBOARDS)
|
||||
ud->in_lboards = 1;
|
||||
ud->in_lboards = 1;
|
||||
else if (ud->field_hash == CHEEVOS_JSON_KEY_ERROR)
|
||||
ud->has_error = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -212,7 +222,7 @@ static int rcheevos_count_number(void* userdata,
|
||||
|
||||
static int rcheevos_count_cheevos(const char* json,
|
||||
unsigned* core_count, unsigned* unofficial_count,
|
||||
unsigned* lboard_count)
|
||||
unsigned* lboard_count, int* has_error)
|
||||
{
|
||||
static const jsonsax_handlers_t handlers =
|
||||
{
|
||||
@@ -234,6 +244,7 @@ static int rcheevos_count_cheevos(const char* json,
|
||||
rcheevos_countud_t ud;
|
||||
ud.in_cheevos = 0;
|
||||
ud.in_lboards = 0;
|
||||
ud.has_error = 0;
|
||||
ud.core_count = 0;
|
||||
ud.unofficial_count = 0;
|
||||
ud.lboard_count = 0;
|
||||
@@ -243,6 +254,7 @@ static int rcheevos_count_cheevos(const char* json,
|
||||
*core_count = ud.core_count;
|
||||
*unofficial_count = ud.unofficial_count;
|
||||
*lboard_count = ud.lboard_count;
|
||||
*has_error = ud.has_error;
|
||||
|
||||
return res;
|
||||
}
|
||||
@@ -261,7 +273,10 @@ typedef struct
|
||||
{
|
||||
int in_cheevos;
|
||||
int in_lboards;
|
||||
int is_game_id;
|
||||
int is_title;
|
||||
int is_console_id;
|
||||
int is_richpresence;
|
||||
unsigned core_count;
|
||||
unsigned unofficial_count;
|
||||
unsigned lboard_count;
|
||||
@@ -273,16 +288,77 @@ typedef struct
|
||||
rcheevos_rapatchdata_t* patchdata;
|
||||
} rcheevos_readud_t;
|
||||
|
||||
static const char* rcheevos_dupstr(const rcheevos_field_t* field)
|
||||
static char* rcheevos_unescape_string(const char* string, size_t length)
|
||||
{
|
||||
char* string = (char*)malloc(field->length + 1);
|
||||
const char* end = string + length;
|
||||
char* buffer = (char*)malloc(length + 1);
|
||||
char* buffer_it = buffer;
|
||||
|
||||
if (!string)
|
||||
if (buffer == NULL)
|
||||
return NULL;
|
||||
|
||||
memcpy((void*)string, (void*)field->string, field->length);
|
||||
string[field->length] = 0;
|
||||
return string;
|
||||
while (string < end)
|
||||
{
|
||||
if (*string == '\\')
|
||||
{
|
||||
char escaped_char = string[1];
|
||||
switch (escaped_char)
|
||||
{
|
||||
case 'r': /* Ignore carriage return */
|
||||
string += 2;
|
||||
break;
|
||||
|
||||
case 'n': /* Accept newlines */
|
||||
*buffer_it++ = '\n';
|
||||
string += 2;
|
||||
break;
|
||||
|
||||
case 'u': /* Accept UTF-16 unicode characters */
|
||||
{
|
||||
#define MAX_SEQUENCES 16
|
||||
uint16_t utf16[MAX_SEQUENCES];
|
||||
char utf8[MAX_SEQUENCES * 4];
|
||||
uint8_t i, j;
|
||||
|
||||
for (i = 1; i < MAX_SEQUENCES - 1; i++)
|
||||
if (strncmp((string + 6 * i), "\\u", 2))
|
||||
break;
|
||||
|
||||
/* Get escaped hex values and add them to the string */
|
||||
for (j = 0; j < i; j++)
|
||||
{
|
||||
char temp[5];
|
||||
|
||||
string += 2;
|
||||
memcpy(temp, string, 4);
|
||||
temp[4] = '\0';
|
||||
utf16[j] = string_hex_to_unsigned(temp);
|
||||
string += 4;
|
||||
}
|
||||
utf16[j] = 0;
|
||||
|
||||
if (utf16_to_char_string(utf16, utf8, sizeof(utf8)))
|
||||
{
|
||||
memcpy(buffer_it, utf8, strlen(utf8));
|
||||
buffer_it += strlen(utf8);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
*buffer_it++ = escaped_char;
|
||||
string += 2;
|
||||
break;
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
*buffer_it++ = *string++;
|
||||
}
|
||||
}
|
||||
*buffer_it = '\0';
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static int rcheevos_new_cheevo(rcheevos_readud_t* ud)
|
||||
@@ -297,10 +373,10 @@ static int rcheevos_new_cheevo(rcheevos_readud_t* ud)
|
||||
else
|
||||
return 0;
|
||||
|
||||
cheevo->title = rcheevos_dupstr(&ud->title);
|
||||
cheevo->description = rcheevos_dupstr(&ud->desc);
|
||||
cheevo->badge = rcheevos_dupstr(&ud->badge);
|
||||
cheevo->memaddr = rcheevos_dupstr(&ud->memaddr);
|
||||
cheevo->title = rcheevos_unescape_string(ud->title.string, ud->title.length);
|
||||
cheevo->description = rcheevos_unescape_string(ud->desc.string, ud->desc.length);
|
||||
cheevo->badge = rcheevos_unescape_string(ud->badge.string, ud->badge.length);
|
||||
cheevo->memaddr = rcheevos_unescape_string(ud->memaddr.string, ud->memaddr.length);
|
||||
cheevo->points = (unsigned)strtol(ud->points.string, NULL, 10);
|
||||
cheevo->id = (unsigned)strtol(ud->id.string, NULL, 10);
|
||||
|
||||
@@ -323,11 +399,11 @@ static int rcheevos_new_lboard(rcheevos_readud_t* ud)
|
||||
{
|
||||
rcheevos_ralboard_t* lboard = ud->patchdata->lboards + ud->lboard_count++;
|
||||
|
||||
lboard->title = rcheevos_dupstr(&ud->title);
|
||||
lboard->description = rcheevos_dupstr(&ud->desc);
|
||||
lboard->format = rcheevos_dupstr(&ud->format);
|
||||
lboard->mem = rcheevos_dupstr(&ud->memaddr);
|
||||
lboard->id = (unsigned)strtol(ud->id.string, NULL, 10);
|
||||
lboard->title = rcheevos_unescape_string(ud->title.string, ud->title.length);
|
||||
lboard->description = rcheevos_unescape_string(ud->desc.string, ud->desc.length);
|
||||
lboard->format = rcheevos_unescape_string(ud->format.string, ud->format.length);
|
||||
lboard->mem = rcheevos_unescape_string(ud->memaddr.string, ud->memaddr.length);
|
||||
lboard->id = (unsigned)strtol(ud->id.string, NULL, 10);
|
||||
|
||||
if ( !lboard->title
|
||||
|| !lboard->description
|
||||
@@ -386,9 +462,14 @@ static int rcheevos_read_key(void* userdata,
|
||||
case CHEEVOS_JSON_KEY_CONSOLE_ID:
|
||||
ud->is_console_id = 1;
|
||||
break;
|
||||
case CHEEVOS_JSON_KEY_RICHPRESENCE:
|
||||
ud->is_richpresence = 1;
|
||||
break;
|
||||
case CHEEVOS_JSON_KEY_ID:
|
||||
if (common)
|
||||
ud->field = &ud->id;
|
||||
else
|
||||
ud->is_game_id = 1;
|
||||
break;
|
||||
case CHEEVOS_JSON_KEY_MEMADDR:
|
||||
if (ud->in_cheevos)
|
||||
@@ -401,6 +482,8 @@ static int rcheevos_read_key(void* userdata,
|
||||
case CHEEVOS_JSON_KEY_TITLE:
|
||||
if (common)
|
||||
ud->field = &ud->title;
|
||||
else
|
||||
ud->is_title = 1;
|
||||
break;
|
||||
case CHEEVOS_JSON_KEY_DESCRIPTION:
|
||||
if (common)
|
||||
@@ -451,6 +534,16 @@ static int rcheevos_read_string(void* userdata,
|
||||
ud->field->string = string;
|
||||
ud->field->length = length;
|
||||
}
|
||||
else if (ud->is_title)
|
||||
{
|
||||
ud->patchdata->title = rcheevos_unescape_string(string, length);
|
||||
ud->is_title = 0;
|
||||
}
|
||||
else if (ud->is_richpresence)
|
||||
{
|
||||
ud->patchdata->richpresence_script = rcheevos_unescape_string(string, length);
|
||||
ud->is_richpresence = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -465,6 +558,11 @@ static int rcheevos_read_number(void* userdata,
|
||||
ud->field->string = number;
|
||||
ud->field->length = length;
|
||||
}
|
||||
else if (ud->is_game_id)
|
||||
{
|
||||
ud->patchdata->game_id = (unsigned)strtol(number, NULL, 10);
|
||||
ud->is_game_id = 0;
|
||||
}
|
||||
else if (ud->is_console_id)
|
||||
{
|
||||
ud->patchdata->console_id = (unsigned)strtol(number, NULL, 10);
|
||||
@@ -494,12 +592,13 @@ int rcheevos_get_patchdata(const char* json, rcheevos_rapatchdata_t* patchdata)
|
||||
|
||||
rcheevos_readud_t ud;
|
||||
int res;
|
||||
int has_error;
|
||||
|
||||
/* Count the number of achievements in the JSON file. */
|
||||
res = rcheevos_count_cheevos(json, &patchdata->core_count,
|
||||
&patchdata->unofficial_count, &patchdata->lboard_count);
|
||||
&patchdata->unofficial_count, &patchdata->lboard_count, &has_error);
|
||||
|
||||
if (res != JSONSAX_OK)
|
||||
if (res != JSONSAX_OK || has_error)
|
||||
return -1;
|
||||
|
||||
/* Allocate the achievements. */
|
||||
@@ -524,10 +623,16 @@ int rcheevos_get_patchdata(const char* json, rcheevos_rapatchdata_t* patchdata)
|
||||
return -1;
|
||||
}
|
||||
|
||||
patchdata->richpresence_script = NULL;
|
||||
patchdata->title = NULL;
|
||||
|
||||
/* Load the achievements. */
|
||||
ud.in_cheevos = 0;
|
||||
ud.in_lboards = 0;
|
||||
ud.is_game_id = 0;
|
||||
ud.is_title = 0;
|
||||
ud.is_console_id = 0;
|
||||
ud.is_richpresence = 0;
|
||||
ud.field = NULL;
|
||||
ud.core_count = 0;
|
||||
ud.unofficial_count = 0;
|
||||
@@ -586,7 +691,10 @@ void rcheevos_free_patchdata(rcheevos_rapatchdata_t* patchdata)
|
||||
CHEEVOS_FREE(patchdata->core);
|
||||
CHEEVOS_FREE(patchdata->unofficial);
|
||||
CHEEVOS_FREE(patchdata->lboards);
|
||||
CHEEVOS_FREE(patchdata->richpresence_script);
|
||||
CHEEVOS_FREE(patchdata->title);
|
||||
|
||||
patchdata->game_id = 0;
|
||||
patchdata->console_id = 0;
|
||||
patchdata->core = NULL;
|
||||
patchdata->unofficial = NULL;
|
||||
|
||||
@@ -42,11 +42,14 @@ typedef struct {
|
||||
} rcheevos_ralboard_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned game_id;
|
||||
unsigned console_id;
|
||||
char* title;
|
||||
|
||||
rcheevos_racheevo_t* core;
|
||||
rcheevos_racheevo_t* unofficial;
|
||||
rcheevos_ralboard_t* lboards;
|
||||
char* richpresence_script;
|
||||
|
||||
unsigned core_count;
|
||||
unsigned unofficial_count;
|
||||
@@ -55,6 +58,7 @@ typedef struct {
|
||||
|
||||
typedef void (*rcheevos_unlock_cb_t)(unsigned id, void* userdata);
|
||||
|
||||
int rcheevos_get_json_error(const char* json, char* token, size_t length);
|
||||
int rcheevos_get_token(const char* json, char* token, size_t length);
|
||||
|
||||
int rcheevos_get_patchdata(const char* json, rcheevos_rapatchdata_t* patchdata);
|
||||
|
||||
@@ -180,6 +180,8 @@ enum event_command
|
||||
CMD_EVENT_DISK_NEXT,
|
||||
/* Cycle to previous disk. */
|
||||
CMD_EVENT_DISK_PREV,
|
||||
/* Switch to specified disk index */
|
||||
CMD_EVENT_DISK_INDEX,
|
||||
/* Appends disk image to disk image list. */
|
||||
CMD_EVENT_DISK_APPEND_IMAGE,
|
||||
/* Stops rumbling. */
|
||||
@@ -208,11 +210,10 @@ enum event_command
|
||||
CMD_EVENT_CHEAT_INDEX_PLUS,
|
||||
CMD_EVENT_CHEAT_INDEX_MINUS,
|
||||
CMD_EVENT_CHEAT_TOGGLE,
|
||||
CMD_EVENT_AI_SERVICE_CALL
|
||||
CMD_EVENT_AI_SERVICE_CALL,
|
||||
CMD_EVENT_SAVE_FILES
|
||||
};
|
||||
|
||||
bool command_set_shader(const char *arg);
|
||||
|
||||
/**
|
||||
* command_event:
|
||||
* @cmd : Command index.
|
||||
|
||||
+246
-164
@@ -89,6 +89,8 @@
|
||||
#define DEFAULT_MAX_PADS 4
|
||||
#elif defined(HAVE_XINPUT) && !defined(HAVE_DINPUT)
|
||||
#define DEFAULT_MAX_PADS 4
|
||||
#elif defined(DINGUX)
|
||||
#define DEFAULT_MAX_PADS 2
|
||||
#else
|
||||
#define DEFAULT_MAX_PADS 16
|
||||
#endif
|
||||
@@ -97,7 +99,7 @@
|
||||
#define DEFAULT_MOUSE_SCALE 1
|
||||
#endif
|
||||
|
||||
#if defined(RARCH_MOBILE) || defined(HAVE_LIBNX)
|
||||
#if defined(RARCH_MOBILE) || defined(HAVE_LIBNX) || defined(__WINRT__)
|
||||
#define DEFAULT_POINTER_ENABLE true
|
||||
#else
|
||||
#define DEFAULT_POINTER_ENABLE false
|
||||
@@ -132,15 +134,41 @@
|
||||
/* Adjust menu padding etc. to better fit the
|
||||
* screen when using landscape layouts */
|
||||
#if defined(RARCH_MOBILE)
|
||||
#define DEFAULT_MATERIALUI_OPTIMIZE_LANDSCAPE_LAYOUT false
|
||||
#define DEFAULT_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION_DISABLED
|
||||
#else
|
||||
#define DEFAULT_MATERIALUI_OPTIMIZE_LANDSCAPE_LAYOUT true
|
||||
#define DEFAULT_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION_ALWAYS
|
||||
#endif
|
||||
|
||||
/* Show/hide navigation bar
|
||||
* > When hidden, MaterialUI menu navigation
|
||||
* behaves like RGUI */
|
||||
#define DEFAULT_MATERIALUI_SHOW_NAV_BAR true
|
||||
|
||||
/* Reposition navigation bar to make better use
|
||||
* of screen space when using landscape layouts */
|
||||
#define DEFAULT_MATERIALUI_AUTO_ROTATE_NAV_BAR true
|
||||
|
||||
/* Default portrait/landscape playlist view modes
|
||||
* (when thumbnails are enabled) */
|
||||
#define DEFAULT_MATERIALUI_THUMBNAIL_VIEW_PORTRAIT MATERIALUI_THUMBNAIL_VIEW_PORTRAIT_LIST_SMALL
|
||||
#define DEFAULT_MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE_LIST_MEDIUM
|
||||
|
||||
/* Enable second thumbnail when using 'list view'
|
||||
* thumbnail views
|
||||
* Note: Second thumbnail will only be drawn if
|
||||
* display has sufficient horizontal real estate */
|
||||
#if defined(RARCH_MOBILE)
|
||||
#define DEFAULT_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE false
|
||||
#else
|
||||
#define DEFAULT_MATERIALUI_DUAL_THUMBNAIL_LIST_VIEW_ENABLE true
|
||||
#endif
|
||||
|
||||
/* Draw solid colour 4:3 background when rendering
|
||||
* thumbnails
|
||||
* > Helps to unify menu appearance when viewing
|
||||
* thumbnails of different sizes */
|
||||
#define DEFAULT_MATERIALUI_THUMBNAIL_BACKGROUND_ENABLE true
|
||||
|
||||
#define DEFAULT_CRT_SWITCH_RESOLUTION CRT_SWITCH_NONE
|
||||
|
||||
#define DEFAULT_CRT_SWITCH_RESOLUTION_SUPER 2560
|
||||
@@ -151,6 +179,10 @@
|
||||
|
||||
#define DEFAULT_PLAYLIST_ENTRY_RENAME true
|
||||
|
||||
#define DEFAULT_ACCESSIBILITY_ENABLE false
|
||||
|
||||
#define DEFAULT_ACCESSIBILITY_NARRATOR_SPEECH_SPEED 5
|
||||
|
||||
#define DEFAULT_DRIVER_SWITCH_ENABLE true
|
||||
|
||||
#define DEFAULT_USER_LANGUAGE 0
|
||||
@@ -182,7 +214,13 @@
|
||||
/* Fullscreen */
|
||||
|
||||
/* To start in Fullscreen, or not. */
|
||||
|
||||
#ifdef HAVE_STEAM
|
||||
/* Start in fullscreen mode for Steam build */
|
||||
#define DEFAULT_FULLSCREEN true
|
||||
#else
|
||||
#define DEFAULT_FULLSCREEN false
|
||||
#endif
|
||||
|
||||
/* To use windowed mode or not when going fullscreen. */
|
||||
#define DEFAULT_WINDOWED_FULLSCREEN true
|
||||
@@ -296,7 +334,14 @@
|
||||
#endif
|
||||
|
||||
/* Smooths picture. */
|
||||
#if defined(_3DS) || defined(GEKKO) || defined(HW_RVL) || defined(PSP) || defined(VITA) || defined(SN_TARGET_PSP2) || defined(PS2) || defined(_XBOX)
|
||||
#define DEFAULT_VIDEO_SMOOTH true
|
||||
#else
|
||||
#define DEFAULT_VIDEO_SMOOTH false
|
||||
#endif
|
||||
|
||||
/* Graphics context specific scaling */
|
||||
#define DEFAULT_VIDEO_CTX_SCALING false
|
||||
|
||||
/* On resize and fullscreen, rendering area will stay 4:3 */
|
||||
#define DEFAULT_FORCE_ASPECT true
|
||||
@@ -353,9 +398,9 @@
|
||||
#define DEFAULT_OVERLAY_AUTO_ROTATE false
|
||||
#endif
|
||||
|
||||
#include "runtime_file.h"
|
||||
#ifdef HAVE_MENU
|
||||
#include "menu/menu_driver.h"
|
||||
#include "menu/menu_animation.h"
|
||||
|
||||
#ifdef HAVE_LIBNX
|
||||
#define DEFAULT_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME true
|
||||
@@ -364,6 +409,8 @@
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_OZONE
|
||||
/* Ozone colour theme: 1 == Basic Black */
|
||||
#define DEFAULT_OZONE_COLOR_THEME 1
|
||||
#define DEFAULT_OZONE_COLLAPSE_SIDEBAR false
|
||||
#define DEFAULT_OZONE_TRUNCATE_PLAYLIST_NAME true
|
||||
#define DEFAULT_OZONE_SCROLL_CONTENT_METADATA false
|
||||
@@ -415,91 +462,102 @@
|
||||
|
||||
#define DEFAULT_QUICK_MENU_SHOW_CLOSE_CONTENT true
|
||||
|
||||
static bool quick_menu_show_take_screenshot = true;
|
||||
static bool quick_menu_show_save_load_state = true;
|
||||
static bool quick_menu_show_undo_save_load_state = true;
|
||||
static bool quick_menu_show_add_to_favorites = true;
|
||||
static bool quick_menu_show_start_recording = true;
|
||||
static bool quick_menu_show_start_streaming = true;
|
||||
static bool quick_menu_show_set_core_association = true;
|
||||
static bool quick_menu_show_reset_core_association = true;
|
||||
static bool quick_menu_show_options = true;
|
||||
static bool quick_menu_show_controls = true;
|
||||
static bool quick_menu_show_cheats = true;
|
||||
static bool quick_menu_show_shaders = true;
|
||||
static bool quick_menu_show_information = true;
|
||||
static bool quick_menu_show_recording = true;
|
||||
static bool quick_menu_show_streaming = true;
|
||||
#define DEFAULT_QUICK_MENU_SHOW_TAKE_SCREENSHOT true
|
||||
|
||||
static bool quick_menu_show_save_core_overrides = true;
|
||||
static bool quick_menu_show_save_game_overrides = true;
|
||||
static bool quick_menu_show_save_content_dir_overrides = true;
|
||||
#define DEFAULT_QUICK_MENU_SHOW_SAVE_LOAD_STATE true
|
||||
|
||||
static bool quick_menu_show_download_thumbnails = true;
|
||||
#define DEFAULT_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE true
|
||||
|
||||
static bool kiosk_mode_enable = false;
|
||||
static const bool quick_menu_show_add_to_favorites = true;
|
||||
static const bool quick_menu_show_start_recording = true;
|
||||
static const bool quick_menu_show_start_streaming = true;
|
||||
static const bool quick_menu_show_set_core_association = true;
|
||||
static const bool quick_menu_show_reset_core_association = true;
|
||||
static const bool quick_menu_show_options = true;
|
||||
static const bool quick_menu_show_controls = true;
|
||||
static const bool quick_menu_show_cheats = true;
|
||||
static const bool quick_menu_show_shaders = true;
|
||||
static const bool quick_menu_show_information = true;
|
||||
static const bool quick_menu_show_recording = true;
|
||||
static const bool quick_menu_show_streaming = true;
|
||||
|
||||
static const bool quick_menu_show_save_core_overrides = true;
|
||||
static const bool quick_menu_show_save_game_overrides = true;
|
||||
static const bool quick_menu_show_save_content_dir_overrides = true;
|
||||
|
||||
#ifdef HAVE_NETWORKING
|
||||
static const bool quick_menu_show_download_thumbnails = true;
|
||||
#endif
|
||||
|
||||
#define DEFAULT_KIOSK_MODE_ENABLE false
|
||||
|
||||
#define DEFAULT_MENU_HORIZONTAL_ANIMATION true
|
||||
|
||||
static bool menu_show_online_updater = true;
|
||||
static bool menu_show_load_core = true;
|
||||
static bool menu_show_load_content = true;
|
||||
static const bool menu_show_online_updater = true;
|
||||
static const bool menu_show_load_core = true;
|
||||
static const bool menu_show_load_content = true;
|
||||
#ifdef HAVE_CDROM
|
||||
static bool menu_show_load_disc = true;
|
||||
static bool menu_show_dump_disc = true;
|
||||
static const bool menu_show_load_disc = true;
|
||||
static const bool menu_show_dump_disc = true;
|
||||
#endif
|
||||
static bool menu_show_information = true;
|
||||
static bool menu_show_configurations = true;
|
||||
static bool menu_show_help = true;
|
||||
static bool menu_show_quit_retroarch = true;
|
||||
static bool menu_show_restart_retroarch = true;
|
||||
static bool menu_show_reboot = true;
|
||||
static bool menu_show_shutdown = true;
|
||||
static const bool menu_show_information = true;
|
||||
static const bool menu_show_configurations = true;
|
||||
static const bool menu_show_help = true;
|
||||
static const bool menu_show_quit_retroarch = true;
|
||||
static const bool menu_show_restart_retroarch = true;
|
||||
static const bool menu_show_reboot = true;
|
||||
static const bool menu_show_shutdown = true;
|
||||
#if defined(HAVE_LAKKA) || defined(VITA) || defined(_3DS)
|
||||
static bool menu_show_core_updater = false;
|
||||
static const bool menu_show_core_updater = false;
|
||||
#else
|
||||
static bool menu_show_core_updater = true;
|
||||
static const bool menu_show_core_updater = true;
|
||||
#endif
|
||||
static bool menu_show_legacy_thumbnail_updater = false;
|
||||
static bool menu_show_sublabels = true;
|
||||
static const bool menu_show_legacy_thumbnail_updater = false;
|
||||
static const bool menu_show_sublabels = true;
|
||||
|
||||
static unsigned menu_ticker_type = TICKER_TYPE_BOUNCE;
|
||||
static float menu_ticker_speed = 1.0f;
|
||||
static const bool menu_scroll_fast = false;
|
||||
|
||||
#define DEFAULT_MENU_TICKER_TYPE (TICKER_TYPE_BOUNCE)
|
||||
static const float menu_ticker_speed = 1.0f;
|
||||
|
||||
#define DEFAULT_MENU_TICKER_SMOOTH true
|
||||
|
||||
#if defined(HAVE_THREADS)
|
||||
static bool menu_savestate_resume = true;
|
||||
static const bool menu_savestate_resume = true;
|
||||
#else
|
||||
static bool menu_savestate_resume = false;
|
||||
static const bool menu_savestate_resume = false;
|
||||
#endif
|
||||
|
||||
static bool content_show_settings = true;
|
||||
static bool content_show_favorites = true;
|
||||
#define DEFAULT_MENU_INSERT_DISK_RESUME true
|
||||
|
||||
static const bool content_show_settings = true;
|
||||
static const bool content_show_favorites = true;
|
||||
#ifdef HAVE_IMAGEVIEWER
|
||||
static bool content_show_images = true;
|
||||
static const bool content_show_images = true;
|
||||
#endif
|
||||
static bool content_show_music = true;
|
||||
static const bool content_show_music = true;
|
||||
#if defined(HAVE_FFMPEG) || defined(HAVE_MPV)
|
||||
static bool content_show_video = true;
|
||||
static const bool content_show_video = true;
|
||||
#endif
|
||||
#ifdef HAVE_NETWORKING
|
||||
static bool content_show_netplay = true;
|
||||
static const bool content_show_netplay = true;
|
||||
#endif
|
||||
static bool content_show_history = true;
|
||||
#ifdef HAVE_LIBRETRODB
|
||||
static bool content_show_add = true;
|
||||
#endif
|
||||
static bool content_show_playlists = true;
|
||||
static const bool content_show_history = true;
|
||||
static const bool content_show_add = true;
|
||||
static const bool content_show_playlists = true;
|
||||
|
||||
#ifdef HAVE_XMB
|
||||
static unsigned xmb_alpha_factor = 75;
|
||||
static unsigned menu_font_color_red = 255;
|
||||
static unsigned menu_font_color_green = 255;
|
||||
static unsigned menu_font_color_blue = 255;
|
||||
static unsigned xmb_menu_layout = 0;
|
||||
static unsigned xmb_icon_theme = XMB_ICON_THEME_MONOCHROME;
|
||||
static unsigned xmb_theme = XMB_THEME_ELECTRIC_BLUE;
|
||||
static const unsigned xmb_alpha_factor = 75;
|
||||
static const unsigned menu_font_color_red = 255;
|
||||
static const unsigned menu_font_color_green = 255;
|
||||
static const unsigned menu_font_color_blue = 255;
|
||||
#ifdef HAVE_ODROIDGO2
|
||||
static const unsigned xmb_menu_layout = 2;
|
||||
#else
|
||||
static const unsigned xmb_menu_layout = 0;
|
||||
#endif
|
||||
static const unsigned xmb_icon_theme = XMB_ICON_THEME_MONOCHROME;
|
||||
static const unsigned xmb_theme = XMB_THEME_ELECTRIC_BLUE;
|
||||
|
||||
#if defined(HAVE_LAKKA) || defined(__arm__) || defined(__PPC64__) || defined(__ppc64__) || defined(__powerpc64__) || defined(__powerpc__) || defined(__ppc__) || defined(__POWERPC__)
|
||||
#define DEFAULT_XMB_SHADOWS_ENABLE false
|
||||
@@ -508,13 +566,13 @@ static unsigned xmb_theme = XMB_THEME_ELECTRIC_BLUE;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static float menu_framebuffer_opacity = 0.900;
|
||||
static const float menu_framebuffer_opacity = 0.900;
|
||||
|
||||
static float menu_wallpaper_opacity = 0.300;
|
||||
static const float menu_wallpaper_opacity = 0.300;
|
||||
|
||||
static float menu_footer_opacity = 1.000;
|
||||
static const float menu_footer_opacity = 1.000;
|
||||
|
||||
static float menu_header_opacity = 1.000;
|
||||
static const float menu_header_opacity = 1.000;
|
||||
|
||||
#if defined(HAVE_OPENGLES2) || (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__)))
|
||||
#define DEFAULT_MENU_SHADER_PIPELINE 1
|
||||
@@ -526,18 +584,18 @@ static float menu_header_opacity = 1.000;
|
||||
|
||||
#define DEFAULT_RGUI_COLOR_THEME RGUI_THEME_CLASSIC_GREEN
|
||||
|
||||
static bool rgui_inline_thumbnails = false;
|
||||
static bool rgui_swap_thumbnails = false;
|
||||
static unsigned rgui_thumbnail_downscaler = RGUI_THUMB_SCALE_POINT;
|
||||
static unsigned rgui_thumbnail_delay = 0;
|
||||
static unsigned rgui_internal_upscale_level = RGUI_UPSCALE_NONE;
|
||||
static bool rgui_full_width_layout = true;
|
||||
static unsigned rgui_aspect = RGUI_ASPECT_RATIO_4_3;
|
||||
static unsigned rgui_aspect_lock = RGUI_ASPECT_RATIO_LOCK_NONE;
|
||||
static bool rgui_shadows = false;
|
||||
static unsigned rgui_particle_effect = RGUI_PARTICLE_EFFECT_NONE;
|
||||
static const bool rgui_inline_thumbnails = false;
|
||||
static const bool rgui_swap_thumbnails = false;
|
||||
static const unsigned rgui_thumbnail_downscaler = RGUI_THUMB_SCALE_POINT;
|
||||
static const unsigned rgui_thumbnail_delay = 0;
|
||||
static const unsigned rgui_internal_upscale_level = RGUI_UPSCALE_NONE;
|
||||
static const bool rgui_full_width_layout = true;
|
||||
static const unsigned rgui_aspect = RGUI_ASPECT_RATIO_4_3;
|
||||
static const unsigned rgui_aspect_lock = RGUI_ASPECT_RATIO_LOCK_NONE;
|
||||
static const bool rgui_shadows = false;
|
||||
static const unsigned rgui_particle_effect = RGUI_PARTICLE_EFFECT_NONE;
|
||||
#define DEFAULT_RGUI_PARTICLE_EFFECT_SPEED 1.0f
|
||||
static bool rgui_extended_ascii = false;
|
||||
static const bool rgui_extended_ascii = false;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_MENU
|
||||
@@ -549,37 +607,37 @@ static bool rgui_extended_ascii = false;
|
||||
/* TODO/FIXME - this setting is thread-unsafe right now and can corrupt the stack - default to off */
|
||||
#define DEFAULT_AUTOMATICALLY_ADD_CONTENT_TO_PLAYLIST false
|
||||
|
||||
static bool default_game_specific_options = true;
|
||||
static bool default_auto_overrides_enable = true;
|
||||
static bool default_auto_remaps_enable = true;
|
||||
static bool default_global_core_options = true;
|
||||
static bool default_auto_shaders_enable = true;
|
||||
static const bool default_game_specific_options = true;
|
||||
static const bool default_auto_overrides_enable = true;
|
||||
static const bool default_auto_remaps_enable = true;
|
||||
static const bool default_global_core_options = true;
|
||||
static const bool default_auto_shaders_enable = true;
|
||||
|
||||
static bool default_sort_savefiles_enable = false;
|
||||
static bool default_sort_savestates_enable = false;
|
||||
static const bool default_sort_savefiles_enable = false;
|
||||
static const bool default_sort_savestates_enable = false;
|
||||
|
||||
static bool default_savestates_in_content_dir = false;
|
||||
static bool default_savefiles_in_content_dir = false;
|
||||
static bool default_systemfiles_in_content_dir = false;
|
||||
static bool default_screenshots_in_content_dir = false;
|
||||
static const bool default_savestates_in_content_dir = false;
|
||||
static const bool default_savefiles_in_content_dir = false;
|
||||
static const bool default_systemfiles_in_content_dir = false;
|
||||
static const bool default_screenshots_in_content_dir = false;
|
||||
|
||||
#if defined(__CELLOS_LV2__) || defined(_XBOX1) || defined(_XBOX360)
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L3_R3;
|
||||
#if defined(__CELLOS_LV2__) || defined(_XBOX1) || defined(_XBOX360) || defined(DINGUX)
|
||||
static const unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L3_R3;
|
||||
#elif defined(PS2) || defined(PSP)
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_HOLD_START;
|
||||
static const unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_HOLD_START;
|
||||
#elif defined(VITA)
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L1_R1_START_SELECT;
|
||||
static const unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L1_R1_START_SELECT;
|
||||
#elif defined(SWITCH) || defined(ORBIS)
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_START_SELECT;
|
||||
static const unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_START_SELECT;
|
||||
#elif TARGET_OS_TV
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_DOWN_Y_L_R;
|
||||
static const unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_DOWN_Y_L_R;
|
||||
#else
|
||||
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_NONE;
|
||||
static const unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_NONE;
|
||||
#endif
|
||||
|
||||
#if defined(VITA)
|
||||
static unsigned input_backtouch_enable = false;
|
||||
static unsigned input_backtouch_toggle = false;
|
||||
static const unsigned input_backtouch_enable = false;
|
||||
static const unsigned input_backtouch_toggle = false;
|
||||
#endif
|
||||
|
||||
#define DEFAULT_SHOW_PHYSICAL_INPUTS true
|
||||
@@ -602,7 +660,12 @@ static unsigned input_backtouch_toggle = false;
|
||||
#define DEFAULT_CROP_OVERSCAN true
|
||||
|
||||
/* Font size for on-screen messages. */
|
||||
#if defined(DINGUX)
|
||||
#define DEFAULT_FONT_SIZE 12
|
||||
#else
|
||||
#define DEFAULT_FONT_SIZE 32
|
||||
#endif
|
||||
|
||||
|
||||
/* Offset for where messages will be placed on-screen.
|
||||
* Values are in range [0.0, 1.0]. */
|
||||
@@ -681,7 +744,7 @@ static const bool audio_enable_menu_cancel = false;
|
||||
static const bool audio_enable_menu_notice = false;
|
||||
static const bool audio_enable_menu_bgm = false;
|
||||
|
||||
#ifdef HAVE_MENU_WIDGETS
|
||||
#ifdef HAVE_GFX_WIDGETS
|
||||
#define DEFAULT_MENU_ENABLE_WIDGETS true
|
||||
#else
|
||||
#define DEFAULT_MENU_ENABLE_WIDGETS false
|
||||
@@ -734,9 +797,10 @@ static const bool audio_enable_menu_bgm = false;
|
||||
|
||||
#ifdef HAVE_WASAPI
|
||||
/* WASAPI defaults */
|
||||
static const bool wasapi_exclusive_mode = true;
|
||||
static const bool wasapi_float_format = false;
|
||||
static const int wasapi_sh_buffer_length = -16; /* auto */
|
||||
#define DEFAULT_WASAPI_EXCLUSIVE_MODE true
|
||||
#define DEFAULT_WASAPI_FLOAT_FORMAT false
|
||||
/* auto */
|
||||
#define DEFAULT_WASAPI_SH_BUFFER_LENGTH -16
|
||||
#endif
|
||||
|
||||
/* MISC */
|
||||
@@ -820,7 +884,7 @@ static const int netplay_check_frames = 600;
|
||||
|
||||
static const bool netplay_use_mitm_server = false;
|
||||
|
||||
static const char *netplay_mitm_server = "nyc";
|
||||
#define DEFAULT_NETPLAY_MITM_SERVER "nyc"
|
||||
|
||||
#ifdef HAVE_NETWORKING
|
||||
static const unsigned netplay_share_digital = RARCH_NETPLAY_SHARE_DIGITAL_NO_PREFERENCE;
|
||||
@@ -860,10 +924,10 @@ static const bool savestate_thumbnail_enable = false;
|
||||
#define DEFAULT_RUN_AHEAD_FRAMES 1
|
||||
|
||||
/* When using the Run Ahead feature, use a secondary instance of the core. */
|
||||
static const bool run_ahead_secondary_instance = true;
|
||||
#define DEFAULT_RUN_AHEAD_SECONDARY_INSTANCE true
|
||||
|
||||
/* Hide warning messages when using the Run Ahead feature. */
|
||||
static const bool run_ahead_hide_warnings = false;
|
||||
#define DEFAULT_RUN_AHEAD_HIDE_WARNINGS false
|
||||
|
||||
/* Enable stdin/network command interface. */
|
||||
static const bool network_cmd_enable = false;
|
||||
@@ -872,14 +936,18 @@ static const bool stdin_cmd_enable = false;
|
||||
|
||||
static const uint16_t network_remote_base_port = 55400;
|
||||
|
||||
#if defined(ANDROID) || defined(IOS)
|
||||
static const bool network_on_demand_thumbnails = true;
|
||||
#else
|
||||
static const bool network_on_demand_thumbnails = false;
|
||||
#endif
|
||||
|
||||
/* Number of entries that will be kept in content history playlist file. */
|
||||
static const unsigned default_content_history_size = 100;
|
||||
static const unsigned default_content_history_size = 200;
|
||||
|
||||
/* Number of entries that will be kept in content favorites playlist file.
|
||||
* -1 == 'unlimited' (99999) */
|
||||
static const int default_content_favorites_size = 100;
|
||||
static const int default_content_favorites_size = 200;
|
||||
|
||||
/* Sort all playlists (apart from histories) alphabetically */
|
||||
static const bool playlist_sort_alphabetical = true;
|
||||
@@ -900,7 +968,7 @@ static const unsigned playlist_sublabel_runtime_type = PLAYLIST_RUNTIME_PER_CORE
|
||||
static const unsigned playlist_entry_remove_enable = PLAYLIST_ENTRY_REMOVE_ENABLE_ALL;
|
||||
#endif
|
||||
|
||||
static const bool scan_without_core_match = false;
|
||||
#define DEFAULT_SCAN_WITHOUT_CORE_MATCH false
|
||||
|
||||
#ifdef __WINRT__
|
||||
/* Be paranoid about WinRT file I/O performance, and leave this disabled by
|
||||
@@ -910,14 +978,23 @@ static const bool scan_without_core_match = false;
|
||||
#define DEFAULT_PLAYLIST_SHOW_SUBLABELS true
|
||||
#endif
|
||||
|
||||
static const bool playlist_fuzzy_archive_match = false;
|
||||
#define DEFAULT_PLAYLIST_FUZZY_ARCHIVE_MATCH false
|
||||
|
||||
/* Show Menu start-up screen on boot. */
|
||||
static const bool default_menu_show_start_screen = true;
|
||||
#define DEFAULT_MENU_SHOW_START_SCREEN true
|
||||
|
||||
/* Default scale factor for non-frambuffer-based menu
|
||||
* drivers and menu widgets */
|
||||
/* Default scale factor for non-frambuffer-based display
|
||||
* drivers and display widgets */
|
||||
#define DEFAULT_MENU_SCALE_FACTOR 1.0f
|
||||
/* Specifies whether display widgets should be scaled
|
||||
* automatically using the default menu scale factor */
|
||||
#define DEFAULT_MENU_WIDGET_SCALE_AUTO true
|
||||
/* Default scale factor for display widgets when widget
|
||||
* auto scaling is disabled (fullscreen mode) */
|
||||
#define DEFAULT_MENU_WIDGET_SCALE_FACTOR 1.0f
|
||||
/* Default scale factor for display widgets when widget
|
||||
* auto scaling is disabled (windowed mode) */
|
||||
#define DEFAULT_MENU_WIDGET_SCALE_FACTOR_WINDOWED 1.0f
|
||||
|
||||
/* Log level for the frontend */
|
||||
#define DEFAULT_FRONTEND_LOG_LEVEL 1
|
||||
@@ -937,15 +1014,17 @@ static const bool default_menu_show_start_screen = true;
|
||||
|
||||
/* Axis threshold (between 0.0 and 1.0)
|
||||
* How far an axis must be tilted to result in a button press. */
|
||||
static const float axis_threshold = 0.5f;
|
||||
#define DEFAULT_AXIS_THRESHOLD 0.5f
|
||||
|
||||
static const float analog_deadzone = 0.0f;
|
||||
#define DEFAULT_ANALOG_DEADZONE 0.0f
|
||||
|
||||
static const float analog_sensitivity = 1.0f;
|
||||
#define DEFAULT_ANALOG_SENSITIVITY 1.0f
|
||||
|
||||
/* Describes speed of which turbo-enabled buttons toggle. */
|
||||
static const unsigned turbo_period = 6;
|
||||
static const unsigned turbo_duty_cycle = 3;
|
||||
static const unsigned turbo_mode = 0;
|
||||
static const unsigned turbo_default_btn = RETRO_DEVICE_ID_JOYPAD_B;
|
||||
|
||||
/* Enable input auto-detection. Will attempt to autoconfigure
|
||||
* gamepads, plug-and-play style. */
|
||||
@@ -965,14 +1044,14 @@ static const unsigned input_bind_timeout = 5;
|
||||
|
||||
static const unsigned input_bind_hold = 2;
|
||||
|
||||
static const unsigned menu_thumbnails_default = 3;
|
||||
static const unsigned gfx_thumbnails_default = 3;
|
||||
|
||||
static const unsigned menu_left_thumbnails_default = 0;
|
||||
|
||||
static const unsigned menu_thumbnail_upscale_threshold = 0;
|
||||
static const unsigned gfx_thumbnail_upscale_threshold = 0;
|
||||
|
||||
#ifdef HAVE_MENU
|
||||
static const unsigned menu_timedate_style = MENU_TIMEDATE_STYLE_DM_HM;
|
||||
static const unsigned menu_timedate_style = MENU_TIMEDATE_STYLE_DDMM_HM;
|
||||
#endif
|
||||
|
||||
static const bool xmb_vertical_thumbnails = false;
|
||||
@@ -991,7 +1070,7 @@ static const bool ui_companion_enable = false;
|
||||
static const bool ui_companion_toggle = false;
|
||||
|
||||
/* Only init the WIMP UI for this session if this is enabled */
|
||||
static const bool desktop_menu_enable = true;
|
||||
#define DEFAULT_DESKTOP_MENU_ENABLE true
|
||||
|
||||
/* Keep track of how long each core+content has been running for over time */
|
||||
|
||||
@@ -1003,22 +1082,25 @@ static const bool desktop_menu_enable = true;
|
||||
#define DEFAULT_CONTENT_RUNTIME_LOG true
|
||||
#endif
|
||||
|
||||
/* Keep track of how long each content has been running for over time (ignores core) */
|
||||
static const bool content_runtime_log_aggregate = false;
|
||||
/* Keep track of how long each content has been running
|
||||
* for over time (ignores core) */
|
||||
#define DEFAULT_CONTENT_RUNTIME_LOG_AGGREGATE false
|
||||
|
||||
#define DEFAULT_UI_MENUBAR_ENABLE true
|
||||
|
||||
#if defined(__QNX__) || defined(_XBOX1) || defined(_XBOX360) || defined(__CELLOS_LV2__) || (defined(__MACH__) && defined(IOS)) || defined(ANDROID) || defined(WIIU) || defined(HAVE_NEON) || defined(GEKKO) || defined(__ARM_NEON__)
|
||||
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWER;
|
||||
#elif defined(PSP) || defined(_3DS) || defined(VITA) || defined(PS2)
|
||||
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWEST;
|
||||
static const enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWER;
|
||||
#elif defined(PSP) || defined(_3DS) || defined(VITA) || defined(PS2) || defined(DINGUX)
|
||||
static const enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWEST;
|
||||
#else
|
||||
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_NORMAL;
|
||||
static const enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_NORMAL;
|
||||
#endif
|
||||
|
||||
/* MIDI */
|
||||
static const char *midi_input = "Off";
|
||||
static const char *midi_output = "Off";
|
||||
#define DEFAULT_MIDI_INPUT "Off"
|
||||
|
||||
#define DEFAULT_MIDI_OUTPUT "Off"
|
||||
|
||||
static const unsigned midi_volume = 100;
|
||||
|
||||
/* Only applies to Android 7.0 (API 24) and up */
|
||||
@@ -1044,100 +1126,100 @@ static const bool enable_device_vibration = false;
|
||||
#endif
|
||||
|
||||
#if defined(HAKCHI)
|
||||
static char buildbot_server_url[] = "http://hakchicloud.com/Libretro_Cores/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://hakchicloud.com/Libretro_Cores/"
|
||||
#elif defined(ANDROID)
|
||||
#if defined(ANDROID_ARM_V7)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/android/latest/armeabi-v7a/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/android/latest/armeabi-v7a/"
|
||||
#elif defined(ANDROID_ARM)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/android/latest/armeabi/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/android/latest/armeabi/"
|
||||
#elif defined(ANDROID_AARCH64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/android/latest/arm64-v8a/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/android/latest/arm64-v8a/"
|
||||
#elif defined(ANDROID_X86)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/android/latest/x86/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/android/latest/x86/"
|
||||
#elif defined(ANDROID_X64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/android/latest/x86_64/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/android/latest/x86_64/"
|
||||
#else
|
||||
static char buildbot_server_url[] = "";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL ""
|
||||
#endif
|
||||
#elif defined(__QNX__)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/blackberry/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/blackberry/latest/"
|
||||
#elif defined(IOS)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/apple/ios/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/apple/ios/latest/"
|
||||
#elif defined(OSX)
|
||||
#if defined(__x86_64__)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/apple/osx/x86_64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/apple/osx/x86_64/latest/"
|
||||
#elif defined(__i386__) || defined(__i486__) || defined(__i686__)
|
||||
static char buildbot_server_url[] = "http://bot.libretro.com/nightly/apple/osx/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://bot.libretro.com/nightly/apple/osx/x86/latest/"
|
||||
#else
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/apple/osx/ppc/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/apple/osx/ppc/latest/"
|
||||
#endif
|
||||
#elif defined(_WIN32) && !defined(_XBOX)
|
||||
#if _MSC_VER >= 1910
|
||||
#ifndef __WINRT__
|
||||
#if defined(__x86_64__) || defined(_M_X64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/x64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/x64/latest/"
|
||||
#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/x86/latest/"
|
||||
#elif defined(__arm__) || defined(_M_ARM)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/arm/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/arm/latest/"
|
||||
#elif defined(__aarch64__) || defined(_M_ARM64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/arm64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-desktop/arm64/latest/"
|
||||
#endif
|
||||
#else
|
||||
#if defined(__x86_64__) || defined(_M_X64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x64/latest/"
|
||||
#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x86/latest/"
|
||||
#elif defined(__arm__) || defined(_M_ARM)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/arm/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/arm/latest/"
|
||||
#elif defined(__aarch64__) || defined(_M_ARM64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/arm64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/arm64/latest/"
|
||||
#endif
|
||||
#endif
|
||||
#elif _MSC_VER == 1600
|
||||
#if defined(__x86_64__) || defined(_M_X64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2010/x86_64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2010/x86_64/latest/"
|
||||
#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2010/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2010/x86/latest/"
|
||||
#endif
|
||||
#elif _MSC_VER == 1400
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2005/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2005/x86/latest/"
|
||||
#elif _MSC_VER == 1310
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows-msvc2003/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2003/x86/latest/"
|
||||
#else
|
||||
#if defined(__x86_64__) || defined(_M_X64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows/x86_64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows/x86_64/latest/"
|
||||
#elif defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(_M_IX86) || defined(_M_IA64)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/windows/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows/x86/latest/"
|
||||
#endif
|
||||
#endif
|
||||
#elif defined(__linux__)
|
||||
#if defined(__x86_64__)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/linux/x86_64/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/linux/x86_64/latest/"
|
||||
#elif defined(__i386__) || defined(__i486__) || defined(__i686__)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/linux/x86/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/linux/x86/latest/"
|
||||
#elif defined(__arm__) && __ARM_ARCH == 7 && defined(__ARM_PCS_VFP)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/linux/armhf/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/linux/armhf/latest/"
|
||||
#else
|
||||
static char buildbot_server_url[] = "";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL ""
|
||||
#endif
|
||||
#elif defined(WIIU)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/nintendo/wiiu/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/nintendo/wiiu/latest/"
|
||||
#elif defined(HAVE_LIBNX)
|
||||
static char buildbot_server_url[] = "http://buildbot.libretro.com/nightly/nintendo/switch/libnx/latest/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/nintendo/switch/libnx/latest/"
|
||||
#elif defined(__CELLOS_LV2__) && defined(DEX_BUILD)
|
||||
static char buildbot_server_url[] = "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/dex-ps3/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/dex-ps3/"
|
||||
#elif defined(__CELLOS_LV2__) && defined(CEX_BUILD)
|
||||
static char buildbot_server_url[] = "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/cex-ps3/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/cex-ps3/"
|
||||
#elif defined(__CELLOS_LV2__) && defined(ODE_BUILD)
|
||||
static char buildbot_server_url[] = "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/ode-ps3/";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://libretro.xbins.org/libretro/nightly/playstation/ps3/latest/ode-ps3/"
|
||||
#else
|
||||
static char buildbot_server_url[] = "";
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL ""
|
||||
#endif
|
||||
|
||||
static char buildbot_assets_server_url[] = "http://buildbot.libretro.com/assets/";
|
||||
#define DEFAULT_BUILDBOT_ASSETS_SERVER_URL "http://buildbot.libretro.com/assets/"
|
||||
|
||||
static char default_discord_app_id[] = "475456035851599874";
|
||||
#define DEFAULT_DISCORD_APP_ID "475456035851599874"
|
||||
|
||||
#define DEFAULT_AI_SERVICE_SOURCE_LANG 0
|
||||
|
||||
|
||||
@@ -71,7 +71,11 @@ static const struct retro_keybind retro_keybinds_1[] = {
|
||||
{ true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#ifdef HAVE_LAKKA
|
||||
{ true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_RESTART_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#else
|
||||
{ true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#endif
|
||||
{ true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
@@ -105,6 +109,88 @@ static const struct retro_keybind retro_keybinds_1[] = {
|
||||
{ true, RARCH_RECORDING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_STREAMING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_AI_SERVICE, MENU_ENUM_LABEL_VALUE_INPUT_META_AI_SERVICE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#elif defined(DINGUX)
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_LALT, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_LSHIFT, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_ESCAPE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_RETURN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UP, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_DOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_LEFT, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_RIGHT, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_LCTRL, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_SPACE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_TAB, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_BACKSPACE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_PAGEUP, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_PAGEDOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_KP_DIVIDE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_KP_PERIOD, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
|
||||
{ true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
|
||||
{ true, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
|
||||
{ true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
|
||||
{ true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SLOWMOTION_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SLOWMOTION_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_BSV_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_FPS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_FPS_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SEND_DEBUG_INFO, MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_NETPLAY_HOST_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_HOST_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_UI_COMPANION_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_HOME, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_RECORDING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_STREAMING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_AI_SERVICE, MENU_ENUM_LABEL_VALUE_INPUT_META_AI_SERVICE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#else
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_z, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_a, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
@@ -153,7 +239,11 @@ static const struct retro_keybind retro_keybinds_1[] = {
|
||||
{ true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_F4, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_F2, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, RETROK_f, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#ifdef HAVE_LAKKA
|
||||
{ true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_RESTART_KEY, RETROK_ESCAPE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#else
|
||||
{ true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_ESCAPE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
#endif
|
||||
{ true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_F7, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_F6, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
{ true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_r, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
|
||||
|
||||
+1
-1
@@ -50,7 +50,7 @@
|
||||
#define SUPPORTS_LIBUSB false
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SDL
|
||||
#if defined(HAVE_SDL)
|
||||
#define SUPPORTS_SDL true
|
||||
#else
|
||||
#define SUPPORTS_SDL false
|
||||
|
||||
+311
-255
File diff suppressed because it is too large.
Load diff
+47
-24
@@ -53,6 +53,12 @@
|
||||
var = newvar; \
|
||||
}
|
||||
|
||||
#define configuration_set_string(settings, var, newvar) \
|
||||
{ \
|
||||
settings->modified = true; \
|
||||
strlcpy(var, newvar, sizeof(var)); \
|
||||
}
|
||||
|
||||
enum crt_switch_type
|
||||
{
|
||||
CRT_SWITCH_NONE = 0,
|
||||
@@ -85,6 +91,7 @@ typedef struct settings
|
||||
bool video_black_frame_insertion;
|
||||
bool video_vfilter;
|
||||
bool video_smooth;
|
||||
bool video_ctx_scaling;
|
||||
bool video_force_aspect;
|
||||
bool video_crop_overscan;
|
||||
bool video_aspect_ratio_auto;
|
||||
@@ -110,6 +117,9 @@ typedef struct settings
|
||||
bool video_layout_enable;
|
||||
#endif
|
||||
|
||||
/* Accessibility */
|
||||
bool accessibility_enable;
|
||||
|
||||
/* Audio */
|
||||
bool audio_enable;
|
||||
bool audio_enable_menu;
|
||||
@@ -148,9 +158,11 @@ typedef struct settings
|
||||
/* Menu */
|
||||
bool filter_by_current_core;
|
||||
bool menu_enable_widgets;
|
||||
bool menu_widget_scale_auto;
|
||||
bool menu_show_start_screen;
|
||||
bool menu_pause_libretro;
|
||||
bool menu_savestate_resume;
|
||||
bool menu_insert_disk_resume;
|
||||
bool menu_timedate_enable;
|
||||
bool menu_battery_level_enable;
|
||||
bool menu_core_enable;
|
||||
@@ -165,6 +177,7 @@ typedef struct settings
|
||||
bool menu_throttle_framerate;
|
||||
bool menu_linear_filter;
|
||||
bool menu_horizontal_animation;
|
||||
bool menu_scroll_fast;
|
||||
bool menu_show_online_updater;
|
||||
bool menu_show_core_updater;
|
||||
bool menu_show_load_core;
|
||||
@@ -186,8 +199,10 @@ typedef struct settings
|
||||
bool menu_show_video_layout;
|
||||
#endif
|
||||
bool menu_materialui_icons_enable;
|
||||
bool menu_materialui_optimize_landscape_layout;
|
||||
bool menu_materialui_show_nav_bar;
|
||||
bool menu_materialui_auto_rotate_nav_bar;
|
||||
bool menu_materialui_dual_thumbnail_list_view_enable;
|
||||
bool menu_materialui_thumbnail_background_enable;
|
||||
bool menu_rgui_background_filler_thickness_enable;
|
||||
bool menu_rgui_border_filler_thickness_enable;
|
||||
bool menu_rgui_border_filler_enable;
|
||||
@@ -284,6 +299,7 @@ typedef struct settings
|
||||
bool cheevos_test_unofficial;
|
||||
bool cheevos_hardcore_mode_enable;
|
||||
bool cheevos_leaderboards_enable;
|
||||
bool cheevos_richpresence_enable;
|
||||
bool cheevos_badges_enable;
|
||||
bool cheevos_verbose_enable;
|
||||
bool cheevos_auto_screenshot;
|
||||
@@ -356,7 +372,6 @@ typedef struct settings
|
||||
bool bluetooth_enable;
|
||||
bool localap_enable;
|
||||
|
||||
bool automatically_add_content_to_playlist;
|
||||
bool video_window_show_decorations;
|
||||
bool video_window_save_positions;
|
||||
|
||||
@@ -401,6 +416,8 @@ typedef struct settings
|
||||
float video_msg_bgcolor_opacity;
|
||||
|
||||
float menu_scale_factor;
|
||||
float menu_widget_scale_factor;
|
||||
float menu_widget_scale_factor_windowed;
|
||||
float menu_wallpaper_opacity;
|
||||
float menu_framebuffer_opacity;
|
||||
float menu_footer_opacity;
|
||||
@@ -460,6 +477,8 @@ typedef struct settings
|
||||
|
||||
unsigned input_turbo_period;
|
||||
unsigned input_turbo_duty_cycle;
|
||||
unsigned input_turbo_mode;
|
||||
unsigned input_turbo_default_button;
|
||||
|
||||
unsigned input_bind_timeout;
|
||||
unsigned input_bind_hold;
|
||||
@@ -517,10 +536,13 @@ typedef struct settings
|
||||
#endif
|
||||
unsigned video_shader_delay;
|
||||
|
||||
/* Accessibility */
|
||||
unsigned accessibility_narrator_speech_speed;
|
||||
|
||||
unsigned menu_timedate_style;
|
||||
unsigned menu_thumbnails;
|
||||
unsigned gfx_thumbnails;
|
||||
unsigned menu_left_thumbnails;
|
||||
unsigned menu_thumbnail_upscale_threshold;
|
||||
unsigned gfx_thumbnail_upscale_threshold;
|
||||
unsigned menu_rgui_thumbnail_downscaler;
|
||||
unsigned menu_rgui_thumbnail_delay;
|
||||
unsigned menu_rgui_color_theme;
|
||||
@@ -535,6 +557,9 @@ typedef struct settings
|
||||
unsigned menu_xmb_thumbnail_scale_factor;
|
||||
unsigned menu_materialui_color_theme;
|
||||
unsigned menu_materialui_transition_animation;
|
||||
unsigned menu_materialui_thumbnail_view_portrait;
|
||||
unsigned menu_materialui_thumbnail_view_landscape;
|
||||
unsigned menu_materialui_landscape_layout_optimization;
|
||||
unsigned menu_ozone_color_theme;
|
||||
unsigned menu_font_color_red;
|
||||
unsigned menu_font_color_green;
|
||||
@@ -614,26 +639,23 @@ typedef struct settings
|
||||
char input_driver[32];
|
||||
char input_joypad_driver[32];
|
||||
char midi_driver[32];
|
||||
char midi_input[32];
|
||||
char midi_output[32];
|
||||
|
||||
char input_keyboard_layout[64];
|
||||
|
||||
char audio_device[255];
|
||||
char camera_device[255];
|
||||
char netplay_mitm_server[255];
|
||||
|
||||
char translation_service_url[2048];
|
||||
|
||||
char bundle_assets_src[PATH_MAX_LENGTH];
|
||||
char bundle_assets_dst[PATH_MAX_LENGTH];
|
||||
char bundle_assets_dst_subdir[PATH_MAX_LENGTH];
|
||||
|
||||
char netplay_mitm_server[255];
|
||||
|
||||
char midi_input[32];
|
||||
char midi_output[32];
|
||||
|
||||
char youtube_stream_key[PATH_MAX_LENGTH];
|
||||
char twitch_stream_key[PATH_MAX_LENGTH];
|
||||
|
||||
char discord_app_id[PATH_MAX_LENGTH];
|
||||
char translation_service_url[2048];
|
||||
char ai_service_url[PATH_MAX_LENGTH];
|
||||
} arrays;
|
||||
|
||||
@@ -642,12 +664,16 @@ typedef struct settings
|
||||
char placeholder;
|
||||
|
||||
char username[32];
|
||||
|
||||
char netplay_password[128];
|
||||
char netplay_spectate_password[128];
|
||||
|
||||
char netplay_server[255];
|
||||
char network_buildbot_url[255];
|
||||
char network_buildbot_assets_url[255];
|
||||
|
||||
char browse_url[4096];
|
||||
|
||||
char path_stream_url[8192];
|
||||
|
||||
char path_menu_xmb_font[PATH_MAX_LENGTH];
|
||||
@@ -797,14 +823,7 @@ const char *config_get_midi_driver_options(void);
|
||||
|
||||
const char *config_get_default_record(void);
|
||||
|
||||
/**
|
||||
* config_parse_file:
|
||||
*
|
||||
* Loads a config file and reads all the values into memory.
|
||||
*
|
||||
*/
|
||||
void config_parse_file(void);
|
||||
|
||||
#ifdef HAVE_CONFIGFILE
|
||||
/**
|
||||
* config_load_override:
|
||||
*
|
||||
@@ -815,7 +834,7 @@ void config_parse_file(void);
|
||||
* Returns: false if there was an error or no action was performed.
|
||||
*
|
||||
*/
|
||||
bool config_load_override(void);
|
||||
bool config_load_override(void *data);
|
||||
|
||||
/**
|
||||
* config_unload_override:
|
||||
@@ -835,7 +854,8 @@ bool config_unload_override(void);
|
||||
* Returns: false if there was an error or no action was performed.
|
||||
*
|
||||
*/
|
||||
bool config_load_remap(const char *directory_input_remapping);
|
||||
bool config_load_remap(const char *directory_input_remapping,
|
||||
void *data);
|
||||
|
||||
/**
|
||||
* config_save_autoconf_profile:
|
||||
@@ -863,16 +883,19 @@ bool config_save_file(const char *path);
|
||||
*
|
||||
* Returns: true (1) on success, otherwise returns false (0).
|
||||
**/
|
||||
bool config_save_overrides(int override_type);
|
||||
bool config_save_overrides(enum override_type type, void *data);
|
||||
|
||||
/* Replaces currently loaded configuration file with
|
||||
* another one. Will load a dummy core to flush state
|
||||
* properly. */
|
||||
bool config_replace(bool config_save_on_exit, char *path);
|
||||
#endif
|
||||
|
||||
bool config_overlay_enable_default(void);
|
||||
|
||||
void config_set_defaults(void);
|
||||
void config_set_defaults(void *data);
|
||||
|
||||
void config_load(void *data);
|
||||
|
||||
settings_t *config_get_ptr(void);
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "core_type.h"
|
||||
#include "input/input_defines.h"
|
||||
#include "disk_control_interface.h"
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
@@ -67,8 +68,8 @@ typedef struct rarch_system_info
|
||||
|
||||
bool supports_vfs;
|
||||
|
||||
struct retro_disk_control_callback disk_control_cb;
|
||||
struct retro_location_callback location_cb;
|
||||
disk_control_interface_t disk_control;
|
||||
struct retro_location_callback location_cb;
|
||||
|
||||
struct
|
||||
{
|
||||
|
||||
+74
-51
@@ -21,14 +21,12 @@
|
||||
#include <file/file_path.h>
|
||||
#include <lists/dir_list.h>
|
||||
#include <file/archive_file.h>
|
||||
#include <streams/file_stream.h>
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "retroarch.h"
|
||||
#include "verbosity.h"
|
||||
|
||||
#include "core_info.h"
|
||||
#include "file_path_special.h"
|
||||
@@ -37,16 +35,9 @@
|
||||
#include "uwp/uwp_func.h"
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_COMPRESSION
|
||||
static const struct string_list *core_info_tmp_list = NULL;
|
||||
#endif
|
||||
static const char *core_info_tmp_path = NULL;
|
||||
static core_info_t *core_info_current = NULL;
|
||||
static core_info_list_t *core_info_curr_list = NULL;
|
||||
|
||||
enum compare_op
|
||||
{
|
||||
COMPARE_OP_EQUAL,
|
||||
COMPARE_OP_EQUAL = 0,
|
||||
COMPARE_OP_NOT_EQUAL,
|
||||
COMPARE_OP_LESS,
|
||||
COMPARE_OP_LESS_EQUAL,
|
||||
@@ -54,6 +45,25 @@ enum compare_op
|
||||
COMPARE_OP_GREATER_EQUAL
|
||||
};
|
||||
|
||||
struct core_info_state
|
||||
{
|
||||
#ifdef HAVE_COMPRESSION
|
||||
const struct string_list *tmp_list;
|
||||
#endif
|
||||
const char *tmp_path;
|
||||
core_info_t *current;
|
||||
core_info_list_t *curr_list;
|
||||
};
|
||||
|
||||
typedef struct core_info_state core_info_state_t;
|
||||
|
||||
static core_info_state_t core_info_st;
|
||||
|
||||
static core_info_state_t *coreinfo_get_ptr(void)
|
||||
{
|
||||
return &core_info_st;
|
||||
}
|
||||
|
||||
static void core_info_list_resolve_all_extensions(
|
||||
core_info_list_t *core_info_list)
|
||||
{
|
||||
@@ -539,15 +549,18 @@ static bool core_info_does_support_file(
|
||||
|
||||
static int core_info_qsort_cmp(const void *a_, const void *b_)
|
||||
{
|
||||
const core_info_t *a = (const core_info_t*)a_;
|
||||
const core_info_t *b = (const core_info_t*)b_;
|
||||
int support_a = core_info_does_support_file(a, core_info_tmp_path);
|
||||
int support_b = core_info_does_support_file(b, core_info_tmp_path);
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
const core_info_t *a = (const core_info_t*)a_;
|
||||
const core_info_t *b = (const core_info_t*)b_;
|
||||
int support_a = core_info_does_support_file(a,
|
||||
p_coreinfo->tmp_path);
|
||||
int support_b = core_info_does_support_file(b,
|
||||
p_coreinfo->tmp_path);
|
||||
#ifdef HAVE_COMPRESSION
|
||||
support_a = support_a ||
|
||||
core_info_does_support_any_file(a, core_info_tmp_list);
|
||||
core_info_does_support_any_file(a, p_coreinfo->tmp_list);
|
||||
support_b = support_b ||
|
||||
core_info_does_support_any_file(b, core_info_tmp_list);
|
||||
core_info_does_support_any_file(b, p_coreinfo->tmp_list);
|
||||
#endif
|
||||
|
||||
if (support_a != support_b)
|
||||
@@ -610,10 +623,7 @@ static bool core_info_list_update_missing_firmware_internal(
|
||||
info->firmware[i].path, path_size);
|
||||
info->firmware[i].missing = !path_is_valid(path);
|
||||
if (info->firmware[i].missing && !info->firmware[i].optional)
|
||||
{
|
||||
*set_missing_bios = true;
|
||||
RARCH_WARN("Firmware missing: %s\n", info->firmware[i].path);
|
||||
}
|
||||
}
|
||||
|
||||
free(path);
|
||||
@@ -622,38 +632,44 @@ static bool core_info_list_update_missing_firmware_internal(
|
||||
|
||||
void core_info_free_current_core(void)
|
||||
{
|
||||
if (core_info_current)
|
||||
free(core_info_current);
|
||||
core_info_current = NULL;
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
if (p_coreinfo->current)
|
||||
free(p_coreinfo->current);
|
||||
p_coreinfo->current = NULL;
|
||||
}
|
||||
|
||||
bool core_info_init_current_core(void)
|
||||
{
|
||||
core_info_current = (core_info_t*)calloc(1, sizeof(core_info_t));
|
||||
if (!core_info_current)
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
core_info_t *current = (core_info_t*)calloc(1, sizeof(*current));
|
||||
if (!current)
|
||||
return false;
|
||||
p_coreinfo->current = current;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool core_info_get_current_core(core_info_t **core)
|
||||
{
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
if (!core)
|
||||
return false;
|
||||
*core = core_info_current;
|
||||
*core = p_coreinfo->current;
|
||||
return true;
|
||||
}
|
||||
|
||||
void core_info_deinit_list(void)
|
||||
{
|
||||
if (core_info_curr_list)
|
||||
core_info_list_free(core_info_curr_list);
|
||||
core_info_curr_list = NULL;
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
if (p_coreinfo->curr_list)
|
||||
core_info_list_free(p_coreinfo->curr_list);
|
||||
p_coreinfo->curr_list = NULL;
|
||||
}
|
||||
|
||||
bool core_info_init_list(const char *path_info, const char *dir_cores,
|
||||
const char *exts, bool dir_show_hidden_files)
|
||||
{
|
||||
if (!(core_info_curr_list = core_info_list_new(dir_cores,
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
if (!(p_coreinfo->curr_list = core_info_list_new(dir_cores,
|
||||
!string_is_empty(path_info) ? path_info : dir_cores,
|
||||
exts,
|
||||
dir_show_hidden_files)))
|
||||
@@ -663,39 +679,42 @@ bool core_info_init_list(const char *path_info, const char *dir_cores,
|
||||
|
||||
bool core_info_get_list(core_info_list_t **core)
|
||||
{
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
if (!core)
|
||||
return false;
|
||||
*core = core_info_curr_list;
|
||||
*core = p_coreinfo->curr_list;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool core_info_list_update_missing_firmware(core_info_ctx_firmware_t *info,
|
||||
bool *set_missing_bios)
|
||||
{
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
if (!info)
|
||||
return false;
|
||||
return core_info_list_update_missing_firmware_internal(
|
||||
core_info_curr_list,
|
||||
p_coreinfo->curr_list,
|
||||
info->path, info->directory.system,
|
||||
set_missing_bios);
|
||||
}
|
||||
|
||||
bool core_info_load(core_info_ctx_find_t *info)
|
||||
{
|
||||
core_info_t *core_info = NULL;
|
||||
core_info_t *core_info = NULL;
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
|
||||
if (!info)
|
||||
return false;
|
||||
|
||||
if (!core_info_current)
|
||||
if (!p_coreinfo->current)
|
||||
core_info_init_current_core();
|
||||
|
||||
core_info_get_current_core(&core_info);
|
||||
|
||||
if (!core_info_curr_list)
|
||||
if (!p_coreinfo->curr_list)
|
||||
return false;
|
||||
|
||||
if (!core_info_list_get_info(core_info_curr_list,
|
||||
if (!core_info_list_get_info(p_coreinfo->curr_list,
|
||||
core_info, info->path))
|
||||
return false;
|
||||
|
||||
@@ -704,9 +723,10 @@ bool core_info_load(core_info_ctx_find_t *info)
|
||||
|
||||
bool core_info_find(core_info_ctx_find_t *info, const char *core_path)
|
||||
{
|
||||
if (!info || !core_info_curr_list)
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
if (!info || !p_coreinfo->curr_list)
|
||||
return false;
|
||||
info->inf = core_info_find_internal(core_info_curr_list, core_path);
|
||||
info->inf = core_info_find_internal(p_coreinfo->curr_list, core_path);
|
||||
if (!info->inf)
|
||||
return false;
|
||||
return true;
|
||||
@@ -729,20 +749,21 @@ void core_info_list_get_supported_cores(core_info_list_t *core_info_list,
|
||||
const char *path, const core_info_t **infos, size_t *num_infos)
|
||||
{
|
||||
size_t i;
|
||||
size_t supported = 0;
|
||||
size_t supported = 0;
|
||||
#ifdef HAVE_COMPRESSION
|
||||
struct string_list *list = NULL;
|
||||
struct string_list *list = NULL;
|
||||
#endif
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
|
||||
if (!core_info_list)
|
||||
return;
|
||||
|
||||
core_info_tmp_path = path;
|
||||
p_coreinfo->tmp_path = path;
|
||||
|
||||
#ifdef HAVE_COMPRESSION
|
||||
if (path_is_compressed_file(path))
|
||||
list = file_archive_get_file_list(path, NULL);
|
||||
core_info_tmp_list = list;
|
||||
p_coreinfo->tmp_list = list;
|
||||
#endif
|
||||
|
||||
/* Let supported core come first in list so we can return
|
||||
@@ -839,8 +860,9 @@ size_t core_info_list_num_info_files(core_info_list_t *core_info_list)
|
||||
|
||||
bool core_info_database_match_archive_member(const char *database_path)
|
||||
{
|
||||
char *database = NULL;
|
||||
const char *new_path = path_basename(database_path);
|
||||
char *database = NULL;
|
||||
const char *new_path = path_basename(database_path);
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
|
||||
if (string_is_empty(new_path))
|
||||
return false;
|
||||
@@ -852,13 +874,13 @@ bool core_info_database_match_archive_member(const char *database_path)
|
||||
|
||||
path_remove_extension(database);
|
||||
|
||||
if (core_info_curr_list)
|
||||
if (p_coreinfo->curr_list)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < core_info_curr_list->count; i++)
|
||||
for (i = 0; i < p_coreinfo->curr_list->count; i++)
|
||||
{
|
||||
const core_info_t *info = &core_info_curr_list->list[i];
|
||||
const core_info_t *info = &p_coreinfo->curr_list->list[i];
|
||||
|
||||
if (!info->database_match_archive_member)
|
||||
continue;
|
||||
@@ -880,8 +902,9 @@ error:
|
||||
bool core_info_database_supports_content_path(
|
||||
const char *database_path, const char *path)
|
||||
{
|
||||
char *database = NULL;
|
||||
const char *new_path = path_basename(database_path);
|
||||
char *database = NULL;
|
||||
const char *new_path = path_basename(database_path);
|
||||
core_info_state_t *p_coreinfo = coreinfo_get_ptr();
|
||||
|
||||
if (string_is_empty(new_path))
|
||||
return false;
|
||||
@@ -893,13 +916,13 @@ bool core_info_database_supports_content_path(
|
||||
|
||||
path_remove_extension(database);
|
||||
|
||||
if (core_info_curr_list)
|
||||
if (p_coreinfo->curr_list)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < core_info_curr_list->count; i++)
|
||||
for (i = 0; i < p_coreinfo->curr_list->count; i++)
|
||||
{
|
||||
const core_info_t *info = &core_info_curr_list->list[i];
|
||||
const core_info_t *info = &p_coreinfo->curr_list->list[i];
|
||||
|
||||
if (!string_list_find_elem(info->supported_extensions_list,
|
||||
path_get_extension(path)))
|
||||
|
||||
@@ -0,0 +1,797 @@
|
||||
/* Copyright (C) 2010-2019 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (core_updater_list.c).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* Permission is hereby granted, free of charge,
|
||||
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <file/file_path.h>
|
||||
#include <string/stdstring.h>
|
||||
#include <lists/string_list.h>
|
||||
#include <net/net_http.h>
|
||||
#include <retro_miscellaneous.h>
|
||||
|
||||
#include "file_path_special.h"
|
||||
#include "core_info.h"
|
||||
|
||||
#include "core_updater_list.h"
|
||||
|
||||
/* Holds all entries in a core updater list */
|
||||
struct core_updater_list
|
||||
{
|
||||
size_t size;
|
||||
size_t capacity;
|
||||
core_updater_list_entry_t *entries;
|
||||
};
|
||||
|
||||
/* Cached ('global') core updater list */
|
||||
static core_updater_list_t *core_list_cached = NULL;
|
||||
|
||||
/**************************************/
|
||||
/* Initialisation / De-Initialisation */
|
||||
/**************************************/
|
||||
|
||||
/* Frees contents of specified core updater
|
||||
* list entry */
|
||||
static void core_updater_list_free_entry(core_updater_list_entry_t *entry)
|
||||
{
|
||||
if (!entry)
|
||||
return;
|
||||
|
||||
if (entry->remote_filename)
|
||||
{
|
||||
free(entry->remote_filename);
|
||||
entry->remote_filename = NULL;
|
||||
}
|
||||
|
||||
if (entry->remote_core_path)
|
||||
{
|
||||
free(entry->remote_core_path);
|
||||
entry->remote_core_path = NULL;
|
||||
}
|
||||
|
||||
if (entry->local_core_path)
|
||||
{
|
||||
free(entry->local_core_path);
|
||||
entry->local_core_path = NULL;
|
||||
}
|
||||
|
||||
if (entry->local_info_path)
|
||||
{
|
||||
free(entry->local_info_path);
|
||||
entry->local_info_path = NULL;
|
||||
}
|
||||
|
||||
if (entry->display_name)
|
||||
{
|
||||
free(entry->display_name);
|
||||
entry->display_name = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Creates a new, empty core updater list.
|
||||
* Returns a handle to a new core_updater_list_t object
|
||||
* on success, otherwise returns NULL. */
|
||||
core_updater_list_t *core_updater_list_init(size_t max_size)
|
||||
{
|
||||
core_updater_list_t *core_list = NULL;
|
||||
core_updater_list_entry_t *entries = NULL;
|
||||
|
||||
/* Sanity check */
|
||||
if (max_size < 1)
|
||||
return NULL;
|
||||
|
||||
/* Create core updater list */
|
||||
core_list = (core_updater_list_t*)calloc(1, sizeof(*core_list));
|
||||
|
||||
if (!core_list)
|
||||
return NULL;
|
||||
|
||||
/* Create entries array */
|
||||
entries = (core_updater_list_entry_t*)calloc(max_size, sizeof(*entries));
|
||||
|
||||
if (!entries)
|
||||
{
|
||||
free(core_list);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Initial configuration */
|
||||
core_list->size = 0;
|
||||
core_list->capacity = max_size;
|
||||
core_list->entries = entries;
|
||||
|
||||
return core_list;
|
||||
}
|
||||
|
||||
/* Resets (removes all entries of) specified core
|
||||
* updater list */
|
||||
void core_updater_list_reset(core_updater_list_t *core_list)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!core_list)
|
||||
return;
|
||||
|
||||
for (i = 0; i < core_list->size; i++)
|
||||
{
|
||||
core_updater_list_entry_t *entry = &core_list->entries[i];
|
||||
|
||||
if (entry)
|
||||
core_updater_list_free_entry(entry);
|
||||
}
|
||||
|
||||
core_list->size = 0;
|
||||
}
|
||||
|
||||
/* Frees specified core updater list */
|
||||
void core_updater_list_free(core_updater_list_t *core_list)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!core_list)
|
||||
return;
|
||||
|
||||
for (i = 0; i < core_list->size; i++)
|
||||
{
|
||||
core_updater_list_entry_t *entry = &core_list->entries[i];
|
||||
|
||||
if (entry)
|
||||
core_updater_list_free_entry(entry);
|
||||
}
|
||||
|
||||
free(core_list->entries);
|
||||
core_list->entries = NULL;
|
||||
|
||||
free(core_list);
|
||||
}
|
||||
|
||||
/***************/
|
||||
/* Cached List */
|
||||
/***************/
|
||||
|
||||
/* Creates a new, empty cached core updater list
|
||||
* (i.e. 'global' list).
|
||||
* Returns false in the event of an error. */
|
||||
bool core_updater_list_init_cached(size_t max_size)
|
||||
{
|
||||
/* Free any existing cached core updater list */
|
||||
if (core_list_cached)
|
||||
{
|
||||
core_updater_list_free(core_list_cached);
|
||||
core_list_cached = NULL;
|
||||
}
|
||||
|
||||
core_list_cached = core_updater_list_init(max_size);
|
||||
|
||||
if (!core_list_cached)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Fetches cached core updater list */
|
||||
core_updater_list_t *core_updater_list_get_cached(void)
|
||||
{
|
||||
if (core_list_cached)
|
||||
return core_list_cached;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Frees cached core updater list */
|
||||
void core_updater_list_free_cached(void)
|
||||
{
|
||||
core_updater_list_free(core_list_cached);
|
||||
core_list_cached = NULL;
|
||||
}
|
||||
|
||||
/***********/
|
||||
/* Getters */
|
||||
/***********/
|
||||
|
||||
/* Returns number of entries in core updater list */
|
||||
size_t core_updater_list_size(core_updater_list_t *core_list)
|
||||
{
|
||||
if (!core_list)
|
||||
return 0;
|
||||
|
||||
return core_list->size;
|
||||
}
|
||||
|
||||
/* Returns maximum allowed number of entries in core
|
||||
* updater list */
|
||||
size_t core_updater_list_capacity(core_updater_list_t *core_list)
|
||||
{
|
||||
if (!core_list)
|
||||
return 0;
|
||||
|
||||
return core_list->capacity;
|
||||
}
|
||||
|
||||
/* Fetches core updater list entry corresponding
|
||||
* to the specified entry index.
|
||||
* Returns false if index is invalid. */
|
||||
bool core_updater_list_get_index(
|
||||
core_updater_list_t *core_list,
|
||||
size_t idx,
|
||||
const core_updater_list_entry_t **entry)
|
||||
{
|
||||
if (!core_list || !entry)
|
||||
return false;
|
||||
|
||||
if (idx >= core_list->size)
|
||||
return false;
|
||||
|
||||
if (entry)
|
||||
*entry = &core_list->entries[idx];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Fetches core updater list entry corresponding
|
||||
* to the specified remote core filename.
|
||||
* Returns false if core is not found. */
|
||||
bool core_updater_list_get_filename(
|
||||
core_updater_list_t *core_list,
|
||||
const char *remote_filename,
|
||||
const core_updater_list_entry_t **entry)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
if (!core_list || string_is_empty(remote_filename))
|
||||
return false;
|
||||
|
||||
if (core_list->size < 1)
|
||||
return false;
|
||||
|
||||
/* Search for specified filename */
|
||||
for (i = 0; i < core_list->size; i++)
|
||||
{
|
||||
core_updater_list_entry_t *current_entry = &core_list->entries[i];
|
||||
|
||||
if (string_is_empty(current_entry->remote_filename))
|
||||
continue;
|
||||
|
||||
if (string_is_equal(remote_filename, current_entry->remote_filename))
|
||||
{
|
||||
if (entry)
|
||||
*entry = current_entry;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Fetches core updater list entry corresponding
|
||||
* to the specified core.
|
||||
* Returns false if core is not found. */
|
||||
bool core_updater_list_get_core(
|
||||
core_updater_list_t *core_list,
|
||||
const char *local_core_path,
|
||||
const core_updater_list_entry_t **entry)
|
||||
{
|
||||
size_t i;
|
||||
char real_core_path[PATH_MAX_LENGTH];
|
||||
|
||||
real_core_path[0] = '\0';
|
||||
|
||||
if (!core_list || !entry || string_is_empty(local_core_path))
|
||||
return false;
|
||||
|
||||
if (core_list->size < 1)
|
||||
return false;
|
||||
|
||||
/* Resolve absolute pathname of local_core_path */
|
||||
strlcpy(real_core_path, local_core_path, sizeof(real_core_path));
|
||||
path_resolve_realpath(real_core_path, sizeof(real_core_path), true);
|
||||
|
||||
if (string_is_empty(real_core_path))
|
||||
return false;
|
||||
|
||||
/* Search for specified core */
|
||||
for (i = 0; i < core_list->size; i++)
|
||||
{
|
||||
core_updater_list_entry_t *current_entry = &core_list->entries[i];
|
||||
|
||||
if (string_is_empty(current_entry->local_core_path))
|
||||
continue;
|
||||
|
||||
#ifdef _WIN32
|
||||
/* Handle case-insensitive operating systems*/
|
||||
if (string_is_equal_noncase(real_core_path, current_entry->local_core_path))
|
||||
{
|
||||
#else
|
||||
if (string_is_equal(real_core_path, current_entry->local_core_path))
|
||||
{
|
||||
#endif
|
||||
if (entry)
|
||||
*entry = current_entry;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/***********/
|
||||
/* Setters */
|
||||
/***********/
|
||||
|
||||
/* Parses date string and adds contents to
|
||||
* specified core updater list entry */
|
||||
static bool core_updater_list_set_date(
|
||||
core_updater_list_entry_t *entry, const char *date_str)
|
||||
{
|
||||
struct string_list *date_list = NULL;
|
||||
|
||||
if (!entry || string_is_empty(date_str))
|
||||
goto error;
|
||||
|
||||
/* Split date string into component values */
|
||||
date_list = string_split(date_str, "-");
|
||||
|
||||
if (!date_list)
|
||||
goto error;
|
||||
|
||||
/* Date string must have 3 values:
|
||||
* [year] [month] [day] */
|
||||
if (date_list->size < 3)
|
||||
goto error;
|
||||
|
||||
/* Convert date string values */
|
||||
entry->date.year = string_to_unsigned(date_list->elems[0].data);
|
||||
entry->date.month = string_to_unsigned(date_list->elems[1].data);
|
||||
entry->date.day = string_to_unsigned(date_list->elems[2].data);
|
||||
|
||||
/* Clean up */
|
||||
string_list_free(date_list);
|
||||
|
||||
return true;
|
||||
|
||||
error:
|
||||
|
||||
if (date_list)
|
||||
string_list_free(date_list);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Parses crc string and adds value to
|
||||
* specified core updater list entry */
|
||||
static bool core_updater_list_set_crc(
|
||||
core_updater_list_entry_t *entry, const char *crc_str)
|
||||
{
|
||||
uint32_t crc;
|
||||
|
||||
if (!entry || string_is_empty(crc_str))
|
||||
return false;
|
||||
|
||||
crc = (uint32_t)string_hex_to_unsigned(crc_str);
|
||||
|
||||
if (crc == 0)
|
||||
return false;
|
||||
|
||||
entry->crc = crc;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Parses core filename string and adds all
|
||||
* associated paths to the specified core
|
||||
* updater list entry */
|
||||
static bool core_updater_list_set_paths(
|
||||
core_updater_list_entry_t *entry,
|
||||
const char *path_dir_libretro,
|
||||
const char *path_libretro_info,
|
||||
const char *network_buildbot_url,
|
||||
const char *filename_str)
|
||||
{
|
||||
char *last_underscore = NULL;
|
||||
char *tmp_url = NULL;
|
||||
char remote_core_path[PATH_MAX_LENGTH];
|
||||
char local_core_path[PATH_MAX_LENGTH];
|
||||
char local_info_path[PATH_MAX_LENGTH];
|
||||
char display_name[255];
|
||||
bool is_archive;
|
||||
|
||||
remote_core_path[0] = '\0';
|
||||
local_core_path[0] = '\0';
|
||||
local_info_path[0] = '\0';
|
||||
display_name[0] = '\0';
|
||||
|
||||
if (!entry || string_is_empty(filename_str))
|
||||
return false;
|
||||
|
||||
if (string_is_empty(path_dir_libretro) ||
|
||||
string_is_empty(path_libretro_info) ||
|
||||
string_is_empty(network_buildbot_url))
|
||||
return false;
|
||||
|
||||
/* Check whether remote file is an archive */
|
||||
is_archive = path_is_compressed_file(filename_str);
|
||||
|
||||
/* remote_filename */
|
||||
if (entry->remote_filename)
|
||||
{
|
||||
free(entry->remote_filename);
|
||||
entry->remote_filename = NULL;
|
||||
}
|
||||
|
||||
entry->remote_filename = strdup(filename_str);
|
||||
|
||||
/* remote_core_path */
|
||||
fill_pathname_join(
|
||||
remote_core_path,
|
||||
network_buildbot_url,
|
||||
filename_str,
|
||||
sizeof(remote_core_path));
|
||||
|
||||
/* > Apply proper URL encoding (messy...) */
|
||||
tmp_url = strdup(remote_core_path);
|
||||
remote_core_path[0] = '\0';
|
||||
net_http_urlencode_full(
|
||||
remote_core_path, tmp_url, sizeof(remote_core_path));
|
||||
if (tmp_url)
|
||||
free(tmp_url);
|
||||
|
||||
if (entry->remote_core_path)
|
||||
{
|
||||
free(entry->remote_core_path);
|
||||
entry->remote_core_path = NULL;
|
||||
}
|
||||
|
||||
entry->remote_core_path = strdup(remote_core_path);
|
||||
|
||||
/* local_core_path */
|
||||
fill_pathname_join(
|
||||
local_core_path,
|
||||
path_dir_libretro,
|
||||
filename_str,
|
||||
sizeof(local_core_path));
|
||||
|
||||
if (is_archive)
|
||||
path_remove_extension(local_core_path);
|
||||
|
||||
path_resolve_realpath(local_core_path, sizeof(local_core_path), true);
|
||||
|
||||
if (entry->local_core_path)
|
||||
{
|
||||
free(entry->local_core_path);
|
||||
entry->local_core_path = NULL;
|
||||
}
|
||||
|
||||
entry->local_core_path = strdup(local_core_path);
|
||||
|
||||
/* local_info_path */
|
||||
fill_pathname_join_noext(
|
||||
local_info_path,
|
||||
path_libretro_info,
|
||||
filename_str,
|
||||
sizeof(local_info_path));
|
||||
|
||||
if (is_archive)
|
||||
path_remove_extension(local_info_path);
|
||||
|
||||
/* > Remove any non-standard core filename
|
||||
* additions (i.e. info files end with
|
||||
* '_libretro' but core files may have
|
||||
* a platform specific addendum,
|
||||
* e.g. '_android')*/
|
||||
last_underscore = (char*)strrchr(local_info_path, '_');
|
||||
|
||||
if (!string_is_empty(last_underscore))
|
||||
{
|
||||
if (string_is_not_equal_fast(last_underscore, "_libretro", 9))
|
||||
*last_underscore = '\0';
|
||||
}
|
||||
|
||||
/* > Add proper file extension */
|
||||
strlcat(
|
||||
local_info_path,
|
||||
file_path_str(FILE_PATH_CORE_INFO_EXTENSION),
|
||||
sizeof(local_info_path));
|
||||
|
||||
if (entry->local_info_path)
|
||||
{
|
||||
free(entry->local_info_path);
|
||||
entry->local_info_path = NULL;
|
||||
}
|
||||
|
||||
entry->local_info_path = strdup(local_info_path);
|
||||
|
||||
/* display_name
|
||||
* > Note: It's a bit rubbish that we have to
|
||||
* read the actual core info files here...
|
||||
* Would be better to cache this globally
|
||||
* (at present, we only cache info for
|
||||
* *installed* cores...) */
|
||||
if (path_is_valid(local_info_path))
|
||||
if (!core_info_get_display_name(
|
||||
local_info_path, display_name, sizeof(display_name)))
|
||||
display_name[0] = '\0';
|
||||
|
||||
/* > If info file does not exist, just use
|
||||
* core filename */
|
||||
if (string_is_empty(display_name))
|
||||
strlcpy(display_name, filename_str, sizeof(display_name));
|
||||
|
||||
if (entry->display_name)
|
||||
{
|
||||
free(entry->display_name);
|
||||
entry->display_name = NULL;
|
||||
}
|
||||
|
||||
entry->display_name = strdup(display_name);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Adds entry to the end of the specified core
|
||||
* updater list
|
||||
* NOTE: Entry string values are passed by
|
||||
* reference - *do not free the entry passed
|
||||
* to this function* */
|
||||
static bool core_updater_list_push_entry(
|
||||
core_updater_list_t *core_list, core_updater_list_entry_t *entry)
|
||||
{
|
||||
core_updater_list_entry_t *list_entry = NULL;
|
||||
|
||||
if (!core_list || !entry)
|
||||
return false;
|
||||
|
||||
/* Ensure there is enough space for the new entry */
|
||||
if (core_list->capacity <= core_list->size)
|
||||
return false;
|
||||
|
||||
/* Get handle of new entry inside list */
|
||||
list_entry = &core_list->entries[core_list->size];
|
||||
|
||||
if (!list_entry)
|
||||
return false;
|
||||
|
||||
/* Ensure list entry is empty */
|
||||
core_updater_list_free_entry(list_entry);
|
||||
|
||||
/* Assign paths */
|
||||
list_entry->remote_filename = entry->remote_filename;
|
||||
list_entry->remote_core_path = entry->remote_core_path;
|
||||
list_entry->local_core_path = entry->local_core_path;
|
||||
list_entry->local_info_path = entry->local_info_path;
|
||||
list_entry->display_name = entry->display_name;
|
||||
|
||||
/* Copy crc */
|
||||
list_entry->crc = entry->crc;
|
||||
|
||||
/* Copy date */
|
||||
memcpy(&list_entry->date, &entry->date, sizeof(core_updater_list_date_t));
|
||||
|
||||
/* Increment list size */
|
||||
core_list->size++;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Parses the contents of a single buildbot
|
||||
* core listing and adds it to the specified
|
||||
* core updater list */
|
||||
static void core_updater_list_add_entry(
|
||||
core_updater_list_t *core_list,
|
||||
const char *path_dir_libretro,
|
||||
const char *path_libretro_info,
|
||||
const char *network_buildbot_url,
|
||||
struct string_list *network_core_entry_list)
|
||||
{
|
||||
const char *date_str = NULL;
|
||||
const char *crc_str = NULL;
|
||||
const char *filename_str = NULL;
|
||||
core_updater_list_entry_t entry = {0};
|
||||
|
||||
if (!core_list || !network_core_entry_list)
|
||||
goto error;
|
||||
|
||||
/* > Listings must have 3 entries:
|
||||
* [date] [crc] [filename] */
|
||||
if (network_core_entry_list->size < 3)
|
||||
goto error;
|
||||
|
||||
/* Get handles of the individual listing strings */
|
||||
date_str = network_core_entry_list->elems[0].data;
|
||||
crc_str = network_core_entry_list->elems[1].data;
|
||||
filename_str = network_core_entry_list->elems[2].data;
|
||||
|
||||
if (string_is_empty(date_str) ||
|
||||
string_is_empty(crc_str) ||
|
||||
string_is_empty(filename_str))
|
||||
goto error;
|
||||
|
||||
/* Check whether core file is already included
|
||||
* in the list (this is *not* an error condition,
|
||||
* it just means we can skip the current listing) */
|
||||
if (core_updater_list_get_filename(core_list, filename_str, NULL))
|
||||
goto error;
|
||||
|
||||
/* Parse individual listing strings */
|
||||
if (!core_updater_list_set_date(&entry, date_str))
|
||||
goto error;
|
||||
|
||||
if (!core_updater_list_set_crc(&entry, crc_str))
|
||||
goto error;
|
||||
|
||||
if (!core_updater_list_set_paths(
|
||||
&entry,
|
||||
path_dir_libretro,
|
||||
path_libretro_info,
|
||||
network_buildbot_url,
|
||||
filename_str))
|
||||
goto error;
|
||||
|
||||
/* Add entry to list */
|
||||
if (!core_updater_list_push_entry(core_list, &entry))
|
||||
goto error;
|
||||
|
||||
return;
|
||||
|
||||
error:
|
||||
/* This is not a *fatal* error - it just
|
||||
* means one of the following:
|
||||
* - The current line of entry text received
|
||||
* from the buildbot is broken somehow
|
||||
* (could be the case that the network buffer
|
||||
* wasn't large enough to cache the entire
|
||||
* string, so the last line was truncated)
|
||||
* - The core updater list struct is at capacity
|
||||
* In either case, the current entry is discarded
|
||||
* and we move on to the next one
|
||||
* (network transfers are fishy business, so we
|
||||
* choose to ignore this sort of error - don't
|
||||
* want the whole fetch to fail because of a
|
||||
* trivial glitch...) */
|
||||
core_updater_list_free_entry(&entry);
|
||||
}
|
||||
|
||||
/* Core updater list qsort helper function */
|
||||
static int core_updater_list_qsort_func(
|
||||
const core_updater_list_entry_t *a, const core_updater_list_entry_t *b)
|
||||
{
|
||||
if (!a || !b)
|
||||
return 0;
|
||||
|
||||
if (string_is_empty(a->display_name) || string_is_empty(b->display_name))
|
||||
return 0;
|
||||
|
||||
return strcasecmp(a->display_name, b->display_name);
|
||||
}
|
||||
|
||||
/* Sorts core updater list into alphabetical order */
|
||||
static void core_updater_list_qsort(core_updater_list_t *core_list)
|
||||
{
|
||||
if (!core_list)
|
||||
return;
|
||||
|
||||
if (core_list->size < 2)
|
||||
return;
|
||||
|
||||
qsort(
|
||||
core_list->entries,
|
||||
core_list->size,
|
||||
sizeof(core_updater_list_entry_t),
|
||||
(int (*)(const void *, const void *))
|
||||
core_updater_list_qsort_func);
|
||||
}
|
||||
|
||||
/* Reads the contents of a buildbot core list
|
||||
* network request into the specified
|
||||
* core_updater_list_t object.
|
||||
* Returns false in the event of an error. */
|
||||
bool core_updater_list_parse_network_data(
|
||||
core_updater_list_t *core_list,
|
||||
const char *path_dir_libretro,
|
||||
const char *path_libretro_info,
|
||||
const char *network_buildbot_url,
|
||||
const char *data, size_t len)
|
||||
{
|
||||
struct string_list *network_core_list = NULL;
|
||||
struct string_list *network_core_entry_list = NULL;
|
||||
char *data_buf = NULL;
|
||||
size_t i;
|
||||
|
||||
/* Sanity check */
|
||||
if (!core_list || string_is_empty(data) || (len < 1))
|
||||
goto error;
|
||||
|
||||
/* We're populating a list 'from scratch' - remove
|
||||
* any existing entries */
|
||||
core_updater_list_reset(core_list);
|
||||
|
||||
/* Input data string is not terminated - have
|
||||
* to copy it to a temporary buffer... */
|
||||
data_buf = (char*)malloc((len + 1) * sizeof(char));
|
||||
|
||||
if (!data_buf)
|
||||
goto error;
|
||||
|
||||
memcpy(data_buf, data, len * sizeof(char));
|
||||
data_buf[len] = '\0';
|
||||
|
||||
/* Split network listing request into lines */
|
||||
network_core_list = string_split(data_buf, "\n");
|
||||
|
||||
if (!network_core_list)
|
||||
goto error;
|
||||
|
||||
if (network_core_list->size < 1)
|
||||
goto error;
|
||||
|
||||
/* Temporary data buffer is no longer required */
|
||||
free(data_buf);
|
||||
data_buf = NULL;
|
||||
|
||||
/* Loop over lines */
|
||||
for (i = 0; i < network_core_list->size; i++)
|
||||
{
|
||||
const char *line = network_core_list->elems[i].data;
|
||||
|
||||
if (string_is_empty(line))
|
||||
continue;
|
||||
|
||||
/* Split line into listings info components */
|
||||
network_core_entry_list = string_split(line, " ");
|
||||
|
||||
/* Parse listings info and add to core updater
|
||||
* list */
|
||||
core_updater_list_add_entry(
|
||||
core_list,
|
||||
path_dir_libretro,
|
||||
path_libretro_info,
|
||||
network_buildbot_url,
|
||||
network_core_entry_list);
|
||||
|
||||
/* Clean up */
|
||||
string_list_free(network_core_entry_list);
|
||||
network_core_entry_list = NULL;
|
||||
}
|
||||
|
||||
/* Sanity check */
|
||||
if (core_list->size < 1)
|
||||
goto error;
|
||||
|
||||
/* Clean up */
|
||||
string_list_free(network_core_list);
|
||||
|
||||
/* Sort completed list */
|
||||
core_updater_list_qsort(core_list);
|
||||
|
||||
return true;
|
||||
|
||||
error:
|
||||
|
||||
if (network_core_list)
|
||||
string_list_free(network_core_list);
|
||||
|
||||
if (network_core_entry_list)
|
||||
string_list_free(network_core_entry_list);
|
||||
|
||||
if (data_buf)
|
||||
free(data_buf);
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
/* Copyright (C) 2010-2019 The RetroArch team
|
||||
*
|
||||
* ---------------------------------------------------------------------------------------
|
||||
* The following license statement only applies to this file (core_updater_list.h).
|
||||
* ---------------------------------------------------------------------------------------
|
||||
*
|
||||
* Permission is hereby granted, free of charge,
|
||||
* to any person obtaining a copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
* and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __CORE_UPDATER_LIST_H
|
||||
#define __CORE_UPDATER_LIST_H
|
||||
|
||||
#include <retro_common_api.h>
|
||||
#include <libretro.h>
|
||||
|
||||
#include <boolean.h>
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
/* Default maximum number of entries in
|
||||
* a core updater list */
|
||||
#define CORE_UPDATER_LIST_SIZE 9999
|
||||
|
||||
/* Holds all date info for a core file
|
||||
* on the buildbot */
|
||||
typedef struct
|
||||
{
|
||||
unsigned year;
|
||||
unsigned month;
|
||||
unsigned day;
|
||||
} core_updater_list_date_t;
|
||||
|
||||
/* Holds all info related to a core
|
||||
* file on the buildbot */
|
||||
typedef struct
|
||||
{
|
||||
char *remote_filename;
|
||||
char *remote_core_path;
|
||||
char *local_core_path;
|
||||
char *local_info_path;
|
||||
char *display_name;
|
||||
uint32_t crc;
|
||||
core_updater_list_date_t date;
|
||||
} core_updater_list_entry_t;
|
||||
|
||||
/* Prevent direct access to core_updater_list_t
|
||||
* members */
|
||||
typedef struct core_updater_list core_updater_list_t;
|
||||
|
||||
/**************************************/
|
||||
/* Initialisation / De-Initialisation */
|
||||
/**************************************/
|
||||
|
||||
/* Creates a new, empty core updater list with a
|
||||
* maximum number of 'max_size' entries.
|
||||
* Returns a handle to a new core_updater_list_t object
|
||||
* on success, otherwise returns NULL. */
|
||||
core_updater_list_t *core_updater_list_init(size_t max_size);
|
||||
|
||||
/* Resets (removes all entries of) specified core
|
||||
* updater list */
|
||||
void core_updater_list_reset(core_updater_list_t *core_list);
|
||||
|
||||
/* Frees specified core updater list */
|
||||
void core_updater_list_free(core_updater_list_t *core_list);
|
||||
|
||||
/***************/
|
||||
/* Cached List */
|
||||
/***************/
|
||||
|
||||
/* Creates a new, empty cached core updater list
|
||||
* (i.e. 'global' list).
|
||||
* Returns false in the event of an error. */
|
||||
bool core_updater_list_init_cached(size_t max_size);
|
||||
|
||||
/* Fetches cached core updater list */
|
||||
core_updater_list_t *core_updater_list_get_cached(void);
|
||||
|
||||
/* Frees cached core updater list */
|
||||
void core_updater_list_free_cached(void);
|
||||
|
||||
/***********/
|
||||
/* Getters */
|
||||
/***********/
|
||||
|
||||
/* Returns number of entries in core updater list */
|
||||
size_t core_updater_list_size(core_updater_list_t *core_list);
|
||||
|
||||
/* Returns maximum allowed number of entries in core
|
||||
* updater list */
|
||||
size_t core_updater_list_capacity(core_updater_list_t *core_list);
|
||||
|
||||
/* Fetches core updater list entry corresponding
|
||||
* to the specified entry index.
|
||||
* Returns false if index is invalid. */
|
||||
bool core_updater_list_get_index(
|
||||
core_updater_list_t *core_list,
|
||||
size_t idx,
|
||||
const core_updater_list_entry_t **entry);
|
||||
|
||||
/* Fetches core updater list entry corresponding
|
||||
* to the specified remote core filename.
|
||||
* Returns false if core is not found. */
|
||||
bool core_updater_list_get_filename(
|
||||
core_updater_list_t *core_list,
|
||||
const char *remote_filename,
|
||||
const core_updater_list_entry_t **entry);
|
||||
|
||||
/* Fetches core updater list entry corresponding
|
||||
* to the specified core.
|
||||
* Returns false if core is not found. */
|
||||
bool core_updater_list_get_core(
|
||||
core_updater_list_t *core_list,
|
||||
const char *local_core_path,
|
||||
const core_updater_list_entry_t **entry);
|
||||
|
||||
/***********/
|
||||
/* Setters */
|
||||
/***********/
|
||||
|
||||
/* Reads the contents of a buildbot core list
|
||||
* network request into the specified
|
||||
* core_updater_list_t object.
|
||||
* Returns false in the event of an error. */
|
||||
bool core_updater_list_parse_network_data(
|
||||
core_updater_list_t *core_list,
|
||||
const char *path_dir_libretro,
|
||||
const char *path_libretro_info,
|
||||
const char *network_buildbot_url,
|
||||
const char *data, size_t len);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
||||
@@ -360,7 +360,7 @@ size_t libretro_videoprocessor_retro_get_memory_size(unsigned id);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_EASTEREGG
|
||||
#ifdef HAVE_GONG
|
||||
/* Internal gong core. */
|
||||
|
||||
void libretro_gong_retro_init(void);
|
||||
|
||||
@@ -75,6 +75,11 @@ endif
|
||||
|
||||
TARGET_NAME := ffmpeg
|
||||
|
||||
GIT_VERSION ?= " $(shell git rev-parse --short HEAD || echo unknown)"
|
||||
ifneq ($(GIT_VERSION)," unknown")
|
||||
CFLAGS += -DGIT_VERSION=\"$(GIT_VERSION)\"
|
||||
endif
|
||||
|
||||
ifneq (,$(findstring unix,$(platform)))
|
||||
ARCH_X86 = 1
|
||||
TARGET := $(TARGET_NAME)_libretro.so
|
||||
@@ -123,7 +128,7 @@ else ifneq (,$(findstring ios,$(platform)))
|
||||
TARGET := $(TARGET_NAME)_libretro_ios.dylib
|
||||
fpic := -fPIC
|
||||
SHARED := -dynamiclib
|
||||
CFLAGS += -I. -I.. -DHAVE_FMINF -DIOS
|
||||
CFLAGS += -I. -I.. -DHAVE_FMINF -DIOS -DHAVE_UNISTD_H
|
||||
ifeq ($(OPENGL),1)
|
||||
HAVE_OPENGL = 1
|
||||
GLES = 1
|
||||
@@ -140,11 +145,16 @@ ifeq ($(IOSSDK),)
|
||||
IOSSDK := $(shell xcodebuild -version -sdk iphoneos Path)
|
||||
endif
|
||||
|
||||
ifeq ($(platform),ios-arm64)
|
||||
CC = cc -arch arm64 -isysroot $(IOSSDK)
|
||||
CXX = c++ -arch arm64 -isysroot $(IOSSDK)
|
||||
else
|
||||
CC = cc -arch armv7 -isysroot $(IOSSDK)
|
||||
CXX = c++ -arch armv7 -isysroot $(IOSSDK)
|
||||
LD = armv7-apple-darwin11-ld
|
||||
endif
|
||||
|
||||
ifeq ($(platform),ios9)
|
||||
ifeq ($(platform),$(filter $(platform),ios9 ios-arm64))
|
||||
CC += -miphoneos-version-min=8.0
|
||||
CFLAGS += -miphoneos-version-min=8.0
|
||||
else
|
||||
@@ -177,20 +187,23 @@ else ifeq ($(platform), emscripten)
|
||||
else
|
||||
|
||||
ARCH_X86 = 1
|
||||
CC = gcc
|
||||
CXX = g++
|
||||
TARGET := $(TARGET_NAME)_libretro.dll
|
||||
SHARED := -shared -static-libgcc -static-libstdc++ -s -Wl,--version-script=link.T -Wl,--no-undefined
|
||||
CFLAGS += -Iffmpeg
|
||||
ifeq ($(OPENGL),1)
|
||||
GL_LIB := -lopengl32
|
||||
CFLAGS += -DHAVE_OPENGL
|
||||
HAVE_OPENGL = 1
|
||||
HAVE_GL_FFT := 1
|
||||
WIN32_PLATFORM := 1
|
||||
endif
|
||||
LIBS += -L.
|
||||
endif
|
||||
|
||||
ifeq ($(LIBRETRO_SWITCH), 1)
|
||||
CFLAGS += -DUPSTREAM_VERSION=\"$(shell cat ../RELEASE)\"
|
||||
endif
|
||||
|
||||
CFLAGS += -D__LIBRETRO__
|
||||
|
||||
include Makefile.common
|
||||
|
||||
@@ -19,10 +19,13 @@ SWRESAMPLE_DIR := $(BASE_DIR)/libswresample
|
||||
INCFLAGS += -I$(BASE_DIR) -I$(CORE_DIR) -I$(LIBRETRO_COMM_DIR)/include -I$(LIBRETRO_COMM_DIR)/include/compat
|
||||
|
||||
LIBRETRO_SOURCE += $(CORE_DIR)/ffmpeg_core.c \
|
||||
$(CORE_DIR)/packet_buffer.c \
|
||||
$(CORE_DIR)/video_buffer.c \
|
||||
$(LIBRETRO_COMM_DIR)/rthreads/tpool.c \
|
||||
$(LIBRETRO_COMM_DIR)/queues/fifo_queue.c \
|
||||
$(LIBRETRO_COMM_DIR)/rthreads/rthreads.c
|
||||
|
||||
ifeq ($(LIBRETRO_SWITCH),1)
|
||||
ifeq ($(LIBRETRO_SWITCH), 1)
|
||||
DEFINES += -DLIBRETRO_SWITCH=1
|
||||
INTERNAL_LIBAVCODEC = 1
|
||||
INTERNAL_LIBAVFORMAT = 1
|
||||
|
||||
@@ -5,6 +5,7 @@ ifeq ($(INTERNAL_ZLIB),0)
|
||||
HAVE_ZLIB = 1
|
||||
else
|
||||
HAVE_ZLIB = 1
|
||||
DEFINES += -DWANT_ZLIB
|
||||
INCFLAGS += -I$(DEPS_DIR)/libz
|
||||
DEPS_SOURCE += $(wildcard $(DEPS_DIR)/libz/*.c)
|
||||
endif
|
||||
|
||||
+734
-307
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,135 @@
|
||||
#include "packet_buffer.h"
|
||||
|
||||
struct AVPacketNode {
|
||||
AVPacket *data;
|
||||
struct AVPacketNode *next;
|
||||
struct AVPacketNode *previous;
|
||||
};
|
||||
typedef struct AVPacketNode AVPacketNode_t;
|
||||
|
||||
struct packet_buffer
|
||||
{
|
||||
AVPacketNode_t *head;
|
||||
AVPacketNode_t *tail;
|
||||
size_t size;
|
||||
};
|
||||
|
||||
packet_buffer_t *packet_buffer_create()
|
||||
{
|
||||
packet_buffer_t *b = (packet_buffer_t*)malloc(sizeof(packet_buffer_t));
|
||||
if (!b)
|
||||
return NULL;
|
||||
|
||||
memset(b, 0, sizeof(packet_buffer_t));
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
void packet_buffer_destroy(packet_buffer_t *packet_buffer)
|
||||
{
|
||||
AVPacketNode_t *node;
|
||||
|
||||
if (!packet_buffer)
|
||||
return;
|
||||
|
||||
if (packet_buffer->head)
|
||||
{
|
||||
node = packet_buffer->head;
|
||||
while (node)
|
||||
{
|
||||
AVPacketNode_t *next = node->next;
|
||||
av_packet_free(&node->data);
|
||||
free(node);
|
||||
node = next;
|
||||
}
|
||||
}
|
||||
|
||||
free(packet_buffer);
|
||||
}
|
||||
|
||||
void packet_buffer_clear(packet_buffer_t **packet_buffer)
|
||||
{
|
||||
if (!packet_buffer)
|
||||
return;
|
||||
|
||||
packet_buffer_destroy(*packet_buffer);
|
||||
*packet_buffer = packet_buffer_create();
|
||||
}
|
||||
|
||||
bool packet_buffer_empty(packet_buffer_t *packet_buffer)
|
||||
{
|
||||
if (!packet_buffer)
|
||||
return true;
|
||||
|
||||
return packet_buffer->size == 0;
|
||||
}
|
||||
|
||||
size_t packet_buffer_size(packet_buffer_t *packet_buffer)
|
||||
{
|
||||
if (!packet_buffer)
|
||||
return 0;
|
||||
|
||||
return packet_buffer->size;
|
||||
}
|
||||
|
||||
void packet_buffer_add_packet(packet_buffer_t *packet_buffer, AVPacket *pkt)
|
||||
{
|
||||
AVPacketNode_t *new_head = (AVPacketNode_t *) malloc(sizeof(AVPacketNode_t));
|
||||
new_head->data = av_packet_alloc();
|
||||
|
||||
av_packet_move_ref(new_head->data, pkt);
|
||||
|
||||
if (packet_buffer->head)
|
||||
{
|
||||
new_head->next = packet_buffer->head;
|
||||
packet_buffer->head->previous = new_head;
|
||||
}
|
||||
else
|
||||
{
|
||||
new_head->next = NULL;
|
||||
packet_buffer->tail = new_head;
|
||||
}
|
||||
|
||||
packet_buffer->head = new_head;
|
||||
packet_buffer->head->previous = NULL;
|
||||
packet_buffer->size++;
|
||||
}
|
||||
|
||||
void packet_buffer_get_packet(packet_buffer_t *packet_buffer, AVPacket *pkt)
|
||||
{
|
||||
AVPacketNode_t *new_tail = NULL;
|
||||
|
||||
if (!packet_buffer->tail)
|
||||
return;
|
||||
|
||||
av_packet_move_ref(pkt, packet_buffer->tail->data);
|
||||
if (packet_buffer->tail->previous)
|
||||
{
|
||||
new_tail = packet_buffer->tail->previous;
|
||||
new_tail->next = NULL;
|
||||
}
|
||||
else
|
||||
packet_buffer->head = NULL;
|
||||
|
||||
av_packet_free(&packet_buffer->tail->data);
|
||||
free(packet_buffer->tail);
|
||||
|
||||
packet_buffer->tail = new_tail;
|
||||
packet_buffer->size--;
|
||||
}
|
||||
|
||||
int64_t packet_buffer_peek_start_pts(packet_buffer_t *packet_buffer)
|
||||
{
|
||||
if (!packet_buffer->tail)
|
||||
return 0;
|
||||
|
||||
return packet_buffer->tail->data->pts;
|
||||
}
|
||||
|
||||
int64_t packet_buffer_peek_end_pts(packet_buffer_t *packet_buffer)
|
||||
{
|
||||
if (!packet_buffer->tail)
|
||||
return 0;
|
||||
|
||||
return packet_buffer->tail->data->pts + packet_buffer->tail->data->duration;
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
#ifndef __LIBRETRO_SDK_PACKETBUFFER_H__
|
||||
#define __LIBRETRO_SDK_PACKETBUFFER_H__
|
||||
|
||||
#include <retro_common_api.h>
|
||||
|
||||
#include <boolean.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <libavcodec/avcodec.h>
|
||||
|
||||
#include <retro_miscellaneous.h>
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* packet_buffer
|
||||
*
|
||||
* Just a simple double linked list for AVPackets.
|
||||
*
|
||||
*/
|
||||
struct packet_buffer;
|
||||
typedef struct packet_buffer packet_buffer_t;
|
||||
|
||||
/**
|
||||
* packet_buffer_create:
|
||||
*
|
||||
* Create a packet_buffer.
|
||||
*
|
||||
* Returns: A packet buffer.
|
||||
*/
|
||||
packet_buffer_t *packet_buffer_create();
|
||||
|
||||
/**
|
||||
* packet_buffer_destroy:
|
||||
* @packet_buffer : packet buffer
|
||||
*
|
||||
* Destroys a packet buffer.
|
||||
*
|
||||
**/
|
||||
void packet_buffer_destroy(packet_buffer_t *packet_buffer);
|
||||
|
||||
/**
|
||||
* packet_buffer_clear:
|
||||
* @packet_buffer : packet buffer
|
||||
*
|
||||
* Clears a packet buffer by re-creating it.
|
||||
*
|
||||
**/
|
||||
void packet_buffer_clear(packet_buffer_t **packet_buffer);
|
||||
|
||||
/**
|
||||
* packet_buffer_empty:
|
||||
* @packet_buffer : packet buffer
|
||||
*
|
||||
* Return true if the buffer is empty;
|
||||
*
|
||||
**/
|
||||
bool packet_buffer_empty(packet_buffer_t *packet_buffer);
|
||||
|
||||
/**
|
||||
* packet_buffer_size:
|
||||
* @packet_buffer : packet buffer
|
||||
*
|
||||
* Returns the number of AVPackets the buffer currently
|
||||
* holds.
|
||||
*
|
||||
**/
|
||||
size_t packet_buffer_size(packet_buffer_t *packet_buffer);
|
||||
|
||||
/**
|
||||
* packet_buffer_add_packet:
|
||||
* @packet_buffer : packet buffer
|
||||
* @pkt : packet
|
||||
*
|
||||
* Copies the given packet into the selected buffer.
|
||||
*
|
||||
**/
|
||||
void packet_buffer_add_packet(packet_buffer_t *packet_buffer, AVPacket *pkt);
|
||||
|
||||
/**
|
||||
* packet_buffer_get_packet:
|
||||
* @packet_buffer : packet buffer
|
||||
* @pkt : packet
|
||||
*
|
||||
* Get the next packet. User needs to unref the packet with av_packet_unref().
|
||||
*
|
||||
**/
|
||||
void packet_buffer_get_packet(packet_buffer_t *packet_buffer, AVPacket *pkt);
|
||||
|
||||
/**
|
||||
* packet_buffer_peek_start_pts:
|
||||
* @packet_buffer : packet buffer
|
||||
*
|
||||
* Returns the start pts of the next packet in the buffer.
|
||||
*
|
||||
**/
|
||||
int64_t packet_buffer_peek_start_pts(packet_buffer_t *packet_buffer);
|
||||
|
||||
/**
|
||||
* packet_buffer_peek_end_pts:
|
||||
* @packet_buffer : packet buffer
|
||||
*
|
||||
* Returns the end pts of the next packet in the buffer.
|
||||
*
|
||||
**/
|
||||
int64_t packet_buffer_peek_end_pts(packet_buffer_t *packet_buffer);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,241 @@
|
||||
#include <libavformat/avformat.h>
|
||||
|
||||
#include <rthreads/rthreads.h>
|
||||
|
||||
#include "video_buffer.h"
|
||||
|
||||
enum kbStatus
|
||||
{
|
||||
KB_OPEN,
|
||||
KB_IN_PROGRESS,
|
||||
KB_FINISHED
|
||||
};
|
||||
|
||||
struct video_buffer
|
||||
{
|
||||
video_decoder_context_t *buffer;
|
||||
enum kbStatus *status;
|
||||
size_t capacity;
|
||||
slock_t *lock;
|
||||
scond_t *open_cond;
|
||||
scond_t *finished_cond;
|
||||
int64_t head;
|
||||
int64_t tail;
|
||||
};
|
||||
|
||||
video_buffer_t *video_buffer_create(size_t capacity, int frame_size, int width, int height)
|
||||
{
|
||||
video_buffer_t *b = (video_buffer_t*)malloc(sizeof(video_buffer_t));
|
||||
if (!b)
|
||||
return NULL;
|
||||
|
||||
memset(b, 0, sizeof(video_buffer_t));
|
||||
b->capacity = capacity;
|
||||
|
||||
b->status = (enum kbStatus*)malloc(sizeof(enum kbStatus) * capacity);
|
||||
if (!b->status)
|
||||
goto fail;
|
||||
for (int i = 0; i < capacity; i++)
|
||||
b->status[i] = KB_OPEN;
|
||||
|
||||
b->lock = slock_new();
|
||||
b->open_cond = scond_new();
|
||||
b->finished_cond = scond_new();
|
||||
if (!b->lock || !b->open_cond || !b->finished_cond)
|
||||
goto fail;
|
||||
|
||||
b->buffer = (video_decoder_context_t*)malloc(sizeof(video_decoder_context_t) * capacity);
|
||||
if (!b->buffer)
|
||||
goto fail;
|
||||
|
||||
for (int i = 0; i < capacity; i++)
|
||||
{
|
||||
b->buffer[i].index = i;
|
||||
b->buffer[i].pts = 0;
|
||||
b->buffer[i].sws = sws_alloc_context();
|
||||
b->buffer[i].source = av_frame_alloc();
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
b->buffer[i].hw_source = av_frame_alloc();
|
||||
#endif
|
||||
b->buffer[i].target = av_frame_alloc();
|
||||
b->buffer[i].frame_buf = (uint8_t*)av_malloc(frame_size);
|
||||
|
||||
avpicture_fill((AVPicture*)b->buffer[i].target, (const uint8_t*)b->buffer[i].frame_buf,
|
||||
PIX_FMT_RGB32, width, height);
|
||||
|
||||
if (!b->buffer[i].sws ||
|
||||
!b->buffer[i].source ||
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
!b->buffer[i].hw_source ||
|
||||
#endif
|
||||
!b->buffer[i].target ||
|
||||
!b->buffer[i].frame_buf)
|
||||
goto fail;
|
||||
}
|
||||
return b;
|
||||
|
||||
fail:
|
||||
video_buffer_destroy(b);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void video_buffer_destroy(video_buffer_t *video_buffer)
|
||||
{
|
||||
if (!video_buffer)
|
||||
return;
|
||||
|
||||
slock_free(video_buffer->lock);
|
||||
scond_free(video_buffer->open_cond);
|
||||
scond_free(video_buffer->finished_cond);
|
||||
free(video_buffer->status);
|
||||
if (video_buffer->buffer)
|
||||
for (int i = 0; i < video_buffer->capacity; i++)
|
||||
{
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
av_frame_free(&video_buffer->buffer[i].hw_source);
|
||||
#endif
|
||||
av_frame_free(&video_buffer->buffer[i].source);
|
||||
av_frame_free(&video_buffer->buffer[i].target);
|
||||
av_freep(&video_buffer->buffer[i].frame_buf);
|
||||
sws_freeContext(video_buffer->buffer[i].sws);
|
||||
}
|
||||
free(video_buffer->buffer);
|
||||
free(video_buffer);
|
||||
}
|
||||
|
||||
void video_buffer_clear(video_buffer_t *video_buffer)
|
||||
{
|
||||
if (!video_buffer)
|
||||
return;
|
||||
|
||||
slock_lock(video_buffer->lock);
|
||||
|
||||
scond_signal(video_buffer->open_cond);
|
||||
scond_signal(video_buffer->finished_cond);
|
||||
|
||||
video_buffer->head = 0;
|
||||
video_buffer->tail = 0;
|
||||
for (int i = 0; i < video_buffer->capacity; i++)
|
||||
video_buffer->status[i] = KB_OPEN;
|
||||
|
||||
slock_unlock(video_buffer->lock);
|
||||
}
|
||||
|
||||
void video_buffer_get_open_slot(video_buffer_t *video_buffer, video_decoder_context_t **context)
|
||||
{
|
||||
slock_lock(video_buffer->lock);
|
||||
|
||||
if (video_buffer->status[video_buffer->head] == KB_OPEN)
|
||||
{
|
||||
*context = &video_buffer->buffer[video_buffer->head];
|
||||
video_buffer->status[video_buffer->head] = KB_IN_PROGRESS;
|
||||
video_buffer->head++;
|
||||
video_buffer->head %= video_buffer->capacity;
|
||||
}
|
||||
|
||||
slock_unlock(video_buffer->lock);
|
||||
}
|
||||
|
||||
void video_buffer_return_open_slot(video_buffer_t *video_buffer, video_decoder_context_t *context)
|
||||
{
|
||||
slock_lock(video_buffer->lock);
|
||||
|
||||
if (video_buffer->status[context->index] == KB_IN_PROGRESS)
|
||||
{
|
||||
video_buffer->status[context->index] = KB_OPEN;
|
||||
video_buffer->head--;
|
||||
video_buffer->head %= video_buffer->capacity;
|
||||
}
|
||||
|
||||
slock_unlock(video_buffer->lock);
|
||||
}
|
||||
|
||||
void video_buffer_open_slot(video_buffer_t *video_buffer, video_decoder_context_t *context)
|
||||
{
|
||||
slock_lock(video_buffer->lock);
|
||||
|
||||
if (video_buffer->status[context->index] == KB_FINISHED)
|
||||
{
|
||||
video_buffer->status[context->index] = KB_OPEN;
|
||||
video_buffer->tail++;
|
||||
video_buffer->tail %= (video_buffer->capacity);
|
||||
scond_signal(video_buffer->open_cond);
|
||||
}
|
||||
|
||||
slock_unlock(video_buffer->lock);
|
||||
}
|
||||
|
||||
void video_buffer_get_finished_slot(video_buffer_t *video_buffer, video_decoder_context_t **context)
|
||||
{
|
||||
slock_lock(video_buffer->lock);
|
||||
|
||||
if (video_buffer->status[video_buffer->tail] == KB_FINISHED)
|
||||
*context = &video_buffer->buffer[video_buffer->tail];
|
||||
|
||||
slock_unlock(video_buffer->lock);
|
||||
}
|
||||
|
||||
void video_buffer_finish_slot(video_buffer_t *video_buffer, video_decoder_context_t *context)
|
||||
{
|
||||
slock_lock(video_buffer->lock);
|
||||
|
||||
if (video_buffer->status[context->index] == KB_IN_PROGRESS)
|
||||
{
|
||||
video_buffer->status[context->index] = KB_FINISHED;
|
||||
scond_signal(video_buffer->finished_cond);
|
||||
}
|
||||
|
||||
slock_unlock(video_buffer->lock);
|
||||
}
|
||||
|
||||
bool video_buffer_wait_for_open_slot(video_buffer_t *video_buffer)
|
||||
{
|
||||
slock_lock(video_buffer->lock);
|
||||
|
||||
while (video_buffer->status[video_buffer->head] != KB_OPEN)
|
||||
scond_wait(video_buffer->open_cond, video_buffer->lock);
|
||||
|
||||
slock_unlock(video_buffer->lock);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool video_buffer_wait_for_finished_slot(video_buffer_t *video_buffer)
|
||||
{
|
||||
slock_lock(video_buffer->lock);
|
||||
|
||||
while (video_buffer->status[video_buffer->tail] != KB_FINISHED)
|
||||
scond_wait(video_buffer->finished_cond, video_buffer->lock);
|
||||
|
||||
slock_unlock(video_buffer->lock);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool video_buffer_has_open_slot(video_buffer_t *video_buffer)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
slock_lock(video_buffer->lock);
|
||||
|
||||
if (video_buffer->status[video_buffer->head] == KB_OPEN)
|
||||
ret = true;
|
||||
|
||||
slock_unlock(video_buffer->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool video_buffer_has_finished_slot(video_buffer_t *video_buffer)
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
slock_lock(video_buffer->lock);
|
||||
|
||||
if (video_buffer->status[video_buffer->tail] == KB_FINISHED)
|
||||
ret = true;
|
||||
|
||||
slock_unlock(video_buffer->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -0,0 +1,195 @@
|
||||
#ifndef __LIBRETRO_SDK_VIDEOBUFFER_H__
|
||||
#define __LIBRETRO_SDK_VIDEOBUFFER_H__
|
||||
|
||||
#include <retro_common_api.h>
|
||||
|
||||
#include <boolean.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef HAVE_SSA
|
||||
#include <ass/ass.h>
|
||||
#endif
|
||||
|
||||
#include <libavutil/frame.h>
|
||||
#include <libswscale/swscale.h>
|
||||
|
||||
#include <retro_miscellaneous.h>
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
#ifndef PIX_FMT_RGB32
|
||||
#define PIX_FMT_RGB32 AV_PIX_FMT_RGB32
|
||||
#endif
|
||||
|
||||
/**
|
||||
* video_decoder_context
|
||||
*
|
||||
* Context object for the sws worker threads.
|
||||
*
|
||||
*/
|
||||
struct video_decoder_context
|
||||
{
|
||||
int index;
|
||||
int64_t pts;
|
||||
struct SwsContext *sws;
|
||||
AVFrame *source;
|
||||
#if LIBAVUTIL_VERSION_MAJOR > 55
|
||||
AVFrame *hw_source;
|
||||
#endif
|
||||
AVFrame *target;
|
||||
#ifdef HAVE_SSA
|
||||
ASS_Track *ass_track_active;
|
||||
#endif
|
||||
uint8_t *frame_buf;
|
||||
};
|
||||
typedef struct video_decoder_context video_decoder_context_t;
|
||||
|
||||
/**
|
||||
* video_buffer
|
||||
*
|
||||
* The video buffer is a ring buffer, that can be used as a
|
||||
* buffer for many workers while keeping the order.
|
||||
*
|
||||
* It is thread safe in a sensem that it is designed to work
|
||||
* with one work coordinator, that allocates work slots for
|
||||
* workers threads to work on and later collect the work
|
||||
* product in the same order, as the slots were allocated.
|
||||
*
|
||||
*/
|
||||
struct video_buffer;
|
||||
typedef struct video_buffer video_buffer_t;
|
||||
|
||||
/**
|
||||
* video_buffer_create:
|
||||
* @capacity : Size of the buffer.
|
||||
* @frame_size : Size of the target frame.
|
||||
* @width : Width of the target frame.
|
||||
* @height : Height of the target frame.
|
||||
*
|
||||
* Create a video buffer.
|
||||
*
|
||||
* Returns: A video buffer.
|
||||
*/
|
||||
video_buffer_t *video_buffer_create(size_t capacity, int frame_size, int width, int height);
|
||||
|
||||
/**
|
||||
* video_buffer_destroy:
|
||||
* @video_buffer : video buffer.
|
||||
*
|
||||
* Destroys a video buffer.
|
||||
*
|
||||
* Does also free the buffer allocated with video_buffer_create().
|
||||
* User has to shut down any external worker threads that may have
|
||||
* a reference to this video buffer.
|
||||
*
|
||||
**/
|
||||
void video_buffer_destroy(video_buffer_t *video_buffer);
|
||||
|
||||
/**
|
||||
* video_buffer_clear:
|
||||
* @video_buffer : video buffer.
|
||||
*
|
||||
* Clears a video buffer.
|
||||
*
|
||||
**/
|
||||
void video_buffer_clear(video_buffer_t *video_buffer);
|
||||
|
||||
/**
|
||||
* video_buffer_get_open_slot:
|
||||
* @video_buffer : video buffer.
|
||||
* @context : sws context.
|
||||
*
|
||||
* Returns the next open context inside the ring buffer
|
||||
* and it's index. The status of the slot will be marked as
|
||||
* 'in progress' until slot is marked as finished with
|
||||
* video_buffer_finish_slot();
|
||||
*
|
||||
**/
|
||||
void video_buffer_get_open_slot(video_buffer_t *video_buffer, video_decoder_context_t **context);
|
||||
|
||||
/**
|
||||
* video_buffer_return_open_slot:
|
||||
* @video_buffer : video buffer.
|
||||
* @context : sws context.
|
||||
*
|
||||
* Marks the given sws context that is "in progress" as "open" again.
|
||||
*
|
||||
**/
|
||||
void video_buffer_return_open_slot(video_buffer_t *video_buffer, video_decoder_context_t *context);
|
||||
|
||||
/**
|
||||
* video_buffer_open_slot:
|
||||
* @video_buffer : video buffer.
|
||||
* @context : sws context.
|
||||
*
|
||||
* Sets the status of the given context from "finished" to "open".
|
||||
* The slot is then available for producers to claim again with video_buffer_get_open_slot().
|
||||
**/
|
||||
void video_buffer_open_slot(video_buffer_t *video_buffer, video_decoder_context_t *context);
|
||||
|
||||
/**
|
||||
* video_buffer_get_finished_slot:
|
||||
* @video_buffer : video buffer.
|
||||
* @context : sws context.
|
||||
*
|
||||
* Returns a reference for the next context inside
|
||||
* the ring buffer. User needs to use video_buffer_open_slot()
|
||||
* to open the slot in the ringbuffer for the next
|
||||
* work assignment. User is free to re-allocate or
|
||||
* re-use the context.
|
||||
*/
|
||||
void video_buffer_get_finished_slot(video_buffer_t *video_buffer, video_decoder_context_t **context);
|
||||
|
||||
/**
|
||||
* video_buffer_finish_slot:
|
||||
* @video_buffer : video buffer.
|
||||
* @context : sws context.
|
||||
*
|
||||
* Sets the status of the given context from "in progress" to "finished".
|
||||
* This is normally done by a producer. User can then retrieve the finished work
|
||||
* context by calling video_buffer_get_finished_slot().
|
||||
*/
|
||||
void video_buffer_finish_slot(video_buffer_t *video_buffer, video_decoder_context_t *context);
|
||||
|
||||
/**
|
||||
* video_buffer_wait_for_open_slot:
|
||||
* @video_buffer : video buffer.
|
||||
*
|
||||
* Blocks until open slot is available.
|
||||
*
|
||||
* Returns true if the buffer has a open slot available.
|
||||
*/
|
||||
bool video_buffer_wait_for_open_slot(video_buffer_t *video_buffer);
|
||||
|
||||
/**
|
||||
* video_buffer_wait_for_finished_slot:
|
||||
* @video_buffer : video buffer.
|
||||
*
|
||||
* Blocks until finished slot is available.
|
||||
*
|
||||
* Returns true if the buffers next slot is finished and a
|
||||
* context available.
|
||||
*/
|
||||
bool video_buffer_wait_for_finished_slot(video_buffer_t *video_buffer);
|
||||
|
||||
/**
|
||||
* bool video_buffer_has_open_slot(video_buffer_t *video_buffer)
|
||||
:
|
||||
* @video_buffer : video buffer.
|
||||
*
|
||||
* Returns true if the buffer has a open slot available.
|
||||
*/
|
||||
bool video_buffer_has_open_slot(video_buffer_t *video_buffer);
|
||||
|
||||
/**
|
||||
* video_buffer_has_finished_slot:
|
||||
* @video_buffer : video buffer.
|
||||
*
|
||||
* Returns true if the buffers next slot is finished and a
|
||||
* context available.
|
||||
*/
|
||||
bool video_buffer_has_finished_slot(video_buffer_t *video_buffer);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
||||
@@ -8,6 +8,7 @@ image_core.so: image_core.c
|
||||
../../libretro-common/compat/compat_strcasestr.c \
|
||||
../../libretro-common/compat/compat_strl.c \
|
||||
../../libretro-common/file/file_path.c \
|
||||
../../libretro-common/file/file_path_io.c \
|
||||
../../libretro-common/file/retro_dirent.c \
|
||||
../../libretro-common/lists/dir_list.c \
|
||||
../../libretro-common/lists/string_list.c \
|
||||
|
||||
+1
-1
@@ -24,4 +24,4 @@ void dump_result_value(Result val);
|
||||
#define PRINTFPOS_STR(X,Y) "\x1b["X";"Y"H"
|
||||
#define PRINTF_LINE(X) "\x1b["X";0H"
|
||||
|
||||
#endif //_CTR_DEBUG_H__
|
||||
#endif /* _CTR_DEBUG_H__ */
|
||||
+15
-12
@@ -88,7 +88,9 @@ struct MemPool
|
||||
last = nullptr;
|
||||
}
|
||||
|
||||
//void Dump(const char* title);
|
||||
#if 0
|
||||
void Dump(const char* title);
|
||||
#endif
|
||||
u32 GetFreeSpace();
|
||||
};
|
||||
|
||||
@@ -159,25 +161,25 @@ static bool linearInit(void)
|
||||
|
||||
void* linearMemAlign(size_t size, size_t alignment)
|
||||
{
|
||||
// Enforce minimum alignment
|
||||
int shift;
|
||||
/* Enforce minimum alignment */
|
||||
if (alignment < 16)
|
||||
alignment = 16;
|
||||
|
||||
// Convert alignment to shift amount
|
||||
int shift;
|
||||
/* Convert alignment to shift amount */
|
||||
for (shift = 4; shift < 32; shift ++)
|
||||
{
|
||||
if ((1U<<shift) == alignment)
|
||||
break;
|
||||
}
|
||||
if (shift == 32) // Invalid alignment
|
||||
if (shift == 32) /* Invalid alignment */
|
||||
return nullptr;
|
||||
|
||||
// Initialize the pool if it is not ready
|
||||
/* Initialize the pool if it is not ready */
|
||||
if (!sLinearPool.Ready() && !linearInit())
|
||||
return nullptr;
|
||||
|
||||
// Allocate the chunk
|
||||
/* Allocate the chunk */
|
||||
MemChunk chunk;
|
||||
if (!sLinearPool.Allocate(chunk, size, shift))
|
||||
return nullptr;
|
||||
@@ -211,23 +213,24 @@ void* linearAlloc(size_t size)
|
||||
|
||||
void* linearRealloc(void* mem, size_t size)
|
||||
{
|
||||
// TODO
|
||||
/* TODO */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void linearFree(void* mem)
|
||||
{
|
||||
auto node = getNode(mem);
|
||||
if (!node) return;
|
||||
if (!node)
|
||||
return;
|
||||
|
||||
// Free the chunk
|
||||
/* Free the chunk */
|
||||
sLinearPool.Deallocate(node->chunk);
|
||||
|
||||
// Free the node
|
||||
/* Free the node */
|
||||
delNode(node);
|
||||
}
|
||||
|
||||
u32 linearSpaceFree()
|
||||
u32 linearSpaceFree(void)
|
||||
{
|
||||
return sLinearPool.GetFreeSpace();
|
||||
}
|
||||
|
||||
+2
-3
@@ -17,8 +17,8 @@ u32 ctr_get_linear_unused(void);
|
||||
u32 ctr_get_stack_free(void)
|
||||
{
|
||||
extern u32 __stack_bottom;
|
||||
|
||||
uint32_t* stack_bottom_current = (u32*)__stack_bottom;
|
||||
|
||||
while(*stack_bottom_current++ == 0xFCFCFCFC);
|
||||
stack_bottom_current--;
|
||||
|
||||
@@ -110,12 +110,11 @@ void ctr_request_free_pages(u32 pages)
|
||||
void* _sbrk_r(struct _reent *ptr, ptrdiff_t incr)
|
||||
{
|
||||
static u32 sbrk_top = 0;
|
||||
u32 tmp;
|
||||
|
||||
if (!sbrk_top)
|
||||
sbrk_top = __heapBase;
|
||||
|
||||
u32 tmp;
|
||||
|
||||
int diff = ((sbrk_top + incr + 0xFFF) & ~0xFFF)
|
||||
- (__heapBase + __heap_size);
|
||||
|
||||
|
||||
+22
-22
@@ -23,7 +23,7 @@ extern void* __service_ptr;
|
||||
typedef u32(*backdoor_fn)(u32 arg0, u32 arg1);
|
||||
|
||||
__attribute((naked))
|
||||
static u32 svc_7b(backdoor_fn entry_fn, ...) // can pass up to two arguments to entry_fn(...)
|
||||
static u32 svc_7b(backdoor_fn entry_fn, ...) /* can pass up to two arguments to entry_fn(...) */
|
||||
{
|
||||
__asm__ volatile(
|
||||
"push {r0, r1, r2} \n\t"
|
||||
@@ -161,19 +161,17 @@ static void target_thread_entry(mch2_thread_args_t* args)
|
||||
static u32 get_first_free_basemem_page(bool isNew3DS)
|
||||
{
|
||||
s64 v1;
|
||||
int memused_base;
|
||||
int memused_base_linear; // guessed
|
||||
|
||||
memused_base = osGetMemRegionUsed(MEMREGION_BASE);
|
||||
int memused_base_linear; /* guessed */
|
||||
int memused_base = osGetMemRegionUsed(MEMREGION_BASE);
|
||||
|
||||
svcGetSystemInfo(&v1, 2, 0);
|
||||
memused_base_linear = 0x6C000 + v1 +
|
||||
(osGetKernelVersion() > SYSTEM_VERSION(2, 49, 0) ? (isNew3DS ? 0x2000 : 0x1000) : 0x0);
|
||||
|
||||
return (osGetKernelVersion() > SYSTEM_VERSION(2, 40, 0) ? 0xE0000000 : 0xF0000000) // kernel FCRAM mapping
|
||||
+ (isNew3DS ? 0x10000000 : 0x08000000) // FCRAM size
|
||||
- (memused_base - memused_base_linear) // memory usage for pages allocated without the MEMOP_LINEAR flag
|
||||
- 0x1000; // skip to the start addr of the next free page
|
||||
return (osGetKernelVersion() > SYSTEM_VERSION(2, 40, 0) ? 0xE0000000 : 0xF0000000) /* kernel FCRAM mapping */
|
||||
+ (isNew3DS ? 0x10000000 : 0x08000000) /* FCRAM size */
|
||||
- (memused_base - memused_base_linear) /* memory usage for pages allocated without the MEMOP_LINEAR flag */
|
||||
- 0x1000; /* skip to the start addr of the next free page */
|
||||
|
||||
}
|
||||
|
||||
@@ -280,7 +278,7 @@ static void do_memchunkhax2(void)
|
||||
|
||||
u32 alloc_address_kaddr = osConvertVirtToPhys((void*)linear_address) + mch2.kernel_fcram_mapping_offset;
|
||||
|
||||
mch2.thread_page_kva = get_first_free_basemem_page(mch2.isNew3DS) - 0x10000; // skip down 16 pages
|
||||
mch2.thread_page_kva = get_first_free_basemem_page(mch2.isNew3DS) - 0x10000; /* skip down 16 pages */
|
||||
((u32*)linear_buffer)[0] = 1;
|
||||
((u32*)linear_buffer)[1] = mch2.thread_page_kva;
|
||||
((u32*)linear_buffer)[2] = alloc_address_kaddr + (((mch2.alloc_size >> 12) - 3) << 13) + (skip_pages << 12);
|
||||
@@ -404,8 +402,9 @@ static void gspwn(u32 dst, u32 src, u32 size, u8* flush_buffer)
|
||||
* *(u32*)val1 = 0x0;
|
||||
*/
|
||||
|
||||
// X-X--X-X
|
||||
// X-XXXX-X
|
||||
/* X-X--X-X
|
||||
* X-XXXX-X
|
||||
*/
|
||||
|
||||
static void memchunkhax1_write_pair(u32 val1, u32 val2)
|
||||
{
|
||||
@@ -458,23 +457,24 @@ static void do_memchunkhax1(void)
|
||||
{
|
||||
u32 saved_vram_value = *(u32*)0x1F000008;
|
||||
|
||||
// 0x1F000000 contains the enable bit for svc 0x7B
|
||||
/* 0x1F000000 contains the enable bit for svc 0x7B */
|
||||
memchunkhax1_write_pair(get_thread_page() + THREAD_PAGE_ACL_OFFSET + SVC_ACL_OFFSET(0x7B), 0x1F000000);
|
||||
|
||||
write_kaddr(0x1F000008, saved_vram_value);
|
||||
}
|
||||
|
||||
Result get_luma_version(u32 *major, u32 *minor) {
|
||||
s64 out;
|
||||
u32 version;
|
||||
Result get_luma_version(u32 *major, u32 *minor)
|
||||
{
|
||||
s64 out;
|
||||
u32 version;
|
||||
|
||||
if (R_FAILED(svcGetSystemInfo(&out, 0x10000, 0)))
|
||||
return -1;
|
||||
if (R_FAILED(svcGetSystemInfo(&out, 0x10000, 0)))
|
||||
return -1;
|
||||
|
||||
version = (u32)out;
|
||||
*major = GET_VERSION_MAJOR(version);
|
||||
*minor = GET_VERSION_MINOR(version);
|
||||
return 0;
|
||||
version = (u32)out;
|
||||
*major = GET_VERSION_MAJOR(version);
|
||||
*minor = GET_VERSION_MINOR(version);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Result svchax_init(bool patch_srv)
|
||||
|
||||
+73
-59
@@ -9,75 +9,89 @@ extern const loaderFuncs_s loader_Ninjhax1;
|
||||
extern const loaderFuncs_s loader_Ninjhax2;
|
||||
extern const loaderFuncs_s loader_Rosalina;
|
||||
|
||||
static void (*launch_3dsx)(const char* path, argData_s* args, executableMetadata_s* em);
|
||||
static void (*launch_3dsx)(const char* path,
|
||||
argData_s* args, executableMetadata_s* em);
|
||||
|
||||
static int exec_3dsx_actual(const char* path, const char** args, bool appendPath){
|
||||
struct stat sBuff;
|
||||
argData_s newProgramArgs;
|
||||
unsigned int argChars = 0;
|
||||
unsigned int argNum = 0;
|
||||
bool fileExists;
|
||||
bool inited;
|
||||
static int exec_3dsx_actual(const char* path,
|
||||
const char** args, bool appendPath)
|
||||
{
|
||||
struct stat sBuff;
|
||||
argData_s newProgramArgs;
|
||||
unsigned int argChars = 0;
|
||||
unsigned int argNum = 0;
|
||||
bool fileExists;
|
||||
bool inited;
|
||||
|
||||
if(path == NULL || path[0] == '\0'){
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
if (!path || path[0] == '\0')
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
fileExists = stat(path, &sBuff) == 0;
|
||||
if(!fileExists){
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
else if(S_ISDIR(sBuff.st_mode)){
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
fileExists = stat(path, &sBuff) == 0;
|
||||
if (!fileExists)
|
||||
{
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
else if (S_ISDIR(sBuff.st_mode))
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
//args the string functions write to the passed string, this will cause a write to read only memory sot the string must be cloned
|
||||
memset(newProgramArgs.buf, '\0', sizeof(newProgramArgs.buf));
|
||||
newProgramArgs.dst = (char*)&newProgramArgs.buf[1];
|
||||
if(appendPath){
|
||||
strcpy(newProgramArgs.dst, path);
|
||||
newProgramArgs.dst += strlen(path) + 1;
|
||||
newProgramArgs.buf[0]++;
|
||||
/* args the string functions write to the passed string,
|
||||
* this will cause a write to read only memory,
|
||||
* so the string must be cloned */
|
||||
memset(newProgramArgs.buf, '\0', sizeof(newProgramArgs.buf));
|
||||
newProgramArgs.dst = (char*)&newProgramArgs.buf[1];
|
||||
if (appendPath)
|
||||
{
|
||||
strcpy(newProgramArgs.dst, path);
|
||||
newProgramArgs.dst += strlen(path) + 1;
|
||||
newProgramArgs.buf[0]++;
|
||||
}
|
||||
while(args[argNum] != NULL)
|
||||
{
|
||||
strcpy(newProgramArgs.dst, args[argNum]);
|
||||
newProgramArgs.dst += strlen(args[argNum]) + 1;
|
||||
newProgramArgs.buf[0]++;
|
||||
argNum++;
|
||||
}
|
||||
|
||||
}
|
||||
while(args[argNum] != NULL){
|
||||
strcpy(newProgramArgs.dst, args[argNum]);
|
||||
newProgramArgs.dst += strlen(args[argNum]) + 1;
|
||||
newProgramArgs.buf[0]++;
|
||||
argNum++;
|
||||
}
|
||||
inited = loader_Rosalina.init();
|
||||
launch_3dsx = loader_Rosalina.launchFile;
|
||||
|
||||
inited = loader_Rosalina.init();
|
||||
launch_3dsx = loader_Rosalina.launchFile;
|
||||
if (!inited)
|
||||
{
|
||||
inited = loader_Ninjhax2.init();
|
||||
launch_3dsx = loader_Ninjhax2.launchFile;
|
||||
}
|
||||
|
||||
if(!inited){
|
||||
inited = loader_Ninjhax2.init();
|
||||
launch_3dsx = loader_Ninjhax2.launchFile;
|
||||
}
|
||||
if (!inited)
|
||||
{
|
||||
inited = loader_Ninjhax1.init();
|
||||
launch_3dsx = loader_Ninjhax1.launchFile;
|
||||
}
|
||||
|
||||
if(!inited){
|
||||
inited = loader_Ninjhax1.init();
|
||||
launch_3dsx = loader_Ninjhax1.launchFile;
|
||||
}
|
||||
if (inited)
|
||||
{
|
||||
osSetSpeedupEnable(false);
|
||||
launch_3dsx(path, &newProgramArgs, NULL);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if(inited){
|
||||
osSetSpeedupEnable(false);
|
||||
launch_3dsx(path, &newProgramArgs, NULL);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
//should never be reached
|
||||
errno = ENOTSUP;
|
||||
return -1;
|
||||
/* should never be reached */
|
||||
errno = ENOTSUP;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int exec_3dsx(const char* path, const char** args){
|
||||
return exec_3dsx_actual(path, args, true/*appendPath*/);
|
||||
int exec_3dsx(const char* path, const char** args)
|
||||
{
|
||||
return exec_3dsx_actual(path, args, true/*appendPath*/);
|
||||
}
|
||||
|
||||
int exec_3dsx_no_path_in_args(const char* path, const char** args){
|
||||
return exec_3dsx_actual(path, args, false/*appendPath*/);
|
||||
}
|
||||
int exec_3dsx_no_path_in_args(const char* path, const char** args)
|
||||
{
|
||||
return exec_3dsx_actual(path, args, false/*appendPath*/);
|
||||
}
|
||||
@@ -1,9 +1,14 @@
|
||||
#ifndef EXEC_3DSX_H
|
||||
#define EXEC_3DSX_H
|
||||
|
||||
//since 3dsx programs are not guaranteed access to the OS, the 3dsx bootloader run by the exploit must run the next program
|
||||
//your program must have no extra threads running when this is called, these limits do not apply to exec_cia
|
||||
/* since 3dsx programs are not guaranteed access to the OS,
|
||||
* the 3dsx bootloader run by the exploit must run the next program
|
||||
*
|
||||
* your program must have no extra threads running when this is called,
|
||||
* these limits do not apply to exec_cia
|
||||
*/
|
||||
int exec_3dsx_no_path_in_args(const char* path, const char** args);
|
||||
|
||||
int exec_3dsx(const char* path, const char** args);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
+164
-147
@@ -13,187 +13,204 @@ typedef struct{
|
||||
|
||||
char argvHmac[0x20] = {0x1d, 0x78, 0xff, 0xb9, 0xc5, 0xbc, 0x78, 0xb7, 0xac, 0x29, 0x1d, 0x3e, 0x16, 0xd0, 0xcf, 0x53, 0xef, 0x12, 0x58, 0x83, 0xb6, 0x9e, 0x2f, 0x79, 0x47, 0xf9, 0x35, 0x61, 0xeb, 0x50, 0xd7, 0x67};
|
||||
|
||||
static void errorAndQuit(const char* errorStr){
|
||||
errorConf error;
|
||||
static void errorAndQuit(const char* errorStr)
|
||||
{
|
||||
errorConf error;
|
||||
|
||||
errorInit(&error, ERROR_TEXT, CFG_LANGUAGE_EN);
|
||||
errorText(&error, errorStr);
|
||||
errorDisp(&error);
|
||||
exit(0);
|
||||
errorInit(&error, ERROR_TEXT, CFG_LANGUAGE_EN);
|
||||
errorText(&error, errorStr);
|
||||
errorDisp(&error);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static int isCiaInstalled(u64 titleId, u16 version){
|
||||
u32 titlesToRetrieve;
|
||||
u32 titlesRetrieved;
|
||||
u64* titleIds;
|
||||
bool titleExists = false;
|
||||
AM_TitleEntry titleInfo;
|
||||
Result failed;
|
||||
static int isCiaInstalled(u64 titleId, u16 version)
|
||||
{
|
||||
u32 titlesToRetrieve;
|
||||
u32 titlesRetrieved;
|
||||
u64* titleIds;
|
||||
bool titleExists = false;
|
||||
AM_TitleEntry titleInfo;
|
||||
Result failed;
|
||||
|
||||
failed = AM_GetTitleCount(MEDIATYPE_SD, &titlesToRetrieve);
|
||||
if(R_FAILED(failed))
|
||||
return -1;
|
||||
failed = AM_GetTitleCount(MEDIATYPE_SD, &titlesToRetrieve);
|
||||
if (R_FAILED(failed))
|
||||
return -1;
|
||||
|
||||
titleIds = malloc(titlesToRetrieve * sizeof(uint64_t));
|
||||
if(titleIds == NULL)
|
||||
return -1;
|
||||
titleIds = malloc(titlesToRetrieve * sizeof(uint64_t));
|
||||
if (!titleIds)
|
||||
return -1;
|
||||
|
||||
failed = AM_GetTitleList(&titlesRetrieved, MEDIATYPE_SD, titlesToRetrieve, titleIds);
|
||||
if(R_FAILED(failed))
|
||||
return -1;
|
||||
failed = AM_GetTitleList(&titlesRetrieved, MEDIATYPE_SD, titlesToRetrieve, titleIds);
|
||||
if (R_FAILED(failed))
|
||||
return -1;
|
||||
|
||||
for(u32 titlesToCheck = 0; titlesToCheck < titlesRetrieved; titlesToCheck++){
|
||||
if(titleIds[titlesToCheck] == titleId){
|
||||
titleExists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for(u32 titlesToCheck = 0; titlesToCheck < titlesRetrieved; titlesToCheck++)
|
||||
{
|
||||
if (titleIds[titlesToCheck] == titleId)
|
||||
{
|
||||
titleExists = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
free(titleIds);
|
||||
free(titleIds);
|
||||
|
||||
if(titleExists){
|
||||
failed = AM_GetTitleInfo(MEDIATYPE_SD, 1 /*titleCount*/, &titleId, &titleInfo);
|
||||
if(R_FAILED(failed))
|
||||
return -1;
|
||||
if (titleExists)
|
||||
{
|
||||
failed = AM_GetTitleInfo(MEDIATYPE_SD, 1 /*titleCount*/, &titleId, &titleInfo);
|
||||
if (R_FAILED(failed))
|
||||
return -1;
|
||||
|
||||
if(titleInfo.version == version)
|
||||
return 1;
|
||||
}
|
||||
if (titleInfo.version == version)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int installCia(Handle ciaFile){
|
||||
Result failed;
|
||||
Handle outputHandle;
|
||||
u64 fileSize;
|
||||
u64 fileOffset = 0;
|
||||
u32 bytesRead;
|
||||
u32 bytesWritten;
|
||||
u8 transferBuffer[FILE_CHUNK_SIZE];
|
||||
static int installCia(Handle ciaFile)
|
||||
{
|
||||
Result failed;
|
||||
Handle outputHandle;
|
||||
u64 fileSize;
|
||||
u64 fileOffset = 0;
|
||||
u32 bytesRead;
|
||||
u32 bytesWritten;
|
||||
u8 transferBuffer[FILE_CHUNK_SIZE];
|
||||
|
||||
failed = AM_StartCiaInstall(MEDIATYPE_SD, &outputHandle);
|
||||
if(R_FAILED(failed))
|
||||
return -1;
|
||||
failed = AM_StartCiaInstall(MEDIATYPE_SD, &outputHandle);
|
||||
if (R_FAILED(failed))
|
||||
return -1;
|
||||
|
||||
failed = FSFILE_GetSize(ciaFile, &fileSize);
|
||||
if(R_FAILED(failed))
|
||||
return -1;
|
||||
failed = FSFILE_GetSize(ciaFile, &fileSize);
|
||||
if (R_FAILED(failed))
|
||||
return -1;
|
||||
|
||||
while(fileOffset < fileSize){
|
||||
u64 bytesRemaining = fileSize - fileOffset;
|
||||
failed = FSFILE_Read(ciaFile, &bytesRead, fileOffset, transferBuffer, bytesRemaining < FILE_CHUNK_SIZE ? bytesRemaining : FILE_CHUNK_SIZE);
|
||||
if(R_FAILED(failed)){
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
return -1;
|
||||
}
|
||||
while(fileOffset < fileSize)
|
||||
{
|
||||
u64 bytesRemaining = fileSize - fileOffset;
|
||||
failed = FSFILE_Read(ciaFile, &bytesRead, fileOffset, transferBuffer, bytesRemaining < FILE_CHUNK_SIZE ? bytesRemaining : FILE_CHUNK_SIZE);
|
||||
if (R_FAILED(failed))
|
||||
{
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
return -1;
|
||||
}
|
||||
|
||||
failed = FSFILE_Write(outputHandle, &bytesWritten, fileOffset, transferBuffer, bytesRead, 0);
|
||||
if(R_FAILED(failed)){
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
if(R_DESCRIPTION(failed) == RD_ALREADY_EXISTS)
|
||||
return 1;
|
||||
return -1;
|
||||
}
|
||||
failed = FSFILE_Write(outputHandle, &bytesWritten, fileOffset, transferBuffer, bytesRead, 0);
|
||||
if (R_FAILED(failed))
|
||||
{
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
if (R_DESCRIPTION(failed) == RD_ALREADY_EXISTS)
|
||||
return 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(bytesWritten != bytesRead){
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
return -1;
|
||||
}
|
||||
if (bytesWritten != bytesRead)
|
||||
{
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fileOffset += bytesWritten;
|
||||
}
|
||||
fileOffset += bytesWritten;
|
||||
}
|
||||
|
||||
failed = AM_FinishCiaInstall(outputHandle);
|
||||
if(R_FAILED(failed))
|
||||
return -1;
|
||||
failed = AM_FinishCiaInstall(outputHandle);
|
||||
if (R_FAILED(failed))
|
||||
return -1;
|
||||
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int exec_cia(const char* path, const char** args){
|
||||
struct stat sBuff;
|
||||
bool fileExists;
|
||||
bool inited;
|
||||
int exec_cia(const char* path, const char** args)
|
||||
{
|
||||
struct stat sBuff;
|
||||
bool fileExists;
|
||||
bool inited;
|
||||
|
||||
if(path == NULL || path[0] == '\0'){
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
if (!path || path[0] == '\0')
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
fileExists = stat(path, &sBuff) == 0;
|
||||
if(!fileExists){
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
else if(S_ISDIR(sBuff.st_mode)){
|
||||
errno = EINVAL;;
|
||||
return -1;
|
||||
}
|
||||
fileExists = stat(path, &sBuff) == 0;
|
||||
if (!fileExists)
|
||||
{
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
else if (S_ISDIR(sBuff.st_mode))
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
inited = R_SUCCEEDED(amInit()) && R_SUCCEEDED(fsInit());
|
||||
if(inited){
|
||||
Result res;
|
||||
AM_TitleEntry ciaInfo;
|
||||
FS_Archive ciaArchive;
|
||||
Handle ciaFile;
|
||||
int ciaInstalled;
|
||||
ciaParam param;
|
||||
int argsLength;
|
||||
inited = R_SUCCEEDED(amInit()) && R_SUCCEEDED(fsInit());
|
||||
if (inited)
|
||||
{
|
||||
AM_TitleEntry ciaInfo;
|
||||
FS_Archive ciaArchive;
|
||||
Handle ciaFile;
|
||||
int ciaInstalled;
|
||||
ciaParam param;
|
||||
int argsLength;
|
||||
/* open CIA file */
|
||||
Result res = FSUSER_OpenArchive(&ciaArchive, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, ""));
|
||||
|
||||
//open cia file
|
||||
res = FSUSER_OpenArchive(&ciaArchive, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, ""));
|
||||
if(R_FAILED(res))
|
||||
errorAndQuit("Cant open SD FS archive.");
|
||||
if (R_FAILED(res))
|
||||
errorAndQuit("Cant open SD FS archive.");
|
||||
|
||||
res = FSUSER_OpenFile(&ciaFile, ciaArchive, fsMakePath(PATH_ASCII, path + 5/*skip "sdmc:"*/), FS_OPEN_READ, 0);
|
||||
if(R_FAILED(res))
|
||||
errorAndQuit("Cant open CIA file.");
|
||||
res = FSUSER_OpenFile(&ciaFile, ciaArchive, fsMakePath(PATH_ASCII, path + 5/*skip "sdmc:"*/), FS_OPEN_READ, 0);
|
||||
if (R_FAILED(res))
|
||||
errorAndQuit("Cant open CIA file.");
|
||||
|
||||
res = AM_GetCiaFileInfo(MEDIATYPE_SD, &ciaInfo, ciaFile);
|
||||
if(R_FAILED(res))
|
||||
errorAndQuit("Cant get CIA file info.");
|
||||
res = AM_GetCiaFileInfo(MEDIATYPE_SD, &ciaInfo, ciaFile);
|
||||
if (R_FAILED(res))
|
||||
errorAndQuit("Cant get CIA file info.");
|
||||
|
||||
ciaInstalled = isCiaInstalled(ciaInfo.titleID, ciaInfo.version);
|
||||
if(ciaInstalled == -1){
|
||||
//error
|
||||
errorAndQuit("Could not read title id list.");
|
||||
}
|
||||
else if(ciaInstalled == 0){
|
||||
//not installed
|
||||
int error = installCia(ciaFile);
|
||||
if(error == -1)
|
||||
errorAndQuit("Cant install CIA.");
|
||||
}
|
||||
ciaInstalled = isCiaInstalled(ciaInfo.titleID, ciaInfo.version);
|
||||
if (ciaInstalled == -1)
|
||||
{
|
||||
/* error */
|
||||
errorAndQuit("Could not read title ID list.");
|
||||
}
|
||||
else if (ciaInstalled == 0)
|
||||
{
|
||||
/* not installed */
|
||||
int error = installCia(ciaFile);
|
||||
if (error == -1)
|
||||
errorAndQuit("Cant install CIA.");
|
||||
}
|
||||
|
||||
FSFILE_Close(ciaFile);
|
||||
FSUSER_CloseArchive(ciaArchive);
|
||||
FSFILE_Close(ciaFile);
|
||||
FSUSER_CloseArchive(ciaArchive);
|
||||
|
||||
param.argc = 0;
|
||||
argsLength = 0;
|
||||
char* argLocation = param.args;
|
||||
while(args[param.argc] != NULL){
|
||||
strcpy(argLocation, args[param.argc]);
|
||||
argLocation += strlen(args[param.argc]) + 1;
|
||||
argsLength += strlen(args[param.argc]) + 1;
|
||||
param.argc++;
|
||||
}
|
||||
param.argc = 0;
|
||||
argsLength = 0;
|
||||
char* argLocation = param.args;
|
||||
while(args[param.argc] != NULL)
|
||||
{
|
||||
strcpy(argLocation, args[param.argc]);
|
||||
argLocation += strlen(args[param.argc]) + 1;
|
||||
argsLength += strlen(args[param.argc]) + 1;
|
||||
param.argc++;
|
||||
}
|
||||
|
||||
res = APT_PrepareToDoApplicationJump(0, ciaInfo.titleID, 0x1);
|
||||
if(R_FAILED(res))
|
||||
errorAndQuit("CIA cant run, cant prepare.");
|
||||
res = APT_PrepareToDoApplicationJump(0, ciaInfo.titleID, 0x1);
|
||||
if (R_FAILED(res))
|
||||
errorAndQuit("CIA cant run, cant prepare.");
|
||||
|
||||
res = APT_DoApplicationJump(¶m, sizeof(param.argc) + argsLength, argvHmac);
|
||||
if(R_FAILED(res))
|
||||
errorAndQuit("CIA cant run, cant jump.");
|
||||
res = APT_DoApplicationJump(¶m, sizeof(param.argc) + argsLength, argvHmac);
|
||||
if (R_FAILED(res))
|
||||
errorAndQuit("CIA cant run, cant jump.");
|
||||
|
||||
//wait for application jump, for some reason its not instant
|
||||
while(1);
|
||||
}
|
||||
/* wait for application jump, for some reason its not instant */
|
||||
while(1);
|
||||
}
|
||||
|
||||
//should never be reached
|
||||
amExit();
|
||||
fsExit();
|
||||
errno = ENOTSUP;
|
||||
return -1;
|
||||
/* should never be reached */
|
||||
amExit();
|
||||
fsExit();
|
||||
errno = ENOTSUP;
|
||||
return -1;
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
// C stdlib includes
|
||||
/* C stdlib includes */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -10,7 +10,7 @@
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
// 3DS includes
|
||||
/* 3DS includes */
|
||||
#include <3ds.h>
|
||||
|
||||
#define ENTRY_ARGBUFSIZE 0x400
|
||||
@@ -73,7 +73,7 @@ typedef struct
|
||||
u32 processAppCodeAddress;
|
||||
u32 processHookTidLow, processHookTidHigh;
|
||||
u32 mediatype;
|
||||
bool capabilities[0x10]; // {socuAccess, csndAccess, qtmAccess, nfcAccess, httpcAccess, reserved...}
|
||||
bool capabilities[0x10]; /* {socuAccess, csndAccess, qtmAccess, nfcAccess, httpcAccess, reserved...} */
|
||||
} memmap_header_t;
|
||||
|
||||
typedef struct
|
||||
|
||||
@@ -2,21 +2,21 @@
|
||||
|
||||
Handle launchOpenFile(const char* path)
|
||||
{
|
||||
if (strncmp(path, "sdmc:/", 6) == 0)
|
||||
path += 5;
|
||||
else if (*path != '/')
|
||||
return 0;
|
||||
Handle file;
|
||||
if (strncmp(path, "sdmc:/", 6) == 0)
|
||||
path += 5;
|
||||
else if (*path != '/')
|
||||
return 0;
|
||||
|
||||
// Convert the executable path to UTF-16
|
||||
static uint16_t __utf16path[PATH_MAX+1];
|
||||
ssize_t units = utf8_to_utf16(__utf16path, (const uint8_t*)path, PATH_MAX);
|
||||
if (units < 0 || units >= PATH_MAX) return 0;
|
||||
__utf16path[units] = 0;
|
||||
/* Convert the executable path to UTF-16 */
|
||||
static uint16_t __utf16path[PATH_MAX+1];
|
||||
ssize_t units = utf8_to_utf16(__utf16path, (const uint8_t*)path, PATH_MAX);
|
||||
if (units < 0 || units >= PATH_MAX) return 0;
|
||||
__utf16path[units] = 0;
|
||||
|
||||
// Open the file directly
|
||||
FS_Path apath = { PATH_EMPTY, 1, (u8*)"" };
|
||||
FS_Path fpath = { PATH_UTF16, (units+1)*2, (u8*)__utf16path };
|
||||
Handle file;
|
||||
Result res = FSUSER_OpenFileDirectly(&file, ARCHIVE_SDMC, apath, fpath, FS_OPEN_READ, 0);
|
||||
return R_SUCCEEDED(res) ? file : 0;
|
||||
/* Open the file directly */
|
||||
FS_Path apath = { PATH_EMPTY, 1, (u8*)"" };
|
||||
FS_Path fpath = { PATH_UTF16, (units+1)*2, (u8*)__utf16path };
|
||||
Result res = FSUSER_OpenFileDirectly(&file, ARCHIVE_SDMC, apath, fpath, FS_OPEN_READ, 0);
|
||||
return R_SUCCEEDED(res) ? file : 0;
|
||||
}
|
||||
@@ -12,15 +12,15 @@ enum
|
||||
|
||||
typedef struct
|
||||
{
|
||||
// Mandatory fields
|
||||
/* Mandatory fields */
|
||||
const char* name;
|
||||
u32 flags;
|
||||
bool (* init)(void);
|
||||
void (* deinit)(void);
|
||||
void (* launchFile)(const char* path, argData_s* args, executableMetadata_s* em);
|
||||
|
||||
// Optional fields
|
||||
/* Optional fields */
|
||||
void (* useTitle)(u64 tid, u8 mediatype);
|
||||
} loaderFuncs_s;
|
||||
|
||||
Handle launchOpenFile(const char* path);
|
||||
Handle launchOpenFile(const char* path);
|
||||
@@ -69,5 +69,7 @@ const loaderFuncs_s loader_Ninjhax2 =
|
||||
.init = init,
|
||||
.deinit = deinit,
|
||||
.launchFile = launchFile,
|
||||
//.useTitle = useTitle,
|
||||
#if 0
|
||||
.useTitle = useTitle,
|
||||
#endif
|
||||
};
|
||||
@@ -12,7 +12,7 @@ static Result HBLDR_SetTarget(const char* path)
|
||||
u32 pathLen = strlen(path) + 1;
|
||||
u32* cmdbuf = getThreadCommandBuffer();
|
||||
|
||||
cmdbuf[0] = IPC_MakeHeader(2, 0, 2); //0x20002
|
||||
cmdbuf[0] = IPC_MakeHeader(2, 0, 2); /* 0x20002 */
|
||||
cmdbuf[1] = IPC_Desc_StaticBuffer(pathLen, 0);
|
||||
cmdbuf[2] = (u32)path;
|
||||
|
||||
@@ -25,7 +25,7 @@ static Result HBLDR_SetArgv(const void* buffer, u32 size)
|
||||
{
|
||||
u32* cmdbuf = getThreadCommandBuffer();
|
||||
|
||||
cmdbuf[0] = IPC_MakeHeader(3, 0, 2); //0x30002
|
||||
cmdbuf[0] = IPC_MakeHeader(3, 0, 2); /* 0x30002 */
|
||||
cmdbuf[1] = IPC_Desc_StaticBuffer(size, 1);
|
||||
cmdbuf[2] = (u32)buffer;
|
||||
|
||||
|
||||
Loaded 100 of 1227 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user