mirror of
https://github.com/libretro/RetroArch.git
synced 2026-11-13 04:51:38 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0bf818af8d | ||
|
|
c641f20e6a | ||
|
|
8976a179df | ||
|
|
63a080af3f | ||
|
|
c0926ad1a1 | ||
|
|
61a8b19b2b | ||
|
|
a50f9bae85 | ||
|
|
5402b781fe | ||
|
|
2103280fdd | ||
|
|
9e0c0865cd | ||
|
|
63153620a7 | ||
|
|
0b71407b62 | ||
|
|
5e9e5177ec | ||
|
|
706d79f535 | ||
|
|
b080b39d2b | ||
|
|
ff5e0220c3 | ||
|
|
3e8ff57e2c | ||
|
|
3b921ffbfa | ||
|
|
7ca0d36169 | ||
|
|
e24d62715e | ||
|
|
527d1557ce | ||
|
|
6ff82319fb | ||
|
|
d5a268a2ac | ||
|
|
030c3cba44 | ||
|
|
cd2392c559 | ||
|
|
1ada87736a | ||
|
|
e46e03094f | ||
|
|
106a6c268e | ||
|
|
86669d21e2 | ||
|
|
3de186e374 | ||
|
|
6c05f4794c | ||
|
|
b6563f7b5d | ||
|
|
d5a54cb782 | ||
|
|
d6cbd8a5a9 | ||
|
|
648b0ab7b7 | ||
|
|
a73e1beb1c | ||
|
|
c28fede937 | ||
|
|
0b329b1694 | ||
|
|
49b973ac89 | ||
|
|
eb5b4197f8 | ||
|
|
c3d2548a38 | ||
|
|
e3ba29b434 | ||
|
|
7a8617bad5 | ||
|
|
68401205f2 | ||
|
|
6083ab14e5 | ||
|
|
954d1bf605 | ||
|
|
e3a25793b6 | ||
|
|
da6e560e72 | ||
|
|
ec625cf145 | ||
|
|
4d92fc5f76 | ||
|
|
217fba48c5 | ||
|
|
6d34ef46f4 | ||
|
|
9796024f3d | ||
|
|
5869caf7f2 | ||
|
|
b47fb0b807 | ||
|
|
7a6c56e947 | ||
|
|
b89692c532 | ||
|
|
5b8baaf2d9 | ||
|
|
498835a1f7 | ||
|
|
69060796bb | ||
|
|
d4eef18f18 | ||
|
|
5587ab4f8b | ||
|
|
bba1fdca30 | ||
|
|
3b300f395b | ||
|
|
1263b53dae | ||
|
|
7aa8c6bb11 | ||
|
|
56ad3fa091 | ||
|
|
15048027e7 | ||
|
|
1aa258faa0 | ||
|
|
c4d2788c08 | ||
|
|
0ffdf0790c | ||
|
|
01649d7955 | ||
|
|
a024d620bb | ||
|
|
db6e0b1f42 | ||
|
|
1c7855acc8 | ||
|
|
aa3c8de64c | ||
|
|
e4e776abf7 | ||
|
|
bfd9419d6a | ||
|
|
ea4b815117 | ||
|
|
6176b6a764 | ||
|
|
db1184c19d | ||
|
|
aeef3d6220 | ||
|
|
b2e2330ed7 | ||
|
|
9a3a5688b8 | ||
|
|
8485233b08 | ||
|
|
cb1b02a1c3 | ||
|
|
47070a64e6 | ||
|
|
9e84c89233 | ||
|
|
cf0951b5d5 | ||
|
|
03a2f10117 | ||
|
|
5705ff95cb | ||
|
|
5d4c6a9564 | ||
|
|
724acc4eb9 | ||
|
|
0159c2f70f | ||
|
|
250a0b9542 | ||
|
|
07378abbdf | ||
|
|
11047c6f4d | ||
|
|
c3914d1c85 | ||
|
|
2de52baf74 | ||
|
|
6a9eea5958 | ||
|
|
a94c4c72c2 | ||
|
|
b4a2216049 | ||
|
|
9b21848f4c | ||
|
|
ffd3d195b5 | ||
|
|
8825eea884 | ||
|
|
c1a3085939 | ||
|
|
55daddf286 | ||
|
|
3a744b7dae | ||
|
|
edfc96feea | ||
|
|
4854643ead | ||
|
|
91d7f5970b | ||
|
|
3a6a34b2dd | ||
|
|
1dd165a3bf | ||
|
|
cab6cbca48 | ||
|
|
f6866fe6ce | ||
|
|
174b01f7d9 | ||
|
|
2ec2f4719f | ||
|
|
2e73b87328 | ||
|
|
902a693bdb | ||
|
|
194be57da1 | ||
|
|
3f53de09c1 | ||
|
|
c7eee86fd5 | ||
|
|
c0d6d6e750 | ||
|
|
e8f4268e6e | ||
|
|
d0b3c1742d | ||
|
|
fc78f96a3a | ||
|
|
8a0491b282 | ||
|
|
92a2c0f71a | ||
|
|
27dbf06dfb | ||
|
|
46c2a9b950 | ||
|
|
18639cca6e | ||
|
|
b41f6b2885 | ||
|
|
94a3eba9ef | ||
|
|
299875f8b6 | ||
|
|
0d16eb6e10 | ||
|
|
44cb5be2ef | ||
|
|
069de60efc | ||
|
|
d30f16dc79 | ||
|
|
e3e0040063 | ||
|
|
18ea6fa81e | ||
|
|
9b7be5f2af | ||
|
|
198be07542 | ||
|
|
94733e4a4c | ||
|
|
11c96ce2d3 | ||
|
|
3c7e4b032e | ||
|
|
f389c08109 | ||
|
|
3d1bcf9836 | ||
|
|
7cfa69be1b | ||
|
|
622cc61671 | ||
|
|
50e5c40c40 | ||
|
|
89d9fe9981 | ||
|
|
c161c35738 | ||
|
|
a90a79fa95 | ||
|
|
22f43a4b75 | ||
|
|
170ed8ea0f | ||
|
|
6ade32336a | ||
|
|
55ce774527 | ||
|
|
6c0be28b98 | ||
|
|
72a076a58d | ||
|
|
03c901dfb8 | ||
|
|
07ae7ff7f1 | ||
|
|
57d5b8749e | ||
|
|
0597aa6939 | ||
|
|
b846a5d792 | ||
|
|
320886f9fa | ||
|
|
c594abb10d | ||
|
|
0cebebbfdc | ||
|
|
840c4481ab | ||
|
|
8bbc4a90f3 | ||
|
|
feea90d877 | ||
|
|
ababfcc0c8 | ||
|
|
415925c5dc | ||
|
|
3c61126578 | ||
|
|
df879b52cd | ||
|
|
b98c53ddb7 | ||
|
|
5b08c3fc22 | ||
|
|
cac8b82368 | ||
|
|
e62abac647 | ||
|
|
bbd6c0ae9a | ||
|
|
74d7aa3691 | ||
|
|
48bfc6d6f8 | ||
|
|
254ac65549 | ||
|
|
a153738bbd | ||
|
|
abf8bdc660 | ||
|
|
f90b71b2ed | ||
|
|
18b3997a15 | ||
|
|
50ace058ce | ||
|
|
8b39654368 | ||
|
|
41de5ec80b | ||
|
|
da68e73f94 | ||
|
|
cc3a339011 | ||
|
|
2371e5cbd2 | ||
|
|
78ffb973b1 | ||
|
|
d100e73780 | ||
|
|
c9bbe7683f | ||
|
|
076a1a398c | ||
|
|
2218ea1d96 | ||
|
|
baaf8e03fa | ||
|
|
2cddea21f8 | ||
|
|
479e3b23d9 | ||
|
|
d3384fd89d | ||
|
|
d5a6c4f150 | ||
|
|
73f766f133 | ||
|
|
385029786c | ||
|
|
a1edae126c | ||
|
|
d506210fbe | ||
|
|
fd2a026f96 | ||
|
|
fcbd72dbf3 | ||
|
|
7f8d358f17 | ||
|
|
da06989296 | ||
|
|
f40d157571 | ||
|
|
c51b1491ef | ||
|
|
df8571b3ca | ||
|
|
83c1e502ba | ||
|
|
903fcffe64 | ||
|
|
91119d038f | ||
|
|
4f071e47c7 | ||
|
|
28f55845b6 | ||
|
|
cc199b71db | ||
|
|
951b98fe1b | ||
|
|
714878783a | ||
|
|
0bdc761adb | ||
|
|
30eb0edcf8 | ||
|
|
141c33ceb5 | ||
|
|
fbf55a1999 | ||
|
|
b3bb62881a | ||
|
|
92e996e272 | ||
|
|
8e9d19568c | ||
|
|
d832ce15d6 | ||
|
|
f8a9b0a197 | ||
|
|
e8c53cad10 | ||
|
|
d0c6dfee0b | ||
|
|
b2521c53ae | ||
|
|
6447c6c39b | ||
|
|
7d956b611c | ||
|
|
ffa1ae4143 | ||
|
|
acc2128a6e | ||
|
|
3a0d8cbc50 | ||
|
|
236621d6ac | ||
|
|
ab1f21ef78 | ||
|
|
fa40754585 | ||
|
|
e9ad1e494f | ||
|
|
1eebd1196e | ||
|
|
1a46943a76 | ||
|
|
088ef4f6f9 | ||
|
|
389ef31a8f | ||
|
|
8fb91ce1af | ||
|
|
12cc56f712 | ||
|
|
185e1af39b | ||
|
|
2429c472b6 | ||
|
|
e5897caa8f | ||
|
|
8c49eed56c | ||
|
|
0874a41e36 | ||
|
|
4fe477ee39 | ||
|
|
d774256e0d | ||
|
|
5ad204bea5 | ||
|
|
91f4892cbe | ||
|
|
0a8ff5d15d | ||
|
|
cb280dcf5e | ||
|
|
13cc6b7f46 | ||
|
|
4672c5a5c0 | ||
|
|
daf8cb9bc8 | ||
|
|
5627a09e0d | ||
|
|
7df0157af5 | ||
|
|
284466b04b | ||
|
|
0033224c25 | ||
|
|
4253b06f2d | ||
|
|
25f5d9ae2a | ||
|
|
cd0d0eb541 | ||
|
|
741b54d4be | ||
|
|
13ac88c9df | ||
|
|
86dccbf1d6 | ||
|
|
ace21d28f7 | ||
|
|
6be8dccd46 | ||
|
|
b93599c7e0 | ||
|
|
5bfe70221c | ||
|
|
4251eb5f61 | ||
|
|
9586d679a8 | ||
|
|
fcdb383dc6 | ||
|
|
d3cb2b2ba9 | ||
|
|
3c81e21589 | ||
|
|
a16725f47c | ||
|
|
f584f7a5f8 | ||
|
|
3cdccb6b90 | ||
|
|
ecccdd5484 | ||
|
|
1571035fb7 | ||
|
|
a4b934b71a | ||
|
|
e902df3b0d | ||
|
|
614e502b41 | ||
|
|
a878bd3f95 | ||
|
|
440264778d | ||
|
|
403eaef516 | ||
|
|
08ccc59e3c | ||
|
|
cd93bdc058 | ||
|
|
0973e8d4b0 | ||
|
|
ab57d3cab7 | ||
|
|
171a79e879 | ||
|
|
568d788d54 | ||
|
|
c10a4d632f | ||
|
|
e8f4425eed | ||
|
|
c1309a34c2 | ||
|
|
b014a9ef98 | ||
|
|
9346a15864 | ||
|
|
dbba69a2d1 | ||
|
|
83ce6f42d9 | ||
|
|
8842603165 | ||
|
|
262d9720fe | ||
|
|
ec333e261f | ||
|
|
c16a50f1dd | ||
|
|
be044c09dd | ||
|
|
ce8389d4a6 | ||
|
|
b32b1f277b | ||
|
|
045fd38f19 | ||
|
|
c1709f2218 | ||
|
|
c5d70d49e5 | ||
|
|
5e8987839e | ||
|
|
663b5eed9d | ||
|
|
8cc866b051 | ||
|
|
36d60f6bf4 | ||
|
|
911308327d | ||
|
|
75757d7d02 | ||
|
|
da094eeb2f | ||
|
|
cdd39a6364 | ||
|
|
422d2fcf12 | ||
|
|
14f4f35445 | ||
|
|
2dec44188b | ||
|
|
2bdb5d488b | ||
|
|
f5fc1fb24e | ||
|
|
4cd63c20f4 | ||
|
|
a665498775 | ||
|
|
ad9836a5f8 | ||
|
|
959d077649 | ||
|
|
4806105a2c | ||
|
|
bafbbc8a1a | ||
|
|
906d885b8e | ||
|
|
3601610b6f | ||
|
|
84f599503d | ||
|
|
98ee07eaa0 | ||
|
|
43f5812a18 | ||
|
|
82cac0f9ba | ||
|
|
b88c297f8e | ||
|
|
1c31efaa91 | ||
|
|
7ae555a51d | ||
|
|
87457eb678 | ||
|
|
6b4e20d414 | ||
|
|
ddeef350bd | ||
|
|
77f3e20e3c | ||
|
|
5e985f0553 | ||
|
|
84868ab21f | ||
|
|
c9ab8a6cbb | ||
|
|
c4c55077a1 | ||
|
|
788d602ec7 | ||
|
|
3bd36941a6 | ||
|
|
1e035b9385 | ||
|
|
dfb4b603e4 | ||
|
|
1a24bfe60c | ||
|
|
866ce4c50d | ||
|
|
bbdc6d36da | ||
|
|
e1990ba0dd | ||
|
|
dfff8e127a | ||
|
|
835bbc6f68 | ||
|
|
532840c4b8 | ||
|
|
3abd414656 | ||
|
|
8b5c5358ad | ||
|
|
5d36d80318 | ||
|
|
bea2eb719b | ||
|
|
57f3e4ca42 | ||
|
|
ab39c6c2c8 | ||
|
|
654203be0a | ||
|
|
8f14143859 | ||
|
|
2463a63c78 | ||
|
|
6226d0442f | ||
|
|
8c3acb7adb | ||
|
|
bfcdc7a764 | ||
|
|
55391ac29f | ||
|
|
328ff1f0e9 | ||
|
|
0ffdd14940 | ||
|
|
77e83a4e60 | ||
|
|
6f84af2efa | ||
|
|
003cea5d42 | ||
|
|
793370aa97 | ||
|
|
60030e373e | ||
|
|
67afa426e5 | ||
|
|
9daf072901 | ||
|
|
a058c78fd0 | ||
|
|
3a25b53175 | ||
|
|
9b60e6c993 | ||
|
|
06ab11d3e5 | ||
|
|
f508a6a87f | ||
|
|
f9eda02a74 | ||
|
|
d6413f2a43 | ||
|
|
d9088dd2a9 | ||
|
|
6038d503c2 | ||
|
|
fd41b0f90c | ||
|
|
a96c5f77c8 | ||
|
|
08fe9be7d1 | ||
|
|
56f66f68e2 | ||
|
|
8f1389c067 | ||
|
|
ef0e9ccc38 | ||
|
|
08154e2656 | ||
|
|
8e949c516e | ||
|
|
200897f61e | ||
|
|
22a12c9861 | ||
|
|
12bc84bc08 | ||
|
|
fcbc71fef8 | ||
|
|
72eb52a5bc | ||
|
|
8b3e5b66bc | ||
|
|
86c22742b3 | ||
|
|
ee672bf785 | ||
|
|
b4f0b2827f | ||
|
|
fabccce437 | ||
|
|
f1ff92c881 | ||
|
|
e6fd2c9cdb | ||
|
|
938d7c1fc4 | ||
|
|
eaae2aec46 | ||
|
|
0c7408ee16 | ||
|
|
bbf93812a5 | ||
|
|
25b76fdb54 | ||
|
|
f34f4d060c | ||
|
|
19c72a413f | ||
|
|
87de6bda46 | ||
|
|
b200ab6f8f | ||
|
|
388183d971 | ||
|
|
c0221ae340 | ||
|
|
61e24132bf | ||
|
|
45b05ea3db | ||
|
|
f3c13cf669 | ||
|
|
8f47621857 | ||
|
|
c3a1c578b6 | ||
|
|
be9b4031d9 | ||
|
|
a47ccd81ed | ||
|
|
1f048dd358 | ||
|
|
7507e20703 | ||
|
|
82efa5a3d6 | ||
|
|
dfe712da95 | ||
|
|
842121ca16 | ||
|
|
205b9f862f | ||
|
|
29caa95f7e | ||
|
|
b8b3fe55fe | ||
|
|
62fffe726c | ||
|
|
112a350789 | ||
|
|
1b07e2bdce | ||
|
|
de67f174bf | ||
|
|
9535c5c0ad | ||
|
|
d67cb22c7f | ||
|
|
ee16c4558d | ||
|
|
1a646d17e0 | ||
|
|
288b2da13e | ||
|
|
625e63c3cc | ||
|
|
575e331fd1 | ||
|
|
5bb3fbab93 | ||
|
|
6caa139700 | ||
|
|
15fe258c1b | ||
|
|
1b181185c2 | ||
|
|
a1f5a03551 | ||
|
|
f5ac33c0b6 | ||
|
|
88187e7ef2 | ||
|
|
8017410098 | ||
|
|
c841e191f7 | ||
|
|
da13fb0f48 | ||
|
|
39241699a0 | ||
|
|
93babdd6f7 | ||
|
|
808fc7f389 | ||
|
|
8fd0961c9a | ||
|
|
e45958b25a | ||
|
|
23f649b050 | ||
|
|
a5eb06b2b5 | ||
|
|
ea9dd022d6 | ||
|
|
72cc98e9bd | ||
|
|
b59624adc8 | ||
|
|
9aef0eff90 | ||
|
|
56a6c50728 | ||
|
|
c79904f8b3 | ||
|
|
f2d8b67f23 | ||
|
|
fdc563e6f7 | ||
|
|
6b9a382f2e | ||
|
|
6894600d41 | ||
|
|
6126a86259 | ||
|
|
2bc723bb4b | ||
|
|
a147cb09d9 | ||
|
|
5f7d14966c | ||
|
|
8776c79a60 | ||
|
|
9663e4b4f1 | ||
|
|
620e048c52 | ||
|
|
fc861c167c | ||
|
|
f48ba41b67 | ||
|
|
c04201927b | ||
|
|
d969facdb4 | ||
|
|
c22c69e792 | ||
|
|
e769436876 | ||
|
|
85c44f9245 | ||
|
|
6f738d4fbd | ||
|
|
5a036de53c | ||
|
|
0e5b2ff280 | ||
|
|
e87db6f0a2 | ||
|
|
c97bc0ddbd | ||
|
|
1a1db6177d | ||
|
|
f5e5a1b201 | ||
|
|
a96d12e8bc | ||
|
|
e1a139ec0f | ||
|
|
30977a2603 | ||
|
|
278baf212b | ||
|
|
10a351228b | ||
|
|
23b06dca69 | ||
|
|
be2d35a1f4 | ||
|
|
f27c8c0c1d | ||
|
|
f3eaa5cfa8 | ||
|
|
597c33fa94 | ||
|
|
90e0d0bb70 | ||
|
|
a510fb5d20 | ||
|
|
3f8fde540d | ||
|
|
2acc7c4b39 | ||
|
|
e0a065d20e | ||
|
|
c818024bc6 | ||
|
|
245319c389 | ||
|
|
4c7e316aa2 | ||
|
|
46bafd6e46 | ||
|
|
b55e6d10c7 | ||
|
|
093432d6c4 | ||
|
|
b32ec36130 | ||
|
|
e8668a5c71 | ||
|
|
cb82725cc2 | ||
|
|
212013f677 | ||
|
|
c180560165 | ||
|
|
8914f0b6fe | ||
|
|
1580dbae6b | ||
|
|
2d1c238c1d | ||
|
|
74ef6a0f4a | ||
|
|
4a1aaa55ec | ||
|
|
59866ddac6 | ||
|
|
e264ab0547 | ||
|
|
86e4c0394b | ||
|
|
b793169638 | ||
|
|
1920430539 | ||
|
|
54f06c55f5 | ||
|
|
908667d97a | ||
|
|
d62b866237 | ||
|
|
4c4bec11f7 | ||
|
|
13b5ec4b1a | ||
|
|
d5cc01c574 | ||
|
|
ec47b9883d | ||
|
|
440a67e4b8 | ||
|
|
96a0486790 | ||
|
|
a6e210e9db | ||
|
|
05cf639712 | ||
|
|
c030e1c5dc | ||
|
|
a9157f975e | ||
|
|
d3f3c58e61 | ||
|
|
5ffe62a52b | ||
|
|
078f712b34 | ||
|
|
976a49ad2b | ||
|
|
3dc979356f | ||
|
|
ba8cc5f381 | ||
|
|
0edbe945b4 | ||
|
|
1b43e60c7c | ||
|
|
c7786a45e1 | ||
|
|
94ed25be56 | ||
|
|
72b4cf914e | ||
|
|
5b09b6614b | ||
|
|
879674d4c3 | ||
|
|
6d054a2d96 | ||
|
|
3b0f20768b | ||
|
|
bebe803658 | ||
|
|
fa9f39c0ab | ||
|
|
30bdd8b447 | ||
|
|
5739c537a2 | ||
|
|
0ed18d16c4 | ||
|
|
cd7a6afd20 | ||
|
|
03971308a3 | ||
|
|
1135bf0534 | ||
|
|
dab528ca11 | ||
|
|
a30f256bb0 | ||
|
|
7eecf3bdd0 | ||
|
|
a7c93eb9ed | ||
|
|
ef551478d3 | ||
|
|
9d939a35d6 | ||
|
|
b04cb4b1e5 | ||
|
|
e3b82184a7 | ||
|
|
add4a1e8a0 | ||
|
|
9c7b96b9d0 | ||
|
|
72a7b3ce07 | ||
|
|
c6b99a5df0 | ||
|
|
0594df8cce | ||
|
|
e1caf32817 | ||
|
|
2e5df6a973 | ||
|
|
0c21a92581 | ||
|
|
9ae46d2648 | ||
|
|
5172fe2ba6 | ||
|
|
67c23aec0e | ||
|
|
7068eebe0c | ||
|
|
993aaee716 | ||
|
|
6ad88b080e | ||
|
|
b2634ea588 | ||
|
|
3aa1811ca9 | ||
|
|
88bc26da4e | ||
|
|
e7f3432e48 | ||
|
|
eab5898790 | ||
|
|
32314eddaf | ||
|
|
ec4c15e8e4 | ||
|
|
f4c22cb236 | ||
|
|
819337d5d4 | ||
|
|
c240340c91 | ||
|
|
53d2fdbd97 | ||
|
|
8e6369ef33 | ||
|
|
7871e9fbc1 | ||
|
|
02df727cb2 | ||
|
|
16930150f8 | ||
|
|
01a7f2010d | ||
|
|
08cc1c986a | ||
|
|
bde84b926f | ||
|
|
6dd52d9bb1 | ||
|
|
556e6702ef | ||
|
|
70ca20fbf9 | ||
|
|
7a993a5951 | ||
|
|
3c7fa43f29 | ||
|
|
33c9f56df0 | ||
|
|
342d3da620 | ||
|
|
8105688a99 | ||
|
|
e6f3a387b2 | ||
|
|
78f4e0abda | ||
|
|
a974cef001 | ||
|
|
605c4608d9 | ||
|
|
9d66e2d5e1 | ||
|
|
e4bff7c12c | ||
|
|
5b56ff145f | ||
|
|
f79875536a | ||
|
|
ec6f4c1f55 | ||
|
|
107c69ab9e | ||
|
|
c7a1d83675 | ||
|
|
20c4407928 | ||
|
|
f472e4d0de | ||
|
|
cd04f770b9 | ||
|
|
e9a6252fc7 | ||
|
|
83a2ec1da8 | ||
|
|
4b8d3ab8a0 | ||
|
|
e602f8762b | ||
|
|
2b84be1210 | ||
|
|
5cb8d34ac8 | ||
|
|
819d02ab24 | ||
|
|
0faee680c0 | ||
|
|
5a4e7cfbd1 | ||
|
|
2ba46da700 | ||
|
|
a176a935da | ||
|
|
a2e525a1b6 | ||
|
|
0db7062c87 | ||
|
|
e4b933cb88 | ||
|
|
fdd5940951 | ||
|
|
fca6015011 | ||
|
|
88bdaffa87 | ||
|
|
36edb15c5b | ||
|
|
9b10579a54 | ||
|
|
afd463be16 | ||
|
|
4b7be8de3f | ||
|
|
f96ef5407a | ||
|
|
f711940339 | ||
|
|
44f5cb2935 | ||
|
|
19e4b8c0ca | ||
|
|
40c974a19c | ||
|
|
9906d2daca | ||
|
|
6b9a2b4bb0 | ||
|
|
aca5169416 | ||
|
|
454e6f9b07 | ||
|
|
3d69321c70 | ||
|
|
349ef1add2 | ||
|
|
0c4bf5f2e3 | ||
|
|
a933b74b1e | ||
|
|
11340c3c9c | ||
|
|
22bef5dc6b | ||
|
|
6a8fe15772 | ||
|
|
24a2f1e7c3 | ||
|
|
125d7dcc3b | ||
|
|
592f9384b0 | ||
|
|
bcd921b012 | ||
|
|
052cdce29b | ||
|
|
79e7360938 | ||
|
|
b999eaa4c9 | ||
|
|
6c38efb0ee | ||
|
|
02905650cc | ||
|
|
adea9559a7 | ||
|
|
6c1de85add | ||
|
|
4afe0c55d5 | ||
|
|
56130ec587 | ||
|
|
d7a30f2a18 | ||
|
|
2c3c9e1e71 | ||
|
|
ba752b6364 | ||
|
|
9f218f923c | ||
|
|
51f5515c63 | ||
|
|
83ac65d855 | ||
|
|
29f0ba2e71 | ||
|
|
eb4440fafa | ||
|
|
88c2ae9ddf | ||
|
|
acfe990ec6 | ||
|
|
e083c46d6e | ||
|
|
8d4a64ab96 | ||
|
|
8ac1a36259 | ||
|
|
d5becf92e8 | ||
|
|
45d78f2a60 | ||
|
|
cedbcb10c6 | ||
|
|
566b4b4520 | ||
|
|
97e3ef6ec7 | ||
|
|
262b0601e2 | ||
|
|
153f77d764 | ||
|
|
07e03c86fa | ||
|
|
a6a4b845a4 | ||
|
|
ddd9544a4f | ||
|
|
54d0d84696 | ||
|
|
522d1ed16d | ||
|
|
35d6c31b5b | ||
|
|
5c98caa7fd | ||
|
|
69a2d124c0 | ||
|
|
cc7c310aa1 | ||
|
|
83a7c0d798 | ||
|
|
34a18f64e8 | ||
|
|
f5ee9e74ba | ||
|
|
eb36c35ebf | ||
|
|
8108931e04 | ||
|
|
30d38d108a | ||
|
|
e865ea83bd | ||
|
|
8d12918243 | ||
|
|
1245cbc63b | ||
|
|
09d9366bc0 | ||
|
|
d2aeba0a92 | ||
|
|
6cfcd749e4 | ||
|
|
1f244aac01 | ||
|
|
3cf7e881ec | ||
|
|
2cf6f6ce8f | ||
|
|
ee9cb6cb1b | ||
|
|
05622ebe85 | ||
|
|
6d4a113eb4 | ||
|
|
ba35f0de93 | ||
|
|
7ff58265bf | ||
|
|
f994c0b371 | ||
|
|
4b5c7856e6 | ||
|
|
a23231525d | ||
|
|
62fd667f41 | ||
|
|
29774f5b7a | ||
|
|
87240556ea | ||
|
|
fbd765f167 | ||
|
|
a64f0332f9 | ||
|
|
8f37c2e3c2 | ||
|
|
71eb74d256 | ||
|
|
83ed9a5980 | ||
|
|
de6c077e4d | ||
|
|
66ea402de8 | ||
|
|
a39532f19d | ||
|
|
610292db61 | ||
|
|
c89f6cf0a9 | ||
|
|
08cccc811c | ||
|
|
c3483654c9 | ||
|
|
3ebfcbc7c7 | ||
|
|
27704a18de | ||
|
|
113b9e96d1 | ||
|
|
e4b33fd0e6 | ||
|
|
0a12062e1c | ||
|
|
dec0ee87d5 | ||
|
|
78c286471f | ||
|
|
f990fa86fa | ||
|
|
b56b447f08 | ||
|
|
c570e657c1 | ||
|
|
5e13851a7a | ||
|
|
675ff6b9b6 | ||
|
|
4b1766cf61 | ||
|
|
eb2c3e35d4 | ||
|
|
c7c42409f1 | ||
|
|
6c8f649b02 | ||
|
|
f5d46681c2 | ||
|
|
c5c5e7539f | ||
|
|
37bb66ef6e | ||
|
|
98ca6232aa | ||
|
|
c4fb055fdb | ||
|
|
f7194e167f | ||
|
|
69ddf03c91 | ||
|
|
ec70bb84ca | ||
|
|
83655420f6 | ||
|
|
06e1b6a68f | ||
|
|
99186b1056 | ||
|
|
f39df40728 | ||
|
|
33386787b6 | ||
|
|
01d68fdb7e | ||
|
|
293722ac38 | ||
|
|
b7926605f4 | ||
|
|
b1c9f93903 | ||
|
|
da53b24c6c | ||
|
|
adf9994828 | ||
|
|
7186d75c44 | ||
|
|
d706c9c5bf | ||
|
|
4bcc479041 | ||
|
|
6475d0ca54 | ||
|
|
e91cf0e40d | ||
|
|
7b83636b64 | ||
|
|
0d4ef1cef4 | ||
|
|
6438d575d4 | ||
|
|
f8d14a0af6 | ||
|
|
99ac1af9d2 | ||
|
|
61ba6d06cc | ||
|
|
e275e9d64e | ||
|
|
9e430cd8b9 | ||
|
|
0e85113eb3 | ||
|
|
79fc6d3b50 | ||
|
|
b44ad6f890 | ||
|
|
05fb6fd9a3 | ||
|
|
3b2b4ea49d | ||
|
|
cda235d124 | ||
|
|
ad87f88b72 | ||
|
|
f78f64f6be | ||
|
|
177691e6fa | ||
|
|
285d89b7d9 | ||
|
|
c54499c5fb | ||
|
|
aae8c65880 | ||
|
|
0f24d52407 | ||
|
|
a9b074fa0a | ||
|
|
274ce86d89 | ||
|
|
c2f618d394 | ||
|
|
4d3587a2e8 | ||
|
|
126c2fa7ac | ||
|
|
460ca09c87 | ||
|
|
fa9e56d824 | ||
|
|
81de36e1ff | ||
|
|
7f3930b71b | ||
|
|
d95e426b4e | ||
|
|
e53a623f4a | ||
|
|
71a3c24d52 | ||
|
|
14afdf0e87 | ||
|
|
ef022ffe90 | ||
|
|
a6516512b6 | ||
|
|
882829cafc | ||
|
|
6fadb1bbf0 | ||
|
|
3494c0de0a | ||
|
|
af71dcb893 | ||
|
|
a87e95ad8f | ||
|
|
c19e24a584 | ||
|
|
281a498474 | ||
|
|
b023001d29 | ||
|
|
a547abbbaf | ||
|
|
cd28d5ec8a | ||
|
|
9af17b633e | ||
|
|
f9c6ccee75 | ||
|
|
91a351adf8 | ||
|
|
20ad96355f | ||
|
|
c6e0e7e198 | ||
|
|
6318e5da5e | ||
|
|
2daeb23504 | ||
|
|
19b2ad56b0 | ||
|
|
547c88259d | ||
|
|
6df4ab4982 | ||
|
|
92264826de | ||
|
|
aeb07432cc | ||
|
|
821bb86b37 | ||
|
|
b6c9740ba3 | ||
|
|
3c20e709ea | ||
|
|
3aafa40c69 | ||
|
|
bb6937949d | ||
|
|
bf5409881c | ||
|
|
6607ff3aaa | ||
|
|
95db09d8c5 | ||
|
|
fbd37f8926 | ||
|
|
f12ad9ed34 | ||
|
|
69605b7c9c | ||
|
|
2d33c49b26 | ||
|
|
336ca1a68c | ||
|
|
1798651041 | ||
|
|
681e1dea94 | ||
|
|
494c93df3e | ||
|
|
9dd1fb895b | ||
|
|
0b2be028ca | ||
|
|
794e088ae1 | ||
|
|
7043873fba | ||
|
|
50873f7c38 | ||
|
|
91c8541e20 | ||
|
|
b021f96522 | ||
|
|
cd36af1d24 | ||
|
|
b55fa28896 | ||
|
|
42f75e7f72 | ||
|
|
61bf5fba91 | ||
|
|
602b3fc43f | ||
|
|
d69f1e46ab | ||
|
|
c97492f85c | ||
|
|
ed83f0e7be | ||
|
|
ee8993c76a | ||
|
|
df25f88432 | ||
|
|
89048993ef | ||
|
|
58decac935 | ||
|
|
78bc42de68 | ||
|
|
e7b9ff1ff6 | ||
|
|
0232fc8e10 | ||
|
|
f4803b1023 | ||
|
|
126940a98b | ||
|
|
6bc73ed8af | ||
|
|
ab208fca91 | ||
|
|
58fc77850c | ||
|
|
e9d67f2bbe | ||
|
|
a5ebfc442a | ||
|
|
8583038d7f | ||
|
|
5b6d11cc60 | ||
|
|
11101f23b1 | ||
|
|
8addb08250 | ||
|
|
0172d57ada | ||
|
|
2fb55f86bd | ||
|
|
ce1d1fd430 | ||
|
|
f2b3948b39 | ||
|
|
128753c81d | ||
|
|
367dfd6e71 | ||
|
|
4e13134c40 | ||
|
|
cf12a5e7e7 | ||
|
|
aab64da1be | ||
|
|
6aa16442db | ||
|
|
38f6ad95f4 | ||
|
|
a6538d0d9c | ||
|
|
bc78e423ee | ||
|
|
e961f27786 | ||
|
|
14e5cd317b | ||
|
|
a7dc57f68f | ||
|
|
865993ffa7 | ||
|
|
8c6c399a01 | ||
|
|
456fb6f2c9 | ||
|
|
41a073da73 | ||
|
|
c1e8925f87 | ||
|
|
7553dc66b5 | ||
|
|
bd9eda38e3 | ||
|
|
2a0fce77d3 | ||
|
|
3615deed9e | ||
|
|
ad64159fe4 | ||
|
|
745652bbbf | ||
|
|
10a2103f7e | ||
|
|
860155969e | ||
|
|
28a41ad1b1 | ||
|
|
807fd35300 | ||
|
|
bb15f009e4 | ||
|
|
1ad9b20b09 | ||
|
|
fae8d7e38f | ||
|
|
961357137f | ||
|
|
645b4864fc | ||
|
|
61e08ee35b | ||
|
|
0356c563b8 | ||
|
|
44a52b4617 | ||
|
|
2ff77a363e | ||
|
|
3c89172516 | ||
|
|
a0bfdcce3b | ||
|
|
e954a69708 | ||
|
|
a06f3b98ce | ||
|
|
01eab0fba5 | ||
|
|
64bf25542f | ||
|
|
e0c7e78e27 | ||
|
|
cf67c102ed | ||
|
|
050107a90e | ||
|
|
f0e340fd23 | ||
|
|
757b0642ba | ||
|
|
216489512c | ||
|
|
278f088c99 | ||
|
|
ca0b3095e8 | ||
|
|
dabd9cb996 | ||
|
|
0008691aa0 | ||
|
|
60161982b2 | ||
|
|
8bad1559f9 | ||
|
|
4f1ad9b665 | ||
|
|
4a38831c47 | ||
|
|
9a1f678e31 | ||
|
|
d7f827d5ad | ||
|
|
9715c0dbb3 | ||
|
|
a71b4c421e | ||
|
|
852b3f2071 | ||
|
|
e6e5e46be3 | ||
|
|
fcf8d2e5b7 | ||
|
|
054bf83f53 | ||
|
|
1539e720f1 | ||
|
|
1dc7481139 | ||
|
|
8ec6c7517c | ||
|
|
5c9501b4c4 | ||
|
|
838e5117d0 | ||
|
|
7e798d04ba | ||
|
|
244ace9c9d | ||
|
|
f24ced37e8 | ||
|
|
e9b8602c6e | ||
|
|
e3a716d06a | ||
|
|
72d38a4b3c | ||
|
|
ef53037cdc | ||
|
|
325ba96613 | ||
|
|
48f13dfaaa | ||
|
|
0fe694665c | ||
|
|
098f14dcd4 | ||
|
|
53d0e161e1 | ||
|
|
a69387089c | ||
|
|
50f65a893f | ||
|
|
53be17aee2 | ||
|
|
e759f81149 | ||
|
|
8d9f772dce | ||
|
|
702a7b37ad | ||
|
|
109b6f9781 | ||
|
|
ff2d6f65d8 | ||
|
|
56ca328d95 | ||
|
|
31a43b9390 | ||
|
|
b444377b50 | ||
|
|
a5d145e211 | ||
|
|
3d619de114 | ||
|
|
844d27c315 | ||
|
|
7fecaf6182 | ||
|
|
dcaba084f9 | ||
|
|
43ad2b64b2 | ||
|
|
c597583816 | ||
|
|
1e4042d08b | ||
|
|
13732ba0da | ||
|
|
fed60aaee6 | ||
|
|
423cc50b6d | ||
|
|
a6e5811dc7 | ||
|
|
856bfb75ee | ||
|
|
349be66031 | ||
|
|
9c34a83aa7 | ||
|
|
9fe100a3dd | ||
|
|
f46e41f6c4 | ||
|
|
332074df40 | ||
|
|
b1351723f3 | ||
|
|
b0ca2e381c | ||
|
|
e8d5c0d4e1 | ||
|
|
ea914e80e7 | ||
|
|
b630b98c60 | ||
|
|
8d80071047 | ||
|
|
21a942665c | ||
|
|
3a1d567ced | ||
|
|
8ec1f3294e | ||
|
|
65ab04e775 | ||
|
|
491cf7f2b4 | ||
|
|
e51d3450cd | ||
|
|
65f45b07c5 | ||
|
|
2b182bfc4a | ||
|
|
c06e18c4ed | ||
|
|
0bb65fb39c | ||
|
|
d6250fd58c | ||
|
|
148f5f7499 | ||
|
|
65901cb133 | ||
|
|
a8cff31420 | ||
|
|
38f258c504 | ||
|
|
8d177ed865 | ||
|
|
8b5b1ce96d | ||
|
|
85ca66bfad | ||
|
|
d0ce0ac06f | ||
|
|
4dc08fad5c | ||
|
|
4226a8311e | ||
|
|
d4324d9a0d | ||
|
|
a4c40da647 | ||
|
|
c0c1198d35 | ||
|
|
85cd386cb3 | ||
|
|
c9149895f5 | ||
|
|
0fbb36c61a | ||
|
|
18bebe0c73 | ||
|
|
2a747ada5d | ||
|
|
05797eb6b8 | ||
|
|
92a7d5bf61 | ||
|
|
281fe83936 | ||
|
|
cb56b35568 | ||
|
|
c0a7739f85 | ||
|
|
92a1dac0ea | ||
|
|
9ea46f34fb | ||
|
|
9fbf1c846f | ||
|
|
5bf82038ad | ||
|
|
bcc31be6da | ||
|
|
a92a37e3f4 | ||
|
|
9fab981317 | ||
|
|
4a21553f06 | ||
|
|
6755eac963 | ||
|
|
2abf42515b | ||
|
|
109cd28a6f | ||
|
|
b4dc4f3cc9 | ||
|
|
63d1ef4677 | ||
|
|
e33f6cbbe2 | ||
|
|
cf2ecf506c | ||
|
|
b0597d91a2 | ||
|
|
b8d9070c9b | ||
|
|
06d62cf86a | ||
|
|
bf7b1c9d9c | ||
|
|
ccdf68e64a | ||
|
|
6408cc8958 | ||
|
|
5b85d46383 | ||
|
|
e470461b14 | ||
|
|
39de84eb05 | ||
|
|
8f7b5a1050 | ||
|
|
cb6b41e10f | ||
|
|
400faff5ba | ||
|
|
4811f8d3f6 | ||
|
|
17d31e6dff | ||
|
|
4c3482faab | ||
|
|
17b7b1322e | ||
|
|
037ae4b87d | ||
|
|
5e258eb8f0 | ||
|
|
de30f212bc | ||
|
|
4e82b40515 | ||
|
|
7c34fd46e1 | ||
|
|
56feacf3b6 | ||
|
|
6ba8fe225d | ||
|
|
c6bd7d8b8a | ||
|
|
96a485f885 | ||
|
|
ccdda219b8 | ||
|
|
4c934e66d5 | ||
|
|
4e5cc3fef1 | ||
|
|
adc6ac1429 | ||
|
|
46e86ff503 | ||
|
|
3b27f7730c | ||
|
|
b65c933a09 | ||
|
|
98a13f386f | ||
|
|
e4f8b531d5 | ||
|
|
51e0515f44 | ||
|
|
16c0f5e223 | ||
|
|
3f6d8508a4 | ||
|
|
134f645e72 | ||
|
|
37a17df182 | ||
|
|
61610bd7d3 | ||
|
|
cc1325ff82 | ||
|
|
24b6a0ae7d | ||
|
|
ade5444d5f | ||
|
|
af7db7c08f | ||
|
|
684889507b | ||
|
|
8f1de8a343 | ||
|
|
d4795b8cf6 | ||
|
|
d54df6f18e | ||
|
|
accbfb3a96 | ||
|
|
d5f5f8e202 | ||
|
|
6994ff3ab7 | ||
|
|
6c6d16e978 | ||
|
|
49370f1f26 | ||
|
|
c92da21647 | ||
|
|
8722f83dee | ||
|
|
4a985b0765 | ||
|
|
8b53aaf45f | ||
|
|
14c0948fb9 | ||
|
|
f3a4a87eae | ||
|
|
0e486f9468 | ||
|
|
7b95f3e2ea | ||
|
|
802b3ecd05 | ||
|
|
9590fdd0d4 | ||
|
|
41d225f937 | ||
|
|
a14ccc2d4d | ||
|
|
13c746f703 | ||
|
|
08e3cd07ef | ||
|
|
4654fc1b75 | ||
|
|
e4f3a781a6 | ||
|
|
d45dbe1e66 | ||
|
|
e65679da09 | ||
|
|
3a6956f429 | ||
|
|
5c6d5b0aa3 | ||
|
|
cc61c90602 | ||
|
|
68608e5db1 | ||
|
|
ba47d09c4b | ||
|
|
f56f28d226 | ||
|
|
5ef1309742 | ||
|
|
0c3506fbdc | ||
|
|
91758569b2 | ||
|
|
05a03164bd | ||
|
|
8f81692b78 | ||
|
|
a5a90a1dc7 | ||
|
|
6974dee535 | ||
|
|
6366fcf8e3 | ||
|
|
f30cbaf7a3 | ||
|
|
50d8982943 | ||
|
|
9dd060dbc8 | ||
|
|
7a15f81b39 | ||
|
|
4dd779467d | ||
|
|
c6d51fdb32 | ||
|
|
46603db2fa | ||
|
|
302169b49a | ||
|
|
28bfa238d4 | ||
|
|
c48209d323 | ||
|
|
7164598a29 | ||
|
|
44288455cb | ||
|
|
49954569f9 | ||
|
|
68d864e01b | ||
|
|
9a0f59677b | ||
|
|
4ee841b5e1 | ||
|
|
66a2a12766 | ||
|
|
4966d2a130 | ||
|
|
3b99b42812 | ||
|
|
25c33a8306 | ||
|
|
3d010cd7a9 | ||
|
|
63157a6f09 | ||
|
|
455dbb6dd0 | ||
|
|
f879a723c6 | ||
|
|
69d251ff6d | ||
|
|
d9948c00e1 | ||
|
|
05eca53290 | ||
|
|
93e0baf715 | ||
|
|
14ab2db692 | ||
|
|
07d19dd807 | ||
|
|
e1db81787d | ||
|
|
adf3929f78 | ||
|
|
fbcc99013e | ||
|
|
41f45becdb | ||
|
|
7c2d033b83 | ||
|
|
937ad8bfc6 | ||
|
|
ae7cc2ef4d | ||
|
|
f2dca12a22 | ||
|
|
30685c6e60 | ||
|
|
af89df2b82 | ||
|
|
493b8fdef8 | ||
|
|
eaabfefcb0 | ||
|
|
a378ce0aec | ||
|
|
a227989fd8 | ||
|
|
f0baf977fa | ||
|
|
011e371e42 | ||
|
|
7a55686a95 | ||
|
|
9e39abcd00 | ||
|
|
241d6eb901 | ||
|
|
8881020b75 | ||
|
|
7bf4515cd2 | ||
|
|
6f156d064e | ||
|
|
3cad090b4c | ||
|
|
581ebcc0ac | ||
|
|
650101083d | ||
|
|
c527bce8e3 | ||
|
|
5a5c65d9b9 | ||
|
|
b3632586f5 | ||
|
|
255522f9a0 | ||
|
|
fe37647c84 | ||
|
|
de4bfa0805 | ||
|
|
7eb9f6b49b | ||
|
|
efe6d14d37 | ||
|
|
a396cd872c | ||
|
|
87b76dc7a4 | ||
|
|
49bf60cc90 | ||
|
|
7896341dfc | ||
|
|
be567da82b | ||
|
|
cdcc8fe992 | ||
|
|
0a5eff8468 | ||
|
|
3115338849 | ||
|
|
bfa627737e | ||
|
|
c8e3ae09e7 | ||
|
|
ee0749e884 | ||
|
|
93dfa0217d | ||
|
|
d7cfcd3f9b | ||
|
|
1c1d37e959 | ||
|
|
3b7ff9d69b | ||
|
|
0df2be001e | ||
|
|
372ac81ee1 | ||
|
|
9dd03f6d9f | ||
|
|
df5f5cd9a4 | ||
|
|
f4964c1937 | ||
|
|
88d0a4ac75 | ||
|
|
5ffd95aa1b | ||
|
|
201eeae7f1 | ||
|
|
275e58c6ce | ||
|
|
e061e7028b | ||
|
|
d6e6fb2a93 | ||
|
|
23f1f98c01 | ||
|
|
ab858c65a1 | ||
|
|
82c9773e0d | ||
|
|
52bb930cc7 | ||
|
|
febd584930 | ||
|
|
28cd77c5b4 | ||
|
|
720cca5e45 | ||
|
|
81593fda42 | ||
|
|
2ca4d8bd7b | ||
|
|
c2ae445a85 | ||
|
|
77fd75dd06 | ||
|
|
0676db9096 | ||
|
|
a496bfa57b | ||
|
|
7934e677ca | ||
|
|
927982e0d6 | ||
|
|
08e69fbd08 | ||
|
|
cb2d6b3d8e | ||
|
|
a577d7d224 | ||
|
|
b934b41758 | ||
|
|
6d96df0e49 | ||
|
|
c88e03df06 | ||
|
|
e9914d6605 | ||
|
|
f29256bb0d | ||
|
|
dc0054a747 | ||
|
|
143655eec6 | ||
|
|
533d746f64 | ||
|
|
9919aac510 | ||
|
|
99e517d2a9 | ||
|
|
801b16885e | ||
|
|
6099428ab7 | ||
|
|
1b8c1faa8a | ||
|
|
f57e46ceb5 | ||
|
|
fc16da3440 | ||
|
|
51c558c8f4 | ||
|
|
796bc15837 | ||
|
|
af224493b3 | ||
|
|
0e44673053 | ||
|
|
1982c82dcd | ||
|
|
80a9c16b3f | ||
|
|
2a15a4cba3 | ||
|
|
8475bcbab3 | ||
|
|
d2e7674e3e | ||
|
|
25a8e05597 | ||
|
|
b57a1b0c72 | ||
|
|
c3c7f5167f | ||
|
|
ba2203e1e4 | ||
|
|
9a3b8f4a0a | ||
|
|
5a85748de6 | ||
|
|
dbcce3f564 | ||
|
|
0a52964015 | ||
|
|
19b7ff81b9 | ||
|
|
e3b59fd36d | ||
|
|
4804d7015a | ||
|
|
55aceb5356 | ||
|
|
102abb0223 | ||
|
|
e51febaa7d | ||
|
|
4674241bf9 | ||
|
|
9cbdc783be | ||
|
|
7c3dfa5e3a | ||
|
|
7a70b36c8b | ||
|
|
984f857621 | ||
|
|
499ccad74e | ||
|
|
0b55188969 | ||
|
|
e389b8c7a1 | ||
|
|
a268ffe6ce | ||
|
|
11234aad11 | ||
|
|
37c56d0d09 | ||
|
|
604335bc27 | ||
|
|
251208fd0b | ||
|
|
9463f0ee55 | ||
|
|
a923b62966 | ||
|
|
84e49bd2d1 | ||
|
|
c1d1e57ec9 | ||
|
|
1493533345 | ||
|
|
c2db12c727 | ||
|
|
7489b5b078 | ||
|
|
47a1f8f851 | ||
|
|
3c3a305eb3 | ||
|
|
1f879b0472 | ||
|
|
339a8736c1 | ||
|
|
f42591305d | ||
|
|
3d0f8c1ed5 | ||
|
|
609c56b7cd | ||
|
|
eaf98919a9 | ||
|
|
141bba0464 | ||
|
|
f377c0d041 | ||
|
|
2864f70bd9 | ||
|
|
589548337c | ||
|
|
77adfb1c1a | ||
|
|
abe85e5e13 | ||
|
|
d6aa3fdce5 | ||
|
|
96d7c31983 | ||
|
|
fc2b3f1ed9 | ||
|
|
736f6eb8b6 | ||
|
|
6a537a656d | ||
|
|
3c6098dff7 | ||
|
|
1613ebdfb4 | ||
|
|
8973f2ae01 | ||
|
|
0888297f31 | ||
|
|
1887aee7c4 | ||
|
|
d0ef0eccbf | ||
|
|
5d82b36f9c | ||
|
|
7f8a0e352f | ||
|
|
af029ed2f9 | ||
|
|
a25fabd6f7 | ||
|
|
90f53bf6f4 | ||
|
|
845a469d4c | ||
|
|
669af1d9c6 | ||
|
|
c4b8b9cfe9 | ||
|
|
45c901ca53 | ||
|
|
0117228fec | ||
|
|
afb04b419b | ||
|
|
7f0cf651f1 | ||
|
|
b231ae7c41 | ||
|
|
cedf77d87f | ||
|
|
6f71879012 | ||
|
|
bc018cff15 | ||
|
|
3336e61859 | ||
|
|
a23127c51b | ||
|
|
3d1f01fecc | ||
|
|
a0738111e9 | ||
|
|
cc4aa85bc0 | ||
|
|
2f0bdac2f5 | ||
|
|
6f0bef6b7b | ||
|
|
b43039f7b0 | ||
|
|
5b97ba65c0 | ||
|
|
ac45f16d79 | ||
|
|
437051c112 | ||
|
|
56b08940c2 | ||
|
|
8c27e58e20 | ||
|
|
3cf86d3093 | ||
|
|
53b039cf7d | ||
|
|
e185955bc1 | ||
|
|
a348571ba8 | ||
|
|
d1cbba2847 | ||
|
|
825bc0739e | ||
|
|
e1f74d3959 | ||
|
|
68032c7734 | ||
|
|
6195711bb3 | ||
|
|
6a032fc1f8 | ||
|
|
4114545564 | ||
|
|
7c37f9c053 | ||
|
|
bceb753993 | ||
|
|
df3927dd33 | ||
|
|
03146e4604 | ||
|
|
a5802ce757 | ||
|
|
9a354982a9 | ||
|
|
56c9db9c4c | ||
|
|
da5d135a9f | ||
|
|
7bdcc8bfe1 | ||
|
|
ee6570f3dc | ||
|
|
2ef0ea0cc7 | ||
|
|
67e3e37ab0 | ||
|
|
3f2d4b1885 | ||
|
|
5121c66624 | ||
|
|
1ff91fe74d | ||
|
|
a597c95c98 | ||
|
|
f38b7afce9 | ||
|
|
d14d218b76 | ||
|
|
95fad4d32c | ||
|
|
c185c3b916 | ||
|
|
0a9ea2da4d | ||
|
|
dcc6727875 | ||
|
|
f9d0a49d42 | ||
|
|
9b282aa742 | ||
|
|
c659751976 | ||
|
|
41d84c6db1 | ||
|
|
260a0a4194 | ||
|
|
e9da17b058 | ||
|
|
5ed375b7df | ||
|
|
d3004fe2c2 | ||
|
|
ee9b6ba78e | ||
|
|
5d2b5e8722 | ||
|
|
044e1ec655 | ||
|
|
d82bba38ad | ||
|
|
c3220e212f | ||
|
|
d13fec5db5 | ||
|
|
85fef3427a | ||
|
|
bf579df8b9 | ||
|
|
2ef2ff1b36 | ||
|
|
5e85d22d8f | ||
|
|
ee6c9384e9 | ||
|
|
fb2da8e8fd | ||
|
|
573dfb87f2 | ||
|
|
a43ae5d08a | ||
|
|
dcabde33fc | ||
|
|
9cbcaf1798 | ||
|
|
c687a29d6a | ||
|
|
a91b538ba9 | ||
|
|
1e7265e7aa | ||
|
|
77b5e31203 | ||
|
|
23f5b6fb86 | ||
|
|
b2b2425203 | ||
|
|
e38e699fbf | ||
|
|
f353898a9d | ||
|
|
2f6b9c7971 | ||
|
|
686628b8ad | ||
|
|
acf21260e7 | ||
|
|
14578c0b18 | ||
|
|
8cdfc8e8b6 | ||
|
|
3873af37c6 | ||
|
|
65b8ec4cef | ||
|
|
794900a1ed | ||
|
|
0dbd2bc3b9 | ||
|
|
9dfc5950aa | ||
|
|
4a1a1e2fa7 | ||
|
|
fccef557fc | ||
|
|
91e4bbe1e4 | ||
|
|
8194629314 | ||
|
|
754d3b224f | ||
|
|
9276921f5d | ||
|
|
510af4678e | ||
|
|
af9590d45e | ||
|
|
569b3945d6 | ||
|
|
caaaaf99f7 | ||
|
|
0eb4444ad1 | ||
|
|
0db3116805 | ||
|
|
fd35162cbe | ||
|
|
5319b592e9 | ||
|
|
4c3a4d66df | ||
|
|
a7569b5712 | ||
|
|
26fec17593 | ||
|
|
c8d57fe667 | ||
|
|
1df0285091 | ||
|
|
1cd6413e24 |
No files matched your search
@@ -0,0 +1,6 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
@@ -0,0 +1,39 @@
|
||||
name: CI 3DS
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-build-devkitpro:latest
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile Salamander
|
||||
run: |
|
||||
make -f Makefile.ctr.salamander -j$(getconf _NPROCESSORS_ONLN) USE_CTRULIB_2=1 clean
|
||||
make -f Makefile.ctr.salamander -j$(getconf _NPROCESSORS_ONLN) USE_CTRULIB_2=1
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
make -f Makefile.ctr -j$(getconf _NPROCESSORS_ONLN) USE_CTRULIB_2=1 clean
|
||||
make -f Makefile.ctr -j$(getconf _NPROCESSORS_ONLN) USE_CTRULIB_2=1 HAVE_STATIC_DUMMY=1
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: RA-3DS-dummy-${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
retroarch_3ds.cia
|
||||
@@ -0,0 +1,35 @@
|
||||
name: CI DOS/DJGPP
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-djgpp-build-container:latest
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
make -f Makefile.dos -j$(getconf _NPROCESSORS_ONLN) clean
|
||||
make -f Makefile.dos -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1
|
||||
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: RA-DOS-dummy-${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
retrodos.exe
|
||||
@@ -0,0 +1,35 @@
|
||||
name: CI Emscripten
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-build-emscripten:latest
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
emmake make -f Makefile.emscripten -j$(getconf _NPROCESSORS_ONLN) clean
|
||||
emmake make -f Makefile.emscripten -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1
|
||||
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: RA-Emscripten-dummy-${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
retroarch.js
|
||||
@@ -0,0 +1,34 @@
|
||||
name: CI GameCube
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-build-devkitpro:latest
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
make -f Makefile.ngc -j$(getconf _NPROCESSORS_ONLN) clean
|
||||
make -f Makefile.ngc -j$(getconf _NPROCESSORS_ONLN) EXTERNAL_LIBOGC=1 GX_PTHREAD_LEGACY=0 HAVE_STATIC_DUMMY=1
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: RA-GameCube-dummy-${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
retroarch_ngc.dol
|
||||
@@ -0,0 +1,35 @@
|
||||
name: CI Miyoo ARM32
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-build-dingux:latest
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.miyoo clean
|
||||
make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.miyoo
|
||||
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: retroarch_miyoo_arm32${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
retroarch
|
||||
@@ -6,6 +6,9 @@ on:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -14,7 +17,7 @@ jobs:
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile Salamander
|
||||
run: |
|
||||
@@ -30,7 +33,7 @@ jobs:
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: RA-PS2-dummy-${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
name: CI PS4/ORBIS
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-build-orbis:latest
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
apk add ncurses-dev make bash python2
|
||||
apk add libintl icu-dev wget
|
||||
wget https://dot.net/v1/dotnet-install.sh && chmod 755 dotnet-install.sh && ./dotnet-install.sh -c 3.0 --install-dir ~/cli
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
export PATH=~/cli:$PATH # .net cli
|
||||
make -f Makefile.orbis -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1
|
||||
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: bin-${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
retroarch_orbis.elf
|
||||
retroarch_orbis.oelf
|
||||
retroarch_orbis.self
|
||||
|
||||
- name: Version of binaries
|
||||
run: |
|
||||
clang --version
|
||||
orbis-ld --version
|
||||
@@ -6,6 +6,9 @@ on:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -14,7 +17,7 @@ jobs:
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile bootstrap
|
||||
run: |
|
||||
@@ -36,7 +39,7 @@ jobs:
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: RA-PSP-dummy-${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
name: CI PSVita
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-build-vita:latest
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile Salamander
|
||||
run: |
|
||||
make -f Makefile.vita.salamander -j$(getconf _NPROCESSORS_ONLN) clean
|
||||
make -f Makefile.vita.salamander -j$(getconf _NPROCESSORS_ONLN)
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
make -f Makefile.vita -j$(getconf _NPROCESSORS_ONLN) clean
|
||||
make -f Makefile.vita -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1 HAVE_VITAGLES=1
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: RA-PSVita-dummy-${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
eboot.bin
|
||||
@@ -0,0 +1,35 @@
|
||||
name: CI RS90 Odbeta MIPS32
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-build-dingux:odbeta
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.rs90 clean
|
||||
make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.rs90
|
||||
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: retroarch_rs90_mips32${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
retroarch_rs90_odbeta.opk
|
||||
@@ -0,0 +1,35 @@
|
||||
name: CI RetroFW MIPS32
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-build-dingux:odbeta
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.retrofw clean
|
||||
make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.retrofw
|
||||
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: retroarch_retrofw_mips32${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
retroarch_retrofw.opk
|
||||
@@ -0,0 +1,34 @@
|
||||
name: CI Switch/libnx
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-build-libnx-devkitpro:latest
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
make -f Makefile.libnx -j$(getconf _NPROCESSORS_ONLN) clean
|
||||
make -f Makefile.libnx -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: RA-libnx-dummy-${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
retroarch_switch.nro
|
||||
@@ -0,0 +1,39 @@
|
||||
name: CI Wii
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-build-devkitpro:latest
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile Salamander
|
||||
run: |
|
||||
make -f Makefile.wii.salamander -j$(getconf _NPROCESSORS_ONLN) clean
|
||||
make -f Makefile.wii.salamander -j$(getconf _NPROCESSORS_ONLN) EXTERNAL_LIBOGC=1 GX_PTHREAD_LEGACY=0
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
make -f Makefile.wii -j$(getconf _NPROCESSORS_ONLN) clean
|
||||
make -f Makefile.wii -j$(getconf _NPROCESSORS_ONLN) EXTERNAL_LIBOGC=1 GX_PTHREAD_LEGACY=0 HAVE_STATIC_DUMMY=1
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: RA-Wii-dummy-${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
retroarch_wii.dol
|
||||
@@ -0,0 +1,39 @@
|
||||
name: CI WiiU
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-build-wiiu:latest
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile Salamander
|
||||
run: |
|
||||
make -f Makefile.wiiu -j$(getconf _NPROCESSORS_ONLN) SALAMANDER_BUILD=1 clean
|
||||
make -f Makefile.wiiu -j$(getconf _NPROCESSORS_ONLN) SALAMANDER_BUILD=1
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
make -f Makefile.wiiu -j$(getconf _NPROCESSORS_ONLN) clean
|
||||
make -f Makefile.wiiu -j$(getconf _NPROCESSORS_ONLN) HAVE_STATIC_DUMMY=1
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: RA-WiiU-dummy-${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
retroarch.rpx
|
||||
@@ -0,0 +1,37 @@
|
||||
name: CI Windows i686 (MXE)
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-build-mxe-win32-cross:gcc10
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
export MOC=/usr/lib/mxe/usr/i686-w64-mingw32.shared/qt5/bin/moc
|
||||
./configure --host=i686-w64-mingw32.shared
|
||||
make clean
|
||||
make -j$(getconf _NPROCESSORS_ONLN)
|
||||
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: retroarch${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
retroarch.exe
|
||||
@@ -0,0 +1,37 @@
|
||||
name: CI Windows x64 (MXE)
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
repository_dispatch:
|
||||
types: [run_build]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: git.libretro.com:5050/libretro-infrastructure/libretro-build-mxe-win64-cross:gcc10
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Compile RA
|
||||
run: |
|
||||
export MOC=/usr/lib/mxe/usr/x86_64-w64-mingw32.shared/qt5/bin/moc
|
||||
./configure --host=x86_64-w64-mingw32.shared
|
||||
make clean
|
||||
make -j$(getconf _NPROCESSORS_ONLN)
|
||||
|
||||
- name: Get short SHA
|
||||
id: slug
|
||||
run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)"
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: retroarch${{ steps.slug.outputs.sha8 }}
|
||||
path: |
|
||||
retroarch.exe
|
||||
@@ -6,18 +6,26 @@ on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *' # every day at midnight
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
sync:
|
||||
permissions:
|
||||
contents: write # for Git to git push
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Setup Java JDK
|
||||
uses: actions/setup-java@v1
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: 1.8
|
||||
java-version: 18
|
||||
distribution: zulu
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v2
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.10'
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
- name: Crowdin Sync
|
||||
shell: bash
|
||||
env:
|
||||
|
||||
@@ -10,18 +10,24 @@ on:
|
||||
- 'intl/*_us.h'
|
||||
- 'intl/*_us.json'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
sync:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Setup Java JDK
|
||||
uses: actions/setup-java@v1
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: 1.8
|
||||
java-version: 18
|
||||
distribution: zulu
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v2
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.10'
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
- name: Crowdin Sync
|
||||
shell: bash
|
||||
env:
|
||||
|
||||
@@ -10,6 +10,9 @@ on:
|
||||
branches:
|
||||
- master
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
linux-c89: # Smoketest build using most restrictive compiler and default options
|
||||
runs-on: ubuntu-latest
|
||||
@@ -19,8 +22,12 @@ jobs:
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install build-essential libxkbcommon-dev libx11-xcb-dev zlib1g-dev libfreetype6-dev libegl1-mesa-dev libgles2-mesa-dev libgbm-dev nvidia-cg-toolkit nvidia-cg-dev libavcodec-dev libsdl2-dev libsdl-image1.2-dev libxml2-dev yasm
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
- name: Configure
|
||||
run: ./configure
|
||||
- name: Build
|
||||
run: make C89_BUILD=1
|
||||
- name: Build Debug
|
||||
run: |
|
||||
make clean # making sure we don't have leftovers from previous build
|
||||
make DEBUG=1 GL_DEBUG=1 C89_BUILD=1
|
||||
+79
-42
@@ -47,6 +47,7 @@ build-retroarch-windows-x64:
|
||||
--enforcedir /usr/lib/mxe/usr/x86_64-w64-mingw32.shared/qt5/plugins/styles/
|
||||
--copy
|
||||
--objdump x86_64-w64-mingw32.shared-objdump"
|
||||
- "cp -f nvdaControllerClient64.dll ${MEDIA_PATH}/${CI_PROJECT_NAME}/redist/nvdaControllerClient64.dll"
|
||||
- "rm -f ${MEDIA_PATH}/${CI_PROJECT_NAME}/redist/opengl32.dll"
|
||||
|
||||
build-retroarch-windows-i686:
|
||||
@@ -363,28 +364,28 @@ build-retroarch-osx-opengl-x64:
|
||||
XCPROJECT_NAME: RetroArch
|
||||
XCCONFIG: OpenGL_GitLabCI.xcconfig
|
||||
|
||||
build-retroarch-osx-ppc:
|
||||
stage: build
|
||||
artifacts:
|
||||
paths:
|
||||
- ${XCPROJECT_NAME}.zip
|
||||
- retroarch-repo/
|
||||
expire_in: 10 min
|
||||
dependencies: []
|
||||
variables:
|
||||
XCPROJECT_NAME: RetroArch
|
||||
XCCONFIG: OpenGL_GitLabCI.xcconfig
|
||||
tags:
|
||||
- macosx-legacy
|
||||
script:
|
||||
- xcodebuild -target RetroArch -configuration Release -project pkg/apple/RetroArch_PPC.xcodeproj ONLY_ACTIVE_ARCH=NO
|
||||
- pushd pkg/apple/build/Release/
|
||||
- ditto -c -k --sequesterRsrc --keepParent RetroArch.app ${XCPROJECT_NAME}.zip
|
||||
- popd
|
||||
- mv pkg/apple/build/Release/RetroArch.zip ${XCPROJECT_NAME}.zip
|
||||
- mkdir .retroarch-repo
|
||||
- "cp -r ./* .retroarch-repo"
|
||||
- "mv .retroarch-repo/ retroarch-repo/"
|
||||
#build-retroarch-osx-ppc:
|
||||
# stage: build
|
||||
# artifacts:
|
||||
# paths:
|
||||
# - ${XCPROJECT_NAME}.zip
|
||||
# - retroarch-repo/
|
||||
# expire_in: 10 min
|
||||
# dependencies: []
|
||||
# variables:
|
||||
# XCPROJECT_NAME: RetroArch
|
||||
# XCCONFIG: OpenGL_GitLabCI.xcconfig
|
||||
# tags:
|
||||
# - macosx-legacy
|
||||
# script:
|
||||
# - xcodebuild -target RetroArch -configuration Release -project pkg/apple/RetroArch_PPC.xcodeproj ONLY_ACTIVE_ARCH=NO
|
||||
# - pushd pkg/apple/build/Release/
|
||||
# - ditto -c -k --sequesterRsrc --keepParent RetroArch.app ${XCPROJECT_NAME}.zip
|
||||
# - popd
|
||||
# - mv pkg/apple/build/Release/RetroArch.zip ${XCPROJECT_NAME}.zip
|
||||
# - mkdir .retroarch-repo
|
||||
# - "cp -r ./* .retroarch-repo"
|
||||
# - "mv .retroarch-repo/ retroarch-repo/"
|
||||
|
||||
build-retroarch-ios-arm64:
|
||||
extends: .build-retroarch-macos-xcode
|
||||
@@ -661,6 +662,50 @@ build-static-retroarch-dummy-libnx-aarch64:
|
||||
- "cp -f gfx/video_filters/*.filt ${MEDIA_PATH}/${CI_PROJECT_NAME}/filters/video"
|
||||
- "cp -f pkg/libnx/retroarch.jpg ${MEDIA_PATH}/${CI_PROJECT_NAME}/pkg"
|
||||
|
||||
build-static-retroarch-psp:
|
||||
image: $CI_SERVER_HOST:5050/libretro-infrastructure/libretro-build-psp:latest
|
||||
stage: prepare-for-static-cores
|
||||
before_script:
|
||||
- export NUMPROC=$(($(nproc)/3))
|
||||
artifacts:
|
||||
paths:
|
||||
- retroarch-precompiled/
|
||||
expire_in: 10 min
|
||||
dependencies: []
|
||||
needs:
|
||||
# Dummy build requires no core
|
||||
- build-static-retroarch-dummy-psp
|
||||
script:
|
||||
# We need to boostrap before compile
|
||||
- "(cd bootstrap/psp1/kernel_functions_prx/ && make && cd -)"
|
||||
# Allow failure since we don't have a core
|
||||
- "make -f Makefile.psp1 -j$NUMPROC ||:"
|
||||
- "mkdir .retroarch-precompiled"
|
||||
- "cp -r ./* .retroarch-precompiled/"
|
||||
- "mv .retroarch-precompiled/ retroarch-precompiled/"
|
||||
|
||||
build-static-retroarch-dummy-psp:
|
||||
image: $CI_SERVER_HOST:5050/libretro-infrastructure/libretro-build-psp:latest
|
||||
stage: build
|
||||
variables:
|
||||
MEDIA_PATH: .media
|
||||
before_script:
|
||||
- export NUMPROC=$(($(nproc)/3))
|
||||
artifacts:
|
||||
paths:
|
||||
- EBOOT.PBP
|
||||
- kernel_functions.prx
|
||||
- ${MEDIA_PATH}
|
||||
expire_in: 10 min
|
||||
dependencies: []
|
||||
script:
|
||||
- "(cd bootstrap/psp1/kernel_functions_prx/ && make && cd -)"
|
||||
- "make -f Makefile.psp1.salamander -j$NUMPROC"
|
||||
- "make -C bootstrap/psp1/kernel_functions_prx/"
|
||||
- "mkdir -p ${MEDIA_PATH}/${CI_PROJECT_NAME}/pkg"
|
||||
- "cp -f pkg/psp1/ICON0.PNG ${MEDIA_PATH}/${CI_PROJECT_NAME}/pkg"
|
||||
- "cp -f pkg/psp1/PIC1.PNG ${MEDIA_PATH}/${CI_PROJECT_NAME}/pkg"
|
||||
|
||||
build-static-retroarch-vita:
|
||||
image: $CI_SERVER_HOST:5050/libretro-infrastructure/libretro-build-vita:latest
|
||||
stage: prepare-for-static-cores
|
||||
@@ -774,8 +819,8 @@ build-static-retroarch-dummy-psl1ght:
|
||||
script:
|
||||
- "make -f Makefile.psl1ght.salamander -j$NUMPROC create-salamander"
|
||||
|
||||
build-static-retroarch-psp:
|
||||
image: $CI_SERVER_HOST:5050/libretro-infrastructure/libretro-build-psp:latest
|
||||
build-static-retroarch-orbis:
|
||||
image: $CI_SERVER_HOST:5050/libretro-infrastructure/libretro-build-orbis:latest
|
||||
stage: prepare-for-static-cores
|
||||
before_script:
|
||||
- export NUMPROC=$(($(nproc)/3))
|
||||
@@ -786,37 +831,26 @@ build-static-retroarch-psp:
|
||||
dependencies: []
|
||||
needs:
|
||||
# Dummy build requires no core
|
||||
- build-static-retroarch-dummy-psp
|
||||
- build-static-retroarch-dummy-orbis
|
||||
script:
|
||||
# We need to boostrap before compile
|
||||
- "(cd bootstrap/psp1/kernel_functions_prx/ && make && cd -)"
|
||||
# Allow failure since we don't have a core
|
||||
- "make -f Makefile.psp1 -j$NUMPROC ||:"
|
||||
- "make -f Makefile.orbis -j$NUMPROC ||:"
|
||||
- "mkdir .retroarch-precompiled"
|
||||
- "cp -r ./* .retroarch-precompiled/"
|
||||
- "mv .retroarch-precompiled/ retroarch-precompiled/"
|
||||
|
||||
build-static-retroarch-dummy-psp:
|
||||
image: $CI_SERVER_HOST:5050/libretro-infrastructure/libretro-build-psp:latest
|
||||
build-static-retroarch-dummy-orbis:
|
||||
image: $CI_SERVER_HOST:5050/libretro-infrastructure/libretro-build-orbis:latest
|
||||
stage: build
|
||||
variables:
|
||||
MEDIA_PATH: .media
|
||||
before_script:
|
||||
- export NUMPROC=$(($(nproc)/3))
|
||||
artifacts:
|
||||
paths:
|
||||
- EBOOT.PBP
|
||||
- kernel_functions.prx
|
||||
- ${MEDIA_PATH}
|
||||
- retroarch_orbis.self
|
||||
expire_in: 10 min
|
||||
dependencies: []
|
||||
script:
|
||||
- "(cd bootstrap/psp1/kernel_functions_prx/ && make && cd -)"
|
||||
- "make -f Makefile.psp1.salamander -j$NUMPROC"
|
||||
- "make -C bootstrap/psp1/kernel_functions_prx/"
|
||||
- "mkdir -p ${MEDIA_PATH}/${CI_PROJECT_NAME}/pkg"
|
||||
- "cp -f pkg/psp1/ICON0.PNG ${MEDIA_PATH}/${CI_PROJECT_NAME}/pkg"
|
||||
- "cp -f pkg/psp1/PIC1.PNG ${MEDIA_PATH}/${CI_PROJECT_NAME}/pkg"
|
||||
- "make -f Makefile.orbis -j$NUMPROC HAVE_STATIC_DUMMY=1"
|
||||
|
||||
build-static-retroarch-djgpp:
|
||||
image: $CI_SERVER_HOST:5050/libretro-infrastructure/libretro-djgpp-build-container:latest
|
||||
@@ -828,6 +862,7 @@ build-static-retroarch-djgpp:
|
||||
- retroarch-precompiled/
|
||||
expire_in: 10 min
|
||||
dependencies: []
|
||||
needs: []
|
||||
script:
|
||||
# Allow failure since we don't have a core
|
||||
- "make -f Makefile.dos -j$NUMPROC ||:"
|
||||
@@ -865,6 +900,7 @@ build-static-retroarch-ctr-legacy:
|
||||
- retroarch-precompiled/
|
||||
expire_in: 10 min
|
||||
dependencies: []
|
||||
needs: []
|
||||
script:
|
||||
# Allow failure since we don't have a core
|
||||
- "make -f Makefile.ctr -j$NUMPROC ||:"
|
||||
@@ -1075,10 +1111,11 @@ trigger_static-cores:
|
||||
stage: trigger-static-cores
|
||||
needs:
|
||||
- build-static-retroarch-libnx-aarch64
|
||||
- build-static-retroarch-psp
|
||||
- build-static-retroarch-vita
|
||||
- build-static-retroarch-ps2
|
||||
- build-static-retroarch-psl1ght
|
||||
- build-static-retroarch-psp
|
||||
- build-static-retroarch-orbis
|
||||
- build-static-retroarch-ctr
|
||||
- build-static-retroarch-ctr-legacy
|
||||
- build-static-retroarch-wiiu
|
||||
|
||||
@@ -3,54 +3,63 @@ RetroArch and the libretro team would like to
|
||||
acknowledge the following contributors:
|
||||
|
||||
1ch (L0sted)
|
||||
51eating (dnjstlr555)
|
||||
23rd
|
||||
6lackmag3
|
||||
A Schain (aschain)
|
||||
Aaron Oneal (aarononeal)
|
||||
Aaron Ramirez (aaronbytes)
|
||||
Abadede
|
||||
Adam Londero (alondero)
|
||||
Adam Mechtley (amechtley)
|
||||
AdrianoML
|
||||
Adriano de Moura Leite (amlib)
|
||||
Adrien Moulin (elyosh)
|
||||
Aethyrion
|
||||
ajefr
|
||||
AKuHAK
|
||||
Alberto Alonso Ruibal (albertoruibal)
|
||||
Alberto Fustinoni (albertofustinoni)
|
||||
Alberto Simon (asimonf)
|
||||
Alcaro
|
||||
aldebaran27
|
||||
Aleksey Samoilov (Sunderland93)
|
||||
Alessandro Mangone (Vektor) (zevektor)
|
||||
Alessio Tosto (Rinnegatamante)
|
||||
Alex Eckhart (alex34567)
|
||||
Alex Folland (AlexFolland)
|
||||
Alex Kornitzer (alexkornitzer)
|
||||
Alexander Spady (alkaseltzerspadt)
|
||||
Alexander Trufanov (trufanov-nok)
|
||||
Alexandre Garcia (Alexandre-Garcia)
|
||||
Alfredo Monclus (alfrix)
|
||||
aliaspider
|
||||
alphanu1
|
||||
altiereslima
|
||||
Alwin Garside (Yogarine)
|
||||
Amiga1200Gamer (amigagamer)
|
||||
amtz
|
||||
Anders Storhaug (andersstorhaug)
|
||||
Andre Leiradella (leiradel)
|
||||
Andrés (fr500)
|
||||
Andy Nguyen (TheOfficialFloW)
|
||||
Anthony J. Bentley (bentley)
|
||||
Antonio Jose Ramos Marquez (psxdev)
|
||||
antonioginer
|
||||
Apaczer
|
||||
AridRayne
|
||||
ArnaudFaucher
|
||||
arpruss
|
||||
arstn
|
||||
Artem Polishchuk (tim77)
|
||||
Arto Vainiolehto (arakerlu)
|
||||
asavah
|
||||
Ash (QuarkTheAwesome)
|
||||
Ash (ashquarky)
|
||||
Ashura (CoalaJoe)
|
||||
Autechre (twinaphex)
|
||||
Avton1
|
||||
ayssia
|
||||
BananaRama203
|
||||
barbudreadmon
|
||||
Barry Rowe (BarryJRowe)
|
||||
Bartłomiej Burdukiewicz (dev-0x7C6)
|
||||
Bashar Astifan (basharast)
|
||||
bearoso
|
||||
Ben Hamilton (Ben Gertzfield) (bhamiltoncx)
|
||||
benklop
|
||||
benutzer193
|
||||
Bernhard Schelling (schellingb)
|
||||
@@ -74,6 +83,7 @@ C.W. Betts (MaddTheSane)
|
||||
Casey Borders (CaseyB)
|
||||
CatGreen90
|
||||
ceb33
|
||||
cedorg
|
||||
celerizer
|
||||
Charlène (julianaito)
|
||||
CheezeCake
|
||||
@@ -81,11 +91,13 @@ Chris Merrett (chrisfu)
|
||||
Christian Murphy (grimpunch)
|
||||
christianhaitian
|
||||
Christoffer Tibell (Brottweiler)
|
||||
Christopher Snowhill (kode54)
|
||||
chu (9chu)
|
||||
Chuck Smith (chucksmith)
|
||||
CidVonHighwind
|
||||
clienthax
|
||||
cold-brewed
|
||||
Colin Kinloch (ColinKinloch)
|
||||
CompCom
|
||||
ComradeEcho
|
||||
confusedguy9
|
||||
@@ -104,7 +116,7 @@ crystalct
|
||||
CTCaer
|
||||
cucholix
|
||||
cudencuden
|
||||
Cyan (44100hertz)
|
||||
CyberLabSystems
|
||||
Daehan Kim (iAmGhost)
|
||||
dalter
|
||||
Dan Weiss (Dwedit)
|
||||
@@ -120,6 +132,7 @@ David Erickson (daviderickson)
|
||||
David G. F. (davidgfnet)
|
||||
David Lawson (dmrlawson)
|
||||
David Walters (hiddenasbestos)
|
||||
dbaronica
|
||||
DEX357
|
||||
diablodiab
|
||||
dibas
|
||||
@@ -136,6 +149,7 @@ duganchen
|
||||
dukemiller
|
||||
duskgao
|
||||
Dylan Scott (dyscott)
|
||||
Dystopian
|
||||
eadmaster
|
||||
Eduard Strehlau (Herdinger)
|
||||
ekipan
|
||||
@@ -150,8 +164,9 @@ Fabio (Oibaf66)
|
||||
Fabio Ritrovato (Sephiroth87)
|
||||
Fayne Aldan (FayneAldan)
|
||||
fff (felinben)
|
||||
Filipe Azevedo (pasnox)
|
||||
FIX94
|
||||
Flame Sage (chris062689)
|
||||
Flame Sage (flamesage)
|
||||
flyinghead
|
||||
FmT0
|
||||
francescotintori
|
||||
@@ -159,6 +174,7 @@ Francisco Javier Trujillo Mata (fjtrujy)
|
||||
Francisco José García García (frangarcj)
|
||||
FreeShippingParty
|
||||
fuzzydunlops732 (JKoppel93)
|
||||
GABO1423
|
||||
Gabriel (Ghabry)
|
||||
GameDragon2k
|
||||
Garrett Brown (garbear)
|
||||
@@ -166,11 +182,11 @@ gatecat (daveshah1)
|
||||
GavinDarkglider
|
||||
gblues
|
||||
Geoffrey Plitt (GeoffreyPlitt)
|
||||
Giovanni Cascione (spleen1981)
|
||||
Glenn Hevey (hevey)
|
||||
Googer
|
||||
gordon-fish
|
||||
gouchi
|
||||
grant2258
|
||||
Gregor Richards (GregorR)
|
||||
Grzegorz Raciborski (graciborski)
|
||||
Gui Andrade (archshift)
|
||||
@@ -178,7 +194,6 @@ Guillaume Thiolliere (thiolliere)
|
||||
Guo Yunhe (guoyunhe)
|
||||
Gustavo Maciel Dias Vieira (gmdvieira)
|
||||
gvbr
|
||||
H. İbrahim Güngör (igungor)
|
||||
hadess
|
||||
Hans-Kristian Arntzen (Themaister)
|
||||
Henri Gomez (hgomez)
|
||||
@@ -194,10 +209,13 @@ HyperspaceMadness
|
||||
i30817
|
||||
im4potato
|
||||
ImJezze
|
||||
İbrahim Güngör (igungor)
|
||||
Jack (jakcron)
|
||||
Jacob (cubtekki)
|
||||
Jacob (RegenJacob)
|
||||
Jacob Patterson (jacobpa)
|
||||
jacobsson (Roet-Ivar)
|
||||
Jahed
|
||||
Jake Stine (jstine35)
|
||||
James Le Cuirot (chewi)
|
||||
James Sexton (Bezier89)
|
||||
@@ -217,6 +235,7 @@ Joan Coll Cerdán (johanbcn)
|
||||
Job Adrian Salinas Gonzalez (efylan)
|
||||
Joe Osborn (JoeOsborn)
|
||||
Joel (joel16)
|
||||
Joel Puig Rubio (XXLuigiMario)
|
||||
Joerg Sonnenberger (jsonn)
|
||||
Johannes Schickel (lordhoto)
|
||||
John Parton (john-parton)
|
||||
@@ -227,18 +246,22 @@ Jonathan Relf (jonathanrelf)
|
||||
Joohan Lee (losernator)
|
||||
Jools Wills (joolswills)
|
||||
Jose Lage Miguez (Joselagem)
|
||||
Joseph Carter (iKarith)
|
||||
Joseph Carter (knghtbrd)
|
||||
Joseph Conan Montgomery (Grotke)
|
||||
jsd1982 (JamesDunne)
|
||||
jSTE0
|
||||
JuanVCS
|
||||
Justin Jacobs (dorkster)
|
||||
Justin Weiss (justinweiss)
|
||||
JustMeDaFaq
|
||||
Kangmo-Ahn
|
||||
Karl Forshaw (karlforshaw)
|
||||
Kate Eckhart (katepango)
|
||||
Keith Bowes (keithbowes)
|
||||
Ken Rossato (rossato)
|
||||
kikmon
|
||||
Kopert
|
||||
krzys_h (krzys-h)
|
||||
Krzysztof Haładyn (krzys_h) (krzys-h)
|
||||
kurumushi
|
||||
kwyxz
|
||||
l3iggs
|
||||
@@ -248,26 +271,29 @@ Lawrence Kesteloot (lkesteloot)
|
||||
LazyBumHorse
|
||||
LazyFunker
|
||||
Lennard Kittner (Lennard599)
|
||||
LibretroAdmin
|
||||
Lionel Flandrin (simias)
|
||||
littleguy77
|
||||
liushuyu
|
||||
Logan (loganmc10)
|
||||
Logan McNaughton (loganmc10)
|
||||
lordashram
|
||||
Lothar Serra Mari (lotharsm)
|
||||
Lubosz Sarnecki (lubosz)
|
||||
lucasmr
|
||||
lucianposton
|
||||
lxerandrew
|
||||
m4xw
|
||||
mahoneyt944
|
||||
Mahyar Koshkouei (deltabeard)
|
||||
Mai M. (lioncash)
|
||||
Mai (lioncash)
|
||||
MajorPainTheCactus
|
||||
maksun
|
||||
Manuel Alfayate Corchete (vanfanel)
|
||||
Marcelo Munhoz Pélos (mpelos)
|
||||
Marcus Crisostomo (mcrisostomo)
|
||||
markwkidd
|
||||
Maschell
|
||||
Mats (m4tsa)
|
||||
Mats (Myaats)
|
||||
Matt Sephton (gingerbeardman)
|
||||
Matthew Bauer (matthewbauer)
|
||||
Matthew Wang (asakous)
|
||||
@@ -289,27 +315,32 @@ mikeOSX
|
||||
minucce
|
||||
misson20000
|
||||
Monroe88
|
||||
Morgane (Niouby)
|
||||
Morgane (MorganeAD)
|
||||
mprobinson
|
||||
MrHuu
|
||||
MrJs (mrjschulte)
|
||||
mudlord
|
||||
Muhamed Hobi (mmhobi7)
|
||||
muzuiget
|
||||
N/A (inactive123)
|
||||
Nargash
|
||||
Nathan S. (natinusala)
|
||||
NathanStrong-Tripwire
|
||||
nattycleopatra
|
||||
Naveen (naveensrinivasan)
|
||||
nayslayer
|
||||
negativeExponent
|
||||
Neil Barkhina (nbarkhina)
|
||||
neil4
|
||||
Nephilim (Nephil1m)
|
||||
netux79
|
||||
nfnty
|
||||
nfp0
|
||||
nia (alarixnia)
|
||||
Nicolas Adenis-Lamarre (nadenislamarre)
|
||||
Nicolas Guillaumin (nguillaumin)
|
||||
Nicolas Roehm (NicolasRoehm)
|
||||
Nik (WerWolv)
|
||||
Nikita Vakhrushev (XF10C)
|
||||
Nikola Kocić (nikola-kocic)
|
||||
Nikos Chantziaras (realnc)
|
||||
@@ -321,7 +352,9 @@ notaz
|
||||
nstCactus
|
||||
nurupo
|
||||
Oggom
|
||||
Oh Won Sik (dnjstlr555)
|
||||
Oleg Shevchenko (olsh)
|
||||
Omar Saleem (ofsaleem)
|
||||
opendata26
|
||||
Ophidon
|
||||
orbea
|
||||
@@ -335,22 +368,28 @@ Paul McCarty (notabeatle)
|
||||
pcjco
|
||||
Pedro Ferraz (ferrazpedro)
|
||||
Pedro Ribeiro (pedrib)
|
||||
Peter J Kos (pkos)
|
||||
Philippe Simons (loki666)
|
||||
pinumbernumber
|
||||
Piotr Dobrowolski (Informatic)
|
||||
pjft
|
||||
Poligraf
|
||||
pponso1
|
||||
pyroesp
|
||||
R-YaTian
|
||||
Rafael Toledo (rafaeltoledo)
|
||||
Ramiro Morales (ramiro)
|
||||
Raphaël Zumer (rzumer)
|
||||
redenvelope2000
|
||||
Reid Kleckner (rnk)
|
||||
repojohnray
|
||||
retrotails
|
||||
revvv
|
||||
reztek
|
||||
Richard Howell (rmaz)
|
||||
Rinnegatamante
|
||||
rlnilsen
|
||||
Rob Loach (RobLoach)
|
||||
Roberto V. Rampim (Cthulhu)
|
||||
Robin de Rooij (rrooij)
|
||||
Romain Gay (vikbez)
|
||||
Romain Graillot (notnotme)
|
||||
@@ -359,20 +398,27 @@ Roman Fomin (rfomin)
|
||||
Roman Kalashnikov (lunixoid)
|
||||
Royerson
|
||||
rsn8887
|
||||
Ruben Nine (rnine)
|
||||
Ryan C. Gordon (icculus)
|
||||
Ryan Kuba (thelamer)
|
||||
Ryunam
|
||||
rz5
|
||||
Sage (neonfuz)
|
||||
Saggi Mizrahi (ficoos)
|
||||
SAKUJ0
|
||||
Salvador (salvacam)
|
||||
Sam (44100hertz)
|
||||
Sam Lantinga (slouken)
|
||||
Sam Stenvall (Jalle19)
|
||||
Samuel P. (p-sam)
|
||||
Sanaki
|
||||
Scheiker
|
||||
Sean O'Neil (seanocali)
|
||||
Sebastien Ronsse (sronsse)
|
||||
SecularSteve
|
||||
Sefa Eyeoglu (Scrumplex)
|
||||
Sergei Nikitin (Kert)
|
||||
Sergei Trofimovich (trofi)
|
||||
Sergi Granell (xerpi)
|
||||
Sergio Padrino (sergiou87)
|
||||
sergio-br2 (sergiobenrocha2)
|
||||
@@ -387,19 +433,23 @@ SindenLightgun
|
||||
Sirrempat
|
||||
slotek
|
||||
Soar Qin (soarqin)
|
||||
sonninnos
|
||||
Sou Bunnbu (iyzsong)
|
||||
sparklewind
|
||||
spec-chum
|
||||
Stefan (gizmo98)
|
||||
stefan-gr
|
||||
stellarporter
|
||||
Stephanie Gawroriski (XerTheSquirrel)
|
||||
Steve Cox (stevenjamescox)
|
||||
Stevoisiak
|
||||
stoofin
|
||||
StormedBubbles
|
||||
strotlog
|
||||
Stuart Carnie (stuartcarnie)
|
||||
Sunguk Lee (d3m3vilurr)
|
||||
Supernature2k
|
||||
Sven (RetroSven)
|
||||
Swingflip
|
||||
Swizzy
|
||||
Sylvain Colinet (Skarsnik)
|
||||
Szunti
|
||||
@@ -410,34 +460,38 @@ thedax
|
||||
theheroGAC
|
||||
TheMrIron2
|
||||
ThePhxRises
|
||||
TheRhysWyrill
|
||||
Thomas Lorblanchès (Zlika)
|
||||
Tilman M. Jaeschke (asciibeats)
|
||||
Tim Van den Langenbergh (tmtvl)
|
||||
Tobias Gruetzmacher (TobiX)
|
||||
Tobias Jakobi (tobiasjakobi)
|
||||
Todd Laney (ToddLa)
|
||||
Tomáš Kelemen (ToKe79)
|
||||
Tony (sonninnos)
|
||||
Tor Arne Vestbø (torarnv)
|
||||
Torsten Paul (t-paul)
|
||||
toshixm
|
||||
TotalCaesar659
|
||||
tr12345
|
||||
TroggleMonkey
|
||||
tunip3
|
||||
txorion
|
||||
Tyler Loch (TylerLoch)
|
||||
unrelentingtech
|
||||
URBANsUNITED
|
||||
vaguerant
|
||||
Val Packett (valpackett)
|
||||
Valerio Proietti (kamicane)
|
||||
vgmoose
|
||||
Vicki Pfau (endrift)
|
||||
Vicky C Lau (vickychenglau)
|
||||
vin (suseme)
|
||||
Vincent Pelletier (vpelletier)
|
||||
Vladimir Panteleev (CyberShadow)
|
||||
Vladimir Serbinenko (phcoder)
|
||||
Víctor "IlDucci" (IlDucci)
|
||||
waitingmoon
|
||||
Warning: Non-Potable Water (warningnonpotablewater)
|
||||
webgeek1234
|
||||
Weedy Weed Smoker (WeedyWeedSmoker)
|
||||
WerWolv
|
||||
whorsemaster
|
||||
Wiimpathy
|
||||
Wiktor Strzębała (wiktorek140)
|
||||
|
||||
+350
@@ -1,5 +1,355 @@
|
||||
# Future
|
||||
|
||||
# 1.13.0
|
||||
- 3DS: Remove debug button combo to shutdown RA
|
||||
- 3DS: Remove MaterialUI as per MrHuu recommendation
|
||||
- ANDROID: Enable 'Vibrate On Key Press' by default
|
||||
- ANDROID: Turn 'Threaded Video' off by default
|
||||
- CHEEVOS: Upgrade to rcheevos 10.5
|
||||
- COMPILATION: Fixed compiling with --disable-menu
|
||||
- CONFIG: Don't show override notification with appendconfig alone
|
||||
- DATABASE/PLAYLISTS: Playlist + database changes - Cleanup 'entry_slot', fallback label + logging
|
||||
- FRONTEND: Fix default remaps folder for various cores: remap should …
|
||||
…be nested in config folder
|
||||
- HOTKEYS: Fix shader toggle and add hotkey + sublabel
|
||||
- HOTKEYS: Cleanups and corrections - Keep hotkey pause and menu pause separate in order to not trigger unwanted pause when toggling menu regardless if menu will pause or not
|
||||
- HOTKEYS: Cleanups and corrections - Allow unpausing with Start (makes resuming more convenient after controller disconnect if menu does not pause)
|
||||
- IOS13+: Pointer movement accuracy. iPad Trackpad Pointer Movement Accuracy through absolute location (for iOS 13.4 and above)
|
||||
- IOS13+: Adds iPad Trackpad Support to iOS13 Project (for iOS 13.4 and above)
|
||||
- INPUT: Addition to analog stick menu navigation
|
||||
- INPUT: Fixed the way devices were previously indexed. Input devices were only being indexed in order and would stop at the first time an input has no device connected to it. The problem is when a device gets disconnected, that input will have no devices connected to it, but the next input may still have a device connected. So, that makes changing the port of the currently connected devices impossible.
|
||||
- INPUT/AUTOCONFIG: Add option for pause on controller disconnect
|
||||
- INPUT/AUTOCONFIG: Driver independent disconnection notification. Should show disconnect notification now properly on Windows with XInput and/or DirectInput pads
|
||||
- INPUT/HID: Added usb hid controllers for the famous ZeroDelay encoder and also for "Kade: Kick Ass Dynamic Encoder" to be able to use some custom arcade sticks.
|
||||
- INPUT/OVERLAY: Add eightway area types. The playlist supports UTF8, but edit control replaces the extended character with #. The following code enables extended character input in Netplay Chatting, Search, and Rename titles.
|
||||
- INPUT/OVERLAY: Fix overlay next_index for unnamed targets
|
||||
- LOCALIZATION: Updates
|
||||
- LOCALIZATION: Add Hungarian language option
|
||||
- MENU: Thumbnail fullscreen toggle behavior correction
|
||||
- MENU: Consistent left-right scrolling for Quick Menu items
|
||||
- MENU: Remove useless sublabel from System Information
|
||||
- MENU: Improve widget appearance with missing assets
|
||||
- MENU/INPUT: Add option for swapping menu scrolling buttons
|
||||
- MENU/QT/WIMP: Remove SSL/TLS check at startup
|
||||
- MENU/OZONE: Show metadata helper in footer only with second thumbnail
|
||||
- MENU/OZONE: Footer improvements - Add "Cycle thumbnails" helper when suitable
|
||||
- MENU/OZONE: Footer improvements - Show "Search" helper only when search function is enabled
|
||||
- MENU/OZONE: Footer improvements - Fix "Thumbnails available" helper for save states
|
||||
- MENU/OZONE: Footer improvements - Tighten padding between icon and title, and widen between helpers
|
||||
- MENU/OZONE: Remember selection per main tabs
|
||||
- MENU/OZONE: Remove incomplete assets warning
|
||||
- MENU/OZONE: Add option to adjust cursor memory when changing menu tabs
|
||||
- MENU/OZONE: Further extend texture support for Core Option categories
|
||||
- MENU/XMB: Remove incomplete assets warning
|
||||
- MENU/XMB: Add truncate playlist name option
|
||||
- MENU/XMB: Improve background image selector
|
||||
- MENU/XMB: Add option to adjust cursor memory when changing menu tabs
|
||||
- MENU/XMB: Further extend texture support for Core Option categories
|
||||
- MENU/MATERIALUI: Remove incomplete assets warning
|
||||
- OSX: Fixed Z/X keys not working on the macOS port
|
||||
- OSX: Fixed RETROK_LMETA not working on macOS port. The RETROK_LMETA key was not defined in the rarch_key_map_apple_hid
|
||||
- OSX: Fix broken fullscreen mode in macOS Ventura
|
||||
- OVERLAYS: Ignore hitboxes with zero area. I.e. Set 'reach_x' or 'reach_y' to zero to ensure no hitbox math is done. This simplifies designating animation-only descriptors (e.g. for eightway areas) or obsolete descriptors.
|
||||
- OVERLAYS: Add 'reach' and 'exclusive' for hitboxes. Allows stretching hitboxes and handling their overlap.
|
||||
- PS2: Fix Error saving remaps and runtime logs
|
||||
- PS3: Fix Core Remap Overwrite Fail
|
||||
- QB: Don't fail if OSDependent/OGLCompiler libraries are not present
|
||||
- SCANNER/PS1: Improved scanning of PS1 discs
|
||||
- SCANNER/PS2: Added serial scanning of PS2 discs - should now scan DVDs and other discs which were previously missed
|
||||
- THUMBNAIL: If you rename title, you cannot use the thumbnail image. because the thumbnail filename and the title must be the same.
|
||||
If there is no thumbnail with title, find the thumbnail image with rom-name. This has nothing to do with IME.
|
||||
- THREADED VIDEO/GLCORE: Fix regression 'Shader presets dont load, when video driver is set to glcore'
|
||||
- VULKAN: Fix HDR inverse tonemapping
|
||||
|
||||
# 1.12.0
|
||||
- CONFIG/CLI: Allow use of --appendconfig with override cfgs instead of getting ignored
|
||||
- CONFIG/LOGGING: No more console startup logging if logging to file
|
||||
- CONFIG: Saves config on exit only once instead of (worst case scenario) 3 times
|
||||
- DATABASE/EXPLORE/VIEW: Add View feature - Add saving of a filter set in the Explore menu into a so called "View" file which then gets listed alongside playlists. This also adds the ability to filter a category by range in the Explore menu and not just filter on exact matches.
|
||||
- FILEBROWSER: Fix regression - certain extensions keep disappearing
|
||||
- IOS: New modern iOS version (targeting iOS 13 and up), leverages Swift
|
||||
- IOS: Fixes to iOS toolbar
|
||||
- IOS16: Add iOS 16 lock screen widget
|
||||
- IOS13+: Added emulator keyboard
|
||||
- IOS13+: Add JIT support for non-jailbroken devices
|
||||
- IOS13+: Added support for touch mouse handler
|
||||
- IOS13+: Changed click-and-drag behavior to double tap hold and drag
|
||||
- INPUT/HAPTIC/OVERLAYS/ANDROID: Improve haptic feedback for input overlays
|
||||
- LINUX/MALI FBDEV: Add conditional support for OpenGL ES 3.x
|
||||
- LOCALIZATION: Updates
|
||||
- LOCALIZATION/ENGLISH: Add British English language option
|
||||
- LOGGING/QT: Increase log buffer to 2048 characters - Vulkan validation layer
|
||||
messages output correctly now.
|
||||
- MENU/XMB: Remember selection per main tabs. Addresses the following : collection playlists can contain hundreds or thousands of items. When scrolling through one, pressing left or right by accident can be common. This resets the playlist to the top
|
||||
- MIST/STEAM/STEAMDECK: Don't expose Black Frame Insertion (BFI) if we are running on a Steam Deck
|
||||
- NETWORKING/WINDOWS: Disable poll support for MSVC 2010 and earlier. WSAPoll is not supported on Windows XP and earlier.
|
||||
- NETWORKING/WIIU: Fix socket_connect_with_timeout for WIIU
|
||||
- NETWORKING/WIIU: Fixes RetroAchievements login
|
||||
- NETWORKING/WIIU: Fixes other online updater functionality
|
||||
- SAVESTATES/NOTIFICATIONS: Add delay to savestate notifications, so that GPU savestate screenshots stay untouched
|
||||
- SAVESTATES/SCREENSHOTS: Avoid 'video_gpu_screenshot' with savestates. Allow GPU screenshots with savestates only when there is no other way of getting a screenshot.
|
||||
- SCREENSHOTS/VULKAN: Unload screenshot widget texture early. Fixes Vulkan crash when closing content while a screenshot widget is still on-screen
|
||||
- SCREENSHOTS/VULKAN: Fix screenshot widget crash when ticker animating
|
||||
- WAYLAND: Set correct app ID
|
||||
- WIIU: Add some missing default directories
|
||||
- WIIU: Get mkdir working on WiiU (directory creation)
|
||||
|
||||
# 1.11.1
|
||||
- GENERAL: Fix DEFAULT_FILL_TITLE_MACRO
|
||||
- NETWORKING: Add the const qualifier to some function parameters
|
||||
- NETWORKING/NETPLAY/UPNP: Add a private or CGNAT address warning to UPnP
|
||||
- SAVESTATES/SCREENSHOTS: Avoid 'video_gpu_screenshot' with savestates
|
||||
- UWP: Better 'Save on quit' fix
|
||||
|
||||
# 1.11.0
|
||||
- 3DS: Add unique ID's
|
||||
- 3DS: Add bottom menu options
|
||||
- 3DS: Set bottom_asset directory default
|
||||
- 3DS: Only enable internal counter with CONSOLE_LOG defined
|
||||
- 3DS: Set default bottom font values
|
||||
- 3DS: Fix CIA installation issues
|
||||
- 3DS: Support latest libctru
|
||||
- ANDROID: Add HAVE_ACCESSIBILITY
|
||||
- ANDROID: Gingerbread support
|
||||
- ANDROID: Touchpads support
|
||||
- ANDROID: Builtin Xperia Play autoconfig profile
|
||||
- ANDROID: Disable Feral GameMode for Android - only available on Linux
|
||||
- ANDROID: Add a configurable workaround for Android reconnecting devices
|
||||
- ANDROID/FDROID: Add F-Droid metadata to repo in Fastlane format
|
||||
- AUDIO/AUDIO MIXER: Add missing locks for thread safety
|
||||
- AUDIO/AUDIO MIXER: Fix audio mixer memory leak + remove redundant 'single threaded' rthreads implementation
|
||||
- AUTOSAVE: Change/improve exit behavior of autosave thread - if condition variable is signaled, the loop is ran another last time so we can do a final check/save before stopping the thread.
|
||||
- CDROM: Fix memory leak caught with asan - buf passed to filestream_read_file
|
||||
- CORE INFO/NETPLAY: Ensure current core info is initialized at runloop_event_init_core when netplay is enabled
|
||||
- CHEEVOS: Upgrade to rcheevos 10.4
|
||||
- CHEEVOS: Allow creating auto savestate in hardcore
|
||||
- CHEEVOS: prevent invalid memory reference if game has achievements but core doesn't expose memory
|
||||
- CHEEVOS: Release achievement badge textures when video driver is deinitialized
|
||||
- CHEEVOS: Re-enforce hardcore limitations once achievements are loade
|
||||
- CHEEVOS/MENU/MATERIALUI: Show achievement badge icons in MaterialUI driver
|
||||
- D3D9: D3D9 has been split up into two drivers - D3D9 HLSL (max compatibility, no shader support yet) and D3D9 Cg (dependent on deprecated Nvidia Cg runtime library)
|
||||
- D3D9/HLSL/XMB: XMB fix
|
||||
- D3D9/CG: D3D9 Cg driver fixed
|
||||
- D3D11: Fix overlay not showing up
|
||||
- D3D11/12: Reduce lag with WaitForVBlank - this rather simple addition seems to make D3D11/12 very very close to Vulkan/GLCore regarding input lag.
|
||||
- D3D11/12: Add waitable swapchains and max frame latency option
|
||||
- D3D11/12: Make waitable swapchains optional
|
||||
- DATABASE: Reformat 'rdb_entry_int' - Nitpick adjustments for database entries: Capitalize "Release Date", and remove space before : from Release Date rows which use integer
|
||||
- DATABASE/EXPLORE: Allow On-Demand Thumbnails in Explore menu
|
||||
- DATABASE/EXPLORE/MENU/OZONE/XMB/RGUI: Explore menu thumbnails
|
||||
- DISC CONTROL: Better Disc Control append focus
|
||||
- DOS/DJGPP: Add a workaround for libc bug
|
||||
- AUTOMATIC FRAME DELAY: Added slowmotion resiliency
|
||||
- AUTOMATIC FRAME DELAY: Added string representation for seeing the current effective delay without opening statistics
|
||||
- AUTOMATIC FRAME DELAY: Added "ms" to logging and "(ms)" to label just like in Audio Latency
|
||||
- GENERAL: Don't bake in OpenAL and libcaca by default unless explicitly enabled with configure switch.
|
||||
- GENERAL: Reduce amount of strlen calls
|
||||
- GENERAL: Reduce or simply sin/cosf calls
|
||||
- GFX: Fix readability and precision issues in aspectratio_lut
|
||||
- GFX: Add option to manually enable/disable automatic refresh rate switching
|
||||
- GFX: Enable automatic configuration of 'VSync Swap Interval'
|
||||
- GFX/FONT/FREETYPE: Use FT_New_Memory_Face - first read it from file to memory beforehand -
|
||||
this solves an asset extraction issue when selecting 'Update Assets' - apparently FT_New_Face keeps an open file handle to the font file which
|
||||
prevents it from being overwritten/deleted while the program is still running.
|
||||
- GFX/THUMBNAILS: Thumbnail aspect ratio fix
|
||||
- GFX/THREADED VIDEO: Optimizations, fixes and cleanups
|
||||
- GFX/VIDEO FILTERS: Add Upscale_240x160-320x240 video filter with 'mixed' method
|
||||
- GLSLANG: Fix compilation with ./configure --disable-builtinglslang - was missing linking against -lMachineIndependent and -lGenericCodeGen static libs
|
||||
- INPUT: Fix off by one error for input_block_timeout setting. Also default to 0 for this setting (pretty massive performance gain)
|
||||
- INPUT: Analog button mapping fixes
|
||||
- INPUT/HID/OSX: Fix DualShock3 support
|
||||
- INPUT/HID/LINUX: (qb) Disable HAVE_HID by default for now for Linux as long as there are no working backends for both
|
||||
- INPUT/HID/WINDOWS: (qb) Disable HAVE_HID by default for now for Windows as long as there are no working backends for both
|
||||
- INPUT/HID/WIIU: Fix DualShock3 support
|
||||
- INPUT/OVERLAY: Block pointer input when overlay is pressed
|
||||
- INPUT/REMAPPING: input_remapping_save_file - existing remapping file was needlessly reloaded
|
||||
- INPUT/REMAPPING: Add option to disable automatic saving of input remap files
|
||||
- INPUT/LINUX/UDEV: Fix lightgun scaling on Y axis
|
||||
- INPUT/LINUX/X11/LED: Add LED keyboard driver
|
||||
- INPUT/WINDOWS/LED: LED keyboard driver cleanup
|
||||
- INPUT/WINDOWS/WINRAW: Clear key states when unfocused
|
||||
- INPUT/WINDOWS/WINRAW: Fix pointer device position
|
||||
- IOS: iOS app icon fixes & revisions
|
||||
- LIBRETRO/SAVESTATES: Implement an api call for context awareness
|
||||
- LOCALIZATION: Updates
|
||||
- LOCALIZATION: Add Catalan language option
|
||||
- LOCALIZATION: Fix some bad localization
|
||||
- LINUX: Make memfd_create call more backwards compatible by calling it through syscall - on older systems, you'll have to include linux/memfd.h for the MFD_ defines, and call memfd_create() via the the syscall(2) wrapper (and include unistd.h and sys/syscall.h for it work). We exclude linux/memfd.h header include because we already provide the MFD_ defines in case they are missing
|
||||
- LINUX/MALI FBDEV: Fix assertion failed on video threaded switch
|
||||
- MENU: Menu paging navigation adjustments
|
||||
- MENU: New Menu Items for disabling Info & Search buttons in the menu
|
||||
- MENU: Allow the user to use volume up/down/mute hotkeys from within the menu
|
||||
- MENU: Add missing sublabels for non-running Quick Menu
|
||||
- MENU: Reorganize Quick Menu Information
|
||||
- MENU: Savestate thumbnails - Savestate slot reset action
|
||||
- MENU: Allow changing savestate slots with left/right on save/load
|
||||
- MENU: Add 'Ago' to playlist last played styles
|
||||
- MENU: Add proper icons for shader items
|
||||
- MENU/MATERIALUI: Add icon for 'Download Thumbnails'
|
||||
- MENU/XMB: Add options for hiding header and horizontal title margin
|
||||
- MENU/XMB: Dynamic wallpaper fixes
|
||||
- MENU/XMB: Add Daite XMB Icon Theme
|
||||
- MENU/XMB/OZONE: Savestate thumbnail aspect ratio
|
||||
- MENU/XMB/OZONE: Core option category icon refinements
|
||||
- MENU/XMB/OZONE: Fullscreen thumbnail browsing
|
||||
- MENU/XMB/OZONE: Add playlist icons under 'Load Content'
|
||||
- MENU/XMB/OZONE: Thumbnail improvements
|
||||
- MENU/XMB/OZONE: Savestate thumbnail fullscreen + dropdown
|
||||
- MENU/XMB/OZONE: Prevent unnecessary thumbnail requests when scrolling through playlists
|
||||
- MENU/OZONE: Fix playlist thumbnail mouse hover after returning from Quick Menu
|
||||
- MENU/OZONE: Thumbnail visibility corrections
|
||||
- MENU/OZONE: Playlist metadata reformat
|
||||
- MENU/OZONE: Savestate thumbnail fixes
|
||||
- MENU/OZONE: Add savestate thumbnails
|
||||
- MENU/OZONE: Header icon spacing adjustment
|
||||
- MENU/RGUI: Savestate thumbnails
|
||||
- MENU/SETTINGS: Turn Advanced Settings on by default, this entire filtering of settings will need a complete rethink anyways
|
||||
- MENU/WIDGETS: Widget color + position adjustments
|
||||
- MIYOO: Exclude unused HAVE_HID for Miyoo
|
||||
- MIYOO: Enable screenshots
|
||||
- MIYOO: Enable rewind
|
||||
- NETWORK: Allow MITM server selection on OK callback
|
||||
- NETWORK: Replace socket_select calls
|
||||
- NETWORK: Implement binary network streams
|
||||
- NETWORK: Poll support
|
||||
- NETWORK: Check connect errno for successful connection
|
||||
- NETWORK: Get rid of the timeout_enable parameter for socket_connect
|
||||
- NETWORK: Fix getnameinfo_retro's port value for HAVE_SOCKET_LEGACY platforms
|
||||
- NETWORK: Define inet_ntop and inet_pton for older Windows versions
|
||||
- NETWORK: Define isinprogress function
|
||||
- NETWORK/NATT: Move natt files to "network"
|
||||
- NETWORK/NETWORK STREAMS: Add function netstream_eof
|
||||
- NETWORK/NETPLAY: Fix game CRC parsing
|
||||
- NETWORK/NETPLAY: Disable and hide stateless mode
|
||||
- NETWORK/NETPLAY: Change default for input sharing to "no sharing"
|
||||
- NETWORK/NETPLAY: Enforce a timeout during connection
|
||||
- NETWORK/NETPLAY: Disallow clients from loading states and resetting
|
||||
- NETWORK/NETPLAY: Special saves directory for client
|
||||
- NETWORK/NETPLAY: Ensure current content is reloaded before joining a host
|
||||
- NETWORK/NETPLAY: Fix client info devices index
|
||||
- NETWORK/NETPLAY: Fix input for some cores when hosting
|
||||
- NETWORK/NETPLAY: Memory leak fixes
|
||||
- NETWORK/NETPLAY: Force a core update when starting netplay
|
||||
- NETWORK/NETPLAY: Fix NAT traversal announce for HAVE_SOCKET_LEGACY platforms
|
||||
- NETWORK/NETPLAY: Refactor fork arguments
|
||||
- NETWORK/NETPLAY: Fix content reload deadlocks on static core platforms
|
||||
- NETWORK/NETPLAY: Disallow netplay start when content is not loaded for static core platforms
|
||||
- NETWORK/NETPLAY: Show client slowdown information
|
||||
- NETWORK/NETPLAY: Improve check frames menu entry
|
||||
- NETWORK/NETPLAY: Do not try to receive new data if the data is in the buffer
|
||||
- NETWORK/NETPLAY: Copy data on receive, even if the buffer is full
|
||||
- NETWORK/NETPLAY: Fix lobby sublabel CRC display on some platforms
|
||||
- NETWORK/NETPLAY: Support for customizing chat colors
|
||||
- NETWORK/NETPLAY: Small launch compatibility patch adjustments
|
||||
- NETWORK/NETPLAY: Support for banning clients
|
||||
- NETWORK/NETPLAY: Minor tweaks to the find content task
|
||||
- NETWORK/NETPLAY: Support for gathering client info and kicking
|
||||
- NETWORK/NETPLAY: Fix possible deadlock
|
||||
- NETWORK/NETPLAY: Initialize client's allow_pausing to true
|
||||
- NETWORK/NETPLAY: Disable netplay for unsupported cores - with stateless mode being disabled for now, there is no reason not to include this. Refuse to initialize netplay when the current core is not supported (no proper savestates support)
|
||||
- NETWORK/NETPLAY/DISCOVERY: Ensure fixed width ints on packet struct
|
||||
- NETWORK/NETPLAY/DISCOVERY: Support for IPv4 tunneling (6to4)
|
||||
- NETWORK/NETPLAY/DISCOVERY/TASKS: Netplay/LAN Discovery Task refactor - aims to prevent blocking the main thread while awaiting for the LAN discovery timeout; This is accomplished by moving the whole discovery functionality into its task and using a non-blocking timer to finish the task. Also fixes discovery sockets not being made non-blocking, which could cause the main thread to hang for very long periods of time every pre-frame.
|
||||
- NETWORK/NETPLAY/TASKS: Find content task refactor - fixes many issues along the way, including a couple of nasty memory leaks that would leak thousands of bytes each time the task ran. It also expands the original concept by matching currently run content by filename (CRC matching is always performed first though).
|
||||
- NETWORK/NETPLAY/TASKS: Find content task refactor - Ensure CRC32 is 8 characters long
|
||||
- NETWORK/NETPLAY/LOBBY: Add setting for filtering out rooms with non-installed cores
|
||||
- NETWORK/NETPLAY/LOBBY: Hide older (incompatible) rooms
|
||||
- NETWORK/NETPLAY/LOBBY: Add a toggleable filter for passworded rooms. In addition, move lobby filters into its own submenu for better organization.
|
||||
- NETWORK/NETPLAY/MENU: Chat supported info for the host kick submenu
|
||||
- NETWORK/NETPLAY/MENU: Localize relay servers
|
||||
- NETWORK/NETPLAY/MENU: Host Ban Submenu
|
||||
- NETWORK/NETPLAY/MENU: Add client devices info to the kick sub-menu
|
||||
- NETWORK/NETPLAY/MENU: Path: Netplay -> Host -> Kick Client - Allows the host to kick clients. Allows the host to view client information: connected clients (names), status (playing/spectating) and ping.
|
||||
- NETWORK/NETPLAY/VITA: Add net_ifinfo support
|
||||
- NETWORK/NETPLAY/VITA: Enable partial LAN discovery
|
||||
- NETWORK/NETPLAY/VITA: Change default UDP port to 19492
|
||||
- NETWORK/NETPLAY/VITA: Do not multiply negative timeout values
|
||||
- NETWORK/NETPLAY/VITA: Fix epoll's timeout parameter
|
||||
- NETWORK/NETPLAY/VITA: Launch compatibility patch
|
||||
- NETWORK/NETPLAY/3DS: Launch compatibility patch
|
||||
- NETWORK/NETPLAY/3DS: Adapt POLL for 3DS platform
|
||||
- NETWORK/NETPLAY/PS3: Launch compatibility patch
|
||||
- NETWORK/NETPLAY/WII: Enable net_ifinfo for some features. In practice, this only allows the netplay's UPnP task to succeed on the Wii.
|
||||
- NETWORK/NETPLAY/WIIU: Launch compatibility patch
|
||||
- NETWORK/NETPLAY/SWITCH: Launch compatibility patch
|
||||
- NETWORK/UPNP: Attempt support for remaining platforms
|
||||
- NETWORK/UPNP: Support for IPv4 tunneling
|
||||
- ODROID GO2: Increase DEFAULT_MAX_PADS to 8 for ODROIDGO2, since that impacts the RG351[X] consoles. The RG351[X] have a USB host controller and can have an arbitrary number of USB gamepads.
|
||||
- ONLINE UPDATER: Online Updater menu reorganizing
|
||||
- OSX: Fixed items of system top menu bar on macOS
|
||||
- OSX: Revision to macOS app icon set
|
||||
- PLAYLISTS: Ensure history list will contain CRC32
|
||||
- PLAYLISTS: Fix CRC32 comparison - as state->content_crc has "|crc" suffix.
|
||||
- PS4/ORBIS: Orbis/PS4 Support using OrbisDev toolchain
|
||||
- PS4/ORBIS: Update xxHash dependecy
|
||||
- PS4/ORBIS: Shader cache
|
||||
- RETROFW: Exclude unused HAVE_HID for RetroFW
|
||||
- RETROFW: Support battery indicator on RetroFW
|
||||
- RETROFW: Enable menu toggle button on retrofw devices
|
||||
- SHADERS: Shader Preset Loading of Multiple additional #references lines for settings
|
||||
- SHADERS: Shader Load Extra Parameter Reference Files - this adds the ability to put additional #reference lines inside shader presets which will load additional settings. The first reference in the preset still needs to point at a chain of presets which ends with a shader chain, and subsequent #reference lines will load presets which only have parameter values adjustment. This allows presets to be made with a modular selection of settings. For example with the Mega Bezel one additional reference could point at a preset which contained settings for Night mode vs Day mode, and another reference could point to a preset which contained settings for how much the screen should be zoomed in.
|
||||
- SHADERS/MENU: Increase shader scale max value
|
||||
- SCANNER/DC: Fix Redump bin/cue scan for some DC games
|
||||
- SCANNER/GC/WII: Add RVZ/WIA scan support for GC/Wii
|
||||
- SCANNER/PS1: Improved success rate of Serial scanning on PS1 by adding support for the xx.xxx format
|
||||
- SCANNER/PS1: Changed return value of detect_ps1_game function to actuially return a failure when the Serial couldn't be extracted. Scanner will then fallback on crc check, and usually ends up finding the games in the database.
|
||||
- SWITCH: Enable RWAV (WAV audio file) support
|
||||
- STRING: Do not assume char is unsigned
|
||||
- TASKS: More thread-awareness in task callbacks
|
||||
- TASKS: Fix race condition at task_queue_wait
|
||||
- TVOS: Revised tvOS icons w/ updated alien.
|
||||
- VFS: Fix various VFS / file stream issues
|
||||
- VULKAN: Fix more validation errors
|
||||
- VULKAN: Attempt to fix validation errors with HDR swapchain. Always use final render pass type equal to swapchain format. Use more direct logic to expose if filter chain emits HDR10 color space or not
|
||||
- VULKAN/ANDROID: Honor SUBOPTIMAL on non-Android since you'd want to recreate swapchains then. On Android it can be promoted to SUCCESS.
|
||||
SUBOPTIMAL_KHR can happen there when rotation (pre-rotate) is wrong.
|
||||
- VULKAN/DEBUG: Automatically mark buffer/images/memory with names
|
||||
- VULKAN/DEBUG: Move over to VK_EXT_debug_utils. Debug marker is deprecated years ago.
|
||||
- VULKAN/HDR: Fix leak of HDR UBO buffer
|
||||
- VULKAN/BFI: Fix BFI (Black Frame Insertion) regression
|
||||
- WINDOWS: Fix exclusive fullscreen video refresh rate when vsync swap interval is not equal to one - refresh rate in exclusive fullscreen mode was being incorrectly multiplied by vsync swap interval, breaking swap interval functionality at the gfx driver level
|
||||
- WIN32: Do optimization for Windows where we only update the title with SetWindowText when the previous title differs from the current title
|
||||
- WIN32: Skip console attach when logging to file
|
||||
- WIN32: Remove black margins with borderless non-fullscreen window
|
||||
- WIN32/TASKBAR: Release ITaskbarList3 on failed HrInit - pointer wasn't NULL'd, thus set_window_progress would cause weird behavior
|
||||
- WII/GX: Fix potential datarace
|
||||
- WIIU: Implement sysconf and __clear_cache
|
||||
- WIIU: Add OS memory mapping imports
|
||||
- UWP: Added launch protocol arg 'forceExit' so a frontend can tell an already-running RetroArch UWP instance to quit.
|
||||
- UWP: Enable core downloader/updater
|
||||
- UWP: Remove copy permissions as its inefficient as we can just directly assign the new ACL and that works
|
||||
- Xbox/UWP: Remove expandedResources
|
||||
- Xbox/UWP: UWP OnSuspending crash fix
|
||||
- Xbox/UWP: Enable savestate file compression by default for UWP/Xbox - got told there are no more issues with it
|
||||
- Xbox/UWP: Add support for 4k to angle on xbox for MSVC2017 build
|
||||
|
||||
# 1.10.3
|
||||
- ANDROID: Decouple Play Core dependency to bring app into compliance for F-Droid
|
||||
- ANDROID: Allow audio playback capture on android
|
||||
- AI/SERVICE: Disable AI Service setting by default
|
||||
- BLUETOOTH/LAKKA: bluetoothctl: add / modify pairing steps
|
||||
- CHEEVOS: Disallow manual frame delay setting in Hardcore Mode
|
||||
- DATABASE: Serial scanning for Wii now includes WBFS
|
||||
- INPUT: Allow proper descriptor declaration for analog triggers
|
||||
- INPUT/MAPPING: Fix offset + crash when clearing input port binds
|
||||
- INPUT/MAPPING: Fix saving of 'Analog to Digital Type' when configuration overrides are used
|
||||
- INPUT/MAPPING: Fix saving of 'Analog to Digital Type' when configuration overrides are used
|
||||
- LOCALIZATION: Add Valencian language option
|
||||
- LOCALIZATION: Updates
|
||||
- MENU/SETTINGS: Move 'Show Menu Bar' under 'Windowed Mode' settings
|
||||
- MENU/SETTINGS: Add sublabels for 'Subsystems' and 'Input Deadzone/Sensitivity'
|
||||
- MENU/SETTINGS: Move 'On-Screen Notifications' to top
|
||||
- MENU/XMB: Unified the shadow alpha value to a slightly darker one for better readability
|
||||
- MENU/XMB: Corrected the option label and sublabel for actual behavior
|
||||
- MIYOO: Enable ALSA audio driver and default to it
|
||||
- PSP: Take out extra languages/localization, adds about 4/5MB to the binary, and RAM is limited on PSP (32MB and 64MB RAM models)
|
||||
- STATIC PLATFORMS: Populate all history list metadata when launching content from playlists
|
||||
- STEAM: Introduce Steam Rich Presence
|
||||
- VIDEO: Fast-Forward Frameskip improvement
|
||||
- VIDEO/THREADED: Stability fixes
|
||||
- WINDOWS/WINRAW: Fix multiple light guns
|
||||
- WIIU: Fix USB get_device_name(), don't truncate to three chars
|
||||
|
||||
# 1.10.2
|
||||
- 3DS: Add a menu toggle for switching between old and new 3DS speeds, located in the 'Power Management' menu. Enabled by default, hidden on old 3DS devices.
|
||||
- AUDIO/MIXER: Free audio voices properly
|
||||
|
||||
+12
-1
@@ -1,3 +1,6 @@
|
||||
Refer also to this page for more information -
|
||||
https://docs.libretro.com/development/coding-standards/
|
||||
|
||||
Struct ordering
|
||||
---------------
|
||||
|
||||
@@ -24,7 +27,7 @@ For POD-types, try to order structs as follows (first to last):
|
||||
* enum (4 bytes)
|
||||
* int16_t (2 bytes)
|
||||
* char (1 byte)
|
||||
* bool (1 byte)
|
||||
* bool (1 byte)
|
||||
|
||||
[1] PS3 uses 4 byte pointers despite having a 64bit processor
|
||||
|
||||
@@ -107,3 +110,11 @@ VLA (Variable Length Array)
|
||||
---------------------------
|
||||
Do not use VLAs (Variable Length Array) in C source files. These are not
|
||||
C89-compliant.
|
||||
|
||||
Miscellaneous
|
||||
-------------
|
||||
- Brace usage follows "Allman style". The brace associated with a control statement is placed on the following line,
|
||||
indented to the same level as the control statement.
|
||||
Statements within the braces are indented to the next level.
|
||||
- A single statement block must not include brackets (unless the block uses a macro that expands into multiple lines)
|
||||
- If possible, avoid 'while (true)' and use 'for (;;)' instead
|
||||
+43
-25
@@ -273,6 +273,7 @@ endif
|
||||
|
||||
OBJ += \
|
||||
$(LIBRETRO_COMM_DIR)/compat/fopen_utf8.o \
|
||||
$(LIBRETRO_COMM_DIR)/compat/compat_strldup.o \
|
||||
$(LIBRETRO_COMM_DIR)/lists/file_list.o \
|
||||
$(LIBRETRO_COMM_DIR)/lists/dir_list.o \
|
||||
$(LIBRETRO_COMM_DIR)/file/retro_dirent.o \
|
||||
@@ -281,6 +282,7 @@ OBJ += \
|
||||
$(LIBRETRO_COMM_DIR)/streams/file_stream_transforms.o \
|
||||
$(LIBRETRO_COMM_DIR)/streams/interface_stream.o \
|
||||
$(LIBRETRO_COMM_DIR)/streams/memory_stream.o \
|
||||
$(LIBRETRO_COMM_DIR)/streams/network_stream.o \
|
||||
$(LIBRETRO_COMM_DIR)/vfs/vfs_implementation.o
|
||||
|
||||
OBJ += \
|
||||
@@ -306,10 +308,6 @@ else ifneq ($(findstring Darwin,$(OS)),)
|
||||
OBJ += $(LIBRETRO_COMM_DIR)/file/nbio/nbio_unixmmap.o
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET), retroarch_orbis)
|
||||
OBJ += $(LIBRETRO_COMM_DIR)/file/nbio/nbio_orbis.o
|
||||
endif
|
||||
|
||||
OBJ += \
|
||||
$(LIBRETRO_COMM_DIR)/file/nbio/nbio_intf.o \
|
||||
$(LIBRETRO_COMM_DIR)/file/file_path.o \
|
||||
@@ -474,7 +472,11 @@ ifeq ($(HAVE_LANGEXTRA), 1)
|
||||
intl/msg_hash_id.o \
|
||||
intl/msg_hash_sv.o \
|
||||
intl/msg_hash_uk.o \
|
||||
intl/msg_hash_cs.o
|
||||
intl/msg_hash_cs.o \
|
||||
intl/msg_hash_val.o \
|
||||
intl/msg_hash_ca.o \
|
||||
intl/msg_hash_en.o \
|
||||
intl/msg_hash_hu.o
|
||||
endif
|
||||
|
||||
ifneq ($(HAVE_GETOPT_LONG), 1)
|
||||
@@ -534,17 +536,10 @@ ifeq ($(HAVE_QT), 1)
|
||||
MOC_HEADERS += ui/drivers/ui_qt.h \
|
||||
ui/drivers/qt/ui_qt_load_core_window.h \
|
||||
ui/drivers/qt/gridview.h \
|
||||
ui/drivers/qt/coreoptionsdialog.h \
|
||||
ui/drivers/qt/filedropwidget.h \
|
||||
ui/drivers/qt/coreinfodialog.h \
|
||||
ui/drivers/qt/playlistentrydialog.h \
|
||||
ui/drivers/qt/viewoptionsdialog.h
|
||||
ui/drivers/qt/qt_dialogs.h \
|
||||
ui/drivers/qt/qt_widgets.h
|
||||
ifeq ($(HAVE_MENU), 1)
|
||||
ifeq ($(HAVE_SHADERS_COMMON), 1)
|
||||
MOC_HEADERS += ui/drivers/qt/shaderparamsdialog.h
|
||||
endif
|
||||
MOC_HEADERS += ui/drivers/qt/settingswidgets.h \
|
||||
ui/drivers/qt/qt_options.h
|
||||
MOC_HEADERS += ui/drivers/qt/qt_options.h
|
||||
endif
|
||||
|
||||
DEFINES += -DHAVE_MAIN
|
||||
@@ -877,8 +872,10 @@ ifeq ($(HAVE_ALSA), 1)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_THREADS), 1)
|
||||
OBJ += audio/drivers/alsathread.o
|
||||
ifneq ($(MIYOO), 1)
|
||||
ifeq ($(HAVE_THREADS), 1)
|
||||
OBJ += audio/drivers/alsathread.o
|
||||
endif
|
||||
endif
|
||||
|
||||
LIBS += $(ALSA_LIBS)
|
||||
@@ -976,6 +973,7 @@ OBJ += $(LIBRETRO_COMM_DIR)/audio/conversion/s16_to_float.o \
|
||||
$(LIBRETRO_COMM_DIR)/audio/conversion/float_to_s16.o
|
||||
|
||||
ifeq ($(HAVE_RWAV), 1)
|
||||
DEFINES += -DHAVE_RWAV
|
||||
OBJ += $(LIBRETRO_COMM_DIR)/formats/wav/rwav.o
|
||||
endif
|
||||
|
||||
@@ -1385,6 +1383,8 @@ ifeq ($(HAVE_HID), 1)
|
||||
input/connect/connect_nesusb.o \
|
||||
input/connect/connect_snesusb.o \
|
||||
input/connect/connect_wiiupro.o \
|
||||
input/connect/connect_kade.o \
|
||||
input/connect/connect_zerodelay_dragonrise.o \
|
||||
input/connect/connect_wiiugca.o
|
||||
endif
|
||||
|
||||
@@ -1739,7 +1739,8 @@ ifeq ($(HAVE_D3D9), 1)
|
||||
OBJ += gfx/drivers_font/d3d_w32_font.o
|
||||
ifeq ($(HAVE_CG), 1)
|
||||
LIBS += -lcgD3D9
|
||||
OBJ += gfx/drivers_renderchain/d3d9_cg_renderchain.o
|
||||
OBJ += gfx/drivers/d3d9cg.o
|
||||
OBJ += gfx/drivers_display/gfx_display_d3d9cg.o
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -1809,9 +1810,7 @@ endif
|
||||
|
||||
ifeq ($(HAVE_D3D9), 1)
|
||||
DEFINES += -DHAVE_D3D9
|
||||
OBJ += gfx/drivers/d3d9.o
|
||||
OBJ += gfx/common/d3d9_common.o
|
||||
OBJ += gfx/drivers_display/gfx_display_d3d9.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_D3D_COMMON), 1)
|
||||
@@ -1832,7 +1831,8 @@ endif
|
||||
|
||||
ifeq ($(HAVE_HLSL),1)
|
||||
DEFINES += -DHAVE_HLSL
|
||||
OBJ += gfx/drivers_renderchain/d3d9_hlsl_renderchain.o
|
||||
OBJ += gfx/drivers/d3d9hlsl.o
|
||||
OBJ += gfx/drivers_display/gfx_display_d3d9hlsl.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_SLANG),1)
|
||||
@@ -1877,7 +1877,6 @@ ifeq ($(HAVE_BUILTINGLSLANG), 1)
|
||||
$(wildcard $(DEPS_DIR)/glslang/glslang/glslang/MachineIndependent/*.cpp) \
|
||||
$(wildcard $(DEPS_DIR)/glslang/glslang/glslang/MachineIndependent/preprocessor/*.cpp) \
|
||||
$(DEPS_DIR)/glslang/glslang/glslang/OSDependent/$(GLSLANG_PLATFORM)/ossource.cpp
|
||||
|
||||
ifneq ($(findstring Win32,$(OS)),)
|
||||
DEFINES += -DENABLE_HLSL
|
||||
GLSLANG_SOURCES += $(wildcard $(DEPS_DIR)/glslang/glslang/hlsl/*.cpp)
|
||||
@@ -1888,6 +1887,8 @@ else ifeq ($(HAVE_GLSLANG),1)
|
||||
|
||||
# The order of these libs are somewhat specific
|
||||
LIBS += $(GLSLANG_LIBS) \
|
||||
$(GLSLANG_MACHINEINDEPENDENT_LIBS) \
|
||||
$(GLSLANG_GENERICCODEGEN_LIBS) \
|
||||
$(GLSLANG_OSDEPENDENT_LIBS) \
|
||||
$(GLSLANG_OGLCOMPILER_LIBS) \
|
||||
$(GLSLANG_HLSL_LIBS) \
|
||||
@@ -1898,6 +1899,7 @@ endif
|
||||
|
||||
ifeq ($(HAVE_GLSLANG_COMMON), 1)
|
||||
DEFINES += -DHAVE_GLSLANG
|
||||
OBJ += $(GLSLANG_SOURCES_C:.c=.o)
|
||||
OBJ += $(GLSLANG_SOURCES:.cpp=.o)
|
||||
endif
|
||||
|
||||
@@ -2110,8 +2112,8 @@ ifeq ($(HAVE_NETWORKING), 1)
|
||||
$(LIBRETRO_COMM_DIR)/net/net_http.o \
|
||||
$(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/natt.o \
|
||||
network/net_http_special.o \
|
||||
tasks/task_http.o \
|
||||
tasks/task_netplay_lan_scan.o \
|
||||
@@ -2129,7 +2131,8 @@ ifeq ($(HAVE_NETWORKING), 1)
|
||||
OBJ += $(LIBRETRO_COMM_DIR)/net/net_socket_ssl_mbed.o
|
||||
endif
|
||||
|
||||
ifneq ($(HAVE_SOCKET_LEGACY),1)
|
||||
ifeq ($(HAVE_IFINFO), 1)
|
||||
DEFINES += -DHAVE_IFINFO
|
||||
OBJ += $(LIBRETRO_COMM_DIR)/net/net_ifinfo.o
|
||||
endif
|
||||
|
||||
@@ -2223,6 +2226,7 @@ ifeq ($(HAVE_NETWORKING), 1)
|
||||
|
||||
ifeq ($(HAVE_DISCORD), 1)
|
||||
NEED_CXX_LINKER = 1
|
||||
HAVE_PRESENCE = 1
|
||||
DEFINES += -DHAVE_DISCORD
|
||||
INCLUDE_DIRS += -Ideps/discord-rpc/include
|
||||
|
||||
@@ -2393,7 +2397,8 @@ ifeq ($(HAVE_STATIC_VIDEO_FILTERS), 1)
|
||||
gfx/video_filters/upscale_1_5x.o \
|
||||
gfx/video_filters/upscale_256x_320x240.o \
|
||||
gfx/video_filters/picoscale_256x_320x240.o \
|
||||
gfx/video_filters/upscale_240x160_320x240.o
|
||||
gfx/video_filters/upscale_240x160_320x240.o \
|
||||
gfx/video_filters/upscale_mix_240x160_320x240.o
|
||||
endif
|
||||
|
||||
ifeq ($(WANT_IOSUHAX), 1)
|
||||
@@ -2438,6 +2443,10 @@ ifneq ($(findstring Win32,$(OS)),)
|
||||
OBJ += led/drivers/led_win32_keyboard.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_X11), 1)
|
||||
OBJ += led/drivers/led_x11_keyboard.o
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_VITAGLES), 1)
|
||||
DEFINES += -DHAVE_VITAGLES
|
||||
INCLUDE_DIRS += -I$(DEPS_DIR)/Pigs-In-A-Blanket/include
|
||||
@@ -2460,11 +2469,20 @@ endif
|
||||
|
||||
### Steam integration using mist
|
||||
ifeq ($(HAVE_MIST), 1)
|
||||
HAVE_PRESENCE = 1
|
||||
DEFINES += -DHAVE_MIST
|
||||
INCLUDE_DIRS += -I$(MIST_PATH)/include
|
||||
LDFLAGS += -L$(MIST_PATH) -lmist
|
||||
OBJ += steam/steam.o tasks/task_steam.o
|
||||
endif
|
||||
|
||||
### Shared rich presence code for Discord and Steam
|
||||
|
||||
ifeq ($(HAVE_PRESENCE), 1)
|
||||
DEFINES += -DHAVE_PRESENCE
|
||||
OBJ += network/presence.o
|
||||
endif
|
||||
|
||||
##################################
|
||||
### Classic Platform specifics ###
|
||||
###############WIP################
|
||||
|
||||
+34
-20
@@ -4,6 +4,7 @@ LIBRETRO =
|
||||
DEBUG = 0
|
||||
CONSOLE_LOG = 0
|
||||
GRIFFIN_BUILD = 1
|
||||
HAVE_STATIC_DUMMY ?= 0
|
||||
WHOLE_ARCHIVE_LINK = 0
|
||||
BUILD_3DSX = 1
|
||||
BUILD_3DS = 0
|
||||
@@ -52,9 +53,9 @@ endif
|
||||
DEFINES :=
|
||||
ifeq ($(GRIFFIN_BUILD), 1)
|
||||
OBJ += griffin/griffin.o
|
||||
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_CONFIGFILE -DHAVE_RGUI -DHAVE_XMB -DHAVE_MATERIALUI -DHAVE_LIBRETRODB -DHAVE_CC_RESAMPLER
|
||||
DEFINES += -DHAVE_GRIFFIN=1 -DHAVE_MENU -DHAVE_CONFIGFILE -DHAVE_RGUI -DHAVE_XMB -DHAVE_LIBRETRODB -DHAVE_CC_RESAMPLER
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_7ZIP -D_7ZIP_ST -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA
|
||||
DEFINES += -DHAVE_NETWORKING -DHAVE_CHEEVOS -DRC_DISABLE_LUA -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_CORES
|
||||
DEFINES += -DHAVE_NETWORKING -DHAVE_IFINFO -DHAVE_CHEEVOS -DRC_DISABLE_LUA -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_CORES
|
||||
#DEFINES += -DHAVE_UPDATE_ASSETS
|
||||
DEFINES += -DHAVE_PATCH -DHAVE_RWAV
|
||||
DEFINES += -DHAVE_SCREENSHOTS
|
||||
@@ -79,7 +80,6 @@ else
|
||||
HAVE_7ZIP = 1
|
||||
HAVE_BUILTINZLIB = 1
|
||||
HAVE_LIBRETRODB = 1
|
||||
HAVE_MATERIALUI = 1
|
||||
HAVE_XMB = 1
|
||||
HAVE_STATIC_VIDEO_FILTERS = 1
|
||||
HAVE_STATIC_AUDIO_FILTERS = 1
|
||||
@@ -89,6 +89,7 @@ else
|
||||
HAVE_AUDIOMIXER = 1
|
||||
HAVE_RWAV = 1
|
||||
#HAVE_NETWORKING = 1
|
||||
#HAVE_IFINFO = 1
|
||||
#HAVE_CHEEVOS = 1
|
||||
#HAVE_SOCKET_LEGACY = 1
|
||||
HAVE_THREADS = 1
|
||||
@@ -151,13 +152,17 @@ LIBDIRS := -L. -L$(CTRULIB)/lib
|
||||
|
||||
ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -marm -mfpu=vfp -mtp=soft
|
||||
|
||||
CFLAGS += -mword-relocations \
|
||||
-fomit-frame-pointer -ffast-math \
|
||||
-Werror=implicit-function-declaration \
|
||||
$(ARCH)
|
||||
CFLAGS += -mword-relocations \
|
||||
-fomit-frame-pointer -ffast-math \
|
||||
-Werror=implicit-function-declaration \
|
||||
$(ARCH)
|
||||
|
||||
#CFLAGS += -Wall
|
||||
CFLAGS += -DARM11 -D_3DS
|
||||
CFLAGS += -DARM11 -D_3DS
|
||||
|
||||
ifeq ($(strip $(USE_CTRULIB_2)),1)
|
||||
CFLAGS += -D__3DS__
|
||||
endif
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
CFLAGS += -O0 -g
|
||||
@@ -179,12 +184,12 @@ ifeq ($(WHOLE_ARCHIVE_LINK), 1)
|
||||
endif
|
||||
|
||||
CFLAGS += -I. \
|
||||
-Ideps \
|
||||
-Ideps/7zip \
|
||||
-Ideps/stb \
|
||||
-Ideps/rcheevos/include \
|
||||
-Ilibretro-common/include \
|
||||
-Ilibretro-common/include/compat/zlib
|
||||
-Ideps \
|
||||
-Ideps/7zip \
|
||||
-Ideps/stb \
|
||||
-Ideps/rcheevos/include \
|
||||
-Ilibretro-common/include \
|
||||
-Ilibretro-common/include/compat/zlib
|
||||
|
||||
CFLAGS += -DRARCH_INTERNAL -DRARCH_CONSOLE
|
||||
CFLAGS += -DHAVE_DSP_FILTER
|
||||
@@ -192,14 +197,23 @@ CFLAGS += -DHAVE_VIDEO_FILTER
|
||||
CFLAGS += -DHAVE_FILTERS_BUILTIN $(DEFINES)
|
||||
CFLAGS += -DHAVE_CHEATS
|
||||
|
||||
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
|
||||
|
||||
ASFLAGS := -g $(ARCH) -O3
|
||||
LDFLAGS += -specs=ctr/3dsx_custom.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
||||
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
|
||||
|
||||
ASFLAGS := -g $(ARCH) -O3
|
||||
LDFLAGS += -specs=ctr/3dsx_custom.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
||||
CFLAGS += -std=gnu99 -ffast-math
|
||||
|
||||
LIBS := $(WHOLE_START) -lretro_ctr $(WHOLE_END) -lm
|
||||
LIB_CORE :=
|
||||
LIB_CORE_FULL :=
|
||||
|
||||
ifeq ($(HAVE_STATIC_DUMMY),1)
|
||||
DEFINES += -DHAVE_STATIC_DUMMY
|
||||
else
|
||||
LIB_CORE += -lretro_ctr
|
||||
LIB_CORE_FULL += libretro_ctr.a
|
||||
endif
|
||||
|
||||
LIBS := $(WHOLE_START) $(LIB_CORE) $(WHOLE_END) -lm
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
LIBS += -lctrud
|
||||
@@ -225,7 +239,7 @@ all: $(TARGET)
|
||||
|
||||
$(TARGET): $(TARGET_3DSX) $(TARGET_3DS) $(TARGET_CIA)
|
||||
$(TARGET).3dsx: $(TARGET).elf
|
||||
$(TARGET).elf: $(OBJ) libretro_ctr.a
|
||||
$(TARGET).elf: $(OBJ) $(LIB_CORE_FULL)
|
||||
|
||||
PREFIX := $(DEVKITARM)/bin/arm-none-eabi-
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ OBJ := ctr/ctr_system.o \
|
||||
libretro-common/lists/dir_list.o \
|
||||
libretro-common/file/retro_dirent.o \
|
||||
libretro-common/compat/compat_strl.o \
|
||||
libretro-common/compat/compat_strldup.o \
|
||||
libretro-common/file/config_file.o \
|
||||
libretro-common/streams/file_stream.o \
|
||||
libretro-common/vfs/vfs_implementation.o \
|
||||
@@ -90,6 +91,10 @@ CFLAGS += -mword-relocations \
|
||||
#CFLAGS += -Wall
|
||||
CFLAGS += -DARM11 -D_3DS
|
||||
|
||||
ifeq ($(strip $(USE_CTRULIB_2)),1)
|
||||
CFLAGS += -D__3DS__
|
||||
endif
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
CFLAGS += -O0 -g
|
||||
else
|
||||
|
||||
@@ -69,6 +69,7 @@ HAVE_MENU_COMMON = 1
|
||||
HAVE_GFX_WIDGETS = 1
|
||||
HAVE_MMAP = 1
|
||||
HAVE_NETWORKING = 1
|
||||
HAVE_IFINFO = 1
|
||||
HAVE_OPENDINGUX_FBDEV = 1
|
||||
HAVE_OPENGL = 1
|
||||
HAVE_OPENGL1 = 0
|
||||
|
||||
+12
-2
@@ -9,6 +9,7 @@ TOPDIR ?= $(CURDIR)
|
||||
|
||||
DEBUG ?= 0
|
||||
WHOLE_ARCHIVE_LINK = 0
|
||||
HAVE_STATIC_DUMMY ?= 0
|
||||
GRIFFIN_BUILD = 0
|
||||
|
||||
OBJ :=
|
||||
@@ -53,7 +54,8 @@ HAVE_PATCH = 1
|
||||
HAVE_CHEATS = 1
|
||||
HAVE_RUNAHEAD = 1
|
||||
HAVE_NETWORKING = 0
|
||||
HAVE_NETPLAYDISCOVERY = 1
|
||||
HAVE_IFINFO = 0
|
||||
HAVE_NETPLAYDISCOVERY = 0
|
||||
HAVE_OVERLAY := 1
|
||||
HAVE_STB_FONT = 1
|
||||
HAVE_COMMAND := 1
|
||||
@@ -182,6 +184,14 @@ ifneq ($(ROMFS),)
|
||||
export NROFLAGS += --romfsdir=$(CURDIR)/$(ROMFS)
|
||||
endif
|
||||
|
||||
LIB_CORE :=
|
||||
|
||||
ifeq ($(HAVE_STATIC_DUMMY),1)
|
||||
DEFINES += -DHAVE_STATIC_DUMMY
|
||||
else
|
||||
LIB_CORE += -lretro_dos
|
||||
endif
|
||||
|
||||
DEPENDS_TMP := $(OFILES:.o=.d)
|
||||
DEPENDS := $(filter-out libretro_libnx.a,$(DEPENDS_TMP))
|
||||
|
||||
@@ -193,7 +203,7 @@ DEPENDS := $(filter-out libretro_libnx.a,$(DEPENDS_TMP))
|
||||
all : $(OUTPUT)
|
||||
|
||||
$(OUTPUT): $(OBJ)
|
||||
$(CXX) -o $@ $(LDFLAGS) $(LIBDIRS) $(OBJ) $(PLATEXTRA) -L. -lretro_dos $(LIBS)
|
||||
$(CXX) -o $@ $(LDFLAGS) $(LIBDIRS) $(OBJ) $(PLATEXTRA) -L. $(LIB_CORE) $(LIBS)
|
||||
|
||||
%.o: %.c
|
||||
$(CC) -c -o $@ $(CFLAGS) $<
|
||||
|
||||
+9
-1
@@ -1,3 +1,4 @@
|
||||
HAVE_STATIC_DUMMY ?= 0
|
||||
ifeq ($(TARGET),)
|
||||
ifeq ($(LIBRETRO),)
|
||||
TARGET := retroarch.js
|
||||
@@ -85,7 +86,14 @@ endif
|
||||
include Makefile.common
|
||||
|
||||
CFLAGS += $(DEF_FLAGS) -Ideps -Ideps/stb
|
||||
libretro = libretro_emscripten.bc
|
||||
|
||||
libretro :=
|
||||
|
||||
ifeq ($(HAVE_STATIC_DUMMY),1)
|
||||
DEFINES += -DHAVE_STATIC_DUMMY
|
||||
else
|
||||
libretro += libretro_emscripten.bc
|
||||
endif
|
||||
|
||||
ifneq ($(V), 1)
|
||||
Q := @
|
||||
|
||||
+17
-2
@@ -345,6 +345,8 @@ else ifeq ($(platform), vita)
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_VITA2D := 1
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_IFINFO := 1
|
||||
HAVE_NETPLAYDISCOVERY := 1
|
||||
HAVE_OVERLAY := 1
|
||||
HAVE_VIDEO_LAYOUT := 0
|
||||
HAVE_MATERIALUI := 1
|
||||
@@ -365,8 +367,9 @@ else ifeq ($(platform), windows_msvc6_x86)
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_NETWORKING := 0
|
||||
HAVE_NETWORK_CMD := 1
|
||||
HAVE_NETPLAYDISCOVERY := 1
|
||||
HAVE_IFINFO := 0
|
||||
HAVE_NETWORK_CMD := 0
|
||||
HAVE_NETPLAYDISCOVERY := 0
|
||||
HAVE_OVERLAY := 1
|
||||
HAVE_VIDEO_LAYOUT := 0
|
||||
HAVE_MATERIALUI := 1
|
||||
@@ -412,6 +415,7 @@ else ifeq ($(platform), windows_msvc2003_x86)
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_IFINFO := 0
|
||||
HAVE_NETWORK_CMD := 1
|
||||
HAVE_NETPLAYDISCOVERY := 1
|
||||
HAVE_OVERLAY := 1
|
||||
@@ -467,6 +471,7 @@ else ifeq ($(platform), windows_msvc2005_x86)
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_IFINFO := 0
|
||||
HAVE_NETWORK_CMD := 1
|
||||
HAVE_NETPLAYDISCOVERY := 1
|
||||
HAVE_OVERLAY := 1
|
||||
@@ -549,6 +554,7 @@ else ifneq (,$(findstring windows_msvc2010,$(platform)))
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_IFINFO := 1
|
||||
HAVE_NETWORK_CMD := 1
|
||||
HAVE_NETPLAYDISCOVERY := 1
|
||||
HAVE_OVERLAY := 1
|
||||
@@ -643,6 +649,7 @@ else ifneq (,$(findstring windows_msvc2012,$(platform)))
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_IFINFO := 1
|
||||
HAVE_NETWORK_CMD := 1
|
||||
HAVE_NETPLAYDISCOVERY := 1
|
||||
HAVE_OVERLAY := 1
|
||||
@@ -728,6 +735,7 @@ else ifneq (,$(findstring windows_msvc2013,$(platform)))
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_IFINFO := 1
|
||||
HAVE_NETWORK_CMD := 1
|
||||
HAVE_NETPLAYDISCOVERY := 1
|
||||
HAVE_OVERLAY := 1
|
||||
@@ -813,6 +821,7 @@ else ifneq (,$(findstring windows_msvc2015,$(platform)))
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_IFINFO := 1
|
||||
HAVE_NETWORK_CMD := 1
|
||||
HAVE_NETPLAYDISCOVERY := 1
|
||||
HAVE_OVERLAY := 1
|
||||
@@ -913,6 +922,7 @@ else ifeq (qnx,$(platform))
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_IFINFO := 1
|
||||
HAVE_NETWORK_CMD := 1
|
||||
HAVE_NETPLAYDISCOVERY := 1
|
||||
HAVE_OVERLAY := 1
|
||||
@@ -958,6 +968,7 @@ else ifneq (,$(findstring unix,$(platform)))
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_IFINFO := 1
|
||||
HAVE_NETWORK_CMD := 1
|
||||
HAVE_NETPLAYDISCOVERY := 1
|
||||
HAVE_OVERLAY := 1
|
||||
@@ -1111,6 +1122,10 @@ ifeq ($(HAVE_NETWORKING), 1)
|
||||
CFLAGS += -DHAVE_NETWORKING
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_IFINFO), 1)
|
||||
CFLAGS += -DHAVE_IFINFO
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_NETPLAYDISCOVERY), 1)
|
||||
CFLAGS += -DHAVE_NETPLAYDISCOVERY
|
||||
endif
|
||||
|
||||
@@ -32,6 +32,7 @@ HAVE_RTGA = 1
|
||||
HAVE_RPNG = 1
|
||||
HAVE_RJPEG = 1
|
||||
HAVE_RBMP = 1
|
||||
HAVE_RWAV = 1
|
||||
HAVE_7ZIP = 1
|
||||
HAVE_ZLIB = 1
|
||||
HAVE_BUILTINZLIB = 1
|
||||
@@ -47,6 +48,7 @@ HAVE_PATCH = 1
|
||||
HAVE_CHEATS = 1
|
||||
HAVE_RUNAHEAD = 1
|
||||
HAVE_NETWORKING = 1
|
||||
HAVE_IFINFO = 1
|
||||
HAVE_NETPLAYDISCOVERY = 1
|
||||
HAVE_STB_FONT = 1
|
||||
HAVE_CHEEVOS = 1
|
||||
|
||||
+6
-7
@@ -41,12 +41,11 @@ DEBUG ?= 0
|
||||
|
||||
MIYOO = 1
|
||||
DINGUX = 1
|
||||
HAVE_SCREENSHOTS = 0
|
||||
HAVE_REWIND = 0
|
||||
HAVE_SCREENSHOTS = 1
|
||||
HAVE_REWIND = 1
|
||||
HAVE_7ZIP = 1
|
||||
HAVE_AL = 0
|
||||
# ALSA freezes when switching back from menu
|
||||
HAVE_ALSA = 0
|
||||
HAVE_ALSA = 1
|
||||
HAVE_DSP_FILTER = 1
|
||||
HAVE_VIDEO_FILTER = 1
|
||||
HAVE_STATIC_VIDEO_FILTERS = 1
|
||||
@@ -68,7 +67,7 @@ HAVE_GDI = 1
|
||||
HAVE_GETADDRINFO = 0
|
||||
HAVE_GETOPT_LONG = 1
|
||||
HAVE_GLSL = 0
|
||||
HAVE_HID = 1
|
||||
HAVE_HID = 0
|
||||
HAVE_IBXM = 1
|
||||
HAVE_IMAGEVIEWER = 0
|
||||
HAVE_LANGEXTRA = 0
|
||||
@@ -123,7 +122,7 @@ DEF_FLAGS += -ffunction-sections -fdata-sections
|
||||
DEF_FLAGS += -I. -Ideps -Ideps/stb -DMIYOO=1 -DDINGUX -MMD
|
||||
DEF_FLAGS += -Wall -Wno-unused-variable -flto
|
||||
DEF_FLAGS += -std=gnu99 -D_GNU_SOURCE
|
||||
LIBS := -ldl -lz -lrt -pthread
|
||||
LIBS := -ldl -lz -lrt -pthread -lasound
|
||||
CFLAGS :=
|
||||
CXXFLAGS := -fno-exceptions -fno-rtti -std=c++11 -D__STDC_CONSTANT_MACROS
|
||||
ASFLAGS :=
|
||||
@@ -133,7 +132,7 @@ LIBRARY_DIRS = -L$(GCW0_LIB_DIR)
|
||||
DEFINES := -DRARCH_INTERNAL -D_FILE_OFFSET_BITS=64 -UHAVE_STATIC_DUMMY
|
||||
DEFINES += -DHAVE_C99=1 -DHAVE_CXX=1
|
||||
DEFINES += -DHAVE_GETOPT_LONG=1 -DHAVE_STRCASESTR=1 -DHAVE_DYNAMIC=1
|
||||
DEFINES += -DHAVE_FILTERS_BUILTIN
|
||||
DEFINES += -DHAVE_FILTERS_BUILTIN -DHAVE_ALSA
|
||||
|
||||
SDL_DINGUX_CFLAGS := $(shell $(GCW0_SDL_CONFIG) --cflags)
|
||||
SDL_DINGUX_LIBS := $(shell $(GCW0_SDL_CONFIG) --libs)
|
||||
|
||||
@@ -58,6 +58,7 @@ HAVE_RBMP := 1
|
||||
HAVE_RTGA := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_IFINFO := 1
|
||||
HAVE_NETWORK_CMD := 1
|
||||
HAVE_OVERLAY := 1
|
||||
HAVE_VIDEO_LAYOUT := 0
|
||||
|
||||
+10
-5
@@ -10,6 +10,7 @@ PC_DEVELOPMENT_IP_ADDRESS = 255.255.255.255
|
||||
PC_DEVELOPMENT_UDP_PORT = 3490
|
||||
RARCH_CONSOLE = 0
|
||||
USBGECKO = 0
|
||||
HAVE_STATIC_DUMMY ?= 0
|
||||
|
||||
SPACE :=
|
||||
SPACE := $(SPACE) $(SPACE)
|
||||
@@ -44,7 +45,15 @@ ifeq ($(WHOLE_ARCHIVE_LINK), 1)
|
||||
WHOLE_END := -Wl,--no-whole-archive
|
||||
endif
|
||||
|
||||
LIBS := $(WHOLE_START) -lretro_ngc $(WHOLE_END)
|
||||
LIB_CORE :=
|
||||
|
||||
ifeq ($(HAVE_STATIC_DUMMY),1)
|
||||
DEFINES += -DHAVE_STATIC_DUMMY
|
||||
else
|
||||
LIB_CORE += -lretro_ngc
|
||||
endif
|
||||
|
||||
LIBS := $(WHOLE_START) $(LIB_CORE) $(WHOLE_END)
|
||||
|
||||
libogc_platform := 1
|
||||
|
||||
@@ -188,10 +197,6 @@ ifeq ($(HAVE_ZLIB), 1)
|
||||
CFLAGS += -I./libretro-common/include/compat/zlib
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_RWAV), 1)
|
||||
CFLAGS += -DHAVE_RWAV
|
||||
endif
|
||||
|
||||
ifeq ($(RARCH_CONSOLE), 1)
|
||||
CFLAGS += -DRARCH_CONSOLE
|
||||
endif
|
||||
|
||||
+139
-100
@@ -3,21 +3,38 @@ DEBUG ?= 0
|
||||
GRIFFIN_BUILD = 0
|
||||
WHOLE_ARCHIVE_LINK = 0
|
||||
|
||||
HAVE_STATIC_DUMMY ?= 0
|
||||
HAVE_GLES3 ?= 0
|
||||
HAVE_MOUSE ?= 0
|
||||
HAVE_KEYBOARD ?= 0
|
||||
|
||||
PS4_TITLE_ID := RETROARCH
|
||||
PS4_TITLE_NAME := RetroArch
|
||||
|
||||
PC_DEVELOPMENT_IP_ADDRESS =
|
||||
PC_DEVELOPMENT_UDP_PORT =
|
||||
PC_DEVELOPMENT_IP_ADDRESS = 192.168.1.137
|
||||
PC_DEVELOPMENT_UDP_PORT = 18194
|
||||
|
||||
OBJ :=
|
||||
AUTH_INFO = 000000000000000000000000001C004000FF000000000080000000000000000000000000000000000000008000400040000000000000008000000000000000080040FFFF000000F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
|
||||
DEFINES :=
|
||||
OBJ += deps/xxHash/xxhash.o \
|
||||
# input/drivers/ps4_input.o \
|
||||
# input/drivers_joypad/ps4_joypad.o \
|
||||
# audio/drivers/psp_audio.o \
|
||||
# gfx/drivers_context/orbis_ctx.o \
|
||||
# frontend/drivers/platform_orbis.o
|
||||
|
||||
ifeq ($(HAVE_GLES3),1)
|
||||
DEFINES += -DHAVE_OPENGLES3
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_STATIC_DUMMY),1)
|
||||
DEFINES += -DHAVE_STATIC_DUMMY
|
||||
endif
|
||||
|
||||
ifeq ($(GRIFFIN_BUILD), 1)
|
||||
OBJ += griffin/griffin.o
|
||||
DEFINES += -DHAVE_GRIFFIN=1
|
||||
DEFINES += -DHAVE_MENU -DHAVE_LIBRETRODB -DHAVE_CONFIGFILE -DHAVE_PATCH -DHAVE_SCREENSHOTS -DHAVE_CHEATS
|
||||
DEFINES += -DHAVE_REWIND
|
||||
DEFINES += -DHAVE_MENU -DHAVE_LIBRETRODB -DHAVE_CONFIGFILE
|
||||
DEFINES += -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_RJPEG -DHAVE_RBMP -DHAVE_RTGA -DHAVE_CC_RESAMPLER
|
||||
DEFINES += -DHAVE_CORE_INFO_CACHE
|
||||
ifeq ($(DEBUG), 1)
|
||||
@@ -25,39 +42,53 @@ ifeq ($(GRIFFIN_BUILD), 1)
|
||||
endif
|
||||
else
|
||||
|
||||
HAVE_DSP_FILTER := 1
|
||||
HAVE_VIDEO_FILTER := 1
|
||||
HAVE_FILTERS_BUILTIN := 1
|
||||
HAVE_LANGEXTRA := 0
|
||||
HAVE_RPNG := 1
|
||||
HAVE_RJPEG := 1
|
||||
HAVE_RBMP := 1
|
||||
HAVE_RTGA := 1
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_OVERLAY := 1
|
||||
HAVE_VIDEO_LAYOUT := 0
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_EGL := 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_SCREENSHOTS := 1
|
||||
HAVE_REWIND := 1
|
||||
HAVE_PATCH := 1
|
||||
HAVE_CHEATS := 1
|
||||
HAVE_RGUI := 0
|
||||
HAVE_MATERIALUI := 0
|
||||
HAVE_XMB := 1
|
||||
HAVE_THREADS := 1
|
||||
HAVE_LIBRETRODB := 1
|
||||
HAVE_CC_RESAMPLER := 1
|
||||
HAVE_CHEEVOS := 1
|
||||
RARCH_CONSOLE := 1
|
||||
HAVE_LANGEXTRA := 1
|
||||
HAVE_IMAGEVIEWER := 1
|
||||
HAVE_RPNG := 1
|
||||
HAVE_RJPEG := 1
|
||||
HAVE_RBMP := 1
|
||||
HAVE_RTGA := 1
|
||||
HAVE_ZLIB := 1
|
||||
HAVE_BUILTINZLIB := 1
|
||||
HAVE_OVERLAY := 1
|
||||
HAVE_VIDEO_LAYOUT := 1
|
||||
HAVE_7ZIP := 1
|
||||
HAVE_EGL := 1
|
||||
HAVE_GFX_WIDGETS := 1
|
||||
HAVE_GLSL := 1
|
||||
HAVE_SHADERPIPELINE := 1
|
||||
HAVE_OPENGL := 1
|
||||
HAVE_OPENGLES := 1
|
||||
HAVE_OPENGLES2 := 1
|
||||
HAVE_NETWORKING := 0
|
||||
HAVE_IFINFO := 0
|
||||
HAVE_SOCKET_LEGACY := 1
|
||||
HAVE_MENU := 1
|
||||
HAVE_MENU_COMMON := 1
|
||||
HAVE_RGUI := 1
|
||||
HAVE_STB_FONT := 1
|
||||
HAVE_STB_VORBIS := 1
|
||||
HAVE_DR_FLAC := 1
|
||||
HAVE_DR_MP3 := 1
|
||||
HAVE_MATERIALUI := 1
|
||||
HAVE_XMB := 1
|
||||
HAVE_OZONE := 1
|
||||
HAVE_RGUI := 1
|
||||
HAVE_THREADS := 1
|
||||
HAVE_THREAD_ATTR := 1
|
||||
HAVE_LIBRETRODB := 1
|
||||
HAVE_CC_RESAMPLER := 1
|
||||
HAVE_CHEEVOS := 1
|
||||
HAVE_RUNAHEAD := 1
|
||||
RARCH_CONSOLE := 1
|
||||
HAVE_MAIN := 1
|
||||
HAVE_ONLINE_UPDATER := 1
|
||||
HAVE_COMPRESSION := 1
|
||||
HAVE_UPDATE_ASSETS := 1
|
||||
HAVE_UPDATE_CORES := 1
|
||||
HAVE_CONFIGFILE := 1
|
||||
HAVE_CHD := 1
|
||||
HAVE_STATIC_VIDEO_FILTERS = 1
|
||||
HAVE_STATIC_AUDIO_FILTERS = 1
|
||||
HAVE_CORE_INFO_CACHE := 1
|
||||
@@ -68,107 +99,115 @@ else
|
||||
|
||||
include Makefile.common
|
||||
CFLAGS += $(DEF_FLAGS)
|
||||
BLACKLIST :=
|
||||
OBJ := $(filter-out $(BLACKLIST),$(OBJ))
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(PS4SDK)),)
|
||||
$(error "Please set PS4SDK in your environment. export PS4SDK=<path to>ps4sdk")
|
||||
ifeq ($(strip $(ORBISDEV)),)
|
||||
$(error "Please set ORBISDEV in your environment. export ORBISDEV=<path to>orbisdev")
|
||||
endif
|
||||
|
||||
export PATH := $(PATH):$(PS4SDK)/bin
|
||||
|
||||
PREFIX :=
|
||||
|
||||
CC := $(PREFIX)clang
|
||||
CXX := $(PREFIX)clang
|
||||
AS := $(PREFIX)clang
|
||||
PREFIX := orbis-
|
||||
CC := clang
|
||||
CXX := clang++
|
||||
AS := $(PREFIX)as
|
||||
AR := $(PREFIX)ar
|
||||
OBJCOPY := $(PREFIX)objcopy
|
||||
STRIP := $(PREFIX)strip
|
||||
NM := $(PREFIX)nm
|
||||
LD := $(CXX)
|
||||
LD := clang
|
||||
|
||||
INCDIRS := -I. -Ideps/7zip -Ilibretro-common/include -Ideps/stb -Ilibretro-common/include/compat/zlib
|
||||
LIBDIRS := -L.
|
||||
LIBDIRS += -L. -Lcores -Lbuild -L$(ORBISDEV)/usr/lib
|
||||
INCDIRS += -I. -Idefines -Ideps -Ideps/7zip -Ideps/libz -Ilibretro-common/include -Ideps/stb \
|
||||
-Ilibretro-common/include/compat/zlib -Ideps/rcheevos/include -I$(ORBISDEV)/usr/include -I$(ORBISDEV)/usr/include/c++/v1 -I$(ORBISDEV)/usr/include/orbis
|
||||
|
||||
ARCHFLAGS := -m64 -DORBIS
|
||||
CFLAGS += $(ARCHFLAGS) -std=c11 -mcmodel=large -ffreestanding -nostdlib -nostdinc -fno-builtin -fno-stack-protector
|
||||
ARCHFLAGS += --target=x86_64-scei-ps4 -DORBIS -D__ORBIS__ -D__PS4__ -D_BSD_SOURCE
|
||||
DEFINES += -DRARCH_INTERNAL -DRARCH_CONSOLE -DHAVE_FILTERS_BUILTIN \
|
||||
-DHAVE_XMB -DHAVE_RGUI -DHAVE_OZONE \
|
||||
-DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_CORES -DHAVE_UPDATE_ASSETS \
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
CFLAGS += -O2 -g
|
||||
else
|
||||
CFLAGS += -O3
|
||||
# Compiling with -Werror and disabling some warnings
|
||||
DEFINES += -Werror -Wno-macro-redefined -Wno-typedef-redefinition -Wno-non-literal-null-conversion -Wno-void-pointer-to-int-cast \
|
||||
-Wno-format -Wno-tautological-constant-out-of-range-compare -Wno-implicit-function-declaration
|
||||
|
||||
ifeq ($(HAVE_KEYBOARD), 1)
|
||||
DEFINES += -DHAVE_KEYBOARD
|
||||
PS4_LIBS += -lSceDbgKeyboard_stub
|
||||
endif
|
||||
|
||||
ASFLAGS := $(ARCHFLAGS) -I$(PS4SDK)/include -target x86_64-scei-ps4-elf -fPIE
|
||||
LDFLAGS := -O3 -Wall -m64 -nostartfiles -nostdlib -L$(PS4SDK)/lib -pie
|
||||
ARFLAGS := rcs
|
||||
|
||||
CRTFILE ?= $(PS4SDK)/crt0.s
|
||||
|
||||
CFLAGS += -Wall -pedantic -Wno-zero-length-array -Wno-format-pedantic
|
||||
CFLAGS += -D__PS4__ -I$(PS4SDK)/include -I $(PS4SDK)/include/sce
|
||||
CFLAGS += -target x86_64-scei-ps4-elf -fPIE
|
||||
CFLAGS += -DRARCH_INTERNAL -DRARCH_CONSOLE
|
||||
CFLAGS += -DHAVE_FILTERS_BUILTIN $(DEFINES)
|
||||
ifeq ($(HAVE_MOUSE),1)
|
||||
DEFINES += -DHAVE_MOUSE
|
||||
PS4_LIBS += -lSceMouse_stub
|
||||
endif
|
||||
|
||||
ifneq ($(PC_DEVELOPMENT_IP_ADDRESS),)
|
||||
CFLAGS += -DPC_DEVELOPMENT_IP_ADDRESS='"$(PC_DEVELOPMENT_IP_ADDRESS)"'
|
||||
DEFINES += -DPC_DEVELOPMENT_IP_ADDRESS='"$(PC_DEVELOPMENT_IP_ADDRESS)"'
|
||||
endif
|
||||
|
||||
ifneq ($(PC_DEVELOPMENT_UDP_PORT),)
|
||||
CFLAGS += -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT)
|
||||
DEFINES += -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT)
|
||||
endif
|
||||
|
||||
ifeq ($(WHOLE_ARCHIVE_LINK), 1)
|
||||
WHOLE_START := -Wl,--whole-archive
|
||||
WHOLE_END := -Wl,--no-whole-archive
|
||||
WHOLE_START := --whole-archive
|
||||
WHOLE_END := --no-whole-archive
|
||||
endif
|
||||
CXXFLAGS := $(CFLAGS)
|
||||
|
||||
PS4_LIBS := -lps4link -ldebugnet -lorbisFile -lelfloader -lorbisKeyboard -lorbis2d -lpng -lz -lorbisGl -lorbisPad -lorbisAudio -lmod -lorbisFileBrowser -lorbisXbmFont -lSceNet_stub -lScePigletv2VSH_stub -lSceSystemService_stub -lSceUserService_stub -lScePad_stub -lSceAudioOut_stub -lSceIme_stub -lSceSysmodule_stub \
|
||||
-lPs4_extension_kernel_call_standard -lPs4_extension_kernel_execute_dynlib_prepare_dlclose -lPs4_common_kernel -lPs4_common_user -lPs4_common_generic -lPs4LibCInternalAdaptive_stub -lPs4LibKernelAdaptive_stub -lSceLibcInternal_stub -lkernel_stub -lps4Kernel_stub -lPs4_base_stub_resolve_minimal -lPs4_base_kernel_dlsym_standard -lPs4_base_kernel_seek_elf_address_standard -lPs4_base_assembler_register_parameter_standard -lPs4_base_assembler_system_call_standard
|
||||
PS4_LIBS += -luser_mem_sys -lkernel_stub -lSceLibcInternal_stub -lunwind -lc++ -lc++abi -lc++experimental \
|
||||
-lorbisLink -lkernelUtil -ldebugnet -lorbisNfs -lSceSysmodule_stub -lSceSystemService_stub -lSceNet_stub \
|
||||
-lSceUserService_stub -lScePigletv2VSH_stub -lSceVideoOut_stub -lSceGnmDriver_stub -lorbisPad \
|
||||
-lScePad_stub -lSceAudioOut_stub -lSceIme_stub -lSceNetCtl_stub -lSQLite
|
||||
|
||||
LIBS := $(WHOLE_START) -lretro_orbis $(WHOLE_END) $(PS4_LIBS)
|
||||
ifeq ($(HAVE_STATIC_DUMMY),1)
|
||||
LIBS := $(PS4_LIBS)
|
||||
else
|
||||
LIBS := $(WHOLE_START) -lretro_orbis $(WHOLE_END) $(PS4_LIBS)
|
||||
endif
|
||||
|
||||
TARGETS := $(TARGET).elf
|
||||
|
||||
DEPFLAGS = -MT $@ -MMD -MP -MF $*.Tdepend
|
||||
POSTCOMPILE = mv -f $*.Tdepend $*.depend
|
||||
CFLAGS := $(ARCHFLAGS) $(INCDIRS) $(DEFINES)
|
||||
CXXFLAGS := $(ARCHFLAGS) $(INCDIRS) $(DEFINES)
|
||||
LDFLAGS := $(LIBDIRS) -Wl,--gc-sections -Wl,-z -Wl,max-page-size=0x4000 -Wl,--dynamic-linker="/libexec/ld-elf.so.1" -Wl,-pie -Wl,--eh-frame-hdr -target x86_64-scei-ps4-elf -T $(ORBISDEV)/usr/lib/linker.x
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
CFLAGS += -O0 -fno-inline
|
||||
CXXFLAGS += -O0 -fno-inline
|
||||
else
|
||||
CFLAGS += -O3
|
||||
CXXFLAGS += -O3
|
||||
endif
|
||||
|
||||
TARGETS := $(TARGET).self
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
%.o: %.cpp
|
||||
%.o: %.cpp %.depend
|
||||
$(CXX) -c -o $@ $< $(CXXFLAGS) $(INCDIRS) $(DEPFLAGS)
|
||||
$(POSTCOMPILE)
|
||||
OBJOUT = -o
|
||||
|
||||
%.o: %.c
|
||||
%.o: %.c %.depend
|
||||
$(CC) -c -o $@ $< $(CFLAGS) $(INCDIRS) $(DEPFLAGS)
|
||||
$(POSTCOMPILE)
|
||||
$(CC) $(CFLAGS) -c $(OBJOUT)$@ $<
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) $(CXXFLAGS) -c $(OBJOUT)$@ $<
|
||||
|
||||
%.o: %.S
|
||||
%.o: %.S %.depend
|
||||
$(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS)
|
||||
$(POSTCOMPILE)
|
||||
$(CC) $(CFLAGS) -c $(OBJOUT)$@ $<
|
||||
|
||||
%.o: %.s
|
||||
%.o: %.s %.depend
|
||||
$(CC) -c -o $@ $< $(ASFLAGS) $(INCDIRS) $(DEPFLAGS)
|
||||
$(POSTCOMPILE)
|
||||
$(CC) -c $(OBJOUT)$@ $<
|
||||
|
||||
%.depend: ;
|
||||
$(TARGET).elf: $(OBJ)
|
||||
$(LD) $(ORBISDEV)/usr/lib/crt0.o $(OBJ) $(LDFLAGS) $(LIBS) -o $(TARGET).elf
|
||||
|
||||
$(TARGET).elf: $(OBJ) libretro_orbis.a
|
||||
$(LD) $(CRTFILE) $(OBJ) $(LDFLAGS) $(LIBDIRS) $(LIBS) -o $@
|
||||
$(TARGET).oelf: $(TARGET).elf
|
||||
@orbis-elf-create $(TARGET).elf $(TARGET).oelf
|
||||
|
||||
$(TARGET).self: $(TARGET).oelf
|
||||
python $(ORBISDEV)/bin/make_fself.py --auth-info $(AUTH_INFO) $(TARGET).oelf $(TARGET).self
|
||||
|
||||
install:
|
||||
@cp $(TARGET).self $(SELF_PATH_INSTALL)/homebrew.self
|
||||
@echo "Installed!"
|
||||
|
||||
clean:
|
||||
rm -f $(OBJ) $(TARGET).elf
|
||||
rm -f $(OBJ:.o=.depend)
|
||||
rm -f $(OBJ) $(TARGET).elf $(TARGET).oelf $(TARGET).self
|
||||
|
||||
.PHONY: clean all
|
||||
.PRECIOUS: %.depend
|
||||
|
||||
-include $(OBJ:.o=.depend)
|
||||
@@ -0,0 +1,131 @@
|
||||
TARGET := retroarch_orbis_salamander
|
||||
|
||||
DEBUG ?= 0
|
||||
|
||||
|
||||
PS4_TITLE_ID := RETROARCH
|
||||
PS4_TITLE_NAME := RetroArch
|
||||
|
||||
PC_DEVELOPMENT_IP_ADDRESS = 192.168.1.137
|
||||
PC_DEVELOPMENT_UDP_PORT = 18194
|
||||
|
||||
AUTH_INFO = 000000000000000000000000001C004000FF000000000080000000000000000000000000000000000000008000400040000000000000008000000000000000080040FFFF000000F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
|
||||
|
||||
|
||||
endif
|
||||
|
||||
ifeq ($(strip $(ORBISDEV)),)
|
||||
$(error "Please set ORBISDEV in your environment. export ORBISDEV=<path to>orbisdev")
|
||||
endif
|
||||
|
||||
PREFIX := orbis-
|
||||
CC := clang
|
||||
CXX := clang++
|
||||
AS := $(PREFIX)as
|
||||
AR := $(PREFIX)ar
|
||||
OBJCOPY := $(PREFIX)objcopy
|
||||
STRIP := $(PREFIX)strip
|
||||
NM := $(PREFIX)nm
|
||||
LD := clang
|
||||
|
||||
LIBDIRS += -L. -Lcores -Lbuild -L$(ORBISDEV)/usr/lib
|
||||
INCDIRS += -I. -Idefines -Ilibretro-common/include -I$(ORBISDEV)/usr/include -I$(ORBISDEV)/usr/include/c++/v1 -I$(ORBISDEV)/usr/include/orbis
|
||||
|
||||
ARCHFLAGS += --target=x86_64-scei-ps4 -DORBIS -D__ORBIS__ -D__PS4__ -D_BSD_SOURCE
|
||||
|
||||
|
||||
DEFINES += -DORBIS -D__ORBIS__ -DIS_SALAMANDER -DRARCH_CONSOLE -D__PS4__ -D_BSD_SOURCE
|
||||
|
||||
# Compiling with -Werror and disabling some warnings
|
||||
DEFINES += -Werror -Wno-macro-redefined -Wno-typedef-redefinition -Wno-non-literal-null-conversion -Wno-void-pointer-to-int-cast \
|
||||
-Wno-format -Wno-tautological-constant-out-of-range-compare -Wno-implicit-function-declaration
|
||||
|
||||
ifeq ($(HAVE_FILE_LOGGER), 1)
|
||||
DEFINES += -DHAVE_FILE_LOGGER
|
||||
endif
|
||||
ifneq ($(PC_DEVELOPMENT_IP_ADDRESS),)
|
||||
DEFINES += -DPC_DEVELOPMENT_IP_ADDRESS='"$(PC_DEVELOPMENT_IP_ADDRESS)"'
|
||||
endif
|
||||
|
||||
ifneq ($(PC_DEVELOPMENT_UDP_PORT),)
|
||||
DEFINES += -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT)
|
||||
endif
|
||||
|
||||
PS4_LIBS += -luser_mem_sys -lkernel_stub -lSceLibcInternal_stub -lunwind -lc++ -lc++abi -lc++experimental \
|
||||
-lorbisLink -lkernelUtil -ldebugnet -lorbisNfs -lSceSysmodule_stub -lSceSystemService_stub -lSceNet_stub \
|
||||
-lSceUserService_stub -lScePigletv2VSH_stub -lSceVideoOut_stub -lSceGnmDriver_stub -lorbisPad \
|
||||
-lScePad_stub -lSceAudioOut_stub -lSceIme_stub -lSceNetCtl_stub -lSQLite
|
||||
|
||||
|
||||
LIBS := $(PS4_LIBS)
|
||||
|
||||
|
||||
CFLAGS := $(ARCHFLAGS) $(INCDIRS) $(DEFINES)
|
||||
CXXFLAGS := $(ARCHFLAGS) $(INCDIRS) $(DEFINES)
|
||||
LDFLAGS := $(LIBDIRS) -Wl,--gc-sections -Wl,-z -Wl,max-page-size=0x4000 -Wl,--dynamic-linker="/libexec/ld-elf.so.1" -Wl,-pie -Wl,--eh-frame-hdr -target x86_64-scei-ps4-elf -T $(ORBISDEV)/usr/lib/linker.x
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
CFLAGS += -O0 -fno-inline
|
||||
CXXFLAGS += -O0 -fno-inline
|
||||
else
|
||||
CFLAGS += -O3
|
||||
CXXFLAGS += -O3
|
||||
endif
|
||||
|
||||
OBJS = frontend/frontend_salamander.o \
|
||||
frontend/frontend_driver.o \
|
||||
frontend/drivers/platform_orbis.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 \
|
||||
libretro-common/file/retro_dirent.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/file/config_file.o \
|
||||
libretro-common/streams/file_stream.o \
|
||||
libretro-common/vfs/vfs_implementation.o \
|
||||
libretro-common/hash/lrc_hash.o \
|
||||
libretro-common/time/rtime.o \
|
||||
network/net_logger.o \
|
||||
verbosity.o
|
||||
|
||||
TARGETS := $(TARGET).elf
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
OBJOUT = -o
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c $(OBJOUT)$@ $<
|
||||
|
||||
%.o: %.cpp
|
||||
$(CXX) $(CXXFLAGS) -c $(OBJOUT)$@ $<
|
||||
|
||||
%.o: %.S
|
||||
$(CC) $(CFLAGS) -c $(OBJOUT)$@ $<
|
||||
|
||||
%.o: %.s
|
||||
$(CC) -c $(OBJOUT)$@ $<
|
||||
|
||||
$(TARGET).elf: $(OBJ)
|
||||
$(LD) $(ORBISDEV)/usr/lib/crt0.o $(OBJ) $(LDFLAGS) $(LIBS) -o $(TARGET).elf
|
||||
|
||||
$(TARGET).oelf: $(TARGET).elf
|
||||
@orbis-elf-create $(TARGET).elf $(TARGET).oelf
|
||||
|
||||
$(TARGET).self: $(TARGET).oelf
|
||||
python $(ORBISDEV)/bin/make_fself.py --auth-info $(AUTH_INFO) $(TARGET).oelf $(TARGET).self
|
||||
|
||||
install:
|
||||
@cp $(TARGET).self $(SELF_PATH_INSTALL)/homebrew.self
|
||||
@echo "Installed!"
|
||||
|
||||
clean:
|
||||
rm -f $(OBJ) $(TARGET).elf $(TARGET).oelf $(TARGET).self
|
||||
|
||||
.PHONY: clean all
|
||||
@@ -53,6 +53,7 @@ EE_OBJS = frontend/frontend_salamander.o \
|
||||
libretro-common/encodings/encoding_utf.o \
|
||||
libretro-common/compat/fopen_utf8.o \
|
||||
libretro-common/compat/compat_strl.o \
|
||||
libretro-common/compat/compat_strldup.o \
|
||||
libretro-common/compat/compat_strcasestr.o \
|
||||
libretro-common/file/config_file.o \
|
||||
libretro-common/streams/file_stream.o \
|
||||
|
||||
@@ -66,6 +66,7 @@ OBJ = frontend/frontend_salamander.o \
|
||||
libretro-common/string/stdstring.o \
|
||||
libretro-common/encodings/encoding_utf.o \
|
||||
libretro-common/compat/compat_strl.o \
|
||||
libretro-common/compat/compat_strldup.o \
|
||||
libretro-common/compat/compat_strcasestr.o \
|
||||
libretro-common/compat/fopen_utf8.o \
|
||||
libretro-common/streams/file_stream.o \
|
||||
|
||||
@@ -21,7 +21,6 @@ ASFLAGS = $(CFLAGS)
|
||||
|
||||
RARCH_DEFINES = -DPSP \
|
||||
-D_MIPS_ARCH_ALLEGREX \
|
||||
-DHAVE_LANGEXTRA \
|
||||
-DHAVE_ZLIB \
|
||||
-DHAVE_AUDIOMIXER \
|
||||
-DHAVE_RWAV \
|
||||
|
||||
@@ -40,6 +40,7 @@ OBJS = frontend/frontend_salamander.o \
|
||||
libretro-common/encodings/encoding_utf.o \
|
||||
libretro-common/compat/fopen_utf8.o \
|
||||
libretro-common/compat/compat_strl.o \
|
||||
libretro-common/compat/compat_strldup.o \
|
||||
libretro-common/compat/compat_strcasestr.o \
|
||||
libretro-common/file/config_file.o \
|
||||
libretro-common/streams/file_stream.o \
|
||||
|
||||
+1
-1
@@ -69,7 +69,7 @@ HAVE_GDI = 1
|
||||
HAVE_GETADDRINFO = 0
|
||||
HAVE_GETOPT_LONG = 1
|
||||
HAVE_GLSL = 0
|
||||
HAVE_HID = 1
|
||||
HAVE_HID = 0
|
||||
HAVE_IBXM = 1
|
||||
HAVE_IMAGEVIEWER = 1
|
||||
HAVE_LANGEXTRA = 0
|
||||
|
||||
+13
-2
@@ -3,6 +3,7 @@ DEBUG ?= 0
|
||||
HAVE_FILE_LOGGER = 1
|
||||
GRIFFIN_BUILD = 0
|
||||
WHOLE_ARCHIVE_LINK = 0
|
||||
HAVE_STATIC_DUMMY ?= 0
|
||||
|
||||
VITA_TITLE_ID := RETROARCH
|
||||
VITA_TITLE_NAME := RetroArch
|
||||
@@ -75,6 +76,8 @@ else
|
||||
HAVE_VITAGL := 0
|
||||
endif
|
||||
HAVE_NETWORKING := 1
|
||||
HAVE_IFINFO := 1
|
||||
HAVE_NETPLAYDISCOVERY := 1
|
||||
HAVE_SOCKET_LEGACY := 1
|
||||
HAVE_MENU := 1
|
||||
HAVE_MENU_COMMON := 1
|
||||
@@ -179,7 +182,15 @@ else
|
||||
FSELF_FLAGS := -s
|
||||
endif
|
||||
|
||||
LIBS := $(WHOLE_START) -lretro_vita $(WHOLE_END) $(VITA_LIBS) -lm -lc
|
||||
LIBS := $(WHOLE_START)
|
||||
|
||||
ifeq ($(HAVE_STATIC_DUMMY),1)
|
||||
DEFINES += -DHAVE_STATIC_DUMMY
|
||||
else
|
||||
LIBS += -lretro_vita
|
||||
endif
|
||||
|
||||
LIBS += $(WHOLE_END) $(VITA_LIBS) -lm -lc
|
||||
|
||||
TARGETS := $(TARGET).vpk
|
||||
|
||||
@@ -216,7 +227,7 @@ liblibScePiglet_stub.a:
|
||||
make -C deps/Pigs-In-A-Blanket/piglet_stub/libScePiglet ARCH=arm-vita-eabi
|
||||
cp deps/Pigs-In-A-Blanket/piglet_stub/libScePiglet/liblibScePiglet_stub.a .
|
||||
|
||||
$(TARGET).elf: $(OBJ) libretro_vita.a liblibScePiglet_stub.a
|
||||
$(TARGET).elf: $(OBJ) liblibScePiglet_stub.a
|
||||
$(LD) $(OBJ) $(LDFLAGS) $(LIBDIRS) $(LIBS) -o $@
|
||||
|
||||
%.velf: %.elf
|
||||
|
||||
@@ -43,6 +43,7 @@ OBJS = frontend/frontend_salamander.o \
|
||||
libretro-common/file/retro_dirent.o \
|
||||
libretro-common/encodings/encoding_utf.o \
|
||||
libretro-common/compat/compat_strl.o \
|
||||
libretro-common/compat/compat_strldup.o \
|
||||
libretro-common/compat/compat_strcasestr.o \
|
||||
libretro-common/compat/fopen_utf8.o \
|
||||
libretro-common/file/config_file.o \
|
||||
|
||||
+5
-5
@@ -67,11 +67,11 @@ HAVE_LIBRETRODB = 1
|
||||
HAVE_MENU = 1
|
||||
HAVE_MENU_COMMON = 1
|
||||
HAVE_NEON = 1
|
||||
HAVE_NETPLAYDISCOVERY = 1
|
||||
HAVE_NETPLAYDISCOVERY = 1
|
||||
HAVE_NETWORK_CMD = 1
|
||||
HAVE_NETWORKGAMEPAD = 1
|
||||
HAVE_NETWORKING = 1
|
||||
HAVE_IFINFO = 1
|
||||
HAVE_NETWORK_CMD = 1
|
||||
HAVE_NETPLAYDISCOVERY = 1
|
||||
HAVE_NETWORKGAMEPAD = 1
|
||||
HAVE_GFX_WIDGETS = 1
|
||||
HAVE_MMAP = 1
|
||||
HAVE_ONLINE_UPDATER = 1
|
||||
@@ -136,7 +136,7 @@ DEFINES += -DHAVE_GETOPT_LONG=1 -DHAVE_STRCASESTR=1 -DHAVE_DYNAMIC=1
|
||||
DEFINES += -DHAVE_FILTERS_BUILTIN
|
||||
DEFINES += -DHAVE_SDL2
|
||||
DEFINES += -DHAVE_PULSE
|
||||
DEFINES += -DHAVE_NETWORKING -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES
|
||||
DEFINES += -DHAVE_NETWORKING -DHAVE_IFINFO -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES
|
||||
|
||||
SDL2_CFLAGS := $(shell pkg-config --cflags sdl2)
|
||||
SDL2_LIBS := $(shell pkg-config --libs sdl2)
|
||||
|
||||
+11
-5
@@ -7,10 +7,12 @@ HAVE_CC_RESAMPLER = 1
|
||||
WHOLE_ARCHIVE_LINK = 0
|
||||
BIG_STACK = 1
|
||||
HAVE_NETWORKING = 1
|
||||
HAVE_IFINFO = 1
|
||||
PC_DEVELOPMENT_IP_ADDRESS = 255.255.255.255
|
||||
PC_DEVELOPMENT_UDP_PORT = 3490
|
||||
RARCH_CONSOLE = 0
|
||||
USBGECKO = 0
|
||||
HAVE_STATIC_DUMMY ?= 0
|
||||
|
||||
SPACE :=
|
||||
SPACE := $(SPACE) $(SPACE)
|
||||
@@ -45,7 +47,15 @@ ifeq ($(WHOLE_ARCHIVE_LINK), 1)
|
||||
WHOLE_END := -Wl,--no-whole-archive
|
||||
endif
|
||||
|
||||
LIBS := $(WHOLE_START) -lretro_wii $(WHOLE_END)
|
||||
LIB_CORE :=
|
||||
|
||||
ifeq ($(HAVE_STATIC_DUMMY),1)
|
||||
DEFINES += -DHAVE_STATIC_DUMMY
|
||||
else
|
||||
LIB_CORE += -lretro_wii
|
||||
endif
|
||||
|
||||
LIBS := $(WHOLE_START) $(LIB_CORE) $(WHOLE_END)
|
||||
|
||||
libogc_platform := 1
|
||||
|
||||
@@ -212,10 +222,6 @@ ifeq ($(HAVE_ZLIB), 1)
|
||||
CFLAGS += -I./libretro-common/include/compat/zlib
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_RWAV), 1)
|
||||
CFLAGS += -DHAVE_RWAV
|
||||
endif
|
||||
|
||||
ifeq ($(RARCH_CONSOLE), 1)
|
||||
CFLAGS += -DRARCH_CONSOLE
|
||||
endif
|
||||
|
||||
@@ -78,6 +78,7 @@ OBJ = frontend/frontend_salamander.o \
|
||||
libretro-common/file/retro_dirent.o \
|
||||
libretro-common/encodings/encoding_utf.o \
|
||||
libretro-common/compat/compat_strl.o \
|
||||
libretro-common/compat/compat_strldup.o \
|
||||
libretro-common/compat/compat_strcasestr.o \
|
||||
libretro-common/compat/fopen_utf8.o \
|
||||
libretro-common/file/config_file.o \
|
||||
|
||||
+14
-2
@@ -5,6 +5,7 @@ BUILD_RPX = 1
|
||||
DEBUG = 0
|
||||
GRIFFIN_BUILD = 0
|
||||
SALAMANDER_BUILD = 0
|
||||
HAVE_STATIC_DUMMY ?= 0
|
||||
WHOLE_ARCHIVE_LINK = 0
|
||||
WIIU_HID = 1
|
||||
HAVE_HID = 1
|
||||
@@ -65,6 +66,7 @@ ifeq ($(SALAMANDER_BUILD),1)
|
||||
OBJ += libretro-common/lists/dir_list.o
|
||||
OBJ += libretro-common/file/retro_dirent.o
|
||||
OBJ += libretro-common/compat/compat_strl.o
|
||||
OBJ += libretro-common/compat/compat_strldup.o
|
||||
OBJ += libretro-common/file/config_file.o
|
||||
OBJ += libretro-common/streams/file_stream.o
|
||||
OBJ += libretro-common/vfs/vfs_implementation.o
|
||||
@@ -118,7 +120,7 @@ endif
|
||||
DEFINES += -DHAVE_REWIND
|
||||
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
|
||||
DEFINES += -DHAVE_STB_FONT -DHAVE_STB_VORBIS -DHAVE_LANGEXTRA -DHAVE_LIBRETRODB -DHAVE_NETWORKING -DHAVE_IFINFO -DHAVE_NETPLAYDISCOVERY
|
||||
#DEFINES += -DWANT_IFADDRS
|
||||
#DEFINES += -DHAVE_FREETYPE
|
||||
DEFINES += -DHAVE_XMB -DHAVE_MATERIALUI
|
||||
@@ -155,6 +157,7 @@ endif
|
||||
HAVE_LANGEXTRA = 1
|
||||
HAVE_LIBRETRODB = 1
|
||||
HAVE_NETWORKING = 1
|
||||
HAVE_IFINFO = 1
|
||||
HAVE_NETPLAYDISCOVERY = 1
|
||||
HAVE_CHEEVOS = 1
|
||||
#WANT_IFADDRS = 1
|
||||
@@ -223,7 +226,16 @@ ifeq ($(WHOLE_ARCHIVE_LINK), 1)
|
||||
WHOLE_END := -Wl,--no-whole-archive
|
||||
endif
|
||||
|
||||
LIBS := $(WHOLE_START) -lretro_wiiu $(WHOLE_END) -lm
|
||||
LIB_CORE :=
|
||||
|
||||
ifeq ($(HAVE_STATIC_DUMMY),1)
|
||||
DEFINES += -DHAVE_STATIC_DUMMY
|
||||
else
|
||||
LIB_CORE += -lretro_wiiu
|
||||
endif
|
||||
|
||||
|
||||
LIBS := $(WHOLE_START) $(LIB_CORE) $(WHOLE_END) -lm
|
||||
|
||||
# Use portlibs zlib if deps/ isn't being used
|
||||
ifeq ($(HAVE_ZLIB),1)
|
||||
|
||||
@@ -11,6 +11,7 @@ HAVE_OPENGL = 1
|
||||
HAVE_DYLIB = 1
|
||||
HAVE_D3D9 = 1
|
||||
HAVE_NETWORKING = 1
|
||||
HAVE_IFINFO = 1
|
||||
HAVE_NETPLAYDISCOVERY = 1
|
||||
HAVE_STDIN_CMD = 1
|
||||
HAVE_COMMAND = 1
|
||||
|
||||
@@ -66,7 +66,17 @@ RetroArch also emphasizes being easy to integrate into various launcher frontend
|
||||
RetroArch has been ported to the following platforms:
|
||||
|
||||
- DOS
|
||||
- Windows
|
||||
- Windows 11
|
||||
- Windows 10
|
||||
- Windows 8
|
||||
- Windows 7
|
||||
- Windows Vista
|
||||
- Windows XP
|
||||
- Windows Millennium
|
||||
- Windows 2000
|
||||
- Windows NT 3.5
|
||||
- Windows 98
|
||||
- Windows 95
|
||||
- Linux
|
||||
- Emscripten (WebAssembly and JavaScript)
|
||||
- FreeBSD
|
||||
@@ -74,13 +84,19 @@ RetroArch has been ported to the following platforms:
|
||||
- OpenBSD
|
||||
- Haiku
|
||||
- Solaris
|
||||
- macOS (PPC, x86-32 and x86-64)
|
||||
- PlayStation 2
|
||||
- PlayStation 3
|
||||
- Apple macOS (PPC, x86-32 and x86-64)
|
||||
- Apple iOS
|
||||
- Apple tvOS
|
||||
- Android (2.x to most recent version)
|
||||
- PlayStation2
|
||||
- PlayStation3
|
||||
- PlayStation4
|
||||
- PlayStation Portable
|
||||
- PlayStation Vita
|
||||
- Original Microsoft Xbox
|
||||
- Microsoft Xbox 360 (Libxenon/XeXDK)
|
||||
- Microsoft Xbox One
|
||||
- Microsoft Xbox Series S/X
|
||||
- Nintendo GameCube
|
||||
- Nintendo Wii
|
||||
- Nintendo Wii U
|
||||
@@ -88,9 +104,11 @@ RetroArch has been ported to the following platforms:
|
||||
- Nintendo Switch
|
||||
- Nintendo NES/SNES Classic Edition
|
||||
- Raspberry Pi
|
||||
- Android
|
||||
- iOS
|
||||
- Blackberry
|
||||
- OpenDingux
|
||||
- Miyoo
|
||||
- RS90
|
||||
- RetroFW
|
||||
|
||||
## Dependencies (PC)
|
||||
|
||||
@@ -133,6 +151,47 @@ dynamically, it's not required at build time.
|
||||
Console ports have their own dependencies, but generally do not require
|
||||
anything other than what the respective SDKs provide.
|
||||
|
||||
## Requirements
|
||||
|
||||
### OpenGL1 ###
|
||||
Your videocard needs to at least support the OpenGL 1.1 spec.
|
||||
|
||||
***Shaders***: N/A
|
||||
|
||||
**Menu driver support**: MaterialUI, XMB, Ozone and RGUI should all work correctly.
|
||||
XMB won't have shader pipeline effects because of the aforementioned lack of shader
|
||||
support.
|
||||
|
||||
### OpenGL2 ###
|
||||
Your videocard needs to at least support the OpenGL 2.1 spec.
|
||||
|
||||
***Shaders:*** You can choose between either NVIDIA Cg shaders (deprecated, requires separate runtime
|
||||
to be installed on your system), or GLSL shaders.
|
||||
|
||||
***Menu driver support:*** MaterialUI, XMB, Ozone and RGUI should all work correctly.
|
||||
|
||||
### OpenGL3 ###
|
||||
Your videocard needs to at least support the OpenGL 3.2 core feature spec.
|
||||
|
||||
***Shaders:*** You will be able to use modern Slang shaders with this driver.
|
||||
|
||||
***Menu driver support:*** MaterialUI, XMB, Ozone and RGUI should all work correctly.
|
||||
|
||||
### Direct3D 11 ###
|
||||
Your videocard needs to at least support the Direct3D11 11.0 spec. The card
|
||||
also needs to support at least the Shader Model 4.0.
|
||||
|
||||
***Shaders:*** You will be able to use modern Slang shaders with this driver.
|
||||
|
||||
***Menu driver support:*** MaterialUI, XMB, Ozone and RGUI should all work correctly.
|
||||
|
||||
### Vulkan ###
|
||||
Your videocard needs to at least support the Vulkan 1.0 spec.
|
||||
|
||||
***Shaders:*** You will be able to use modern Slang shaders with this driver.
|
||||
|
||||
***Menu driver support:*** MaterialUI, XMB, Ozone and RGUI should all work correctly.
|
||||
|
||||
## Configuring
|
||||
|
||||
The default configuration is defined in `config.def.h`.
|
||||
|
||||
+132
-158
@@ -83,7 +83,7 @@ audio_driver_t audio_null = {
|
||||
audio_driver_t *audio_drivers[] = {
|
||||
#ifdef HAVE_ALSA
|
||||
&audio_alsa,
|
||||
#if !defined(__QNX__) && defined(HAVE_THREADS)
|
||||
#if !defined(__QNX__) && !defined(MIYOO) && defined(HAVE_THREADS)
|
||||
&audio_alsathread,
|
||||
#endif
|
||||
#endif
|
||||
@@ -296,7 +296,7 @@ static bool audio_driver_deinit_internal(bool audio_enable)
|
||||
|
||||
if (!audio_enable)
|
||||
{
|
||||
audio_st->active = false;
|
||||
audio_st->flags &= ~AUDIO_FLAG_ACTIVE;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -321,7 +321,7 @@ static void audio_driver_mixer_deinit(void)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
audio_driver_st.mixer_active = false;
|
||||
audio_driver_st.flags &= ~AUDIO_FLAG_MIXER_ACTIVE;
|
||||
|
||||
for (i = 0; i < AUDIO_MIXER_MAX_SYSTEM_STREAMS; i++)
|
||||
{
|
||||
@@ -440,7 +440,7 @@ static void audio_driver_flush(
|
||||
|
||||
src_data.data_out = audio_st->output_samples_buf;
|
||||
|
||||
if (audio_st->control)
|
||||
if (audio_st->flags & AUDIO_FLAG_CONTROL)
|
||||
{
|
||||
/* Readjust the audio input rate. */
|
||||
int half_size = (int)(audio_st->buffer_size / 2);
|
||||
@@ -499,7 +499,7 @@ static void audio_driver_flush(
|
||||
audio_st->resampler_data, &src_data);
|
||||
|
||||
#ifdef HAVE_AUDIOMIXER
|
||||
if (audio_st->mixer_active)
|
||||
if (audio_st->flags & AUDIO_FLAG_MIXER_ACTIVE)
|
||||
{
|
||||
bool override = true;
|
||||
float mixer_gain = 0.0f;
|
||||
@@ -521,7 +521,7 @@ static void audio_driver_flush(
|
||||
const void *output_data = audio_st->output_samples_buf;
|
||||
unsigned output_frames = (unsigned)src_data.output_frames;
|
||||
|
||||
if (audio_st->use_float)
|
||||
if (audio_st->flags & AUDIO_FLAG_USE_FLOAT)
|
||||
output_frames *= sizeof(float);
|
||||
else
|
||||
{
|
||||
@@ -560,25 +560,26 @@ bool audio_driver_init_internal(
|
||||
void *settings_data,
|
||||
bool audio_cb_inited)
|
||||
{
|
||||
unsigned new_rate = 0;
|
||||
float *samples_buf = NULL;
|
||||
settings_t *settings = (settings_t*)settings_data;
|
||||
size_t max_bufsamples = AUDIO_CHUNK_SIZE_NONBLOCKING * 2;
|
||||
bool audio_enable = settings->bools.audio_enable;
|
||||
bool audio_sync = settings->bools.audio_sync;
|
||||
bool audio_rate_control = settings->bools.audio_rate_control;
|
||||
float slowmotion_ratio = settings->floats.slowmotion_ratio;
|
||||
runloop_state_t *runloop_st = runloop_state_get_ptr();
|
||||
unsigned audio_latency = (runloop_st->audio_latency > settings->uints.audio_latency) ?
|
||||
runloop_st->audio_latency : settings->uints.audio_latency;
|
||||
unsigned new_rate = 0;
|
||||
float *samples_buf = NULL;
|
||||
settings_t *settings = (settings_t*)settings_data;
|
||||
size_t max_bufsamples = AUDIO_CHUNK_SIZE_NONBLOCKING * 2;
|
||||
bool audio_enable = settings->bools.audio_enable;
|
||||
bool audio_sync = settings->bools.audio_sync;
|
||||
bool audio_rate_control = settings->bools.audio_rate_control;
|
||||
float slowmotion_ratio = settings->floats.slowmotion_ratio;
|
||||
unsigned setting_audio_latency = settings->uints.audio_latency;
|
||||
unsigned runloop_audio_latency = runloop_state_get_ptr()->audio_latency;
|
||||
unsigned audio_latency = (runloop_audio_latency > setting_audio_latency) ?
|
||||
runloop_audio_latency : setting_audio_latency;
|
||||
#ifdef HAVE_REWIND
|
||||
int16_t *rewind_buf = NULL;
|
||||
int16_t *rewind_buf = NULL;
|
||||
#endif
|
||||
/* Accomodate rewind since at some point we might have two full buffers. */
|
||||
size_t outsamples_max = AUDIO_CHUNK_SIZE_NONBLOCKING * 2 * AUDIO_MAX_RATIO * slowmotion_ratio;
|
||||
int16_t *conv_buf = (int16_t*)memalign_alloc(64, outsamples_max * sizeof(int16_t));
|
||||
float *audio_buf = (float*)memalign_alloc(64, AUDIO_CHUNK_SIZE_NONBLOCKING * 2 * sizeof(float));
|
||||
bool verbosity_enabled = verbosity_is_enabled();
|
||||
size_t outsamples_max = AUDIO_CHUNK_SIZE_NONBLOCKING * 2 * AUDIO_MAX_RATIO * slowmotion_ratio;
|
||||
int16_t *conv_buf = (int16_t*)memalign_alloc(64, outsamples_max * sizeof(int16_t));
|
||||
float *audio_buf = (float*)memalign_alloc(64, AUDIO_CHUNK_SIZE_NONBLOCKING * 2 * sizeof(float));
|
||||
bool verbosity_enabled = verbosity_is_enabled();
|
||||
|
||||
convert_s16_to_float_init_simd();
|
||||
convert_float_to_s16_init_simd();
|
||||
@@ -607,13 +608,13 @@ bool audio_driver_init_internal(
|
||||
if (!rewind_buf)
|
||||
goto error;
|
||||
|
||||
audio_driver_st.rewind_buf = rewind_buf;
|
||||
audio_driver_st.rewind_size = max_bufsamples;
|
||||
audio_driver_st.rewind_buf = rewind_buf;
|
||||
audio_driver_st.rewind_size = max_bufsamples;
|
||||
#endif
|
||||
|
||||
if (!audio_enable)
|
||||
{
|
||||
audio_driver_st.active = false;
|
||||
audio_driver_st.flags &= ~AUDIO_FLAG_ACTIVE;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -627,7 +628,7 @@ bool audio_driver_init_internal(
|
||||
if (!audio_driver_st.current_audio || !audio_driver_st.current_audio->init)
|
||||
{
|
||||
RARCH_ERR("Failed to initialize audio driver. Will continue without audio.\n");
|
||||
audio_driver_st.active = false;
|
||||
audio_driver_st.flags &= ~AUDIO_FLAG_ACTIVE;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -667,19 +668,20 @@ bool audio_driver_init_internal(
|
||||
if (!audio_driver_st.context_audio_data)
|
||||
{
|
||||
RARCH_ERR("Failed to initialize audio driver. Will continue without audio.\n");
|
||||
audio_driver_st.active = false;
|
||||
audio_driver_st.flags &= ~AUDIO_FLAG_ACTIVE;
|
||||
}
|
||||
|
||||
audio_driver_st.use_float = false;
|
||||
if ( audio_driver_st.active
|
||||
audio_driver_st.flags &= ~AUDIO_FLAG_USE_FLOAT;
|
||||
if ( (audio_driver_st.flags & AUDIO_FLAG_ACTIVE)
|
||||
&& audio_driver_st.current_audio->use_float(
|
||||
audio_driver_st.context_audio_data))
|
||||
audio_driver_st.use_float = true;
|
||||
audio_driver_st.flags |= AUDIO_FLAG_USE_FLOAT;
|
||||
|
||||
if (!audio_sync && audio_driver_st.active)
|
||||
if ( !audio_sync
|
||||
&& (audio_driver_st.flags & AUDIO_FLAG_ACTIVE))
|
||||
{
|
||||
if (audio_driver_st.active &&
|
||||
audio_driver_st.context_audio_data)
|
||||
if ( (audio_driver_st.flags & AUDIO_FLAG_ACTIVE)
|
||||
&& audio_driver_st.context_audio_data)
|
||||
audio_driver_st.current_audio->set_nonblock_state(
|
||||
audio_driver_st.context_audio_data, true);
|
||||
|
||||
@@ -720,7 +722,7 @@ bool audio_driver_init_internal(
|
||||
{
|
||||
RARCH_ERR("Failed to initialize resampler \"%s\".\n",
|
||||
audio_driver_st.resampler_ident);
|
||||
audio_driver_st.active = false;
|
||||
audio_driver_st.flags &= ~AUDIO_FLAG_ACTIVE;
|
||||
}
|
||||
|
||||
audio_driver_st.data_ptr = 0;
|
||||
@@ -736,12 +738,12 @@ bool audio_driver_init_internal(
|
||||
goto error;
|
||||
|
||||
audio_driver_st.output_samples_buf = (float*)samples_buf;
|
||||
audio_driver_st.control = false;
|
||||
audio_driver_st.flags &= ~AUDIO_FLAG_CONTROL;
|
||||
|
||||
if (
|
||||
!audio_cb_inited
|
||||
&& audio_driver_st.active
|
||||
&& audio_rate_control
|
||||
!audio_cb_inited
|
||||
&& (audio_driver_st.flags & AUDIO_FLAG_ACTIVE)
|
||||
&& (audio_rate_control)
|
||||
)
|
||||
{
|
||||
/* Audio rate control requires write_avail
|
||||
@@ -751,7 +753,7 @@ bool audio_driver_init_internal(
|
||||
audio_driver_st.buffer_size =
|
||||
audio_driver_st.current_audio->buffer_size(
|
||||
audio_driver_st.context_audio_data);
|
||||
audio_driver_st.control = true;
|
||||
audio_driver_st.flags |= AUDIO_FLAG_CONTROL;
|
||||
}
|
||||
else
|
||||
RARCH_WARN("[Audio]: Rate control was desired, but driver does not support needed features.\n");
|
||||
@@ -767,8 +769,8 @@ bool audio_driver_init_internal(
|
||||
|
||||
/* Threaded driver is initially stopped. */
|
||||
if (
|
||||
audio_driver_st.active
|
||||
&& audio_cb_inited
|
||||
(audio_driver_st.flags & AUDIO_FLAG_ACTIVE)
|
||||
&& audio_cb_inited
|
||||
)
|
||||
audio_driver_start(false);
|
||||
|
||||
@@ -780,10 +782,10 @@ error:
|
||||
|
||||
void audio_driver_sample(int16_t left, int16_t right)
|
||||
{
|
||||
uint32_t runloop_flags;
|
||||
audio_driver_state_t *audio_st = &audio_driver_st;
|
||||
recording_state_t *recording_st = NULL;
|
||||
runloop_state_t *runloop_st = NULL;
|
||||
if (audio_st->suspended)
|
||||
if (audio_st->flags & AUDIO_FLAG_SUSPENDED)
|
||||
return;
|
||||
audio_st->output_samples_conv_buf[audio_st->data_ptr++] = left;
|
||||
audio_st->output_samples_conv_buf[audio_st->data_ptr++] = right;
|
||||
@@ -791,7 +793,7 @@ void audio_driver_sample(int16_t left, int16_t right)
|
||||
if (audio_st->data_ptr < audio_st->chunk_size)
|
||||
return;
|
||||
|
||||
runloop_st = runloop_state_get_ptr();
|
||||
runloop_flags = runloop_get_flags();
|
||||
recording_st = recording_state_get_ptr();
|
||||
|
||||
if ( recording_st->data &&
|
||||
@@ -806,30 +808,32 @@ void audio_driver_sample(int16_t left, int16_t right)
|
||||
recording_st->driver->push_audio(recording_st->data, &ffemu_data);
|
||||
}
|
||||
|
||||
if (!( runloop_st->paused
|
||||
|| !audio_st->active
|
||||
|| !audio_st->output_samples_buf))
|
||||
if (!( (runloop_flags & RUNLOOP_FLAG_PAUSED)
|
||||
|| !(audio_st->flags & AUDIO_FLAG_ACTIVE)
|
||||
|| !(audio_st->output_samples_buf)))
|
||||
audio_driver_flush(audio_st,
|
||||
config_get_ptr()->floats.slowmotion_ratio,
|
||||
config_get_ptr()->bools.audio_fastforward_mute,
|
||||
audio_st->output_samples_conv_buf,
|
||||
audio_st->data_ptr,
|
||||
runloop_st->slowmotion,
|
||||
runloop_st->fastmotion);
|
||||
runloop_flags & RUNLOOP_FLAG_SLOWMOTION,
|
||||
runloop_flags & RUNLOOP_FLAG_FASTMOTION);
|
||||
|
||||
audio_st->data_ptr = 0;
|
||||
}
|
||||
|
||||
size_t audio_driver_sample_batch(const int16_t *data, size_t frames)
|
||||
{
|
||||
uint32_t runloop_flags;
|
||||
size_t frames_remaining = frames;
|
||||
recording_state_t *record_st = recording_state_get_ptr();
|
||||
runloop_state_t *runloop_st = runloop_state_get_ptr();
|
||||
audio_driver_state_t *audio_st = &audio_driver_st;
|
||||
|
||||
if (audio_st->suspended || (frames < 1))
|
||||
if ((audio_st->flags & AUDIO_FLAG_SUSPENDED) || (frames < 1))
|
||||
return frames;
|
||||
|
||||
runloop_flags = runloop_get_flags();
|
||||
|
||||
/* We want to run this loop at least once, so use a
|
||||
* do...while (do...while has only a single conditional
|
||||
* jump, as opposed to for and while which have a
|
||||
@@ -854,16 +858,16 @@ size_t audio_driver_sample_batch(const int16_t *data, size_t frames)
|
||||
record_st->driver->push_audio(record_st->data, &ffemu_data);
|
||||
}
|
||||
|
||||
if (!( runloop_st->paused
|
||||
|| !audio_st->active
|
||||
|| !audio_st->output_samples_buf))
|
||||
if (!( (runloop_flags & RUNLOOP_FLAG_PAUSED)
|
||||
|| !(audio_st->flags & AUDIO_FLAG_ACTIVE)
|
||||
|| !(audio_st->output_samples_buf)))
|
||||
audio_driver_flush(audio_st,
|
||||
config_get_ptr()->floats.slowmotion_ratio,
|
||||
config_get_ptr()->bools.audio_fastforward_mute,
|
||||
data,
|
||||
frames_to_write << 1,
|
||||
runloop_st->slowmotion,
|
||||
runloop_st->fastmotion);
|
||||
runloop_flags & RUNLOOP_FLAG_SLOWMOTION,
|
||||
runloop_flags & RUNLOOP_FLAG_FASTMOTION);
|
||||
|
||||
frames_remaining -= frames_to_write;
|
||||
data += frames_to_write << 1;
|
||||
@@ -917,18 +921,13 @@ bool audio_driver_dsp_filter_init(const char *device)
|
||||
retro_dsp_filter_t *audio_driver_dsp = NULL;
|
||||
struct string_list *plugs = NULL;
|
||||
#if defined(HAVE_DYLIB) && !defined(HAVE_FILTERS_BUILTIN)
|
||||
char basedir[PATH_MAX_LENGTH];
|
||||
char ext_name[PATH_MAX_LENGTH];
|
||||
|
||||
basedir[0] = ext_name[0] = '\0';
|
||||
|
||||
char ext_name[32];
|
||||
char basedir[256];
|
||||
ext_name[0] = '\0';
|
||||
fill_pathname_basedir(basedir, device, sizeof(basedir));
|
||||
|
||||
if (!frontend_driver_get_core_extension(ext_name, sizeof(ext_name)))
|
||||
return false;
|
||||
|
||||
plugs = dir_list_new(basedir, ext_name, false, true, false, false);
|
||||
if (!plugs)
|
||||
if (!(plugs = dir_list_new(basedir, ext_name, false, true, false, false)))
|
||||
return false;
|
||||
#endif
|
||||
audio_driver_dsp = retro_dsp_filter_new(
|
||||
@@ -954,10 +953,10 @@ float audio_driver_monitor_adjust_system_rates(
|
||||
unsigned video_swap_interval,
|
||||
float audio_max_timing_skew)
|
||||
{
|
||||
float inp_sample_rate = input_sample_rate;
|
||||
const float target_video_sync_rate = video_refresh_rate
|
||||
/ video_swap_interval;
|
||||
float timing_skew =
|
||||
float inp_sample_rate = input_sample_rate;
|
||||
float target_video_sync_rate = video_refresh_rate
|
||||
/ (float)video_swap_interval;
|
||||
float timing_skew =
|
||||
fabs(1.0f - input_fps / target_video_sync_rate);
|
||||
if (timing_skew <= audio_max_timing_skew)
|
||||
return (inp_sample_rate * target_video_sync_rate / input_fps);
|
||||
@@ -1103,7 +1102,6 @@ static void audio_mixer_menu_stop_cb(
|
||||
}
|
||||
break;
|
||||
case AUDIO_MIXER_SOUND_STOPPED:
|
||||
break;
|
||||
case AUDIO_MIXER_SOUND_REPEATED:
|
||||
break;
|
||||
}
|
||||
@@ -1153,7 +1151,6 @@ static void audio_mixer_play_stop_sequential_cb(
|
||||
}
|
||||
break;
|
||||
case AUDIO_MIXER_SOUND_STOPPED:
|
||||
break;
|
||||
case AUDIO_MIXER_SOUND_REPEATED:
|
||||
break;
|
||||
}
|
||||
@@ -1167,8 +1164,8 @@ static bool audio_driver_mixer_get_free_stream_slot(
|
||||
|
||||
if (type == AUDIO_STREAM_TYPE_USER)
|
||||
{
|
||||
i = 0;
|
||||
count = AUDIO_MIXER_MAX_STREAMS;
|
||||
i = 0;
|
||||
count = AUDIO_MIXER_MAX_STREAMS;
|
||||
}
|
||||
|
||||
for (; i < count; i++)
|
||||
@@ -1189,7 +1186,7 @@ bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params)
|
||||
audio_mixer_voice_t *voice = NULL;
|
||||
audio_mixer_sound_t *handle = NULL;
|
||||
audio_mixer_stop_cb_t stop_cb = audio_mixer_play_stop_cb;
|
||||
bool looped = false;
|
||||
bool looped = (params->state == AUDIO_STREAM_STATE_PLAYING_LOOPED);
|
||||
void *buf = NULL;
|
||||
|
||||
if (params->stream_type == AUDIO_STREAM_TYPE_NONE)
|
||||
@@ -1209,18 +1206,14 @@ bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params)
|
||||
break;
|
||||
case AUDIO_MIXER_SLOT_SELECTION_AUTOMATIC:
|
||||
default:
|
||||
if (!audio_driver_mixer_get_free_stream_slot(
|
||||
&free_slot, params->stream_type))
|
||||
return false;
|
||||
break;
|
||||
return audio_driver_mixer_get_free_stream_slot(
|
||||
&free_slot, params->stream_type);
|
||||
}
|
||||
|
||||
if (params->state == AUDIO_STREAM_STATE_NONE)
|
||||
return false;
|
||||
|
||||
buf = malloc(params->bufsize);
|
||||
|
||||
if (!buf)
|
||||
if (!(buf = malloc(params->bufsize)))
|
||||
return false;
|
||||
|
||||
memcpy(buf, params->buf, params->bufsize);
|
||||
@@ -1266,19 +1259,11 @@ bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params)
|
||||
|
||||
switch (params->state)
|
||||
{
|
||||
case AUDIO_STREAM_STATE_PLAYING_LOOPED:
|
||||
looped = true;
|
||||
voice = audio_mixer_play(handle, looped, params->volume,
|
||||
audio_driver_st.resampler_ident,
|
||||
audio_driver_st.resampler_quality, stop_cb);
|
||||
break;
|
||||
case AUDIO_STREAM_STATE_PLAYING:
|
||||
voice = audio_mixer_play(handle, looped, params->volume,
|
||||
audio_driver_st.resampler_ident,
|
||||
audio_driver_st.resampler_quality, stop_cb);
|
||||
break;
|
||||
case AUDIO_STREAM_STATE_PLAYING_SEQUENTIAL:
|
||||
stop_cb = audio_mixer_play_stop_sequential_cb;
|
||||
/* fall-through */
|
||||
case AUDIO_STREAM_STATE_PLAYING_LOOPED:
|
||||
case AUDIO_STREAM_STATE_PLAYING:
|
||||
voice = audio_mixer_play(handle, looped, params->volume,
|
||||
audio_driver_st.resampler_ident,
|
||||
audio_driver_st.resampler_quality, stop_cb);
|
||||
@@ -1287,7 +1272,7 @@ bool audio_driver_mixer_add_stream(audio_mixer_stream_params_t *params)
|
||||
break;
|
||||
}
|
||||
|
||||
audio_driver_st.mixer_active = true;
|
||||
audio_driver_st.flags |= AUDIO_FLAG_MIXER_ACTIVE;
|
||||
|
||||
audio_driver_st.mixer_streams[free_slot].name =
|
||||
!string_is_empty(params->basename) ? strdup(params->basename) : NULL;
|
||||
@@ -1339,20 +1324,16 @@ static void audio_driver_mixer_play_stream_internal(
|
||||
static void audio_driver_load_menu_bgm_callback(retro_task_t *task,
|
||||
void *task_data, void *user_data, const char *error)
|
||||
{
|
||||
bool contentless = false;
|
||||
bool is_inited = false;
|
||||
|
||||
content_get_status(&contentless, &is_inited);
|
||||
|
||||
if (!is_inited)
|
||||
uint8_t flags = content_get_flags();
|
||||
if (!(flags & CONTENT_ST_FLAG_IS_INITED))
|
||||
audio_driver_mixer_play_menu_sound_looped(AUDIO_MIXER_SYSTEM_SLOT_BGM);
|
||||
}
|
||||
|
||||
void audio_driver_load_system_sounds(void)
|
||||
{
|
||||
char basename_noext[256];
|
||||
char sounds_path[PATH_MAX_LENGTH];
|
||||
char sounds_fallback_path[PATH_MAX_LENGTH];
|
||||
char basename_noext[PATH_MAX_LENGTH];
|
||||
settings_t *settings = config_get_ptr();
|
||||
const char *dir_assets = settings->paths.directory_assets;
|
||||
const bool audio_enable_menu = settings->bools.audio_enable_menu;
|
||||
@@ -1373,10 +1354,9 @@ void audio_driver_load_system_sounds(void)
|
||||
if (!audio_enable_menu && !audio_enable_cheevo_unlock)
|
||||
goto end;
|
||||
|
||||
sounds_path[0] = sounds_fallback_path[0] =
|
||||
basename_noext[0] ='\0';
|
||||
sounds_path[0] = basename_noext[0] ='\0';
|
||||
|
||||
fill_pathname_join(
|
||||
fill_pathname_join_special(
|
||||
sounds_fallback_path,
|
||||
dir_assets,
|
||||
"sounds",
|
||||
@@ -1419,7 +1399,8 @@ void audio_driver_load_system_sounds(void)
|
||||
if (audio_driver_mixer_extension_supported(ext))
|
||||
{
|
||||
basename_noext[0] = '\0';
|
||||
fill_pathname_base_noext(basename_noext, path, sizeof(basename_noext));
|
||||
fill_pathname_base(basename_noext, path, sizeof(basename_noext));
|
||||
path_remove_extension(basename_noext);
|
||||
|
||||
if (string_is_equal_noncase(basename_noext, "ok"))
|
||||
path_ok = path;
|
||||
@@ -1508,8 +1489,6 @@ void audio_driver_mixer_set_stream_volume(unsigned i, float vol)
|
||||
|
||||
void audio_driver_mixer_stop_stream(unsigned i)
|
||||
{
|
||||
bool set_state = false;
|
||||
|
||||
if (i >= AUDIO_MIXER_MAX_SYSTEM_STREAMS)
|
||||
return;
|
||||
|
||||
@@ -1518,28 +1497,23 @@ void audio_driver_mixer_stop_stream(unsigned i)
|
||||
case AUDIO_STREAM_STATE_PLAYING:
|
||||
case AUDIO_STREAM_STATE_PLAYING_LOOPED:
|
||||
case AUDIO_STREAM_STATE_PLAYING_SEQUENTIAL:
|
||||
set_state = true;
|
||||
{
|
||||
audio_mixer_voice_t *voice = audio_driver_st.mixer_streams[i].voice;
|
||||
|
||||
if (voice)
|
||||
audio_mixer_stop(voice);
|
||||
audio_driver_st.mixer_streams[i].state = AUDIO_STREAM_STATE_STOPPED;
|
||||
audio_driver_st.mixer_streams[i].volume = 1.0f;
|
||||
}
|
||||
break;
|
||||
case AUDIO_STREAM_STATE_STOPPED:
|
||||
case AUDIO_STREAM_STATE_NONE:
|
||||
break;
|
||||
}
|
||||
|
||||
if (set_state)
|
||||
{
|
||||
audio_mixer_voice_t *voice = audio_driver_st.mixer_streams[i].voice;
|
||||
|
||||
if (voice)
|
||||
audio_mixer_stop(voice);
|
||||
audio_driver_st.mixer_streams[i].state = AUDIO_STREAM_STATE_STOPPED;
|
||||
audio_driver_st.mixer_streams[i].volume = 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
void audio_driver_mixer_remove_stream(unsigned i)
|
||||
{
|
||||
bool destroy = false;
|
||||
|
||||
if (i >= AUDIO_MIXER_MAX_SYSTEM_STREAMS)
|
||||
return;
|
||||
|
||||
@@ -1549,31 +1523,28 @@ void audio_driver_mixer_remove_stream(unsigned i)
|
||||
case AUDIO_STREAM_STATE_PLAYING_LOOPED:
|
||||
case AUDIO_STREAM_STATE_PLAYING_SEQUENTIAL:
|
||||
audio_driver_mixer_stop_stream(i);
|
||||
destroy = true;
|
||||
break;
|
||||
/* fall-through */
|
||||
case AUDIO_STREAM_STATE_STOPPED:
|
||||
destroy = true;
|
||||
{
|
||||
audio_mixer_sound_t *handle = audio_driver_st.mixer_streams[i].handle;
|
||||
if (handle)
|
||||
audio_mixer_destroy(handle);
|
||||
|
||||
if (!string_is_empty(audio_driver_st.mixer_streams[i].name))
|
||||
free(audio_driver_st.mixer_streams[i].name);
|
||||
|
||||
audio_driver_st.mixer_streams[i].state = AUDIO_STREAM_STATE_NONE;
|
||||
audio_driver_st.mixer_streams[i].stop_cb = NULL;
|
||||
audio_driver_st.mixer_streams[i].volume = 0.0f;
|
||||
audio_driver_st.mixer_streams[i].handle = NULL;
|
||||
audio_driver_st.mixer_streams[i].voice = NULL;
|
||||
audio_driver_st.mixer_streams[i].name = NULL;
|
||||
}
|
||||
break;
|
||||
case AUDIO_STREAM_STATE_NONE:
|
||||
break;
|
||||
}
|
||||
|
||||
if (destroy)
|
||||
{
|
||||
audio_mixer_sound_t *handle = audio_driver_st.mixer_streams[i].handle;
|
||||
if (handle)
|
||||
audio_mixer_destroy(handle);
|
||||
|
||||
if (!string_is_empty(audio_driver_st.mixer_streams[i].name))
|
||||
free(audio_driver_st.mixer_streams[i].name);
|
||||
|
||||
audio_driver_st.mixer_streams[i].state = AUDIO_STREAM_STATE_NONE;
|
||||
audio_driver_st.mixer_streams[i].stop_cb = NULL;
|
||||
audio_driver_st.mixer_streams[i].volume = 0.0f;
|
||||
audio_driver_st.mixer_streams[i].handle = NULL;
|
||||
audio_driver_st.mixer_streams[i].voice = NULL;
|
||||
audio_driver_st.mixer_streams[i].name = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bool audio_driver_mixer_toggle_mute(void)
|
||||
@@ -1606,15 +1577,18 @@ bool audio_driver_disable_callback(void)
|
||||
bool audio_driver_callback(void)
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
bool runloop_paused = runloop_state_get_ptr()->paused;
|
||||
uint32_t runloop_flags = runloop_get_flags();
|
||||
bool runloop_paused = runloop_flags & RUNLOOP_FLAG_PAUSED;
|
||||
#ifdef HAVE_MENU
|
||||
#ifdef HAVE_NETWORKING
|
||||
bool core_paused = runloop_paused ||
|
||||
(settings->bools.menu_pause_libretro && menu_state_get_ptr()->alive &&
|
||||
netplay_driver_ctl(RARCH_NETPLAY_CTL_ALLOW_PAUSE, NULL));
|
||||
( settings->bools.menu_pause_libretro
|
||||
&& (menu_state_get_ptr()->flags & MENU_ST_FLAG_ALIVE)
|
||||
&& netplay_driver_ctl(RARCH_NETPLAY_CTL_ALLOW_PAUSE, NULL));
|
||||
#else
|
||||
bool core_paused = runloop_paused ||
|
||||
(settings->bools.menu_pause_libretro && menu_state_get_ptr()->alive);
|
||||
(settings->bools.menu_pause_libretro
|
||||
&& (menu_state_get_ptr()->flags & MENU_ST_FLAG_ALIVE));
|
||||
#endif
|
||||
#else
|
||||
bool core_paused = runloop_paused;
|
||||
@@ -1661,7 +1635,7 @@ bool audio_driver_start(bool is_shutdown)
|
||||
error:
|
||||
RARCH_ERR("%s\n",
|
||||
msg_hash_to_str(MSG_FAILED_TO_START_AUDIO_DRIVER));
|
||||
audio_driver_st.active = false;
|
||||
audio_driver_st.flags &= ~AUDIO_FLAG_ACTIVE;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1682,7 +1656,7 @@ void audio_driver_frame_is_reverse(void)
|
||||
{
|
||||
audio_driver_state_t *audio_st = &audio_driver_st;
|
||||
recording_state_t *recording_st = recording_state_get_ptr();
|
||||
runloop_state_t *runloop_st = runloop_state_get_ptr();
|
||||
uint32_t runloop_flags = runloop_get_flags();
|
||||
|
||||
/* We just rewound. Flush rewind audio buffer. */
|
||||
if ( recording_st->data &&
|
||||
@@ -1702,10 +1676,10 @@ void audio_driver_frame_is_reverse(void)
|
||||
}
|
||||
|
||||
if (!(
|
||||
runloop_st->paused
|
||||
|| !audio_st->active
|
||||
|| !audio_st->output_samples_buf))
|
||||
if (!audio_st->suspended)
|
||||
(runloop_flags & RUNLOOP_FLAG_PAUSED)
|
||||
|| !(audio_st->flags & AUDIO_FLAG_ACTIVE)
|
||||
|| !(audio_st->output_samples_buf)))
|
||||
if (!(audio_st->flags & AUDIO_FLAG_SUSPENDED))
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
audio_driver_flush(audio_st,
|
||||
@@ -1715,8 +1689,8 @@ void audio_driver_frame_is_reverse(void)
|
||||
audio_st->rewind_ptr,
|
||||
audio_st->rewind_size -
|
||||
audio_st->rewind_ptr,
|
||||
runloop_st->slowmotion,
|
||||
runloop_st->fastmotion);
|
||||
runloop_flags & RUNLOOP_FLAG_SLOWMOTION,
|
||||
runloop_flags & RUNLOOP_FLAG_FASTMOTION);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1847,7 +1821,7 @@ void audio_driver_menu_sample(void)
|
||||
static int16_t samples_buf[1024] = {0};
|
||||
settings_t *settings = config_get_ptr();
|
||||
video_driver_state_t *video_st = video_state_get_ptr();
|
||||
runloop_state_t *runloop_st = runloop_state_get_ptr();
|
||||
uint32_t runloop_flags = runloop_get_flags();
|
||||
recording_state_t *recording_st = recording_state_get_ptr();
|
||||
struct retro_system_av_info *av_info = &video_st->av_info;
|
||||
const struct retro_system_timing *info =
|
||||
@@ -1855,10 +1829,10 @@ void audio_driver_menu_sample(void)
|
||||
unsigned sample_count = (info->sample_rate / info->fps) * 2;
|
||||
audio_driver_state_t *audio_st = &audio_driver_st;
|
||||
bool check_flush = !(
|
||||
runloop_st->paused
|
||||
|| !audio_st->active
|
||||
(runloop_flags & RUNLOOP_FLAG_PAUSED)
|
||||
|| !(audio_st->flags & AUDIO_FLAG_ACTIVE)
|
||||
|| !audio_st->output_samples_buf);
|
||||
if (audio_st->suspended)
|
||||
if ((audio_st->flags & AUDIO_FLAG_SUSPENDED))
|
||||
check_flush = false;
|
||||
|
||||
while (sample_count > 1024)
|
||||
@@ -1881,8 +1855,8 @@ void audio_driver_menu_sample(void)
|
||||
settings->bools.audio_fastforward_mute,
|
||||
samples_buf,
|
||||
1024,
|
||||
runloop_st->slowmotion,
|
||||
runloop_st->fastmotion);
|
||||
runloop_flags & RUNLOOP_FLAG_SLOWMOTION,
|
||||
runloop_flags & RUNLOOP_FLAG_FASTMOTION);
|
||||
sample_count -= 1024;
|
||||
}
|
||||
if ( recording_st->data &&
|
||||
@@ -1903,7 +1877,7 @@ void audio_driver_menu_sample(void)
|
||||
settings->bools.audio_fastforward_mute,
|
||||
samples_buf,
|
||||
sample_count,
|
||||
runloop_st->slowmotion,
|
||||
runloop_st->fastmotion);
|
||||
runloop_flags & RUNLOOP_FLAG_SLOWMOTION,
|
||||
runloop_flags & RUNLOOP_FLAG_FASTMOTION);
|
||||
}
|
||||
#endif
|
||||
+12
-8
@@ -158,6 +158,16 @@ typedef struct audio_driver
|
||||
size_t (*buffer_size)(void *data);
|
||||
} audio_driver_t;
|
||||
|
||||
enum audio_driver_state_flags
|
||||
{
|
||||
AUDIO_FLAG_ACTIVE = (1 << 0),
|
||||
AUDIO_FLAG_USE_FLOAT = (1 << 1),
|
||||
AUDIO_FLAG_SUSPENDED = (1 << 2),
|
||||
AUDIO_FLAG_MIXER_ACTIVE = (1 << 3),
|
||||
AUDIO_FLAG_HARD_DISABLE = (1 << 4),
|
||||
AUDIO_FLAG_CONTROL = (1 << 5)
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
double source_ratio_original;
|
||||
@@ -210,19 +220,13 @@ typedef struct
|
||||
|
||||
enum resampler_quality resampler_quality;
|
||||
|
||||
uint8_t flags;
|
||||
|
||||
char resampler_ident[64];
|
||||
|
||||
bool active;
|
||||
bool control;
|
||||
bool mute_enable;
|
||||
bool use_float;
|
||||
bool suspended;
|
||||
#ifdef HAVE_AUDIOMIXER
|
||||
bool mixer_mute_enable;
|
||||
bool mixer_active;
|
||||
#endif
|
||||
#ifdef HAVE_RUNAHEAD
|
||||
bool hard_disable;
|
||||
#endif
|
||||
} audio_driver_state_t;
|
||||
|
||||
|
||||
@@ -79,13 +79,14 @@ static void *gx_audio_init(const char *device,
|
||||
AIInit(NULL);
|
||||
AIRegisterDMACallback(dma_callback);
|
||||
|
||||
//ranges 0-32000 (default low) and 40000-47999 (in settings going down from 48000) -> set to 32000 hz
|
||||
/* Ranges 0-32000 (default low) and 40000-47999
|
||||
(in settings going down from 48000) -> set to 32000 hz */
|
||||
if (rate <= 32000 || (rate >= 40000 && rate < 48000))
|
||||
{
|
||||
AISetDSPSampleRate(AI_SAMPLERATE_32KHZ);
|
||||
*new_rate = 32000;
|
||||
}
|
||||
else //ranges 32001-39999 (in settings going up from 32000) and 48000-max (default high) -> set to 48000 hz
|
||||
else /* Ranges 32001-39999 (in settings going up from 32000) and 48000-max (default high) -> set to 48000 hz */
|
||||
{
|
||||
AISetDSPSampleRate(AI_SAMPLERATE_48KHZ);
|
||||
*new_rate = 48000;
|
||||
@@ -93,7 +94,7 @@ static void *gx_audio_init(const char *device,
|
||||
|
||||
wa->dma_write = BLOCKS - 1;
|
||||
DCFlushRange(wa->data, sizeof(wa->data));
|
||||
stop_audio = false;
|
||||
stop_audio = false;
|
||||
AIInitDMA((uint32_t)wa->data[wa->dma_next], CHUNK_SIZE);
|
||||
AIStartDMA();
|
||||
|
||||
|
||||
+23
-28
@@ -34,10 +34,9 @@
|
||||
#include <pspkernel.h>
|
||||
#include <pspaudio.h>
|
||||
#elif defined(ORBIS)
|
||||
#include <audioout.h>
|
||||
#define SCE_AUDIO_OUT_PORT_TYPE_MAIN 0
|
||||
#define SCE_AUDIO_OUT_MODE_STEREO 1
|
||||
#define SceUID uint32_t
|
||||
#include <libSceAudioOut.h>
|
||||
#include <defines/ps4_defines.h>
|
||||
#include <verbosity.h>
|
||||
#endif
|
||||
|
||||
#include "../audio_driver.h"
|
||||
@@ -55,6 +54,7 @@ typedef struct psp_audio
|
||||
SceUID thread;
|
||||
|
||||
int port;
|
||||
int rate;
|
||||
|
||||
volatile uint16_t read_pos;
|
||||
volatile uint16_t write_pos;
|
||||
@@ -129,44 +129,35 @@ static void *psp_audio_init(const char *device,
|
||||
unsigned block_frames,
|
||||
unsigned *new_rate)
|
||||
{
|
||||
int port;
|
||||
psp_audio_t *psp = (psp_audio_t*)calloc(1, sizeof(psp_audio_t));
|
||||
|
||||
if (!psp)
|
||||
return NULL;
|
||||
|
||||
int port = configureAudio(rate);
|
||||
if (port < 0)
|
||||
if ((port = configureAudio(rate)) < 0)
|
||||
return NULL;
|
||||
|
||||
#ifdef ORBIS
|
||||
psp->buffer = (uint32_t*)
|
||||
malloc(AUDIO_BUFFER_SIZE * sizeof(uint32_t));
|
||||
#else
|
||||
/* Cache aligned, not necessary but helpful. */
|
||||
psp->buffer = (uint32_t*)
|
||||
memalign(64, AUDIO_BUFFER_SIZE * sizeof(uint32_t));
|
||||
#if defined(ORBIS)
|
||||
sceAudioOutInit();
|
||||
#endif
|
||||
/* Cache aligned, not necessary but helpful. */
|
||||
psp->buffer = (uint32_t*)malloc(AUDIO_BUFFER_SIZE * sizeof(uint32_t));
|
||||
memset(psp->buffer, 0, AUDIO_BUFFER_SIZE * sizeof(uint32_t));
|
||||
|
||||
#ifdef ORBIS
|
||||
psp->zeroBuffer = (uint32_t*)
|
||||
malloc(AUDIO_OUT_COUNT * sizeof(uint32_t));
|
||||
#else
|
||||
psp->zeroBuffer = (uint32_t*)
|
||||
memalign(64, AUDIO_OUT_COUNT * sizeof(uint32_t));
|
||||
#endif
|
||||
psp->zeroBuffer = (uint32_t*)malloc(AUDIO_OUT_COUNT * sizeof(uint32_t));
|
||||
memset(psp->zeroBuffer, 0, AUDIO_OUT_COUNT * sizeof(uint32_t));
|
||||
|
||||
psp->read_pos = 0;
|
||||
psp->write_pos = 0;
|
||||
psp->port = port;
|
||||
psp->read_pos = 0;
|
||||
psp->write_pos = 0;
|
||||
psp->port = port;
|
||||
|
||||
psp->fifo_lock = slock_new();
|
||||
psp->cond_lock = slock_new();
|
||||
psp->cond = scond_new();
|
||||
psp->fifo_lock = slock_new();
|
||||
psp->cond_lock = slock_new();
|
||||
psp->cond = scond_new();
|
||||
|
||||
psp->nonblock = false;
|
||||
psp->running = true;
|
||||
psp->nonblock = false;
|
||||
psp->running = true;
|
||||
psp->worker_thread = sthread_create(audioMainLoop, psp);
|
||||
|
||||
return psp;
|
||||
@@ -263,6 +254,9 @@ static bool psp_audio_stop(void *data)
|
||||
{
|
||||
psp_audio_t* psp = (psp_audio_t*)data;
|
||||
|
||||
#if defined(ORBIS)
|
||||
return false;
|
||||
#else
|
||||
if (psp){
|
||||
psp->running = false;
|
||||
|
||||
@@ -273,6 +267,7 @@ static bool psp_audio_stop(void *data)
|
||||
psp->worker_thread = NULL;
|
||||
}
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
static bool psp_audio_start(void *data, bool is_shutdown)
|
||||
|
||||
@@ -274,7 +274,7 @@ fail_audio_output:
|
||||
fail_audio_ipc:
|
||||
switch_audio_ipc_finalize();
|
||||
fail:
|
||||
free(swa); // freeing a null ptr is valid
|
||||
free(swa); /* freeing a NULL ptr is valid */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
+20
-11
@@ -57,12 +57,17 @@ typedef struct xaudio2 xaudio2_t;
|
||||
|
||||
#define XAUDIO2_WRITE_AVAILABLE(handle) ((handle)->bufsize * (MAX_BUFFERS - (handle)->buffers - 1))
|
||||
|
||||
enum xa_flags
|
||||
{
|
||||
XA2_FLAG_NONBLOCK = (1 << 0),
|
||||
XA2_FLAG_IS_PAUSED = (1 << 1)
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
xaudio2_t *xa;
|
||||
size_t bufsize;
|
||||
bool nonblock;
|
||||
bool is_paused;
|
||||
uint8_t flags;
|
||||
} xa_t;
|
||||
|
||||
/* Forward declarations */
|
||||
@@ -323,8 +328,7 @@ static void *xa_init(const char *device, unsigned rate, unsigned latency,
|
||||
bufsize = latency * rate / 1000;
|
||||
xa->bufsize = bufsize * 2 * sizeof(float);
|
||||
|
||||
xa->xa = xaudio2_new(rate, 2, xa->bufsize, device);
|
||||
if (!xa->xa)
|
||||
if (!(xa->xa = xaudio2_new(rate, 2, xa->bufsize, device)))
|
||||
{
|
||||
RARCH_ERR("[XAudio2] Failed to init driver.\n");
|
||||
free(xa);
|
||||
@@ -344,7 +348,7 @@ static ssize_t xa_write(void *data, const void *buf, size_t size)
|
||||
xaudio2_t *handle = xa->xa;
|
||||
const uint8_t *buffer = (const uint8_t*)buf;
|
||||
|
||||
if (xa->nonblock)
|
||||
if (xa->flags & XA2_FLAG_NONBLOCK)
|
||||
{
|
||||
size_t avail = XAUDIO2_WRITE_AVAILABLE(xa->xa);
|
||||
|
||||
@@ -403,8 +407,8 @@ static ssize_t xa_write(void *data, const void *buf, size_t size)
|
||||
|
||||
static bool xa_stop(void *data)
|
||||
{
|
||||
xa_t *xa = (xa_t*)data;
|
||||
xa->is_paused = true;
|
||||
xa_t *xa = (xa_t*)data;
|
||||
xa->flags |= XA2_FLAG_IS_PAUSED;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -413,20 +417,25 @@ static bool xa_alive(void *data)
|
||||
xa_t *xa = (xa_t*)data;
|
||||
if (!xa)
|
||||
return false;
|
||||
return !xa->is_paused;
|
||||
return !(xa->flags & XA2_FLAG_IS_PAUSED);
|
||||
}
|
||||
|
||||
static void xa_set_nonblock_state(void *data, bool state)
|
||||
{
|
||||
xa_t *xa = (xa_t*)data;
|
||||
if (xa)
|
||||
xa->nonblock = state;
|
||||
{
|
||||
if (state)
|
||||
xa->flags |= XA2_FLAG_NONBLOCK;
|
||||
else
|
||||
xa->flags &= ~XA2_FLAG_NONBLOCK;
|
||||
}
|
||||
}
|
||||
|
||||
static bool xa_start(void *data, bool is_shutdown)
|
||||
{
|
||||
xa_t *xa = (xa_t*)data;
|
||||
xa->is_paused = false;
|
||||
xa_t *xa = (xa_t*)data;
|
||||
xa->flags &= ~(XA2_FLAG_IS_PAUSED);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
+60
-53
@@ -94,7 +94,7 @@
|
||||
****************************************************************************
|
||||
*/
|
||||
|
||||
// Internal enumerations
|
||||
/* Internal enumerations */
|
||||
enum rsd_logtype
|
||||
{
|
||||
RSD_LOG_DEBUG = 0,
|
||||
@@ -111,7 +111,7 @@ enum rsd_conn_type
|
||||
RSD_CONN_PROTO = 0x100
|
||||
};
|
||||
|
||||
// Some logging macros.
|
||||
/* Some logging macros. */
|
||||
#define RSD_WARN(fmt, args...)
|
||||
#define RSD_ERR(fmt, args...)
|
||||
#define RSD_DEBUG(fmt, args...)
|
||||
@@ -159,7 +159,7 @@ static size_t rsnd_get_delay(rsound_t *rd);
|
||||
static size_t rsnd_get_ptr(rsound_t *rd);
|
||||
static int rsnd_reset(rsound_t *rd);
|
||||
|
||||
// Protocol functions
|
||||
/* Protocol functions */
|
||||
static int rsnd_send_identity_info(rsound_t *rd);
|
||||
static int rsnd_close_ctl(rsound_t *rd);
|
||||
static int rsnd_send_info_query(rsound_t *rd);
|
||||
@@ -328,7 +328,7 @@ static int rsnd_send_header_info(rsound_t *rd)
|
||||
uint16_t temp_bits = 8 * rsnd_format_to_samplesize(rd->format);
|
||||
uint16_t temp_format = rd->format;
|
||||
|
||||
// Checks the format for native endian which will need to be set properly.
|
||||
/* Checks the format for native endian which will need to be set properly. */
|
||||
switch ( temp_format )
|
||||
{
|
||||
case RSD_S16_NE:
|
||||
@@ -365,7 +365,7 @@ static int rsnd_send_header_info(rsound_t *rd)
|
||||
to determine whether we're running it or not, so we can byte swap accordingly.
|
||||
Could determine this compile time, but it was simpler to do it this way. */
|
||||
|
||||
// Fancy macros for embedding little endian values into the header.
|
||||
/* Fancy macros for embedding little endian values into the header. */
|
||||
#define SET32(buf,offset,x) (*((uint32_t*)(buf+offset)) = x)
|
||||
#define SET16(buf,offset,x) (*((uint16_t*)(buf+offset)) = x)
|
||||
|
||||
@@ -383,7 +383,7 @@ static int rsnd_send_header_info(rsound_t *rd)
|
||||
LSB32(temp32);
|
||||
SET32(header, 16, temp32);
|
||||
|
||||
temp16 = 0; // PCM data
|
||||
temp16 = 0; /* PCM data */
|
||||
|
||||
switch( rd->format )
|
||||
{
|
||||
@@ -404,10 +404,10 @@ static int rsnd_send_header_info(rsound_t *rd)
|
||||
LSB16(temp16);
|
||||
SET16(header, 20, temp16);
|
||||
|
||||
// Channels here
|
||||
/* Channels here */
|
||||
LSB16(temp_channels);
|
||||
SET16(header, CHANNEL, temp_channels);
|
||||
// Samples per sec
|
||||
/* Samples per sec */
|
||||
LSB32(temp_rate);
|
||||
SET32(header, RATE, temp_rate);
|
||||
|
||||
@@ -419,7 +419,7 @@ static int rsnd_send_header_info(rsound_t *rd)
|
||||
LSB16(temp16);
|
||||
SET16(header, 32, temp16);
|
||||
|
||||
// Bits per sample
|
||||
/* Bits per sample */
|
||||
LSB16(temp_bits);
|
||||
SET16(header, FRAMESIZE, temp_bits);
|
||||
|
||||
@@ -450,7 +450,7 @@ static int rsnd_get_backend_info ( rsound_t *rd )
|
||||
#define LATENCY 0
|
||||
#define CHUNKSIZE 1
|
||||
|
||||
// Header is 2 uint32_t's. = 8 bytes.
|
||||
/* Header is 2 uint32_t's. = 8 bytes. */
|
||||
uint32_t rsnd_header[2] = {0};
|
||||
|
||||
if ( rsnd_recv_chunk(rd->conn.socket, rsnd_header, RSND_HEADER_SIZE, 1) != RSND_HEADER_SIZE )
|
||||
@@ -470,7 +470,7 @@ static int rsnd_get_backend_info ( rsound_t *rd )
|
||||
rd->backend_info.latency = rsnd_header[LATENCY];
|
||||
rd->backend_info.chunk_size = rsnd_header[CHUNKSIZE];
|
||||
|
||||
#define MAX_CHUNK_SIZE 1024 // We do not want larger chunk sizes than this.
|
||||
#define MAX_CHUNK_SIZE 1024 /* We do not want larger chunk sizes than this. */
|
||||
if ( rd->backend_info.chunk_size > MAX_CHUNK_SIZE || rd->backend_info.chunk_size <= 0 )
|
||||
rd->backend_info.chunk_size = MAX_CHUNK_SIZE;
|
||||
|
||||
@@ -487,7 +487,7 @@ static int rsnd_get_backend_info ( rsound_t *rd )
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Only bother with setting network buffer size if we're doing TCP.
|
||||
/* Only bother with setting network buffer size if we're doing TCP. */
|
||||
if ( rd->conn_type & RSD_CONN_TCP )
|
||||
{
|
||||
#define MAX_TCP_BUFSIZE (1 << 14)
|
||||
@@ -507,17 +507,17 @@ static int rsnd_get_backend_info ( rsound_t *rd )
|
||||
setsockopt(rd->conn.ctl_socket, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int));
|
||||
}
|
||||
|
||||
// Can we read the last 8 bytes so we can use the protocol interface?
|
||||
// This is non-blocking.
|
||||
/* Can we read the last 8 bytes so we can use the protocol interface? */
|
||||
/* This is non-blocking. */
|
||||
if ( rsnd_recv_chunk(rd->conn.socket, rsnd_header, RSND_HEADER_SIZE, 0) == RSND_HEADER_SIZE )
|
||||
rd->conn_type |= RSD_CONN_PROTO;
|
||||
else
|
||||
{ RSD_DEBUG("[RSound] Failed to get new proto.\n"); }
|
||||
|
||||
// We no longer want to read from this socket.
|
||||
/* We no longer want to read from this socket. */
|
||||
#ifdef _WIN32
|
||||
net_shutdown(rd->conn.socket, SD_RECEIVE);
|
||||
#elif !defined(__APPLE__) // OSX doesn't seem to like shutdown()
|
||||
#elif !defined(__APPLE__) /* OSX doesn't seem to like shutdown() */
|
||||
net_shutdown(rd->conn.socket, SHUT_RD);
|
||||
#endif
|
||||
|
||||
@@ -727,7 +727,7 @@ static int64_t rsnd_get_time_usec(void)
|
||||
{
|
||||
#if defined(_WIN32)
|
||||
static LARGE_INTEGER freq;
|
||||
if (!freq.QuadPart && !QueryPerformanceFrequency(&freq)) // Frequency is guaranteed to not change.
|
||||
if (!freq.QuadPart && !QueryPerformanceFrequency(&freq)) /* Frequency is guaranteed to not change. */
|
||||
return 0;
|
||||
|
||||
LARGE_INTEGER count;
|
||||
@@ -738,7 +738,7 @@ static int64_t rsnd_get_time_usec(void)
|
||||
return sysGetSystemTime();
|
||||
#elif defined(GEKKO)
|
||||
return ticks_to_microsecs(gettime());
|
||||
#elif defined(__MACH__) // OSX doesn't have clock_gettime ...
|
||||
#elif defined(__MACH__) /* OSX doesn't have clock_gettime ... */
|
||||
clock_serv_t cclock;
|
||||
mach_timespec_t mts;
|
||||
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
|
||||
@@ -818,10 +818,14 @@ static size_t rsnd_fill_buffer(rsound_t *rd, const char *buf, size_t size)
|
||||
slock_lock(rd->thread.mutex);
|
||||
fifo_write(rd->fifo_buffer, buf, size);
|
||||
slock_unlock(rd->thread.mutex);
|
||||
//RSD_DEBUG("[RSound] fill_buffer: Wrote to buffer.\n");
|
||||
#if 0
|
||||
RSD_DEBUG("[RSound] fill_buffer: Wrote to buffer.\n");
|
||||
#endif
|
||||
|
||||
/* Send signal to thread that buffer has been updated */
|
||||
//RSD_DEBUG("[RSound] fill_buffer: Waking up thread.\n");
|
||||
#if 0
|
||||
RSD_DEBUG("[RSound] fill_buffer: Waking up thread.\n");
|
||||
#endif
|
||||
scond_signal(rd->thread.cond);
|
||||
|
||||
return size;
|
||||
@@ -941,7 +945,7 @@ static int rsnd_close_ctl(rsound_t *rd)
|
||||
else if ( fd.revents & POLLHUP )
|
||||
return 0;
|
||||
|
||||
// Let's wait for reply (or POLLHUP)
|
||||
/* Let's wait for reply (or POLLHUP) */
|
||||
|
||||
fd.events = POLLIN;
|
||||
int index = 0;
|
||||
@@ -958,14 +962,14 @@ static int rsnd_close_ctl(rsound_t *rd)
|
||||
if (fd.revents & POLLIN)
|
||||
{
|
||||
const char *subchar;
|
||||
|
||||
// We just read everything in large chunks until we find what we're looking for
|
||||
/* We just read everything in large chunks until we find
|
||||
* what we're looking for */
|
||||
int rc = net_recv(rd->conn.ctl_socket, buf + index, RSD_PROTO_MAXSIZE*2 - 1 - index, 0);
|
||||
|
||||
if (rc <= 0 )
|
||||
return -1;
|
||||
|
||||
// Can we find it directly?
|
||||
/* Can we find it directly? */
|
||||
if ( strstr(buf, "RSD 12 CLOSECTL OK") != NULL )
|
||||
break;
|
||||
else if ( strstr(buf, "RSD 15 CLOSECTL ERROR") != NULL )
|
||||
@@ -989,8 +993,9 @@ static int rsnd_close_ctl(rsound_t *rd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Sends delay info request to server on the ctl socket. This code section isn't critical, and will work if it works.
|
||||
// It will never block.
|
||||
/* Sends delay info request to server on the ctl socket.
|
||||
* This code section isn't critical, and will work if it works.
|
||||
* It will never block. */
|
||||
static int rsnd_send_info_query(rsound_t *rd)
|
||||
{
|
||||
char tmpbuf[RSD_PROTO_MAXSIZE];
|
||||
@@ -1007,15 +1012,15 @@ static int rsnd_send_info_query(rsound_t *rd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// We check if there's any pending delay information from the server.
|
||||
// In that case, we read the packet.
|
||||
/* We check if there's any pending delay information from the server.
|
||||
* In that case, we read the packet. */
|
||||
static int rsnd_update_server_info(rsound_t *rd)
|
||||
{
|
||||
long long int client_ptr = -1;
|
||||
long long int serv_ptr = -1;
|
||||
char temp[RSD_PROTO_MAXSIZE + 1] = {0};
|
||||
|
||||
// We read until we have the last (most recent) data in the network buffer.
|
||||
/* We read until we have the last (most recent) data in the network buffer. */
|
||||
for (;;)
|
||||
{
|
||||
ssize_t rc;
|
||||
@@ -1023,7 +1028,7 @@ static int rsnd_update_server_info(rsound_t *rd)
|
||||
char *tmpstr;
|
||||
memset(temp, 0, sizeof(temp));
|
||||
|
||||
// We first recieve the small header. We just use the larger buffer as it is disposable.
|
||||
/* We first recieve the small header. We just use the larger buffer as it is disposable. */
|
||||
rc = rsnd_recv_chunk(rd->conn.ctl_socket, temp, RSD_PROTO_CHUNKSIZE, 0);
|
||||
if ( rc == 0 )
|
||||
break;
|
||||
@@ -1035,22 +1040,22 @@ static int rsnd_update_server_info(rsound_t *rd)
|
||||
if (!(substr = strstr(temp, "RSD")))
|
||||
return -1;
|
||||
|
||||
// Jump over "RSD" in header
|
||||
/* Jump over "RSD" in header */
|
||||
substr += 3;
|
||||
|
||||
// The length of the argument message is stored in the small 8 byte header.
|
||||
/* The length of the argument message is stored in the small 8 byte header. */
|
||||
long int len = strtol(substr, NULL, 0);
|
||||
|
||||
// Recieve the rest of the data.
|
||||
/* Recieve the rest of the data. */
|
||||
if ( rsnd_recv_chunk(rd->conn.ctl_socket, temp, len, 0) < len )
|
||||
return -1;
|
||||
|
||||
// We only bother if this is an INFO message.
|
||||
/* We only bother if this is an INFO message. */
|
||||
substr = strstr(temp, "INFO");
|
||||
if (!substr)
|
||||
continue;
|
||||
|
||||
// Jump over "INFO" in header
|
||||
/* Jump over "INFO" in header */
|
||||
substr += 4;
|
||||
|
||||
client_ptr = strtoull(substr, &tmpstr, 0);
|
||||
@@ -1074,7 +1079,7 @@ static int rsnd_update_server_info(rsound_t *rd)
|
||||
|
||||
RSD_DEBUG("[RSound] Delay: %d, Delta: %d.\n", delay, delta);
|
||||
|
||||
// We only update the pointer if the data we got is quite recent.
|
||||
/* We only update the pointer if the data we got is quite recent. */
|
||||
if ( rd->total_written - client_ptr < 4 * rd->backend_info.chunk_size && rd->total_written > client_ptr )
|
||||
{
|
||||
int offset_delta = delta - delay;
|
||||
@@ -1094,7 +1099,7 @@ static int rsnd_update_server_info(rsound_t *rd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Sort of simulates the behavior of pthread_cancel()
|
||||
/* Sort of simulates the behavior of pthread_cancel() */
|
||||
#define _TEST_CANCEL() \
|
||||
if ( !rd->thread_active ) \
|
||||
break
|
||||
@@ -1115,8 +1120,8 @@ static void rsnd_thread ( void * thread_data )
|
||||
{
|
||||
_TEST_CANCEL();
|
||||
|
||||
// We ask the server to send its latest backend data. Do not really care about errors atm.
|
||||
// We only bother to check after 1 sec of audio has been played, as it might be quite inaccurate in the start of the stream.
|
||||
/* We ask the server to send its latest backend data. Do not really care about errors atm.
|
||||
* We only bother to check after 1 sec of audio has been played, as it might be quite inaccurate in the start of the stream. */
|
||||
if ( (rd->conn_type & RSD_CONN_PROTO) && (rd->total_written > rd->channels * rd->rate * rd->samplesize) )
|
||||
{
|
||||
rsnd_send_info_query(rd);
|
||||
@@ -1175,8 +1180,9 @@ static void rsnd_thread ( void * thread_data )
|
||||
|
||||
if ( rd->thread_active )
|
||||
{
|
||||
// There is a very slim change of getting a deadlock using the cond_wait scheme.
|
||||
// This solution is rather dirty, but avoids complete deadlocks at the very least.
|
||||
/* There is a very slim change of getting a deadlock using the cond_wait scheme.
|
||||
* This solution is rather dirty, but avoids complete deadlocks at the very least.
|
||||
*/
|
||||
|
||||
slock_lock(rd->thread.cond_mutex);
|
||||
scond_signal(rd->thread.cond);
|
||||
@@ -1243,9 +1249,10 @@ static void rsnd_cb_thread(void *thread_data)
|
||||
}
|
||||
else
|
||||
{
|
||||
// The network might do things in large chunks, so it may request large amounts of data in short periods of time.
|
||||
// This breaks when the caller cannot buffer up big buffers beforehand, so do short sleeps inbetween.
|
||||
// This is somewhat dirty, but I cannot see a better solution
|
||||
/* The network might do things in large chunks, so it may request large amounts of data in short periods of time.
|
||||
* This breaks when the caller cannot buffer up big buffers beforehand, so do short sleeps inbetween.
|
||||
* This is somewhat dirty, but I cannot see a better solution
|
||||
*/
|
||||
retro_sleep(1);
|
||||
}
|
||||
}
|
||||
@@ -1306,13 +1313,13 @@ static int rsnd_reset(rsound_t *rd)
|
||||
|
||||
int rsd_stop(rsound_t *rd)
|
||||
{
|
||||
const char buf[] = "RSD 5 STOP";
|
||||
|
||||
retro_assert(rd != NULL);
|
||||
rsnd_stop_thread(rd);
|
||||
|
||||
const char buf[] = "RSD 5 STOP";
|
||||
|
||||
// Do not really care about errors here.
|
||||
// The socket will be closed down in any case in rsnd_reset().
|
||||
/* Do not really care about errors here.
|
||||
* The socket will be closed down in any case in rsnd_reset(). */
|
||||
rsnd_send_chunk(rd->conn.ctl_socket, buf, strlen(buf), 0);
|
||||
|
||||
rsnd_reset(rd);
|
||||
@@ -1364,7 +1371,7 @@ int rsd_exec(rsound_t *rsound)
|
||||
retro_assert(rsound != NULL);
|
||||
RSD_DEBUG("[RSound] rsd_exec().\n");
|
||||
|
||||
// Makes sure we have a working connection
|
||||
/* Makes sure we have a working connection */
|
||||
if ( rsound->conn.socket < 0 )
|
||||
{
|
||||
RSD_DEBUG("[RSound] Calling rsd_start().\n");
|
||||
@@ -1459,7 +1466,7 @@ int rsd_set_param(rsound_t *rd, enum rsd_settings option, void* param)
|
||||
rd->max_latency = *((int*)param);
|
||||
break;
|
||||
|
||||
// Checks if format is valid.
|
||||
/* Checks if format is valid. */
|
||||
case RSD_FORMAT:
|
||||
rd->format = (uint16_t)(*((int*)param));
|
||||
rd->samplesize = rsnd_format_to_samplesize(rd->format);
|
||||
@@ -1555,7 +1562,8 @@ int rsd_pause(rsound_t* rsound, int enable)
|
||||
|
||||
int rsd_init(rsound_t** rsound)
|
||||
{
|
||||
*rsound = calloc(1, sizeof(rsound_t));
|
||||
int format = RSD_S16_LE;
|
||||
*rsound = calloc(1, sizeof(rsound_t));
|
||||
if (*rsound == NULL)
|
||||
return -1;
|
||||
|
||||
@@ -1569,8 +1577,7 @@ int rsd_init(rsound_t** rsound)
|
||||
(*rsound)->cb_lock = slock_new();
|
||||
(*rsound)->thread.cond = scond_new();
|
||||
|
||||
// Assumes default of S16_LE samples.
|
||||
int format = RSD_S16_LE;
|
||||
/* Assumes default of S16_LE samples. */
|
||||
rsd_set_param(*rsound, RSD_FORMAT, &format);
|
||||
|
||||
rsd_set_param(*rsound, RSD_HOST, RSD_DEFAULT_HOST);
|
||||
|
||||
@@ -170,8 +170,7 @@ static bool bluetoothctl_connect_device(void *data, unsigned idx)
|
||||
string_list_free(list);
|
||||
|
||||
snprintf(btctl->command, sizeof(btctl->command), "\
|
||||
bluetoothctl -- trust %s",
|
||||
device);
|
||||
bluetoothctl -- pairable on");
|
||||
|
||||
pclose(popen(btctl->command, "r"));
|
||||
|
||||
@@ -181,6 +180,12 @@ static bool bluetoothctl_connect_device(void *data, unsigned idx)
|
||||
|
||||
pclose(popen(btctl->command, "r"));
|
||||
|
||||
snprintf(btctl->command, sizeof(btctl->command), "\
|
||||
bluetoothctl -- trust %s",
|
||||
device);
|
||||
|
||||
pclose(popen(btctl->command, "r"));
|
||||
|
||||
snprintf(btctl->command, sizeof(btctl->command), "\
|
||||
bluetoothctl -- connect %s",
|
||||
device);
|
||||
|
||||
+35
-23
@@ -164,18 +164,21 @@ bool cheat_manager_save(
|
||||
(char*)"cheat%u_repeat_add_to_address"
|
||||
};
|
||||
|
||||
cheats_file[0] = '\0';
|
||||
|
||||
if (!cheat_st->cheats || cheat_st->size == 0)
|
||||
return false;
|
||||
|
||||
if (!cheat_database)
|
||||
strlcpy(cheats_file, path, sizeof(cheats_file));
|
||||
else
|
||||
fill_pathname_join_concat(cheats_file,
|
||||
cheat_database, path,
|
||||
".cht",
|
||||
sizeof(cheats_file));
|
||||
{
|
||||
size_t len = fill_pathname_join_special(cheats_file,
|
||||
cheat_database, path, sizeof(cheats_file));
|
||||
cheats_file[len ] = '.';
|
||||
cheats_file[len+1] = 'c';
|
||||
cheats_file[len+2] = 'h';
|
||||
cheats_file[len+3] = 't';
|
||||
cheats_file[len+4] = '\0';
|
||||
}
|
||||
|
||||
if (!overwrite)
|
||||
conf = config_file_new_from_path_to_string(cheats_file);
|
||||
@@ -193,16 +196,22 @@ bool cheat_manager_save(
|
||||
unsigned j;
|
||||
char endian_key[100];
|
||||
char key[256];
|
||||
char desc_key[256];
|
||||
char code_key[256];
|
||||
char enable_key[256];
|
||||
char desc_key[128];
|
||||
char code_key[128];
|
||||
char enable_key[128];
|
||||
char formatted_number[12];
|
||||
|
||||
formatted_number[0] = '\0';
|
||||
snprintf(formatted_number, sizeof(formatted_number), "cheat%u_", i);
|
||||
|
||||
key[0] = endian_key[0] = desc_key[0] = code_key[0] = enable_key[0] = '\0';
|
||||
|
||||
snprintf(endian_key, sizeof(endian_key), "cheat%u_big_endian", i);
|
||||
snprintf(desc_key, sizeof(desc_key), "cheat%u_desc", i);
|
||||
snprintf(code_key, sizeof(code_key), "cheat%u_code", i);
|
||||
snprintf(enable_key, sizeof(enable_key), "cheat%u_enable", i);
|
||||
strlcpy(endian_key, formatted_number, sizeof(endian_key));
|
||||
strlcat(endian_key, "big_endian", sizeof(endian_key));
|
||||
strlcpy(desc_key, formatted_number, sizeof(desc_key));
|
||||
strlcat(desc_key, "desc", sizeof(desc_key));
|
||||
strlcpy(code_key, formatted_number, sizeof(code_key));
|
||||
strlcat(code_key, "code", sizeof(code_key));
|
||||
strlcpy(enable_key, formatted_number, sizeof(enable_key));
|
||||
strlcat(enable_key, "enable", sizeof(enable_key));
|
||||
|
||||
if (!string_is_empty(cheat_st->cheats[i].desc))
|
||||
config_set_string(conf, desc_key, cheat_st->cheats[i].desc);
|
||||
@@ -210,8 +219,15 @@ bool cheat_manager_save(
|
||||
config_set_string(conf, desc_key, cheat_st->cheats[i].code);
|
||||
|
||||
config_set_string(conf, code_key, cheat_st->cheats[i].code);
|
||||
config_set_bool(conf, enable_key, cheat_st->cheats[i].state);
|
||||
config_set_bool(conf, endian_key, cheat_st->cheats[i].big_endian);
|
||||
config_set_string(conf, enable_key,
|
||||
cheat_st->cheats[i].state
|
||||
? "true"
|
||||
: "false");
|
||||
config_set_string(conf, endian_key,
|
||||
cheat_st->cheats[i].big_endian
|
||||
? "true"
|
||||
: "false"
|
||||
);
|
||||
|
||||
data_ptrs[0] = &cheat_st->cheats[i].handler;
|
||||
data_ptrs[1] = &cheat_st->cheats[i].memory_search_size;
|
||||
@@ -702,8 +718,6 @@ static bool cheat_manager_get_game_specific_filename(
|
||||
const char *core_name = NULL;
|
||||
const char *game_name = NULL;
|
||||
|
||||
s1[0] = '\0';
|
||||
|
||||
if (!core_get_system_info(&system_info))
|
||||
return false;
|
||||
|
||||
@@ -715,9 +729,7 @@ static bool cheat_manager_get_game_specific_filename(
|
||||
string_is_empty(game_name))
|
||||
return false;
|
||||
|
||||
s[0] = '\0';
|
||||
|
||||
fill_pathname_join(s1,
|
||||
fill_pathname_join_special(s1,
|
||||
path_cheat_database, core_name,
|
||||
sizeof(s1));
|
||||
|
||||
@@ -728,7 +740,7 @@ static bool cheat_manager_get_game_specific_filename(
|
||||
path_mkdir(s1);
|
||||
}
|
||||
|
||||
fill_pathname_join(s, s1, game_name, len);
|
||||
fill_pathname_join_special(s, s1, game_name, len);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
+329
-185
@@ -53,6 +53,7 @@
|
||||
|
||||
#include "cheevos.h"
|
||||
#include "cheevos_client.h"
|
||||
#include "cheevos_menu.h"
|
||||
#include "cheevos_locals.h"
|
||||
|
||||
#include "../network/netplay/netplay.h"
|
||||
@@ -256,6 +257,8 @@ static void rcheevos_activate_achievements(void)
|
||||
if (result != RC_OK)
|
||||
{
|
||||
char buffer[256];
|
||||
buffer[0] = '\0';
|
||||
/* TODO/FIXME - localize */
|
||||
snprintf(buffer, sizeof(buffer),
|
||||
"Could not activate achievement %u \"%s\": %s",
|
||||
achievement->id, achievement->title, rc_error_str(result));
|
||||
@@ -290,7 +293,7 @@ static rcheevos_racheevo_t* rcheevos_find_cheevo(unsigned id)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static bool rcheevos_is_player_active()
|
||||
static bool rcheevos_is_player_active(void)
|
||||
{
|
||||
if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_SPECTATING, NULL))
|
||||
return false;
|
||||
@@ -335,8 +338,13 @@ void rcheevos_award_achievement(rcheevos_locals_t* locals,
|
||||
#endif
|
||||
{
|
||||
char buffer[256];
|
||||
snprintf(buffer, sizeof(buffer), "%s: %s",
|
||||
msg_hash_to_str(MSG_ACHIEVEMENT_UNLOCKED), cheevo->title);
|
||||
size_t _len = strlcpy(buffer,
|
||||
msg_hash_to_str(MSG_ACHIEVEMENT_UNLOCKED),
|
||||
sizeof(buffer));
|
||||
buffer[_len ] = ':';
|
||||
buffer[_len+1] = ' ';
|
||||
buffer[_len+2] = '\0';
|
||||
strlcat(buffer, cheevo->title, sizeof(buffer));
|
||||
runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL,
|
||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||
runloop_msg_queue_push(cheevo->description, 0, 3 * 60, false, NULL,
|
||||
@@ -406,6 +414,7 @@ static rcheevos_ralboard_t* rcheevos_find_lboard(unsigned id)
|
||||
static void rcheevos_lboard_submit(rcheevos_locals_t* locals,
|
||||
rcheevos_ralboard_t* lboard, int value, bool widgets_ready)
|
||||
{
|
||||
size_t _len;
|
||||
char buffer[256];
|
||||
char formatted_value[16];
|
||||
|
||||
@@ -430,8 +439,15 @@ static void rcheevos_lboard_submit(rcheevos_locals_t* locals,
|
||||
formatted_value, lboard->id);
|
||||
|
||||
/* Show the on-screen message (regardless of notifications setting). */
|
||||
snprintf(buffer, sizeof(buffer), "Submitted %s for %s",
|
||||
formatted_value, lboard->title);
|
||||
strlcpy(buffer, "Submitted ", sizeof(buffer));
|
||||
_len = strlcat(buffer, formatted_value, sizeof(buffer));
|
||||
buffer[_len ] = ' ';
|
||||
buffer[_len+1] = 'f';
|
||||
buffer[_len+2] = 'o';
|
||||
buffer[_len+3] = 'r';
|
||||
buffer[_len+4] = ' ';
|
||||
buffer[_len+5] = '\0';
|
||||
strlcat(buffer, lboard->title, sizeof(buffer));
|
||||
runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL,
|
||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||
|
||||
@@ -456,8 +472,9 @@ static void rcheevos_lboard_canceled(rcheevos_ralboard_t * lboard,
|
||||
|
||||
if (rcheevos_locals.leaderboard_notifications)
|
||||
{
|
||||
snprintf(buffer, sizeof(buffer),
|
||||
"Leaderboard attempt failed: %s", lboard->title);
|
||||
strlcpy(buffer, "Leaderboard attempt failed: ",
|
||||
sizeof(buffer));
|
||||
strlcat(buffer, lboard->title, sizeof(buffer));
|
||||
runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL,
|
||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||
}
|
||||
@@ -488,14 +505,18 @@ static void rcheevos_lboard_started(
|
||||
|
||||
if (rcheevos_locals.leaderboard_notifications)
|
||||
{
|
||||
size_t _len;
|
||||
strlcpy(buffer, "Leaderboard attempt started: ",
|
||||
sizeof(buffer));
|
||||
_len = strlcat(buffer, lboard->title, sizeof(buffer));
|
||||
if (lboard->description && *lboard->description)
|
||||
snprintf(buffer, sizeof(buffer),
|
||||
"Leaderboard attempt started: %s - %s",
|
||||
lboard->title, lboard->description);
|
||||
else
|
||||
snprintf(buffer, sizeof(buffer),
|
||||
"Leaderboard attempt started: %s",
|
||||
lboard->title);
|
||||
{
|
||||
buffer[_len ] = ' ';
|
||||
buffer[_len+1] = '-';
|
||||
buffer[_len+2] = ' ';
|
||||
buffer[_len+3] = '\0';
|
||||
strlcat(buffer, lboard->description, sizeof(buffer));
|
||||
}
|
||||
|
||||
runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL,
|
||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||
@@ -542,25 +563,29 @@ static void rcheevos_challenge_ended(
|
||||
|
||||
#endif
|
||||
|
||||
int rcheevos_get_richpresence(char buffer[], int buffer_size)
|
||||
int rcheevos_get_richpresence(char *s, size_t len)
|
||||
{
|
||||
if (rcheevos_is_player_active())
|
||||
{
|
||||
int ret = rc_runtime_get_richpresence(
|
||||
&rcheevos_locals.runtime, buffer, buffer_size,
|
||||
&rcheevos_locals.runtime, s, (unsigned)len,
|
||||
&rcheevos_peek, NULL, NULL);
|
||||
|
||||
if (ret <= 0 && rcheevos_locals.game.title)
|
||||
return snprintf(buffer, buffer_size, "Playing %s", rcheevos_locals.game.title);
|
||||
{
|
||||
/* TODO/FIXME - localize */
|
||||
strlcpy(s, "Playing ", len);
|
||||
strlcat(s, rcheevos_locals.game.title, len);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
if (rcheevos_locals.game.title)
|
||||
{
|
||||
if (rcheevos_locals.game.title)
|
||||
return snprintf(buffer, buffer_size, "Spectating %s", rcheevos_locals.game.title);
|
||||
|
||||
return 0;
|
||||
/* TODO/FIXME - localize */
|
||||
strlcpy(s, "Spectating ", len);
|
||||
return (int)strlcat(s, rcheevos_locals.game.title, len);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rcheevos_reset_game(bool widgets_ready)
|
||||
@@ -614,10 +639,11 @@ bool rcheevos_unload(void)
|
||||
{
|
||||
settings_t* settings = config_get_ptr();
|
||||
|
||||
/* immediately mark the game as unloaded so the ping thread will terminate normally */
|
||||
rcheevos_locals.game.id = -1;
|
||||
/* Immediately mark the game as unloaded
|
||||
so the ping thread will terminate normally */
|
||||
rcheevos_locals.game.id = -1;
|
||||
rcheevos_locals.game.console_id = 0;
|
||||
rcheevos_locals.game.hash = NULL;
|
||||
rcheevos_locals.game.hash = NULL;
|
||||
|
||||
#ifdef HAVE_THREADS
|
||||
if (rcheevos_locals.load_info.state < RCHEEVOS_LOAD_STATE_DONE &&
|
||||
@@ -650,7 +676,7 @@ bool rcheevos_unload(void)
|
||||
{
|
||||
CHEEVOS_FREE(rcheevos_locals.menuitems);
|
||||
rcheevos_locals.menuitems = NULL;
|
||||
rcheevos_locals.menuitem_capacity =
|
||||
rcheevos_locals.menuitem_capacity =
|
||||
rcheevos_locals.menuitem_count = 0;
|
||||
}
|
||||
#endif
|
||||
@@ -663,13 +689,8 @@ bool rcheevos_unload(void)
|
||||
|
||||
rcheevos_locals.loaded = false;
|
||||
rcheevos_locals.hardcore_active = false;
|
||||
}
|
||||
|
||||
while (rcheevos_locals.game.hashes)
|
||||
{
|
||||
rcheevos_hash_entry_t* hash_entry = rcheevos_locals.game.hashes;
|
||||
rcheevos_locals.game.hashes = hash_entry->next;
|
||||
free(hash_entry);
|
||||
rc_libretro_hash_set_destroy(&rcheevos_locals.game.hashes);
|
||||
}
|
||||
|
||||
#ifdef HAVE_THREADS
|
||||
@@ -736,6 +757,8 @@ static void rcheevos_activate_leaderboards(void)
|
||||
if (result != RC_OK)
|
||||
{
|
||||
char buffer[256];
|
||||
buffer[0] = '\0';
|
||||
/* TODO/FIXME - localize */
|
||||
snprintf(buffer, sizeof(buffer),
|
||||
"Could not activate leaderboard %u \"%s\": %s",
|
||||
leaderboard->id, leaderboard->title, rc_error_str(result));
|
||||
@@ -752,7 +775,7 @@ static void rcheevos_activate_leaderboards(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void rcheevos_deactivate_leaderboards()
|
||||
static void rcheevos_deactivate_leaderboards(void)
|
||||
{
|
||||
rcheevos_ralboard_t* lboard = rcheevos_locals.game.leaderboards;
|
||||
rcheevos_ralboard_t* stop = lboard +
|
||||
@@ -834,6 +857,12 @@ void rcheevos_leaderboards_enabled_changed(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void rcheevos_enforce_hardcore_settings(void)
|
||||
{
|
||||
/* disable slowdown */
|
||||
runloop_state_get_ptr()->flags &= ~RUNLOOP_FLAG_SLOWMOTION;
|
||||
}
|
||||
|
||||
static void rcheevos_toggle_hardcore_active(rcheevos_locals_t* locals)
|
||||
{
|
||||
settings_t* settings = config_get_ptr();
|
||||
@@ -864,8 +893,7 @@ static void rcheevos_toggle_hardcore_active(rcheevos_locals_t* locals)
|
||||
runloop_msg_queue_push(msg, 0, 3 * 60, true, NULL,
|
||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||
|
||||
/* disable slowdown */
|
||||
runloop_state_get_ptr()->slowmotion = false;
|
||||
rcheevos_enforce_hardcore_settings();
|
||||
|
||||
/* Reactivate leaderboards */
|
||||
if (locals->leaderboards_enabled)
|
||||
@@ -935,6 +963,9 @@ void rcheevos_toggle_hardcore_paused(void)
|
||||
|
||||
void rcheevos_hardcore_enabled_changed(void)
|
||||
{
|
||||
/* called whenever a setting that could potentially affect hardcore enabledness changes
|
||||
* (i.e. cheevos_enable, hardcore_mode_enable) to synchronize the internal state to the configs.
|
||||
* also called when a game is first loaded to synchronize the internal state to the configs. */
|
||||
const settings_t* settings = config_get_ptr();
|
||||
const bool enabled = settings
|
||||
&& settings->bools.cheevos_enable
|
||||
@@ -947,6 +978,12 @@ void rcheevos_hardcore_enabled_changed(void)
|
||||
/* update leaderboard state flags */
|
||||
rcheevos_leaderboards_enabled_changed();
|
||||
}
|
||||
else if (rcheevos_locals.hardcore_active && rcheevos_locals.loaded)
|
||||
{
|
||||
/* hardcore enabledness didn't change, but hardcore is active, so make
|
||||
* sure to enforce the restrictions. */
|
||||
rcheevos_enforce_hardcore_settings();
|
||||
}
|
||||
}
|
||||
|
||||
void rcheevos_validate_config_settings(void)
|
||||
@@ -957,10 +994,21 @@ void rcheevos_validate_config_settings(void)
|
||||
core_option_manager_t* coreopts = NULL;
|
||||
struct retro_system_info *system =
|
||||
&runloop_state_get_ptr()->system.info;
|
||||
const settings_t* settings = config_get_ptr();
|
||||
|
||||
if (!system->library_name || !rcheevos_locals.hardcore_active)
|
||||
return;
|
||||
|
||||
if (!settings->bools.video_frame_delay_auto && settings->uints.video_frame_delay != 0) {
|
||||
const char* error = "Hardcore paused. Manual video frame delay setting not allowed.";
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "%s\n", error);
|
||||
rcheevos_pause_hardcore();
|
||||
|
||||
runloop_msg_queue_push(error, 0, 4 * 60, false, NULL,
|
||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_WARNING);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(disallowed_settings
|
||||
= rc_libretro_get_disallowed_settings(system->library_name)))
|
||||
return;
|
||||
@@ -974,9 +1022,15 @@ void rcheevos_validate_config_settings(void)
|
||||
const char* val = core_option_manager_get_val(coreopts, i);
|
||||
if (!rc_libretro_is_setting_allowed(disallowed_settings, key, val))
|
||||
{
|
||||
size_t _len;
|
||||
char buffer[256];
|
||||
snprintf(buffer, sizeof(buffer),
|
||||
"Hardcore paused. Setting not allowed: %s=%s", key, val);
|
||||
strlcpy(buffer,
|
||||
"Hardcore paused. Setting not allowed: ",
|
||||
sizeof(buffer));
|
||||
_len = strlcat(buffer, key, sizeof(buffer));
|
||||
buffer[_len ] = '=';
|
||||
buffer[_len+1] = '\0';
|
||||
strlcat(buffer, val, sizeof(buffer));
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "%s\n", buffer);
|
||||
rcheevos_pause_hardcore();
|
||||
|
||||
@@ -986,6 +1040,23 @@ void rcheevos_validate_config_settings(void)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (rcheevos_locals.game.console_id &&
|
||||
!rc_libretro_is_system_allowed(system->library_name, rcheevos_locals.game.console_id))
|
||||
{
|
||||
char buffer[256];
|
||||
buffer[0] = '\0';
|
||||
/* TODO/FIXME - localize */
|
||||
snprintf(buffer, sizeof(buffer),
|
||||
"Hardcore paused. You cannot earn hardcore achievements for %s using %s",
|
||||
rc_console_name(rcheevos_locals.game.console_id), system->library_name);
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "%s\n", buffer);
|
||||
rcheevos_pause_hardcore();
|
||||
|
||||
runloop_msg_queue_push(buffer, 0, 4 * 60, false, NULL,
|
||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_WARNING);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void rcheevos_runtime_event_handler(
|
||||
@@ -1127,8 +1198,15 @@ void rcheevos_test(void)
|
||||
|
||||
/* We were unable to initialize memory earlier, try now */
|
||||
if (rcheevos_locals.memory.count == 0)
|
||||
{
|
||||
rcheevos_validate_memrefs(&rcheevos_locals);
|
||||
|
||||
/* rcheevos_validate_memrefs may decide the core doesn't support achievements and
|
||||
* disable them. if so, bail. */
|
||||
if (!rcheevos_locals.loaded)
|
||||
return;
|
||||
}
|
||||
|
||||
rc_runtime_do_frame(&rcheevos_locals.runtime,
|
||||
&rcheevos_runtime_event_handler, rcheevos_peek, NULL, 0);
|
||||
}
|
||||
@@ -1371,7 +1449,7 @@ static void* rc_hash_handle_cd_open_track(
|
||||
}
|
||||
}
|
||||
|
||||
static void rc_hash_reset_cdreader_hooks()
|
||||
static void rc_hash_reset_cdreader_hooks(void)
|
||||
{
|
||||
struct rc_hash_cdreader cdreader;
|
||||
rc_hash_get_default_cdreader(&cdreader);
|
||||
@@ -1381,10 +1459,10 @@ static void rc_hash_reset_cdreader_hooks()
|
||||
|
||||
/* end hooks */
|
||||
|
||||
void rcheevos_show_mastery_placard()
|
||||
void rcheevos_show_mastery_placard(void)
|
||||
{
|
||||
const settings_t* settings = config_get_ptr();
|
||||
char title[256];
|
||||
const settings_t* settings = config_get_ptr();
|
||||
|
||||
if (rcheevos_locals.game.mastery_placard_shown)
|
||||
return;
|
||||
@@ -1392,7 +1470,9 @@ void rcheevos_show_mastery_placard()
|
||||
rcheevos_locals.game.mastery_placard_shown = true;
|
||||
|
||||
snprintf(title, sizeof(title),
|
||||
msg_hash_to_str(rcheevos_locals.hardcore_active ? MSG_CHEEVOS_MASTERED_GAME : MSG_CHEEVOS_COMPLETED_GAME),
|
||||
msg_hash_to_str(rcheevos_locals.hardcore_active
|
||||
? MSG_CHEEVOS_MASTERED_GAME
|
||||
: MSG_CHEEVOS_COMPLETED_GAME),
|
||||
rcheevos_locals.game.title);
|
||||
title[sizeof(title) - 1] = '\0';
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "%s\n", title);
|
||||
@@ -1400,18 +1480,16 @@ void rcheevos_show_mastery_placard()
|
||||
#if defined (HAVE_GFX_WIDGETS)
|
||||
if (gfx_widgets_ready())
|
||||
{
|
||||
const bool content_runtime_log = settings->bools.content_runtime_log;
|
||||
const bool content_runtime_log = settings->bools.content_runtime_log;
|
||||
const bool content_runtime_log_aggr = settings->bools.content_runtime_log_aggregate;
|
||||
char msg[128];
|
||||
size_t len;
|
||||
|
||||
len = snprintf(msg, sizeof(msg), "%s", rcheevos_locals.displayname);
|
||||
size_t len = strlcpy(msg, rcheevos_locals.displayname, sizeof(msg));
|
||||
|
||||
if (len < sizeof(msg) - 12 &&
|
||||
(content_runtime_log || content_runtime_log_aggr))
|
||||
{
|
||||
const char* content_path = path_get(RARCH_PATH_CONTENT);
|
||||
const char* core_path = path_get(RARCH_PATH_CORE);
|
||||
const char* content_path = path_get(RARCH_PATH_CONTENT);
|
||||
const char* core_path = path_get(RARCH_PATH_CORE);
|
||||
runtime_log_t* runtime_log = runtime_log_init(
|
||||
content_path, core_path,
|
||||
settings->paths.directory_runtime_log,
|
||||
@@ -1439,7 +1517,7 @@ void rcheevos_show_mastery_placard()
|
||||
runloop_msg_queue_push(title, 0, 3 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||
}
|
||||
|
||||
static void rcheevos_show_game_placard()
|
||||
static void rcheevos_show_game_placard(void)
|
||||
{
|
||||
char msg[256];
|
||||
const settings_t* settings = config_get_ptr();
|
||||
@@ -1466,8 +1544,9 @@ static void rcheevos_show_game_placard()
|
||||
number_of_active++;
|
||||
}
|
||||
|
||||
/* TODO/FIXME - localize strings */
|
||||
if (number_of_core == 0)
|
||||
snprintf(msg, sizeof(msg), "This game has no achievements.");
|
||||
strlcpy(msg, "This game has no achievements.", sizeof(msg));
|
||||
else if (!number_of_unsupported)
|
||||
{
|
||||
if (settings->bools.cheevos_start_active)
|
||||
@@ -1580,10 +1659,18 @@ static void rcheevos_start_session_async(retro_task_t* task)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* if there's nothing for the runtime to process,
|
||||
* disable hardcore. */
|
||||
if (!needs_runtime)
|
||||
{
|
||||
/* if there's nothing for the runtime to process,
|
||||
* disable hardcore. */
|
||||
rcheevos_pause_hardcore();
|
||||
}
|
||||
else if (rcheevos_locals.hardcore_active)
|
||||
{
|
||||
/* hardcore is active. we're going to start processing
|
||||
* achievements. make sure restrictions are enforced */
|
||||
rcheevos_enforce_hardcore_settings();
|
||||
}
|
||||
|
||||
task_set_finished(task, true);
|
||||
|
||||
@@ -1612,8 +1699,12 @@ static void rcheevos_start_session(void)
|
||||
return;
|
||||
}
|
||||
|
||||
task = task_init();
|
||||
task->handler = rcheevos_start_session_async;
|
||||
/* re-validate the config settings now that we know
|
||||
* which console_id is active */
|
||||
rcheevos_validate_config_settings();
|
||||
|
||||
task = task_init();
|
||||
task->handler = rcheevos_start_session_async;
|
||||
task->callback = rcheevos_start_session_finish;
|
||||
task_queue_push(task);
|
||||
}
|
||||
@@ -1693,7 +1784,9 @@ static void rcheevos_fetch_game_data(void)
|
||||
struct rcheevos_identify_game_data
|
||||
{
|
||||
struct rc_hash_iterator iterator;
|
||||
char* path;
|
||||
uint8_t* datacopy;
|
||||
char hash[33];
|
||||
};
|
||||
|
||||
static void rcheevos_identify_game_callback(void* userdata)
|
||||
@@ -1701,47 +1794,82 @@ static void rcheevos_identify_game_callback(void* userdata)
|
||||
struct rcheevos_identify_game_data* data =
|
||||
(struct rcheevos_identify_game_data*)userdata;
|
||||
|
||||
if (data)
|
||||
{
|
||||
if (rcheevos_locals.game.id == 0)
|
||||
{
|
||||
/* previous hash didn't match, try the next one */
|
||||
char hash[33];
|
||||
if (rc_hash_iterate(hash, &data->iterator))
|
||||
{
|
||||
memcpy(rcheevos_locals.game.hashes->hash, hash, sizeof(hash));
|
||||
rcheevos_locals.load_info.hashes_tried++;
|
||||
rcheevos_locals.load_info.hashes_tried++;
|
||||
|
||||
rcheevos_client_identify_game(hash,
|
||||
rcheevos_identify_game_callback, data);
|
||||
return;
|
||||
}
|
||||
if (rcheevos_locals.game.id == 0)
|
||||
{
|
||||
/* previous hash didn't match, try the next one */
|
||||
char new_hash[33];
|
||||
int found_new_hash;
|
||||
while ((found_new_hash = rc_hash_iterate(new_hash, &data->iterator)) != 0)
|
||||
{
|
||||
if (!rc_libretro_hash_set_get_game_id(&rcheevos_locals.game.hashes, new_hash))
|
||||
break;
|
||||
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Ignoring [%s]. Already tried.\n", new_hash);
|
||||
}
|
||||
|
||||
/* no more hashes generated, free the iterator data */
|
||||
if (data->datacopy)
|
||||
free(data->datacopy);
|
||||
free(data);
|
||||
if (found_new_hash)
|
||||
{
|
||||
memcpy(data->hash, new_hash, sizeof(data->hash));
|
||||
rcheevos_client_identify_game(data->hash,
|
||||
rcheevos_identify_game_callback, data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
rcheevos_locals.game.hashes->game_id = rcheevos_locals.game.id;
|
||||
rc_libretro_hash_set_add(&rcheevos_locals.game.hashes,
|
||||
data->path, rcheevos_locals.game.id, data->hash);
|
||||
rcheevos_locals.game.hash =
|
||||
rc_libretro_hash_set_get_hash(&rcheevos_locals.game.hashes, data->path);
|
||||
|
||||
if (data->iterator.path && strcmp(data->iterator.path, data->path) != 0)
|
||||
{
|
||||
rc_libretro_hash_set_add(&rcheevos_locals.game.hashes,
|
||||
data->iterator.path, rcheevos_locals.game.id, data->hash);
|
||||
rcheevos_locals.game.hash =
|
||||
rc_libretro_hash_set_get_hash(&rcheevos_locals.game.hashes, data->iterator.path);
|
||||
}
|
||||
|
||||
/* no more hashes generated, free the iterator data */
|
||||
rc_hash_destroy_iterator(&data->iterator);
|
||||
if (data->datacopy)
|
||||
free(data->datacopy);
|
||||
if (data->path)
|
||||
free(data->path);
|
||||
free(data);
|
||||
|
||||
/* hash resolution complete, proceed to fetching game data */
|
||||
if (rcheevos_end_load_state() == 0)
|
||||
rcheevos_fetch_game_data();
|
||||
}
|
||||
|
||||
static int rcheevos_get_image_path(unsigned index, char* buffer, size_t buffer_size)
|
||||
{
|
||||
rarch_system_info_t* system = &runloop_state_get_ptr()->system;
|
||||
if (!system->disk_control.cb.get_image_path)
|
||||
return 0;
|
||||
|
||||
return system->disk_control.cb.get_image_path(index, buffer, buffer_size);
|
||||
}
|
||||
|
||||
static bool rcheevos_identify_game(const struct retro_game_info* info)
|
||||
{
|
||||
struct rcheevos_identify_game_data* data;
|
||||
struct rc_hash_filereader filereader;
|
||||
struct rc_hash_iterator iterator;
|
||||
size_t len;
|
||||
char hash[33];
|
||||
#ifndef DEBUG
|
||||
settings_t* settings = config_get_ptr();
|
||||
#endif
|
||||
|
||||
data = (struct rcheevos_identify_game_data*)
|
||||
calloc(1, sizeof(struct rcheevos_identify_game_data));
|
||||
if (!data)
|
||||
{
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "allocation failed\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
/* provide hooks for reading files */
|
||||
memset(&filereader, 0, sizeof(filereader));
|
||||
filereader.open = rc_hash_handle_file_open;
|
||||
@@ -1764,59 +1892,44 @@ static bool rcheevos_identify_game(const struct retro_game_info* info)
|
||||
rc_hash_reset_cdreader_hooks();
|
||||
|
||||
/* fetch the first hash */
|
||||
rc_hash_initialize_iterator(&iterator,
|
||||
rc_hash_initialize_iterator(&data->iterator,
|
||||
info->path, (uint8_t*)info->data, info->size);
|
||||
if (!rc_hash_iterate(hash, &iterator))
|
||||
if (!rc_hash_iterate(data->hash, &data->iterator))
|
||||
{
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "no hashes generated\n");
|
||||
rc_hash_destroy_iterator(&data->iterator);
|
||||
free(data);
|
||||
return false;
|
||||
}
|
||||
|
||||
rcheevos_locals.game.hashes = (rcheevos_hash_entry_t*)calloc(1, sizeof(rcheevos_hash_entry_t));
|
||||
rcheevos_locals.game.hashes->path_djb2 = djb2_calculate(info->path);
|
||||
rcheevos_locals.game.hash = rcheevos_locals.game.hashes->hash;
|
||||
memcpy(rcheevos_locals.game.hashes->hash, hash, sizeof(hash));
|
||||
rcheevos_locals.load_info.hashes_tried++;
|
||||
rc_libretro_hash_set_init(&rcheevos_locals.game.hashes, info->path, rcheevos_get_image_path);
|
||||
data->path = strdup(info->path);
|
||||
|
||||
if (iterator.consoles[iterator.index] == 0)
|
||||
if (data->iterator.consoles[data->iterator.index] != 0)
|
||||
{
|
||||
/* no more potential matches, just try the one hash */
|
||||
rcheevos_begin_load_state(RCHEEVOS_LOAD_STATE_IDENTIFYING_GAME);
|
||||
rcheevos_client_identify_game(hash,
|
||||
rcheevos_identify_game_callback, NULL);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* multiple potential matches, clone the data for the next attempt */
|
||||
data = (struct rcheevos_identify_game_data*)
|
||||
calloc(1, sizeof(struct rcheevos_identify_game_data));
|
||||
if (!data)
|
||||
{
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "allocation failed\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (info->data)
|
||||
{
|
||||
len = info->size;
|
||||
if (len > CHEEVOS_MB(64))
|
||||
len = CHEEVOS_MB(64);
|
||||
|
||||
data->datacopy = (uint8_t*)malloc(len);
|
||||
if (!data->datacopy)
|
||||
/* multiple potential matches, clone the data for the next attempt */
|
||||
if (info->data)
|
||||
{
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "allocation failed\n");
|
||||
free(data);
|
||||
return false;
|
||||
len = info->size;
|
||||
if (len > CHEEVOS_MB(64))
|
||||
len = CHEEVOS_MB(64);
|
||||
|
||||
data->datacopy = (uint8_t*)malloc(len);
|
||||
if (!data->datacopy)
|
||||
{
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "allocation failed\n");
|
||||
rc_hash_destroy_iterator(&data->iterator);
|
||||
free(data);
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(data->datacopy, info->data, len);
|
||||
data->iterator.buffer = data->datacopy;
|
||||
}
|
||||
|
||||
memcpy(data->datacopy, info->data, len);
|
||||
}
|
||||
|
||||
memcpy(&data->iterator, &iterator, sizeof(iterator));
|
||||
|
||||
rcheevos_begin_load_state(RCHEEVOS_LOAD_STATE_IDENTIFYING_GAME);
|
||||
rcheevos_client_identify_game(hash,
|
||||
rcheevos_client_identify_game(data->hash,
|
||||
rcheevos_identify_game_callback, data);
|
||||
return true;
|
||||
}
|
||||
@@ -1829,6 +1942,8 @@ static void rcheevos_login_callback(void* userdata)
|
||||
if (settings->bools.cheevos_verbose_enable)
|
||||
{
|
||||
char msg[256];
|
||||
msg[0] = '\0';
|
||||
/* TODO/FIXME - localize */
|
||||
snprintf(msg, sizeof(msg),
|
||||
"RetroAchievements: Logged in as \"%s\".",
|
||||
rcheevos_locals.displayname);
|
||||
@@ -1844,10 +1959,14 @@ static void rcheevos_login_callback(void* userdata)
|
||||
/* Increment the outstanding requests counter and set the load state */
|
||||
void rcheevos_begin_load_state(enum rcheevos_load_state state)
|
||||
{
|
||||
CHEEVOS_LOCK(rcheevos_locals.load_info.request_lock);
|
||||
#ifdef HAVE_THREADS
|
||||
slock_lock(rcheevos_locals.load_info.request_lock);
|
||||
#endif
|
||||
++rcheevos_locals.load_info.outstanding_requests;
|
||||
rcheevos_locals.load_info.state = state;
|
||||
CHEEVOS_UNLOCK(rcheevos_locals.load_info.request_lock);
|
||||
#ifdef HAVE_THREADS
|
||||
slock_unlock(rcheevos_locals.load_info.request_lock);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Decrement and return the outstanding requests counter.
|
||||
@@ -1856,11 +1975,15 @@ int rcheevos_end_load_state(void)
|
||||
{
|
||||
int requests = 0;
|
||||
|
||||
CHEEVOS_LOCK(rcheevos_locals.load_info.request_lock);
|
||||
#ifdef HAVE_THREADS
|
||||
slock_lock(rcheevos_locals.load_info.request_lock);
|
||||
#endif
|
||||
if (rcheevos_locals.load_info.outstanding_requests > 0)
|
||||
--rcheevos_locals.load_info.outstanding_requests;
|
||||
requests = rcheevos_locals.load_info.outstanding_requests;
|
||||
CHEEVOS_UNLOCK(rcheevos_locals.load_info.request_lock);
|
||||
#ifdef HAVE_THREADS
|
||||
slock_unlock(rcheevos_locals.load_info.request_lock);
|
||||
#endif
|
||||
|
||||
return requests;
|
||||
}
|
||||
@@ -2016,59 +2139,64 @@ bool rcheevos_load(const void *data)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void rcheevos_add_hash(rcheevos_hash_entry_t* hash_entry)
|
||||
struct rcheevos_identify_changed_disc_data
|
||||
{
|
||||
hash_entry->next = rcheevos_locals.game.hashes;
|
||||
rcheevos_locals.game.hashes = hash_entry;
|
||||
rcheevos_locals.game.hash = hash_entry->hash;
|
||||
}
|
||||
int real_game_id;
|
||||
char* path;
|
||||
char hash[33];
|
||||
};
|
||||
|
||||
static void rcheevos_identify_game_disc_callback(void* userdata)
|
||||
{
|
||||
rcheevos_hash_entry_t* hash_entry = (rcheevos_hash_entry_t*)userdata;
|
||||
struct rcheevos_identify_changed_disc_data* changed_disc_data =
|
||||
(struct rcheevos_identify_changed_disc_data*)userdata;
|
||||
|
||||
/* rcheevos_locals.game.id has the game id for the new hash, swap it with the old game id */
|
||||
const int hash_game_id = rcheevos_locals.game.id;
|
||||
rcheevos_locals.game.id = changed_disc_data->real_game_id;
|
||||
|
||||
/* rcheevos_client_identify_game will update rcheevos_locals.game.id */
|
||||
if (rcheevos_locals.game.id == hash_entry->game_id)
|
||||
if (rcheevos_locals.game.id == hash_game_id)
|
||||
{
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Hash valid for current game\n");
|
||||
}
|
||||
else if (hash_game_id != 0)
|
||||
{
|
||||
/* when changing discs, if the disc is recognized but belongs to another game, allow it.
|
||||
* this allows loading known game discs for games that leverage user-provided discs. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Hash identified for game %d\n", hash_game_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* rcheevos_locals.game.id has the game id for the new hash, swap it with the old game id */
|
||||
const int hash_game_id = rcheevos_locals.game.id;
|
||||
rcheevos_locals.game.id = hash_entry->game_id;
|
||||
hash_entry->game_id = hash_game_id;
|
||||
|
||||
if (hash_game_id != 0)
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Disc not recognized\n");
|
||||
if (rcheevos_hardcore_active())
|
||||
{
|
||||
/* when changing discs, if the disc is recognized but belongs to another game, allow it.
|
||||
* this allows loading known game discs for games that leverage user-provided discs. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Hash identified for game %d\n", hash_game_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Disc not recognized\n");
|
||||
if (rcheevos_hardcore_active())
|
||||
{
|
||||
/* don't allow unknown game discs in hardcore.
|
||||
* assume it's a modified version of the base game. */
|
||||
runloop_msg_queue_push("Hardcore paused. Game disc unrecognized.", 0, 5 * 60, false, NULL,
|
||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_ERROR);
|
||||
rcheevos_pause_hardcore();
|
||||
}
|
||||
/* don't allow unknown game discs in hardcore.
|
||||
* assume it's a modified version of the base game. */
|
||||
runloop_msg_queue_push("Hardcore paused. Game disc unrecognized.", 0, 5 * 60, false, NULL,
|
||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_ERROR);
|
||||
rcheevos_pause_hardcore();
|
||||
}
|
||||
}
|
||||
|
||||
/* disc is valid, add it to the known disk list */
|
||||
rcheevos_add_hash(hash_entry);
|
||||
rc_libretro_hash_set_add(&rcheevos_locals.game.hashes,
|
||||
changed_disc_data->path, hash_game_id, changed_disc_data->hash);
|
||||
|
||||
rcheevos_locals.game.hash =
|
||||
rc_libretro_hash_set_get_hash(&rcheevos_locals.game.hashes, changed_disc_data->hash);
|
||||
|
||||
free(changed_disc_data->path);
|
||||
free(changed_disc_data);
|
||||
}
|
||||
|
||||
static void rcheevos_identify_initial_disc_callback(void* userdata)
|
||||
{
|
||||
rcheevos_hash_entry_t* hash_entry = (rcheevos_hash_entry_t*)userdata;
|
||||
struct rcheevos_identify_changed_disc_data* changed_disc_data =
|
||||
(struct rcheevos_identify_changed_disc_data*)userdata;
|
||||
|
||||
/* rcheevos_client_identify_game will update rcheevos_locals.game.id */
|
||||
if (rcheevos_locals.game.id != hash_entry->game_id)
|
||||
if (rcheevos_locals.game.id != changed_disc_data->real_game_id)
|
||||
{
|
||||
if (rcheevos_locals.game.id == 0)
|
||||
{
|
||||
@@ -2083,15 +2211,22 @@ static void rcheevos_identify_initial_disc_callback(void* userdata)
|
||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_ERROR);
|
||||
}
|
||||
|
||||
rcheevos_locals.game.hash = NULL;
|
||||
rcheevos_unload();
|
||||
}
|
||||
else
|
||||
{
|
||||
/* disc is valid, add it to the known disk list */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Hash valid for current game\n");
|
||||
rc_libretro_hash_set_add(&rcheevos_locals.game.hashes,
|
||||
changed_disc_data->path, rcheevos_locals.game.id, changed_disc_data->hash);
|
||||
|
||||
free(hash_entry);
|
||||
return;
|
||||
rcheevos_locals.game.hash =
|
||||
rc_libretro_hash_set_get_hash(&rcheevos_locals.game.hashes, changed_disc_data->hash);
|
||||
}
|
||||
|
||||
/* disc is valid, add it to the known disk list */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Hash valid for current game\n");
|
||||
rcheevos_add_hash(hash_entry);
|
||||
free(changed_disc_data->path);
|
||||
free(changed_disc_data);
|
||||
}
|
||||
|
||||
static void rcheevos_validate_initial_disc_handler(retro_task_t* task)
|
||||
@@ -2121,22 +2256,21 @@ static void rcheevos_validate_initial_disc_handler(retro_task_t* task)
|
||||
|
||||
void rcheevos_change_disc(const char* new_disc_path, bool initial_disc)
|
||||
{
|
||||
rcheevos_hash_entry_t* hash_entry = rcheevos_locals.game.hashes;
|
||||
rcheevos_hash_entry_t* hash_entry2;
|
||||
const uint32_t path_djb2 = djb2_calculate(new_disc_path);
|
||||
struct rcheevos_identify_changed_disc_data* data;
|
||||
char hash[33];
|
||||
int hash_game_id;
|
||||
|
||||
/* no game loaded */
|
||||
if (rcheevos_locals.game.id == 0)
|
||||
return;
|
||||
|
||||
/* see if we've already identified this file */
|
||||
for (; hash_entry; hash_entry = hash_entry->next)
|
||||
rcheevos_locals.game.hash =
|
||||
rc_libretro_hash_set_get_hash(&rcheevos_locals.game.hashes, new_disc_path);
|
||||
if (rcheevos_locals.game.hash)
|
||||
{
|
||||
if (hash_entry->path_djb2 == path_djb2)
|
||||
{
|
||||
rcheevos_locals.game.hash = hash_entry->hash;
|
||||
return;
|
||||
}
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Switched to known hash: %s\n", rcheevos_locals.game.hash);
|
||||
return;
|
||||
}
|
||||
|
||||
/* don't check the disc until the game is done loading */
|
||||
@@ -2152,35 +2286,45 @@ void rcheevos_change_disc(const char* new_disc_path, bool initial_disc)
|
||||
}
|
||||
|
||||
/* attempt to identify the file */
|
||||
hash_entry = (rcheevos_hash_entry_t*)calloc(1, sizeof(rcheevos_hash_entry_t));
|
||||
hash_entry->path_djb2 = path_djb2;
|
||||
|
||||
if (!rc_hash_generate_from_file(hash_entry->hash, rcheevos_locals.game.console_id, new_disc_path))
|
||||
if (rc_hash_generate_from_file(hash, rcheevos_locals.game.console_id, new_disc_path))
|
||||
{
|
||||
/* check to see if the hash is already known */
|
||||
hash_game_id = rc_libretro_hash_set_get_game_id(&rcheevos_locals.game.hashes, hash);
|
||||
if (hash_game_id)
|
||||
{
|
||||
/* hash identical to some other file - probably the first disc matching the m3u. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Hash valid for current game\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* when changing discs, if the disc is not supported by the system, allow it. this is
|
||||
* primarily for games that support user-provided audio CDs, but does allow using discs
|
||||
* from other systems for games that leverage user-provided discs. */
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "No hash generated\n");
|
||||
rcheevos_add_hash(hash_entry);
|
||||
hash_game_id = -1;
|
||||
strlcpy(hash, "[NO HASH]", sizeof(hash));
|
||||
}
|
||||
|
||||
if (hash_game_id)
|
||||
{
|
||||
/* we know how to handle this disc. no need to call the server */
|
||||
rc_libretro_hash_set_add(&rcheevos_locals.game.hashes, new_disc_path, hash_game_id, hash);
|
||||
rcheevos_locals.game.hash =
|
||||
rc_libretro_hash_set_get_hash(&rcheevos_locals.game.hashes, new_disc_path);
|
||||
return;
|
||||
}
|
||||
|
||||
/* assume it's for the same game. we'll validate in the callback */
|
||||
hash_entry->game_id = rcheevos_locals.game.id;
|
||||
|
||||
/* check to see if the hash is already known - may have generated it for the m3u */
|
||||
for (hash_entry2 = rcheevos_locals.game.hashes; hash_entry2; hash_entry2 = hash_entry2->next)
|
||||
{
|
||||
if (string_is_equal(hash_entry->hash, hash_entry2->hash))
|
||||
{
|
||||
CHEEVOS_LOG(RCHEEVOS_TAG "Hash valid for current game\n");
|
||||
rcheevos_add_hash(hash_entry);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* call the server to make sure the hash is valid for the loaded game */
|
||||
rcheevos_client_identify_game(hash_entry->hash,
|
||||
initial_disc ? rcheevos_identify_initial_disc_callback :
|
||||
rcheevos_identify_game_disc_callback, hash_entry);
|
||||
data = (struct rcheevos_identify_changed_disc_data*)
|
||||
calloc(1, sizeof(struct rcheevos_identify_changed_disc_data));
|
||||
if (data) {
|
||||
data->real_game_id = rcheevos_locals.game.id;
|
||||
data->path = strdup(new_disc_path);
|
||||
memcpy(data->hash, hash, sizeof(data->hash));
|
||||
|
||||
rcheevos_client_identify_game(data->hash,
|
||||
initial_disc ? rcheevos_identify_initial_disc_callback :
|
||||
rcheevos_identify_game_disc_callback, data);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -51,7 +51,7 @@ void rcheevos_set_support_cheevos(bool state);
|
||||
bool rcheevos_get_support_cheevos(void);
|
||||
|
||||
const char* rcheevos_get_hash(void);
|
||||
int rcheevos_get_richpresence(char buffer[], int buffer_size);
|
||||
int rcheevos_get_richpresence(char *s, size_t len);
|
||||
uintptr_t rcheevos_get_badge_texture(const char *badge, bool locked);
|
||||
|
||||
uint8_t* rcheevos_patch_address(unsigned address);
|
||||
|
||||
+41
-26
@@ -32,8 +32,8 @@
|
||||
#include "../network/net_http_special.h"
|
||||
#include "../tasks/tasks_internal.h"
|
||||
|
||||
#ifdef HAVE_DISCORD
|
||||
#include "../network/discord.h"
|
||||
#ifdef HAVE_PRESENCE
|
||||
#include "../network/presence.h"
|
||||
#endif
|
||||
|
||||
#include "../deps/rcheevos/include/rc_api_runtime.h"
|
||||
@@ -973,8 +973,8 @@ static void rcheevos_client_fetch_game_badge(const char* badge_name, rcheevos_as
|
||||
{
|
||||
#if defined(HAVE_GFX_WIDGETS) /* don't need game badge unless widgets are enabled */
|
||||
char badge_fullpath[PATH_MAX_LENGTH] = "";
|
||||
char* badge_fullname = NULL;
|
||||
size_t badge_fullname_size = 0;
|
||||
char *badge_fullname = NULL;
|
||||
size_t badge_fullname_size = 0;
|
||||
|
||||
/* make sure the directory exists */
|
||||
fill_pathname_application_special(badge_fullpath,
|
||||
@@ -988,7 +988,7 @@ static void rcheevos_client_fetch_game_badge(const char* badge_name, rcheevos_as
|
||||
}
|
||||
|
||||
fill_pathname_slash(badge_fullpath, sizeof(badge_fullpath));
|
||||
badge_fullname = badge_fullpath + strlen(badge_fullpath);
|
||||
badge_fullname = badge_fullpath + strlen(badge_fullpath);
|
||||
badge_fullname_size = sizeof(badge_fullpath) -
|
||||
(badge_fullname - badge_fullpath);
|
||||
|
||||
@@ -1248,7 +1248,8 @@ static retro_time_t rcheevos_client_prepare_ping(
|
||||
rc_api_ping_request_t api_params;
|
||||
const rcheevos_locals_t* rcheevos_locals = get_rcheevos_locals();
|
||||
const settings_t *settings = config_get_ptr();
|
||||
const bool cheevos_richpresence_enable =
|
||||
const bool cheevos_richpresence_enable =
|
||||
rcheevos_hardcore_active() ||
|
||||
settings->bools.cheevos_richpresence_enable;
|
||||
char buffer[256] = "";
|
||||
|
||||
@@ -1268,9 +1269,8 @@ static retro_time_t rcheevos_client_prepare_ping(
|
||||
rcheevos_log_post_url(request->request.url,
|
||||
request->request.post_data);
|
||||
|
||||
#ifdef HAVE_DISCORD
|
||||
if (settings->bools.discord_enable && discord_is_ready())
|
||||
discord_update(DISCORD_PRESENCE_RETROACHIEVEMENTS);
|
||||
#ifdef HAVE_PRESENCE
|
||||
presence_update(PRESENCE_RETROACHIEVEMENTS);
|
||||
#endif
|
||||
|
||||
/* Update rich presence every two minutes */
|
||||
@@ -1426,11 +1426,15 @@ static void rcheevos_async_download_next_badge(void* userdata)
|
||||
|
||||
static void rcheevos_async_fetch_badge_complete(rcheevos_fetch_badge_data* badge_data)
|
||||
{
|
||||
#ifdef HAVE_THREADS
|
||||
const rcheevos_locals_t* rcheevos_locals = get_rcheevos_locals();
|
||||
|
||||
CHEEVOS_LOCK(rcheevos_locals->load_info.request_lock);
|
||||
slock_lock(rcheevos_locals->load_info.request_lock);
|
||||
#endif
|
||||
badge_data->state->requested_badges[badge_data->request_index][0] = '\0';
|
||||
CHEEVOS_UNLOCK(rcheevos_locals->load_info.request_lock);
|
||||
#ifdef HAVE_THREADS
|
||||
slock_unlock(rcheevos_locals->load_info.request_lock);
|
||||
#endif
|
||||
|
||||
if (badge_data->callback)
|
||||
badge_data->callback(badge_data);
|
||||
@@ -1442,9 +1446,10 @@ static void rcheevos_async_write_badge(retro_task_t* task)
|
||||
rcheevos_fetch_badge_data* badge_data =
|
||||
(rcheevos_fetch_badge_data*)task->user_data;
|
||||
|
||||
fill_pathname_join(badge_fullpath, badge_data->state->badge_directory,
|
||||
badge_data->state->requested_badges[badge_data->request_index],
|
||||
sizeof(badge_fullpath));
|
||||
fill_pathname_join_special(badge_fullpath,
|
||||
badge_data->state->badge_directory,
|
||||
badge_data->state->requested_badges[badge_data->request_index],
|
||||
sizeof(badge_fullpath));
|
||||
|
||||
if (!filestream_write_file(badge_fullpath, badge_data->data, badge_data->data_len))
|
||||
{
|
||||
@@ -1518,11 +1523,12 @@ static bool rcheevos_client_fetch_badge(
|
||||
|
||||
/* check if it's already requested */
|
||||
{
|
||||
const rcheevos_locals_t* rcheevos_locals = get_rcheevos_locals();
|
||||
int found_index = -1;
|
||||
int i;
|
||||
|
||||
CHEEVOS_LOCK(rcheevos_locals->load_info.request_lock);
|
||||
int found_index = -1;
|
||||
#ifdef HAVE_THREADS
|
||||
const rcheevos_locals_t* rcheevos_locals = get_rcheevos_locals();
|
||||
slock_lock(rcheevos_locals->load_info.request_lock);
|
||||
#endif
|
||||
for (i = RCHEEVOS_CONCURRENT_BADGE_DOWNLOADS - 1; i >= 0; --i)
|
||||
{
|
||||
if (!state->requested_badges[i][0])
|
||||
@@ -1547,8 +1553,9 @@ static bool rcheevos_client_fetch_badge(
|
||||
badge_fullname,
|
||||
sizeof(state->requested_badges[request_index]));
|
||||
}
|
||||
CHEEVOS_UNLOCK(rcheevos_locals->load_info.request_lock);
|
||||
|
||||
#ifdef HAVE_THREADS
|
||||
slock_unlock(rcheevos_locals->load_info.request_lock);
|
||||
#endif
|
||||
if (found_index != -1)
|
||||
return false;
|
||||
}
|
||||
@@ -1607,20 +1614,24 @@ static bool rcheevos_fetch_next_badge(rcheevos_fetch_badge_state* state)
|
||||
}
|
||||
else
|
||||
{
|
||||
int active = 0;
|
||||
const rcheevos_racheevo_t *cheevo = NULL;
|
||||
const rcheevos_locals_t* rcheevos_locals = get_rcheevos_locals();
|
||||
const rcheevos_racheevo_t* cheevo = NULL;
|
||||
int active = 0;
|
||||
|
||||
/* fetch badges for current state of achievements first */
|
||||
do
|
||||
{
|
||||
CHEEVOS_LOCK(rcheevos_locals->load_info.request_lock);
|
||||
#ifdef HAVE_THREADS
|
||||
slock_lock(rcheevos_locals->load_info.request_lock);
|
||||
#endif
|
||||
if ( state->locked_badge_fetch_index
|
||||
< rcheevos_locals->game.achievement_count)
|
||||
cheevo = &rcheevos_locals->game.achievements[state->locked_badge_fetch_index++];
|
||||
else
|
||||
cheevo = NULL;
|
||||
CHEEVOS_UNLOCK(rcheevos_locals->load_info.request_lock);
|
||||
#ifdef HAVE_THREADS
|
||||
slock_unlock(rcheevos_locals->load_info.request_lock);
|
||||
#endif
|
||||
|
||||
if (!cheevo)
|
||||
break;
|
||||
@@ -1635,13 +1646,17 @@ static bool rcheevos_fetch_next_badge(rcheevos_fetch_badge_state* state)
|
||||
/* then fetch badges for unlocked state so they're ready when the user unlocks something */
|
||||
do
|
||||
{
|
||||
CHEEVOS_LOCK(rcheevos_locals->load_info.request_lock);
|
||||
#ifdef HAVE_THREADS
|
||||
slock_lock(rcheevos_locals->load_info.request_lock);
|
||||
#endif
|
||||
if (state->badge_fetch_index < rcheevos_locals->game.achievement_count)
|
||||
cheevo = &rcheevos_locals->game.achievements[state->badge_fetch_index++];
|
||||
else
|
||||
cheevo = NULL;
|
||||
|
||||
CHEEVOS_UNLOCK(rcheevos_locals->load_info.request_lock);
|
||||
#ifdef HAVE_THREADS
|
||||
slock_unlock(rcheevos_locals->load_info.request_lock);
|
||||
#endif
|
||||
|
||||
if (!cheevo)
|
||||
break;
|
||||
|
||||
@@ -120,24 +120,16 @@ typedef struct rcheevos_load_info_t
|
||||
#endif
|
||||
} rcheevos_load_info_t;
|
||||
|
||||
typedef struct rcheevos_hash_entry_t
|
||||
{
|
||||
uint32_t path_djb2;
|
||||
int game_id;
|
||||
struct rcheevos_hash_entry_t* next;
|
||||
char hash[33];
|
||||
} rcheevos_hash_entry_t;
|
||||
|
||||
typedef struct rcheevos_game_info_t
|
||||
{
|
||||
int id;
|
||||
int console_id;
|
||||
char* title;
|
||||
char badge_name[16];
|
||||
char* hash;
|
||||
const char* hash;
|
||||
bool mastery_placard_shown;
|
||||
|
||||
rcheevos_hash_entry_t* hashes;
|
||||
rc_libretro_hash_set_t hashes;
|
||||
|
||||
rcheevos_racheevo_t* achievements;
|
||||
rcheevos_ralboard_t* leaderboards;
|
||||
@@ -155,8 +147,6 @@ typedef struct rcheevos_menuitem_t
|
||||
enum msg_hash_enums state_label_idx;
|
||||
} rcheevos_menuitem_t;
|
||||
|
||||
void rcheevos_menu_reset_badges(void);
|
||||
|
||||
#endif
|
||||
|
||||
typedef struct rcheevos_locals_t
|
||||
@@ -198,14 +188,6 @@ bool rcheevos_load_aborted(void);
|
||||
|
||||
void rcheevos_show_mastery_placard(void);
|
||||
|
||||
#ifdef HAVE_THREADS
|
||||
#define CHEEVOS_LOCK(l) do { slock_lock(l); } while (0)
|
||||
#define CHEEVOS_UNLOCK(l) do { slock_unlock(l); } while (0)
|
||||
#else
|
||||
#define CHEEVOS_LOCK(l)
|
||||
#define CHEEVOS_UNLOCK(l)
|
||||
#endif
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif /* __RARCH_CHEEVOS_LOCALS_H */
|
||||
+36
-27
@@ -42,6 +42,11 @@ enum rcheevos_menuitem_bucket
|
||||
RCHEEVOS_MENUITEM_BUCKET_ALMOST_THERE
|
||||
};
|
||||
|
||||
/* if menu_badge_grayscale is set to a value other than 1 or 0, it's a counter for the number of
|
||||
* frames since the last time we checked for the file. When the counter reaches this value, we'll
|
||||
* check for the file again. */
|
||||
#define MENU_BADGE_RETRY_RELOAD_FRAMES 64
|
||||
|
||||
static void rcheevos_menu_update_bucket(rcheevos_racheevo_t* cheevo)
|
||||
{
|
||||
cheevo->menu_progress = 0;
|
||||
@@ -163,7 +168,11 @@ void rcheevos_menu_reset_badges(void)
|
||||
while (cheevo < stop)
|
||||
{
|
||||
if (cheevo->menu_badge_texture)
|
||||
{
|
||||
video_driver_texture_unload(&cheevo->menu_badge_texture);
|
||||
cheevo->menu_badge_texture = 0;
|
||||
cheevo->menu_badge_grayscale = MENU_BADGE_RETRY_RELOAD_FRAMES;
|
||||
}
|
||||
++cheevo;
|
||||
}
|
||||
}
|
||||
@@ -374,7 +383,7 @@ uintptr_t rcheevos_menu_get_badge_texture(unsigned menu_offset)
|
||||
* has become available (do this roughly once a second) */
|
||||
if (cheevo->menu_badge_grayscale >= 2)
|
||||
{
|
||||
if (++cheevo->menu_badge_grayscale == 64)
|
||||
if (++cheevo->menu_badge_grayscale >= MENU_BADGE_RETRY_RELOAD_FRAMES)
|
||||
{
|
||||
cheevo->menu_badge_grayscale = 2;
|
||||
rcheevos_menu_update_badge(cheevo);
|
||||
@@ -399,29 +408,29 @@ void rcheevos_menu_populate_hardcore_pause_submenu(void* data)
|
||||
{
|
||||
if (rcheevos_locals->hardcore_active)
|
||||
{
|
||||
menu_entries_append_enum(info->list,
|
||||
menu_entries_append(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_PAUSE_CANCEL),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_PAUSE_CANCEL),
|
||||
MENU_ENUM_LABEL_ACHIEVEMENT_PAUSE_CANCEL,
|
||||
MENU_SETTING_ACTION_CLOSE, 0, 0);
|
||||
menu_entries_append_enum(info->list,
|
||||
MENU_SETTING_ACTION_CLOSE, 0, 0, NULL);
|
||||
menu_entries_append(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_PAUSE),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_PAUSE),
|
||||
MENU_ENUM_LABEL_ACHIEVEMENT_PAUSE,
|
||||
MENU_SETTING_ACTION_PAUSE_ACHIEVEMENTS, 0, 0);
|
||||
MENU_SETTING_ACTION_PAUSE_ACHIEVEMENTS, 0, 0, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
menu_entries_append_enum(info->list,
|
||||
menu_entries_append(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_RESUME_CANCEL),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_RESUME_CANCEL),
|
||||
MENU_ENUM_LABEL_ACHIEVEMENT_RESUME_CANCEL,
|
||||
MENU_SETTING_ACTION_CLOSE, 0, 0);
|
||||
menu_entries_append_enum(info->list,
|
||||
MENU_SETTING_ACTION_CLOSE, 0, 0, NULL);
|
||||
menu_entries_append(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_RESUME),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_RESUME),
|
||||
MENU_ENUM_LABEL_ACHIEVEMENT_RESUME,
|
||||
MENU_SETTING_ACTION_RESUME_ACHIEVEMENTS, 0, 0);
|
||||
MENU_SETTING_ACTION_RESUME_ACHIEVEMENTS, 0, 0, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -449,17 +458,17 @@ void rcheevos_menu_populate(void* data)
|
||||
if (settings->bools.cheevos_enable && settings->bools.cheevos_hardcore_mode_enable)
|
||||
{
|
||||
if (rcheevos_locals->hardcore_active)
|
||||
menu_entries_append_enum(info->list,
|
||||
menu_entries_append(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_PAUSE),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_PAUSE_MENU),
|
||||
MENU_ENUM_LABEL_ACHIEVEMENT_PAUSE_MENU,
|
||||
MENU_SETTING_ACTION_PAUSE_ACHIEVEMENTS, 0, 0);
|
||||
MENU_SETTING_ACTION_PAUSE_ACHIEVEMENTS, 0, 0, NULL);
|
||||
else
|
||||
menu_entries_append_enum(info->list,
|
||||
menu_entries_append(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACHIEVEMENT_RESUME),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_ACHIEVEMENT_PAUSE_MENU),
|
||||
MENU_ENUM_LABEL_ACHIEVEMENT_PAUSE_MENU,
|
||||
MENU_SETTING_ACTION_RESUME_ACHIEVEMENTS, 0, 0);
|
||||
MENU_SETTING_ACTION_RESUME_ACHIEVEMENTS, 0, 0, NULL);
|
||||
}
|
||||
|
||||
/* update the bucket for each achievement */
|
||||
@@ -596,18 +605,18 @@ void rcheevos_menu_populate(void* data)
|
||||
do
|
||||
{
|
||||
if (menuitem->cheevo)
|
||||
menu_entries_append_enum(info->list, menuitem->cheevo->title,
|
||||
menu_entries_append(info->list, menuitem->cheevo->title,
|
||||
menuitem->cheevo->description,
|
||||
MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY,
|
||||
MENU_SETTINGS_CHEEVOS_START + idx, 0, 0);
|
||||
MENU_SETTINGS_CHEEVOS_START + idx, 0, 0, NULL);
|
||||
else
|
||||
{
|
||||
snprintf(buffer, sizeof(buffer), "----- %s -----",
|
||||
msg_hash_to_str(menuitem->state_label_idx));
|
||||
|
||||
menu_entries_append_enum(info->list, buffer, "",
|
||||
menu_entries_append(info->list, buffer, "",
|
||||
MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY,
|
||||
MENU_SETTINGS_CHEEVOS_START + idx, 0, 0);
|
||||
MENU_SETTINGS_CHEEVOS_START + idx, 0, 0, NULL);
|
||||
}
|
||||
|
||||
++idx;
|
||||
@@ -618,35 +627,35 @@ void rcheevos_menu_populate(void* data)
|
||||
{
|
||||
/* no achievements found */
|
||||
if (!rcheevos_locals->core_supports)
|
||||
menu_entries_append_enum(info->list,
|
||||
menu_entries_append(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CANNOT_ACTIVATE_ACHIEVEMENTS_WITH_THIS_CORE),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_CANNOT_ACTIVATE_ACHIEVEMENTS_WITH_THIS_CORE),
|
||||
MENU_ENUM_LABEL_CANNOT_ACTIVATE_ACHIEVEMENTS_WITH_THIS_CORE,
|
||||
FILE_TYPE_NONE, 0, 0);
|
||||
FILE_TYPE_NONE, 0, 0, NULL);
|
||||
else if (rcheevos_locals->load_info.state == RCHEEVOS_LOAD_STATE_NETWORK_ERROR)
|
||||
menu_entries_append_enum(info->list,
|
||||
menu_entries_append(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NETWORK_ERROR),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_NETWORK_ERROR),
|
||||
MENU_ENUM_LABEL_NETWORK_ERROR,
|
||||
FILE_TYPE_NONE, 0, 0);
|
||||
FILE_TYPE_NONE, 0, 0, NULL);
|
||||
else if (!rcheevos_locals->game.id)
|
||||
menu_entries_append_enum(info->list,
|
||||
menu_entries_append(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_UNKNOWN_GAME),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_UNKNOWN_GAME),
|
||||
MENU_ENUM_LABEL_UNKNOWN_GAME,
|
||||
FILE_TYPE_NONE, 0, 0);
|
||||
FILE_TYPE_NONE, 0, 0, NULL);
|
||||
else if (!rcheevos_locals->token[0])
|
||||
menu_entries_append_enum(info->list,
|
||||
menu_entries_append(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_LOGGED_IN),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_NOT_LOGGED_IN),
|
||||
MENU_ENUM_LABEL_NOT_LOGGED_IN,
|
||||
FILE_TYPE_NONE, 0, 0);
|
||||
FILE_TYPE_NONE, 0, 0, NULL);
|
||||
else
|
||||
menu_entries_append_enum(info->list,
|
||||
menu_entries_append(info->list,
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ACHIEVEMENTS_TO_DISPLAY),
|
||||
msg_hash_to_str(MENU_ENUM_LABEL_NO_ACHIEVEMENTS_TO_DISPLAY),
|
||||
MENU_ENUM_LABEL_NO_ACHIEVEMENTS_TO_DISPLAY,
|
||||
FILE_TYPE_NONE, 0, 0);
|
||||
FILE_TYPE_NONE, 0, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ void rcheevos_menu_populate_hardcore_pause_submenu(void* data);
|
||||
bool rcheevos_menu_get_state(unsigned menu_offset, char* buffer, size_t buffer_size);
|
||||
bool rcheevos_menu_get_sublabel(unsigned menu_offset, char* buffer, size_t buffer_size);
|
||||
uintptr_t rcheevos_menu_get_badge_texture(unsigned menu_offset);
|
||||
void rcheevos_menu_reset_badges(void);
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
|
||||
@@ -180,35 +180,21 @@ static void network_command_free(command_t *handle)
|
||||
|
||||
static void command_network_poll(command_t *handle)
|
||||
{
|
||||
fd_set fds;
|
||||
struct timeval tmp_tv = {0};
|
||||
command_network_t *netcmd = (command_network_t*)handle->userptr;
|
||||
ssize_t ret;
|
||||
char buf[2048];
|
||||
command_network_t *netcmd = (command_network_t*)handle->userptr;
|
||||
|
||||
if (netcmd->net_fd < 0)
|
||||
return;
|
||||
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(netcmd->net_fd, &fds);
|
||||
|
||||
if (socket_select(netcmd->net_fd + 1, &fds, NULL, NULL, &tmp_tv) <= 0)
|
||||
return;
|
||||
|
||||
if (!FD_ISSET(netcmd->net_fd, &fds))
|
||||
return;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
ssize_t ret;
|
||||
char buf[1024];
|
||||
netcmd->cmd_source_len = sizeof(netcmd->cmd_source);
|
||||
|
||||
buf[0] = '\0';
|
||||
netcmd->cmd_source_len = sizeof(struct sockaddr_storage);
|
||||
ret = recvfrom(netcmd->net_fd, buf, sizeof(buf) - 1, 0,
|
||||
(struct sockaddr*)&netcmd->cmd_source,
|
||||
&netcmd->cmd_source_len);
|
||||
|
||||
if (ret <= 0)
|
||||
break;
|
||||
if ((ret = recvfrom(netcmd->net_fd, buf, sizeof(buf) - 1, 0,
|
||||
(struct sockaddr*)&netcmd->cmd_source,
|
||||
&netcmd->cmd_source_len)) <= 0)
|
||||
return;
|
||||
|
||||
buf[ret] = '\0';
|
||||
|
||||
@@ -223,7 +209,7 @@ command_t* command_network_new(uint16_t port)
|
||||
command_network_t *netcmd = (command_network_t*)calloc(
|
||||
1, sizeof(command_network_t));
|
||||
int fd = socket_init(
|
||||
(void**)&res, port, NULL, SOCKET_TYPE_DATAGRAM);
|
||||
(void**)&res, port, NULL, SOCKET_TYPE_DATAGRAM, AF_INET);
|
||||
|
||||
RARCH_LOG("[NetCMD]: %s %hu.\n",
|
||||
msg_hash_to_str(MSG_BRINGING_UP_COMMAND_INTERFACE_ON_PORT),
|
||||
@@ -355,7 +341,8 @@ command_t* command_stdin_new(void)
|
||||
|
||||
bool command_get_config_param(command_t *cmd, const char* arg)
|
||||
{
|
||||
char reply[8192] = {0};
|
||||
size_t _len;
|
||||
char reply[8192];
|
||||
const char *value = "unsupported";
|
||||
settings_t *settings = config_get_ptr();
|
||||
bool video_fullscreen = settings->bools.video_fullscreen;
|
||||
@@ -388,7 +375,11 @@ bool command_get_config_param(command_t *cmd, const char* arg)
|
||||
value = path_username;
|
||||
/* TODO: query any string */
|
||||
|
||||
snprintf(reply, sizeof(reply), "GET_CONFIG_PARAM %s %s\n", arg, value);
|
||||
strlcpy(reply, "GET_CONFIG_PARAM ", sizeof(reply));
|
||||
_len = strlcat(reply, arg, sizeof(reply));
|
||||
reply[_len ] = ' ';
|
||||
reply[_len+1] = '\0';
|
||||
strlcat(reply, value, sizeof(reply));
|
||||
cmd->replier(cmd, reply, strlen(reply));
|
||||
return true;
|
||||
}
|
||||
@@ -431,71 +422,58 @@ static void uds_command_free(command_t *handle)
|
||||
static void command_uds_poll(command_t *handle)
|
||||
{
|
||||
int i;
|
||||
fd_set fds;
|
||||
command_uds_t *udscmd = (command_uds_t*)handle->userptr;
|
||||
int maxfd = udscmd->sfd;
|
||||
struct timeval tmp_tv = {0};
|
||||
int fd;
|
||||
ssize_t ret;
|
||||
char buf[2048];
|
||||
command_uds_t *udscmd = (command_uds_t*)handle->userptr;
|
||||
|
||||
if (udscmd->sfd < 0)
|
||||
return;
|
||||
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(udscmd->sfd, &fds);
|
||||
|
||||
for (i = 0; i < MAX_USER_CONNECTIONS; i++)
|
||||
{
|
||||
if (udscmd->userfd[i] >= 0)
|
||||
{
|
||||
maxfd = MAX(udscmd->userfd[i], maxfd);
|
||||
FD_SET(udscmd->userfd[i], &fds);
|
||||
}
|
||||
}
|
||||
|
||||
if (socket_select(maxfd + 1, &fds, NULL, NULL, &tmp_tv) <= 0)
|
||||
return;
|
||||
|
||||
/* Read data from clients and process commands */
|
||||
for (i = 0; i < MAX_USER_CONNECTIONS; i++)
|
||||
{
|
||||
if (udscmd->userfd[i] >= 0 && FD_ISSET(udscmd->userfd[i], &fds))
|
||||
bool err = false;
|
||||
|
||||
fd = udscmd->userfd[i];
|
||||
if (fd < 0)
|
||||
continue;
|
||||
|
||||
ret = socket_receive_all_nonblocking(fd, &err, buf, sizeof(buf) - 1);
|
||||
if (!ret)
|
||||
continue;
|
||||
|
||||
if (!err)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
char buf[2048];
|
||||
ssize_t ret = recv(udscmd->userfd[i], buf, sizeof(buf) - 1, 0);
|
||||
buf[ret] = '\0';
|
||||
udscmd->last_fd = fd;
|
||||
|
||||
if (ret < 0)
|
||||
break; /* no more data */
|
||||
if (!ret)
|
||||
{
|
||||
socket_close(udscmd->userfd[i]);
|
||||
udscmd->userfd[i] = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
buf[ret] = 0;
|
||||
udscmd->last_fd = udscmd->userfd[i];
|
||||
command_parse_msg(handle, buf);
|
||||
}
|
||||
command_parse_msg(handle, buf);
|
||||
}
|
||||
else
|
||||
{
|
||||
socket_close(fd);
|
||||
udscmd->userfd[i] = -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (FD_ISSET(udscmd->sfd, &fds))
|
||||
/* Accepts new connections from clients */
|
||||
fd = accept(udscmd->sfd, NULL, NULL);
|
||||
if (fd >= 0)
|
||||
{
|
||||
/* Accepts new connections from clients */
|
||||
int cfd = accept(udscmd->sfd, NULL, NULL);
|
||||
if (cfd >= 0) {
|
||||
if (!socket_nonblock(cfd))
|
||||
socket_close(cfd);
|
||||
else {
|
||||
for (i = 0; i < MAX_USER_CONNECTIONS; i++)
|
||||
if (udscmd->userfd[i] < 0)
|
||||
{
|
||||
udscmd->userfd[i] = cfd;
|
||||
break;
|
||||
}
|
||||
if (socket_nonblock(fd))
|
||||
{
|
||||
for (i = 0; i < MAX_USER_CONNECTIONS; i++)
|
||||
{
|
||||
if (udscmd->userfd[i] < 0)
|
||||
{
|
||||
udscmd->userfd[i] = fd;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
socket_close(fd);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -567,6 +545,48 @@ static bool command_verify(const char *cmd)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool udp_send_packet(const char *host, uint16_t port, const char *msg)
|
||||
{
|
||||
char port_buf[6];
|
||||
const struct addrinfo *tmp_info;
|
||||
struct addrinfo *addr = NULL;
|
||||
struct addrinfo hints = {0};
|
||||
size_t len = strlen(msg);
|
||||
bool ret = false;
|
||||
|
||||
snprintf(port_buf, sizeof(port_buf), "%hu", (unsigned short)port);
|
||||
|
||||
hints.ai_socktype = SOCK_DGRAM;
|
||||
hints.ai_flags = AI_NUMERICSERV;
|
||||
|
||||
if (getaddrinfo_retro(host, port_buf, &hints, &addr))
|
||||
return false;
|
||||
if (!addr)
|
||||
return false;
|
||||
|
||||
/* Send to all possible targets. */
|
||||
tmp_info = addr;
|
||||
|
||||
do
|
||||
{
|
||||
int fd = socket(tmp_info->ai_family,
|
||||
tmp_info->ai_socktype, tmp_info->ai_protocol);
|
||||
|
||||
if (fd < 0)
|
||||
continue;
|
||||
|
||||
if (sendto(fd, msg, len, 0, tmp_info->ai_addr, tmp_info->ai_addrlen) ==
|
||||
(ssize_t)len)
|
||||
ret = true;
|
||||
|
||||
socket_close(fd);
|
||||
} while ((tmp_info = tmp_info->ai_next));
|
||||
|
||||
freeaddrinfo_retro(addr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool command_network_send(const char *cmd_)
|
||||
{
|
||||
char *command = NULL;
|
||||
@@ -632,7 +652,7 @@ bool command_read_ram(command_t *cmd, const char *arg)
|
||||
unsigned int nbytes = 0;
|
||||
unsigned int alloc_size = 0;
|
||||
unsigned int addr = -1;
|
||||
unsigned int len = 0;
|
||||
size_t len = 0;
|
||||
|
||||
if (sscanf(arg, "%x %u", &addr, &nbytes) != 2)
|
||||
return true;
|
||||
@@ -685,9 +705,10 @@ bool command_write_ram(command_t *cmd, const char *arg)
|
||||
|
||||
bool command_version(command_t *cmd, const char* arg)
|
||||
{
|
||||
char reply[256] = {0};
|
||||
|
||||
snprintf(reply, sizeof(reply), "%s\n", PACKAGE_VERSION);
|
||||
char reply[256];
|
||||
size_t _len = strlcpy(reply, PACKAGE_VERSION, sizeof(reply));
|
||||
reply[_len ] = '\n';
|
||||
reply[_len+1] = '\0';
|
||||
cmd->replier(cmd, reply, strlen(reply));
|
||||
|
||||
return true;
|
||||
@@ -765,7 +786,7 @@ uint8_t *command_memory_get_pointer(
|
||||
strlcpy(reply_at, " -1 descriptor data is readonly\n", len);
|
||||
else
|
||||
{
|
||||
*max_bytes = (desc->core.len - offset);
|
||||
*max_bytes = (unsigned int)(desc->core.len - offset);
|
||||
return (uint8_t*)desc->core.ptr + desc->core.offset + offset;
|
||||
}
|
||||
}
|
||||
@@ -776,35 +797,35 @@ uint8_t *command_memory_get_pointer(
|
||||
|
||||
bool command_get_status(command_t *cmd, const char* arg)
|
||||
{
|
||||
char reply[4096] = {0};
|
||||
bool contentless = false;
|
||||
bool is_inited = false;
|
||||
runloop_state_t *runloop_st = runloop_state_get_ptr();
|
||||
char reply[4096];
|
||||
uint8_t flags = content_get_flags();
|
||||
|
||||
content_get_status(&contentless, &is_inited);
|
||||
|
||||
if (!is_inited)
|
||||
strcpy_literal(reply, "GET_STATUS CONTENTLESS");
|
||||
else
|
||||
if (flags & CONTENT_ST_FLAG_IS_INITED)
|
||||
{
|
||||
/* add some content info */
|
||||
const char *status = "PLAYING";
|
||||
const char *content_name = path_basename(path_get(RARCH_PATH_BASENAME)); /* filename only without ext */
|
||||
int content_crc32 = content_get_crc();
|
||||
const char* system_id = NULL;
|
||||
core_info_t *core_info = NULL;
|
||||
/* add some content info */
|
||||
runloop_state_t *runloop_st = runloop_state_get_ptr();
|
||||
const char *status = "PLAYING";
|
||||
const char *content_name = path_basename(path_get(RARCH_PATH_BASENAME)); /* filename only without ext */
|
||||
int content_crc32 = content_get_crc();
|
||||
const char* system_id = NULL;
|
||||
core_info_t *core_info = NULL;
|
||||
|
||||
core_info_get_current_core(&core_info);
|
||||
reply[0] = '\0';
|
||||
|
||||
if (runloop_st->paused)
|
||||
status = "PAUSED";
|
||||
if (core_info)
|
||||
system_id = core_info->system_id;
|
||||
if (!system_id)
|
||||
system_id = runloop_st->system.info.library_name;
|
||||
core_info_get_current_core(&core_info);
|
||||
|
||||
snprintf(reply, sizeof(reply), "GET_STATUS %s %s,%s,crc32=%x\n", status, system_id, content_name, content_crc32);
|
||||
if (runloop_st->flags & RUNLOOP_FLAG_PAUSED)
|
||||
status = "PAUSED";
|
||||
if (core_info)
|
||||
system_id = core_info->system_id;
|
||||
if (!system_id)
|
||||
system_id = runloop_st->system.info.library_name;
|
||||
|
||||
snprintf(reply, sizeof(reply), "GET_STATUS %s %s,%s,crc32=%x\n",
|
||||
status, system_id, content_name, content_crc32);
|
||||
}
|
||||
else
|
||||
strlcpy(reply, "GET_STATUS CONTENTLESS", sizeof(reply));
|
||||
|
||||
cmd->replier(cmd, reply, strlen(reply));
|
||||
|
||||
@@ -898,17 +919,23 @@ void command_event_set_volume(
|
||||
bool widgets_active,
|
||||
bool audio_driver_mute_enable)
|
||||
{
|
||||
size_t _len;
|
||||
char msg[128];
|
||||
float new_volume = settings->floats.audio_volume + gain;
|
||||
|
||||
new_volume = MAX(new_volume, -80.0f);
|
||||
new_volume = MIN(new_volume, 12.0f);
|
||||
|
||||
float new_volume = settings->floats.audio_volume + gain;
|
||||
new_volume = MAX(new_volume, -80.0f);
|
||||
new_volume = MIN(new_volume, 12.0f);
|
||||
configuration_set_float(settings, settings->floats.audio_volume, new_volume);
|
||||
|
||||
snprintf(msg, sizeof(msg), "%s: %.1f dB",
|
||||
msg_hash_to_str(MSG_AUDIO_VOLUME),
|
||||
_len = strlcpy(msg, msg_hash_to_str(MSG_AUDIO_VOLUME),
|
||||
sizeof(msg));
|
||||
msg[_len ] = ':';
|
||||
msg[++_len] = ' ';
|
||||
msg[++_len] = '\0';
|
||||
_len += snprintf(msg + _len, sizeof(msg) - _len, "%.1f",
|
||||
new_volume);
|
||||
msg[_len ] = ' ';
|
||||
msg[++_len] = 'd';
|
||||
msg[++_len] = 'B';
|
||||
msg[++_len] = '\0';
|
||||
|
||||
#if defined(HAVE_GFX_WIDGETS)
|
||||
if (widgets_active)
|
||||
@@ -935,17 +962,23 @@ void command_event_set_mixer_volume(
|
||||
settings_t *settings,
|
||||
float gain)
|
||||
{
|
||||
size_t _len;
|
||||
char msg[128];
|
||||
float new_volume = settings->floats.audio_mixer_volume + gain;
|
||||
|
||||
new_volume = MAX(new_volume, -80.0f);
|
||||
new_volume = MIN(new_volume, 12.0f);
|
||||
|
||||
float new_volume = settings->floats.audio_mixer_volume + gain;
|
||||
new_volume = MAX(new_volume, -80.0f);
|
||||
new_volume = MIN(new_volume, 12.0f);
|
||||
configuration_set_float(settings, settings->floats.audio_mixer_volume, new_volume);
|
||||
|
||||
snprintf(msg, sizeof(msg), "%s: %.1f dB",
|
||||
msg_hash_to_str(MSG_AUDIO_VOLUME),
|
||||
_len = strlcpy(msg, msg_hash_to_str(MSG_AUDIO_VOLUME),
|
||||
sizeof(msg));
|
||||
msg[_len ] = ':';
|
||||
msg[++_len] = ' ';
|
||||
msg[++_len] = '\0';
|
||||
_len += snprintf(msg + _len, sizeof(msg) - _len, "%.1f",
|
||||
new_volume);
|
||||
msg[_len ] = ' ';
|
||||
msg[++_len] = 'd';
|
||||
msg[++_len] = 'B';
|
||||
msg[++_len] = '\0';
|
||||
runloop_msg_queue_push(msg, 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||
|
||||
RARCH_LOG("[Audio]: %s\n", msg);
|
||||
@@ -1096,7 +1129,7 @@ bool command_event_resize_windowed_scale(settings_t *settings,
|
||||
if (window_scale == 0)
|
||||
return false;
|
||||
|
||||
configuration_set_float(settings, settings->floats.video_scale, (float)window_scale);
|
||||
configuration_set_uint(settings, settings->uints.video_scale, window_scale);
|
||||
|
||||
if (!video_fullscreen)
|
||||
command_event(CMD_EVENT_REINIT, NULL);
|
||||
@@ -1111,7 +1144,6 @@ bool command_event_save_auto_state(
|
||||
const enum rarch_core_type current_core_type)
|
||||
{
|
||||
runloop_state_t *runloop_st = runloop_state_get_ptr();
|
||||
bool ret = false;
|
||||
char savestate_name_auto[PATH_MAX_LENGTH];
|
||||
|
||||
if (runloop_st->entry_state_slot)
|
||||
@@ -1122,26 +1154,24 @@ bool command_event_save_auto_state(
|
||||
return false;
|
||||
if (!core_info_current_supports_savestate())
|
||||
return false;
|
||||
|
||||
if (string_is_empty(path_basename(path_get(RARCH_PATH_BASENAME))))
|
||||
return false;
|
||||
|
||||
#ifdef HAVE_CHEEVOS
|
||||
if (rcheevos_hardcore_active())
|
||||
return false;
|
||||
#endif
|
||||
|
||||
savestate_name_auto[0] = '\0';
|
||||
|
||||
fill_pathname_noext(savestate_name_auto,
|
||||
strlcpy(savestate_name_auto,
|
||||
runloop_st->name.savestate,
|
||||
".auto", sizeof(savestate_name_auto));
|
||||
sizeof(savestate_name_auto));
|
||||
strlcat(savestate_name_auto,
|
||||
".auto",
|
||||
sizeof(savestate_name_auto));
|
||||
|
||||
ret = content_save_state((const char*)savestate_name_auto, true, true);
|
||||
RARCH_LOG("%s \"%s\" %s.\n",
|
||||
msg_hash_to_str(MSG_AUTO_SAVE_STATE_TO),
|
||||
savestate_name_auto, ret ?
|
||||
"succeeded" : "failed");
|
||||
if (content_save_state((const char*)savestate_name_auto, true, true))
|
||||
RARCH_LOG("%s \"%s\" %s.\n",
|
||||
msg_hash_to_str(MSG_AUTO_SAVE_STATE_TO),
|
||||
savestate_name_auto, "succeeded");
|
||||
else
|
||||
RARCH_LOG("%s \"%s\" %s.\n",
|
||||
msg_hash_to_str(MSG_AUTO_SAVE_STATE_TO),
|
||||
savestate_name_auto, "failed");
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1196,8 +1226,9 @@ bool command_event_load_entry_state(void)
|
||||
|
||||
entry_state_path[0] = '\0';
|
||||
|
||||
if (!retroarch_get_entry_state_path(entry_state_path, sizeof(entry_state_path),
|
||||
runloop_st->entry_state_slot))
|
||||
if (!retroarch_get_entry_state_path(
|
||||
entry_state_path, sizeof(entry_state_path),
|
||||
runloop_st->entry_state_slot))
|
||||
return false;
|
||||
|
||||
entry_path_stats = path_stat(entry_state_path);
|
||||
@@ -1223,7 +1254,6 @@ void command_event_load_auto_state(void)
|
||||
{
|
||||
char savestate_name_auto[PATH_MAX_LENGTH];
|
||||
runloop_state_t *runloop_st = runloop_state_get_ptr();
|
||||
bool ret = false;
|
||||
|
||||
if (!core_info_current_supports_savestate())
|
||||
return;
|
||||
@@ -1237,30 +1267,35 @@ void command_event_load_auto_state(void)
|
||||
return;
|
||||
#endif
|
||||
|
||||
savestate_name_auto[0] = '\0';
|
||||
|
||||
fill_pathname_noext(savestate_name_auto, runloop_st->name.savestate,
|
||||
".auto", sizeof(savestate_name_auto));
|
||||
strlcpy(savestate_name_auto,
|
||||
runloop_st->name.savestate,
|
||||
sizeof(savestate_name_auto));
|
||||
strlcat(savestate_name_auto,
|
||||
".auto",
|
||||
sizeof(savestate_name_auto));
|
||||
|
||||
if (!path_is_valid(savestate_name_auto))
|
||||
return;
|
||||
|
||||
ret = content_load_state(savestate_name_auto, false, true);
|
||||
|
||||
RARCH_LOG("[State]: %s \"%s\".\n",
|
||||
msg_hash_to_str(MSG_FOUND_AUTO_SAVESTATE_IN),
|
||||
savestate_name_auto);
|
||||
RARCH_LOG("[State]: %s \"%s\" %s.\n",
|
||||
msg_hash_to_str(MSG_AUTOLOADING_SAVESTATE_FROM),
|
||||
savestate_name_auto, ret ? "succeeded" : "failed"
|
||||
);
|
||||
|
||||
if ((content_load_state(savestate_name_auto, false, true)))
|
||||
RARCH_LOG("[State]: %s \"%s\" %s.\n",
|
||||
msg_hash_to_str(MSG_AUTOLOADING_SAVESTATE_FROM),
|
||||
savestate_name_auto, "succeeded");
|
||||
else
|
||||
RARCH_LOG("[State]: %s \"%s\" %s.\n",
|
||||
msg_hash_to_str(MSG_AUTOLOADING_SAVESTATE_FROM),
|
||||
savestate_name_auto, "failed");
|
||||
}
|
||||
|
||||
void command_event_set_savestate_auto_index(settings_t *settings)
|
||||
{
|
||||
size_t i;
|
||||
char state_base[128];
|
||||
char state_dir[PATH_MAX_LENGTH];
|
||||
char state_base[PATH_MAX_LENGTH];
|
||||
|
||||
struct string_list *dir_list = NULL;
|
||||
unsigned max_idx = 0;
|
||||
@@ -1271,8 +1306,6 @@ void command_event_set_savestate_auto_index(settings_t *settings)
|
||||
if (!savestate_auto_index)
|
||||
return;
|
||||
|
||||
state_dir[0] = state_base[0] = '\0';
|
||||
|
||||
/* Find the file in the same directory as runloop_st->savestate_name
|
||||
* with the largest numeral suffix.
|
||||
*
|
||||
@@ -1328,16 +1361,13 @@ void command_event_set_savestate_garbage_collect(
|
||||
{
|
||||
size_t i, cnt = 0;
|
||||
char state_dir[PATH_MAX_LENGTH];
|
||||
char state_base[PATH_MAX_LENGTH];
|
||||
char state_base[128];
|
||||
runloop_state_t *runloop_st = runloop_state_get_ptr();
|
||||
|
||||
struct string_list *dir_list = NULL;
|
||||
unsigned min_idx = UINT_MAX;
|
||||
const char *oldest_save = NULL;
|
||||
|
||||
state_dir[0] = '\0';
|
||||
state_base[0] = '\0';
|
||||
|
||||
/* Similar to command_event_set_savestate_auto_index(),
|
||||
* this will find the lowest numbered save-state */
|
||||
fill_pathname_basedir(state_dir, runloop_st->name.savestate,
|
||||
@@ -1360,8 +1390,6 @@ void command_event_set_savestate_garbage_collect(
|
||||
const char *end = NULL;
|
||||
const char *dir_elem = dir_list->elems[i].data;
|
||||
|
||||
elem_base[0] = '\0';
|
||||
|
||||
if (string_is_empty(dir_elem))
|
||||
continue;
|
||||
|
||||
@@ -1421,14 +1449,10 @@ bool command_set_shader(command_t *cmd, const char *arg)
|
||||
/* rebase on shader directory */
|
||||
if (!path_is_absolute(arg))
|
||||
{
|
||||
static char abs_arg[PATH_MAX_LENGTH];
|
||||
char abs_arg[PATH_MAX_LENGTH];
|
||||
const char *ref_path = settings->paths.directory_video_shader;
|
||||
fill_pathname_join(abs_arg,
|
||||
ref_path, arg, sizeof(abs_arg));
|
||||
/* TODO/FIXME - pointer to local variable -
|
||||
* making abs_arg static for now to workaround this
|
||||
*/
|
||||
arg = abs_arg;
|
||||
fill_pathname_join_special(abs_arg, ref_path, arg, sizeof(abs_arg));
|
||||
return apply_shader(settings, type, abs_arg, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1442,16 +1466,15 @@ bool command_event_save_core_config(
|
||||
const char *rarch_path_config)
|
||||
{
|
||||
char msg[128];
|
||||
char config_name[PATH_MAX_LENGTH];
|
||||
char config_name[255];
|
||||
char config_path[PATH_MAX_LENGTH];
|
||||
char config_dir[PATH_MAX_LENGTH];
|
||||
bool found_path = false;
|
||||
bool new_path_available = false;
|
||||
bool overrides_active = false;
|
||||
const char *core_path = NULL;
|
||||
runloop_state_t *runloop_st = runloop_state_get_ptr();
|
||||
|
||||
msg[0] = '\0';
|
||||
config_dir[0] = '\0';
|
||||
|
||||
if (!string_is_empty(dir_menu_config))
|
||||
strlcpy(config_dir, dir_menu_config, sizeof(config_dir));
|
||||
@@ -1467,63 +1490,52 @@ bool command_event_save_core_config(
|
||||
}
|
||||
|
||||
core_path = path_get(RARCH_PATH_CORE);
|
||||
config_name[0] = '\0';
|
||||
config_path[0] = '\0';
|
||||
|
||||
/* Infer file name based on libretro core. */
|
||||
if (path_is_valid(core_path))
|
||||
{
|
||||
unsigned i;
|
||||
char tmp[PATH_MAX_LENGTH + 8];
|
||||
RARCH_LOG("[Config]: %s\n", msg_hash_to_str(MSG_USING_CORE_NAME_FOR_NEW_CONFIG));
|
||||
|
||||
fill_pathname_base(config_name, core_path, sizeof(config_name));
|
||||
path_remove_extension(config_name);
|
||||
fill_pathname_join_special(config_path, config_dir, config_name,
|
||||
sizeof(config_path));
|
||||
|
||||
/* In case of collision, find an alternative name. */
|
||||
for (i = 0; i < 16; i++)
|
||||
{
|
||||
char tmp[64];
|
||||
|
||||
fill_pathname_base_noext(
|
||||
config_name,
|
||||
core_path,
|
||||
sizeof(config_name));
|
||||
|
||||
fill_pathname_join(config_path, config_dir, config_name,
|
||||
sizeof(config_path));
|
||||
|
||||
size_t _len = strlcpy(tmp, config_path, sizeof(tmp));
|
||||
if (i)
|
||||
snprintf(tmp, sizeof(tmp), "-%u.cfg", i);
|
||||
else
|
||||
{
|
||||
tmp[0] = '\0';
|
||||
strlcpy(tmp, ".cfg", sizeof(tmp));
|
||||
}
|
||||
snprintf(tmp + _len, sizeof(tmp) - _len, "-%u", i);
|
||||
strlcat(tmp, ".cfg", sizeof(tmp));
|
||||
|
||||
strlcat(config_path, tmp, sizeof(config_path));
|
||||
|
||||
if (!path_is_valid(config_path))
|
||||
if (!path_is_valid(tmp))
|
||||
{
|
||||
found_path = true;
|
||||
new_path_available = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!found_path)
|
||||
if (!new_path_available)
|
||||
{
|
||||
/* Fallback to system time... */
|
||||
RARCH_WARN("[Config]: %s\n",
|
||||
msg_hash_to_str(MSG_CANNOT_INFER_NEW_CONFIG_PATH));
|
||||
fill_dated_filename(config_name, ".cfg", sizeof(config_name));
|
||||
fill_pathname_join(config_path, config_dir, config_name,
|
||||
fill_pathname_join_special(config_path, config_dir, config_name,
|
||||
sizeof(config_path));
|
||||
}
|
||||
|
||||
if (runloop_st->overrides_active)
|
||||
if (runloop_st->flags & RUNLOOP_FLAG_OVERRIDES_ACTIVE)
|
||||
{
|
||||
/* Overrides block config file saving,
|
||||
* make it appear as overrides weren't enabled
|
||||
* for a manual save. */
|
||||
runloop_st->overrides_active = false;
|
||||
overrides_active = true;
|
||||
runloop_st->flags &= ~RUNLOOP_FLAG_OVERRIDES_ACTIVE;
|
||||
overrides_active = true;
|
||||
}
|
||||
|
||||
#ifdef HAVE_CONFIGFILE
|
||||
@@ -1534,7 +1546,10 @@ bool command_event_save_core_config(
|
||||
runloop_msg_queue_push(msg, 1, 180, true, NULL,
|
||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||
|
||||
runloop_st->overrides_active = overrides_active;
|
||||
if (overrides_active)
|
||||
runloop_st->flags |= RUNLOOP_FLAG_OVERRIDES_ACTIVE;
|
||||
else
|
||||
runloop_st->flags &= ~RUNLOOP_FLAG_OVERRIDES_ACTIVE;
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1550,8 +1565,7 @@ void command_event_save_current_config(enum override_type type)
|
||||
if (path_is_empty(RARCH_PATH_CONFIG))
|
||||
{
|
||||
char msg[128];
|
||||
msg[0] = '\0';
|
||||
strcpy_literal(msg, "[Config]: Config directory not set, cannot save configuration.");
|
||||
strlcpy(msg, "[Config]: Config directory not set, cannot save configuration.", sizeof(msg));
|
||||
runloop_msg_queue_push(msg, 1, 180, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||
}
|
||||
else
|
||||
@@ -1568,13 +1582,12 @@ void command_event_save_current_config(enum override_type type)
|
||||
case OVERRIDE_CONTENT_DIR:
|
||||
{
|
||||
char msg[128];
|
||||
msg[0] = '\0';
|
||||
if (config_save_overrides(type, &runloop_st->system))
|
||||
{
|
||||
strlcpy(msg, msg_hash_to_str(MSG_OVERRIDES_SAVED_SUCCESSFULLY), sizeof(msg));
|
||||
/* set overrides to active so the original config can be
|
||||
restored after closing content */
|
||||
runloop_st->overrides_active = true;
|
||||
runloop_st->flags |= RUNLOOP_FLAG_OVERRIDES_ACTIVE;
|
||||
}
|
||||
else
|
||||
strlcpy(msg, msg_hash_to_str(MSG_OVERRIDES_ERROR_SAVING), sizeof(msg));
|
||||
@@ -1710,7 +1723,7 @@ bool command_event_disk_control_append_image(
|
||||
return false;
|
||||
|
||||
#ifdef HAVE_THREADS
|
||||
if (runloop_st->use_sram)
|
||||
if (runloop_st->flags & RUNLOOP_FLAG_USE_SRAM)
|
||||
autosave_deinit();
|
||||
#endif
|
||||
|
||||
@@ -1740,7 +1753,7 @@ void command_event_reinit(const int flags)
|
||||
struct menu_state *menu_st = menu_state_get_ptr();
|
||||
bool video_fullscreen = settings->bools.video_fullscreen;
|
||||
bool adaptive_vsync = settings->bools.video_adaptive_vsync;
|
||||
unsigned swap_interval = settings->uints.video_swap_interval;
|
||||
unsigned swap_interval_config = settings->uints.video_swap_interval;
|
||||
#endif
|
||||
enum input_game_focus_cmd_type
|
||||
game_focus_cmd = GAME_FOCUS_CMD_REAPPLY;
|
||||
@@ -1766,15 +1779,15 @@ void command_event_reinit(const int flags)
|
||||
command_event(CMD_EVENT_GAME_FOCUS_TOGGLE, &game_focus_cmd);
|
||||
|
||||
#ifdef HAVE_MENU
|
||||
p_disp->framebuf_dirty = true;
|
||||
p_disp->flags |= GFX_DISP_FLAG_FB_DIRTY;
|
||||
if (video_fullscreen)
|
||||
video_driver_hide_mouse();
|
||||
if ( menu_st->alive
|
||||
if ( (menu_st->flags & MENU_ST_FLAG_ALIVE)
|
||||
&& video_st->current_video->set_nonblock_state)
|
||||
video_st->current_video->set_nonblock_state(
|
||||
video_st->data, false,
|
||||
video_driver_test_all_flags(GFX_CTX_FLAGS_ADAPTIVE_VSYNC) &&
|
||||
adaptive_vsync,
|
||||
swap_interval);
|
||||
runloop_get_video_swap_interval(swap_interval_config));
|
||||
#endif
|
||||
}
|
||||
@@ -136,6 +136,8 @@ enum event_command
|
||||
CMD_EVENT_OVERLAY_SET_SCALE_FACTOR,
|
||||
/* Sets current alpha modulation for overlay. */
|
||||
CMD_EVENT_OVERLAY_SET_ALPHA_MOD,
|
||||
/* Sets diagonal sensitivities of overlay eightway areas. */
|
||||
CMD_EVENT_OVERLAY_SET_EIGHTWAY_DIAGONAL_SENSITIVITY,
|
||||
/* Cycle to next overlay. */
|
||||
CMD_EVENT_OVERLAY_NEXT,
|
||||
/* Deinitializes overlay. */
|
||||
@@ -244,7 +246,7 @@ enum event_command
|
||||
CMD_EVENT_MIXER_VOLUME_UP,
|
||||
CMD_EVENT_MIXER_VOLUME_DOWN,
|
||||
CMD_EVENT_DISCORD_INIT,
|
||||
CMD_EVENT_DISCORD_UPDATE,
|
||||
CMD_EVENT_PRESENCE_UPDATE,
|
||||
CMD_EVENT_OSK_TOGGLE,
|
||||
CMD_EVENT_RECORDING_TOGGLE,
|
||||
CMD_EVENT_STREAMING_TOGGLE,
|
||||
@@ -253,6 +255,7 @@ enum event_command
|
||||
CMD_EVENT_BSV_RECORDING_TOGGLE,
|
||||
CMD_EVENT_SHADER_NEXT,
|
||||
CMD_EVENT_SHADER_PREV,
|
||||
CMD_EVENT_SHADER_TOGGLE,
|
||||
CMD_EVENT_CHEAT_INDEX_PLUS,
|
||||
CMD_EVENT_CHEAT_INDEX_MINUS,
|
||||
CMD_EVENT_CHEAT_TOGGLE,
|
||||
@@ -294,19 +297,22 @@ command_t* command_uds_new(void);
|
||||
bool command_network_send(const char *cmd_);
|
||||
|
||||
#ifdef HAVE_BSV_MOVIE
|
||||
enum bsv_flags
|
||||
{
|
||||
BSV_FLAG_MOVIE_START_RECORDING = (1 << 0),
|
||||
BSV_FLAG_MOVIE_START_PLAYBACK = (1 << 1),
|
||||
BSV_FLAG_MOVIE_PLAYBACK = (1 << 2),
|
||||
BSV_FLAG_MOVIE_EOF_EXIT = (1 << 3),
|
||||
BSV_FLAG_MOVIE_END = (1 << 4)
|
||||
};
|
||||
|
||||
struct bsv_state
|
||||
{
|
||||
uint8_t flags;
|
||||
/* Movie playback/recording support. */
|
||||
char movie_path[PATH_MAX_LENGTH];
|
||||
/* Immediate playback/recording. */
|
||||
char movie_start_path[PATH_MAX_LENGTH];
|
||||
|
||||
bool movie_start_recording;
|
||||
bool movie_start_playback;
|
||||
bool movie_playback;
|
||||
bool eof_exit;
|
||||
bool movie_end;
|
||||
|
||||
};
|
||||
|
||||
struct bsv_movie
|
||||
@@ -458,6 +464,7 @@ static const struct cmd_map map[] = {
|
||||
{ "RESET", RARCH_RESET },
|
||||
{ "SHADER_NEXT", RARCH_SHADER_NEXT },
|
||||
{ "SHADER_PREV", RARCH_SHADER_PREV },
|
||||
{ "SHADER_TOGGLE", RARCH_SHADER_TOGGLE },
|
||||
{ "CHEAT_INDEX_PLUS", RARCH_CHEAT_INDEX_PLUS },
|
||||
{ "CHEAT_INDEX_MINUS", RARCH_CHEAT_INDEX_MINUS },
|
||||
{ "CHEAT_TOGGLE", RARCH_CHEAT_TOGGLE },
|
||||
|
||||
+135
-83
@@ -53,6 +53,11 @@
|
||||
#include "../input/input_overlay.h"
|
||||
#endif
|
||||
|
||||
/* Required for Steam enum settings */
|
||||
#if defined(HAVE_MIST)
|
||||
#include "steam/steam.h"
|
||||
#endif
|
||||
|
||||
#if defined(HW_RVL)
|
||||
#define MAX_GAMMA_SETTING 30
|
||||
#elif defined(GEKKO)
|
||||
@@ -197,7 +202,7 @@
|
||||
* Real x resolution = aspect * base_size * x scale
|
||||
* Real y resolution = base_size * y scale
|
||||
*/
|
||||
#define DEFAULT_SCALE (3.0)
|
||||
#define DEFAULT_SCALE 3
|
||||
|
||||
/* Fullscreen */
|
||||
|
||||
@@ -219,6 +224,10 @@
|
||||
#define DEFAULT_WINDOWED_FULLSCREEN true
|
||||
#endif
|
||||
|
||||
/* Enable automatic switching of the screen refresh rate when using the specified screen mode(s),
|
||||
* based on running core/content */
|
||||
#define DEFAULT_AUTOSWITCH_REFRESH_RATE AUTOSWITCH_REFRESH_RATE_EXCLUSIVE_FULLSCREEN
|
||||
|
||||
/* Which monitor to prefer. 0 is any monitor, 1 and up selects
|
||||
* specific monitors, 1 being the first monitor. */
|
||||
#define DEFAULT_MONITOR_INDEX 0
|
||||
@@ -326,8 +335,19 @@
|
||||
/* Video VSYNC (recommended) */
|
||||
#define DEFAULT_VSYNC true
|
||||
|
||||
/* Vulkan specific */
|
||||
#define DEFAULT_MAX_SWAPCHAIN_IMAGES 3
|
||||
|
||||
/* D3D1x specific */
|
||||
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
||||
#define DEFAULT_WAITABLE_SWAPCHAINS false
|
||||
#else
|
||||
#define DEFAULT_WAITABLE_SWAPCHAINS true
|
||||
#endif
|
||||
#define DEFAULT_MAX_FRAME_LATENCY 1
|
||||
#define MAXIMUM_MAX_FRAME_LATENCY 4
|
||||
|
||||
/* GL specific */
|
||||
#define DEFAULT_ADAPTIVE_VSYNC false
|
||||
|
||||
/* Attempts to hard-synchronize CPU and GPU.
|
||||
@@ -364,7 +384,7 @@
|
||||
/* Threaded video. Will possibly increase performance significantly
|
||||
* at the cost of worse synchronization and latency.
|
||||
*/
|
||||
#if defined(HAVE_LIBNX) || defined(ANDROID)
|
||||
#if defined(HAVE_LIBNX)
|
||||
#define DEFAULT_VIDEO_THREADED true
|
||||
#else
|
||||
#define DEFAULT_VIDEO_THREADED false
|
||||
@@ -492,6 +512,9 @@
|
||||
/* Save configuration file on exit. */
|
||||
#define DEFAULT_CONFIG_SAVE_ON_EXIT true
|
||||
|
||||
/* Save active input remap file on exit/close content */
|
||||
#define DEFAULT_REMAP_SAVE_ON_EXIT true
|
||||
|
||||
#define DEFAULT_SHOW_HIDDEN_FILES false
|
||||
|
||||
/* Initialise file browser with the last used start directory */
|
||||
@@ -555,12 +578,15 @@
|
||||
/* 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_SORT_AFTER_TRUNCATE_PLAYLIST_NAME true
|
||||
#define DEFAULT_OZONE_SCROLL_CONTENT_METADATA false
|
||||
#define DEFAULT_OZONE_THUMBNAIL_SCALE_FACTOR 1.0f
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_OZONE) || defined(HAVE_XMB)
|
||||
#define DEFAULT_OZONE_TRUNCATE_PLAYLIST_NAME true
|
||||
#define DEFAULT_OZONE_SORT_AFTER_TRUNCATE_PLAYLIST_NAME false
|
||||
#endif
|
||||
|
||||
#define DEFAULT_SETTINGS_SHOW_DRIVERS true
|
||||
|
||||
#define DEFAULT_SETTINGS_SHOW_VIDEO true
|
||||
@@ -605,6 +631,8 @@
|
||||
|
||||
#define DEFAULT_SETTINGS_SHOW_DIRECTORY true
|
||||
|
||||
#define DEFAULT_SETTINGS_SHOW_STEAM true
|
||||
|
||||
#define DEFAULT_QUICK_MENU_SHOW_RESUME_CONTENT true
|
||||
|
||||
#define DEFAULT_QUICK_MENU_SHOW_RESTART_CONTENT true
|
||||
@@ -613,6 +641,8 @@
|
||||
|
||||
#define DEFAULT_QUICK_MENU_SHOW_TAKE_SCREENSHOT true
|
||||
|
||||
#define DEFAULT_QUICK_MENU_SHOW_SAVESTATE_SUBMENU false
|
||||
|
||||
#define DEFAULT_QUICK_MENU_SHOW_SAVE_LOAD_STATE true
|
||||
|
||||
#define DEFAULT_QUICK_MENU_SHOW_UNDO_SAVE_LOAD_STATE true
|
||||
@@ -671,9 +701,9 @@ static const bool menu_show_core_updater = true;
|
||||
static const bool menu_show_core_manager_steam = true;
|
||||
#endif
|
||||
static const bool menu_show_legacy_thumbnail_updater = false;
|
||||
static const bool menu_show_sublabels = true;
|
||||
static const bool menu_dynamic_wallpaper_enable = true;
|
||||
static const bool menu_scroll_fast = false;
|
||||
#define DEFAULT_MENU_SHOW_SUBLABELS true
|
||||
#define DEFAULT_MENU_DYNAMIC_WALLPAPER_ENABLE true
|
||||
#define DEFAULT_MENU_SCROLL_FAST false
|
||||
|
||||
#define DEFAULT_MENU_SCROLL_DELAY 256
|
||||
|
||||
@@ -683,9 +713,9 @@ static const float menu_ticker_speed = 2.0f;
|
||||
#define DEFAULT_MENU_TICKER_SMOOTH true
|
||||
|
||||
#if defined(HAVE_THREADS)
|
||||
static const bool menu_savestate_resume = true;
|
||||
#define DEFAULT_MENU_SAVESTATE_RESUME true
|
||||
#else
|
||||
static const bool menu_savestate_resume = false;
|
||||
#define DEFAULT_MENU_SAVESTATE_RESUME false
|
||||
#endif
|
||||
|
||||
#define DEFAULT_MENU_INSERT_DISK_RESUME true
|
||||
@@ -737,9 +767,12 @@ static const bool content_show_playlists = true;
|
||||
#define DEFAULT_MENU_CONTENT_SHOW_CONTENTLESS_CORES MENU_CONTENTLESS_CORES_DISPLAY_SINGLE_PURPOSE
|
||||
|
||||
#ifdef HAVE_XMB
|
||||
#define DEFAULT_XMB_ANIMATION 0
|
||||
#define DEFAULT_XMB_VERTICAL_FADE_FACTOR 100
|
||||
#define DEFAULT_XMB_TITLE_MARGIN 5
|
||||
#define DEFAULT_XMB_ANIMATION 0
|
||||
#define DEFAULT_XMB_VERTICAL_FADE_FACTOR 100
|
||||
#define DEFAULT_XMB_SHOW_TITLE_HEADER true
|
||||
#define DEFAULT_XMB_TITLE_MARGIN 5
|
||||
#define DEFAULT_XMB_TITLE_MARGIN_HORIZONTAL_OFFSET 0
|
||||
#define MAXIMUM_XMB_TITLE_MARGIN 12
|
||||
|
||||
static const unsigned xmb_alpha_factor = 75;
|
||||
static const unsigned menu_font_color_red = 255;
|
||||
@@ -774,24 +807,24 @@ static const float menu_header_opacity = 1.000;
|
||||
#define DEFAULT_MENU_SHADER_PIPELINE 2
|
||||
#endif
|
||||
|
||||
#define DEFAULT_SHOW_ADVANCED_SETTINGS false
|
||||
#define DEFAULT_SHOW_ADVANCED_SETTINGS true
|
||||
|
||||
#define DEFAULT_RGUI_COLOR_THEME RGUI_THEME_CLASSIC_GREEN
|
||||
#define DEFAULT_RGUI_TRANSPARENCY true
|
||||
|
||||
static const bool rgui_inline_thumbnails = false;
|
||||
static const bool rgui_swap_thumbnails = false;
|
||||
#define DEFAULT_RGUI_INLINE_THUMBNAILS false
|
||||
#define DEFAULT_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_SHADOWS false
|
||||
#define DEFAULT_RGUI_PARTICLE_EFFECT RGUI_PARTICLE_EFFECT_NONE
|
||||
#define DEFAULT_RGUI_PARTICLE_EFFECT_SPEED 1.0f
|
||||
#define DEFAULT_RGUI_PARTICLE_EFFECT_SCREENSAVER true
|
||||
static const bool rgui_extended_ascii = false;
|
||||
#define DEFAULT_RGUI_EXTENDED_ASCII false
|
||||
#define DEFAULT_RGUI_SWITCH_ICONS true
|
||||
#endif
|
||||
|
||||
@@ -856,11 +889,15 @@ static const unsigned input_backtouch_toggle = false;
|
||||
|
||||
#define DEFAULT_OVERLAY_SHOW_INPUTS_PORT 0
|
||||
|
||||
#define DEFAULT_OVERLAY_DPAD_DIAGONAL_SENSITIVITY 80
|
||||
#define DEFAULT_OVERLAY_ABXY_DIAGONAL_SENSITIVITY 50
|
||||
|
||||
#if defined(ANDROID) || defined(_WIN32) || defined(HAVE_STEAM)
|
||||
#define DEFAULT_MENU_SWAP_OK_CANCEL_BUTTONS true
|
||||
#else
|
||||
#define DEFAULT_MENU_SWAP_OK_CANCEL_BUTTONS false
|
||||
#endif
|
||||
#define DEFAULT_MENU_SWAP_SCROLL_BUTTONS false
|
||||
|
||||
#if defined(WIIU)
|
||||
#define DEFAULT_ALL_USERS_CONTROL_MENU true
|
||||
@@ -889,18 +926,18 @@ static const unsigned input_backtouch_toggle = false;
|
||||
|
||||
/* Offset for where messages will be placed on-screen.
|
||||
* Values are in range [0.0, 1.0]. */
|
||||
static const float message_pos_offset_x = 0.05;
|
||||
static const float message_pos_offset_y = 0.05;
|
||||
#define DEFAULT_MESSAGE_POS_OFFSET_X 0.05f
|
||||
#define DEFAULT_MESSAGE_POS_OFFSET_Y 0.05f
|
||||
|
||||
/* Color of the message.
|
||||
* RGB hex value. */
|
||||
static const uint32_t message_color = 0xffff00;
|
||||
#define DEFAULT_MESSAGE_COLOR 0xffff00
|
||||
|
||||
static const bool message_bgcolor_enable = false;
|
||||
static const uint32_t message_bgcolor_red = 0;
|
||||
static const uint32_t message_bgcolor_green = 0;
|
||||
static const uint32_t message_bgcolor_blue = 0;
|
||||
static const float message_bgcolor_opacity = 1.0f;
|
||||
#define DEFAULT_MESSAGE_BGCOLOR_ENABLE false
|
||||
#define DEFAULT_MESSAGE_BGCOLOR_RED 0
|
||||
#define DEFAULT_MESSAGE_BGCOLOR_GREEN 0
|
||||
#define DEFAULT_MESSAGE_BGCOLOR_BLUE 0
|
||||
#define DEFAULT_MESSAGE_BGCOLOR_OPACITY 1.0f
|
||||
|
||||
/* Record post-filtered (CPU filter) video,
|
||||
* rather than raw game output. */
|
||||
@@ -949,13 +986,17 @@ static const float message_bgcolor_opacity = 1.0f;
|
||||
* Used for setups where one manually rotates the monitor. */
|
||||
#define DEFAULT_ALLOW_ROTATE true
|
||||
|
||||
#if defined(_3DS)
|
||||
#ifdef _3DS
|
||||
/* Enable New3DS clock and L2 cache */
|
||||
static const bool new3ds_speedup_enable = true;
|
||||
/* Enable bottom LCD screen */
|
||||
static const bool video_3ds_lcd_bottom = true;
|
||||
/* Sets video display mode (3D, 2D, etc.) */
|
||||
static const unsigned video_3ds_display_mode = CTR_VIDEO_MODE_3D;
|
||||
|
||||
#define DEFAULT_BOTTOM_FONT_ENABLE true
|
||||
#define DEFAULT_BOTTOM_FONT_COLOR 255
|
||||
#define DEFAULT_BOTTOM_FONT_SCALE 1.48
|
||||
#endif
|
||||
|
||||
#ifdef WIIU
|
||||
@@ -1051,9 +1092,9 @@ static const bool audio_enable_menu_bgm = false;
|
||||
#endif
|
||||
|
||||
/* Output samplerate. */
|
||||
#ifdef GEKKO
|
||||
#if defined(GEKKO) || defined(MIYOO)
|
||||
#define DEFAULT_OUTPUT_RATE 32000
|
||||
#elif defined(_3DS) || defined(RETROFW) || defined(MIYOO)
|
||||
#elif defined(_3DS) || defined(RETROFW)
|
||||
#define DEFAULT_OUTPUT_RATE 32730
|
||||
#else
|
||||
#define DEFAULT_OUTPUT_RATE 48000
|
||||
@@ -1157,13 +1198,17 @@ static const bool audio_enable_menu_bgm = false;
|
||||
/* How many frames to rewind at a time. */
|
||||
#define DEFAULT_REWIND_GRANULARITY 1
|
||||
#endif
|
||||
/* Pause gameplay when gameplay loses focus. */
|
||||
|
||||
/* Pause gameplay when window loses focus. */
|
||||
#if defined(EMSCRIPTEN)
|
||||
#define DEFAULT_PAUSE_NONACTIVE false
|
||||
#else
|
||||
#define DEFAULT_PAUSE_NONACTIVE true
|
||||
#endif
|
||||
|
||||
/* Pause gameplay when controller disconnects. */
|
||||
#define DEFAULT_PAUSE_ON_DISCONNECT true
|
||||
|
||||
/* Saves non-volatile SRAM at a regular interval.
|
||||
* It is measured in seconds. A value of 0 disables autosave. */
|
||||
#if defined(__i386__) || defined(__i486__) || defined(__i686__) || defined(__x86_64__) || defined(_M_X64) || defined(_WIN32) || defined(OSX) || defined(ANDROID) || defined(IOS) || defined(DINGUX)
|
||||
@@ -1174,8 +1219,10 @@ static const bool audio_enable_menu_bgm = false;
|
||||
#define DEFAULT_AUTOSAVE_INTERVAL 0
|
||||
#endif
|
||||
|
||||
/* Show only connectable rooms */
|
||||
#define DEFAULT_NETPLAY_SHOW_ONLY_CONNECTABLE true
|
||||
/* Netplay lobby filters */
|
||||
#define DEFAULT_NETPLAY_SHOW_ONLY_CONNECTABLE true
|
||||
#define DEFAULT_NETPLAY_SHOW_ONLY_INSTALLED_CORES false
|
||||
#define DEFAULT_NETPLAY_SHOW_PASSWORDED true
|
||||
|
||||
/* Publicly announce netplay */
|
||||
#define DEFAULT_NETPLAY_PUBLIC_ANNOUNCE true
|
||||
@@ -1186,6 +1233,10 @@ static const bool netplay_start_as_spectator = false;
|
||||
/* Netplay chat fading toggle */
|
||||
static const bool netplay_fade_chat = true;
|
||||
|
||||
/* Netplay chat colors */
|
||||
static const unsigned netplay_chat_color_name = 0x008000;
|
||||
static const unsigned netplay_chat_color_msg = 0xFFFFFF;
|
||||
|
||||
/* Allow players to pause */
|
||||
static const bool netplay_allow_pausing = false;
|
||||
|
||||
@@ -1195,9 +1246,6 @@ static const bool netplay_allow_slaves = true;
|
||||
/* Require connections only in slave mode */
|
||||
static const bool netplay_require_slaves = false;
|
||||
|
||||
/* Netplay without savestates/rewind */
|
||||
static const bool netplay_stateless_mode = false;
|
||||
|
||||
/* When being client over netplay, use keybinds for
|
||||
* user 1 rather than user 2. */
|
||||
static const bool netplay_client_swap_input = true;
|
||||
@@ -1216,8 +1264,8 @@ static const bool netplay_use_mitm_server = false;
|
||||
static const unsigned netplay_max_connections = 3;
|
||||
static const unsigned netplay_max_ping = 0;
|
||||
|
||||
static const unsigned netplay_share_digital = RARCH_NETPLAY_SHARE_DIGITAL_NO_PREFERENCE;
|
||||
static const unsigned netplay_share_analog = RARCH_NETPLAY_SHARE_ANALOG_NO_PREFERENCE;
|
||||
static const unsigned netplay_share_digital = RARCH_NETPLAY_SHARE_DIGITAL_NO_SHARING;
|
||||
static const unsigned netplay_share_analog = RARCH_NETPLAY_SHARE_ANALOG_NO_SHARING;
|
||||
#endif
|
||||
|
||||
/* On save state load, block SRAM from being overwritten.
|
||||
@@ -1228,7 +1276,7 @@ static const unsigned netplay_share_analog = RARCH_NETPLAY_SHARE_ANALOG_NO_PREF
|
||||
* incremented before saving.
|
||||
* When the content is loaded, state index will be set
|
||||
* to the highest existing value. */
|
||||
static const bool savestate_auto_index = false;
|
||||
#define DEFAULT_SAVESTATE_AUTO_INDEX false
|
||||
|
||||
/* Specifies the maximum number of savestates to keep
|
||||
* when savestate auto index is enabled
|
||||
@@ -1243,10 +1291,10 @@ static const bool savestate_auto_index = false;
|
||||
* The path is $SRAM_PATH.auto.
|
||||
* RetroArch will automatically load any savestate with this path on
|
||||
* startup if savestate_auto_load is set. */
|
||||
static const bool savestate_auto_save = false;
|
||||
static const bool savestate_auto_load = false;
|
||||
#define DEFAULT_SAVESTATE_AUTO_SAVE false
|
||||
#define DEFAULT_SAVESTATE_AUTO_LOAD false
|
||||
|
||||
static const bool savestate_thumbnail_enable = false;
|
||||
#define DEFAULT_SAVESTATE_THUMBNAIL_ENABLE false
|
||||
|
||||
/* When creating save (srm) files, compress
|
||||
* written data */
|
||||
@@ -1254,8 +1302,7 @@ static const bool savestate_thumbnail_enable = false;
|
||||
|
||||
/* When creating save state files, compress
|
||||
* written data */
|
||||
#if defined(__WINRT__) || defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
||||
/* TODO/FIXME Apparently this is an issue on UWP for now, so disable it for now */
|
||||
#if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
|
||||
#define DEFAULT_SAVESTATE_FILE_COMPRESSION false
|
||||
#else
|
||||
#define DEFAULT_SAVESTATE_FILE_COMPRESSION true
|
||||
@@ -1284,11 +1331,10 @@ static const bool savestate_thumbnail_enable = false;
|
||||
#define DEFAULT_RUN_AHEAD_HIDE_WARNINGS false
|
||||
|
||||
/* Enable stdin/network command interface. */
|
||||
static const bool network_cmd_enable = false;
|
||||
static const uint16_t network_cmd_port = 55355;
|
||||
static const bool stdin_cmd_enable = false;
|
||||
|
||||
static const uint16_t network_remote_base_port = 55400;
|
||||
#define DEFAULT_NETWORK_CMD_ENABLE false
|
||||
#define DEFAULT_NETWORK_CMD_PORT 55355
|
||||
#define DEFAULT_NETWORK_REMOTE_BASE_PORT 55400
|
||||
#define DEFAULT_STDIN_CMD_ENABLE false
|
||||
|
||||
#define DEFAULT_NETWORK_BUILDBOT_AUTO_EXTRACT_ARCHIVE true
|
||||
#define DEFAULT_NETWORK_BUILDBOT_SHOW_EXPERIMENTAL_CORES false
|
||||
@@ -1314,11 +1360,11 @@ static const uint16_t network_remote_base_port = 55400;
|
||||
#endif
|
||||
|
||||
/* Number of entries that will be kept in content history playlist file. */
|
||||
static const unsigned default_content_history_size = 200;
|
||||
#define 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 = 200;
|
||||
#define DEFAULT_CONTENT_FAVORITES_SIZE 200
|
||||
|
||||
/* Sort all playlists (apart from histories) alphabetically */
|
||||
#define DEFAULT_PLAYLIST_SORT_ALPHABETICAL true
|
||||
@@ -1389,7 +1435,11 @@ static const int default_content_favorites_size = 200;
|
||||
#define DEFAULT_LIBRETRO_LOG_LEVEL 1
|
||||
|
||||
#ifndef RARCH_DEFAULT_PORT
|
||||
#ifndef VITA
|
||||
#define RARCH_DEFAULT_PORT 55435
|
||||
#else
|
||||
#define RARCH_DEFAULT_PORT 19492
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef RARCH_STREAM_DEFAULT_PORT
|
||||
@@ -1401,20 +1451,18 @@ static const int default_content_favorites_size = 200;
|
||||
/* Axis threshold (between 0.0 and 1.0)
|
||||
* How far an axis must be tilted to result in a button press. */
|
||||
#define DEFAULT_AXIS_THRESHOLD 0.5f
|
||||
|
||||
#define DEFAULT_ANALOG_DEADZONE 0.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;
|
||||
#define DEFAULT_TURBO_PERIOD 6
|
||||
#define DEFAULT_TURBO_DUTY_CYCLE 3
|
||||
#define DEFAULT_TURBO_MODE 0
|
||||
#define DEFAULT_TURBO_DEFAULT_BTN RETRO_DEVICE_ID_JOYPAD_B
|
||||
|
||||
/* Enable input auto-detection. Will attempt to autoconfigure
|
||||
* gamepads, plug-and-play style. */
|
||||
static const bool input_autodetect_enable = true;
|
||||
#define DEFAULT_INPUT_AUTODETECT_ENABLE true
|
||||
|
||||
/* Enables accelerometer/gyroscope/illuminance
|
||||
* sensor input, if supported */
|
||||
@@ -1432,22 +1480,18 @@ static const bool input_autodetect_enable = true;
|
||||
|
||||
/* Show the input descriptors set by the core instead
|
||||
* of the default ones. */
|
||||
static const bool input_descriptor_label_show = true;
|
||||
|
||||
static const bool input_descriptor_hide_unbound = false;
|
||||
#define DEFAULT_INPUT_DESCRIPTOR_LABEL_SHOW true
|
||||
#define DEFAULT_INPUT_DESCRIPTOR_HIDE_UNBOUND false
|
||||
|
||||
#if defined(DINGUX)
|
||||
static const unsigned input_max_users = 1;
|
||||
#define DEFAULT_INPUT_MAX_USERS 1
|
||||
#else
|
||||
static const unsigned input_max_users = 5;
|
||||
#define DEFAULT_INPUT_MAX_USERS 5
|
||||
#endif
|
||||
|
||||
static const unsigned input_poll_type_behavior = 2;
|
||||
|
||||
static const unsigned input_bind_timeout = 5;
|
||||
|
||||
static const unsigned input_bind_hold = 2;
|
||||
|
||||
#define DEFAULT_INPUT_BIND_TIMEOUT 5
|
||||
#define DEFAULT_INPUT_BIND_HOLD 2
|
||||
#define DEFAULT_INPUT_POLL_TYPE_BEHAVIOR 2
|
||||
#define DEFAULT_INPUT_HOTKEY_BLOCK_DELAY 5
|
||||
|
||||
static const unsigned gfx_thumbnails_default = 3;
|
||||
@@ -1467,22 +1511,22 @@ static const unsigned gfx_thumbnail_upscale_threshold = 0;
|
||||
#endif
|
||||
#define DEFAULT_MENU_TIMEDATE_STYLE MENU_TIMEDATE_STYLE_DDMM_HM
|
||||
#define DEFAULT_MENU_TIMEDATE_DATE_SEPARATOR MENU_TIMEDATE_DATE_SEPARATOR_HYPHEN
|
||||
#define DEFAULT_MENU_REMEMBER_SELECTION MENU_REMEMBER_SELECTION_ALWAYS
|
||||
#endif
|
||||
|
||||
static const bool xmb_vertical_thumbnails = false;
|
||||
#define DEFAULT_XMB_VERTICAL_THUMBNAILS false
|
||||
|
||||
static const unsigned xmb_thumbnail_scale_factor = 100;
|
||||
#define DEFAULT_XMB_THUMBNAIL_SCALE_FACTOR 100
|
||||
|
||||
#ifdef IOS
|
||||
static const bool ui_companion_start_on_boot = false;
|
||||
#define DEFAULT_UI_COMPANION_START_ON_BOOT false
|
||||
#else
|
||||
static const bool ui_companion_start_on_boot = true;
|
||||
#define DEFAULT_UI_COMPANION_START_ON_BOOT true
|
||||
#endif
|
||||
|
||||
static const bool ui_companion_enable = false;
|
||||
|
||||
#define DEFAULT_UI_COMPANION_ENABLE false
|
||||
/* Currently only used to show the WIMP UI on startup */
|
||||
static const bool ui_companion_toggle = false;
|
||||
#define DEFAULT_UI_COMPANION_TOGGLE false
|
||||
|
||||
/* Only init the WIMP UI for this session if this is enabled */
|
||||
#define DEFAULT_DESKTOP_MENU_ENABLE true
|
||||
@@ -1513,16 +1557,24 @@ static const enum resampler_quality audio_resampler_quality_level = RESAMPLER_QU
|
||||
|
||||
/* MIDI */
|
||||
#define DEFAULT_MIDI_INPUT "Off"
|
||||
|
||||
#define DEFAULT_MIDI_OUTPUT "Off"
|
||||
#define DEFAULT_MIDI_VOLUME 100
|
||||
|
||||
static const unsigned midi_volume = 100;
|
||||
#ifdef HAVE_MIST
|
||||
/* Steam */
|
||||
#define DEFAULT_STEAM_RICH_PRESENCE_FORMAT STEAM_RICH_PRESENCE_FORMAT_CONTENT_SYSTEM
|
||||
#endif
|
||||
|
||||
/* Only applies to Android 7.0 (API 24) and up */
|
||||
static const bool sustained_performance_mode = false;
|
||||
#define DEFAULT_SUSTAINED_PERFORMANCE_MODE false
|
||||
|
||||
static const bool vibrate_on_keypress = false;
|
||||
static const bool enable_device_vibration = false;
|
||||
#if defined(ANDROID)
|
||||
#define DEFAULT_VIBRATE_ON_KEYPRESS true
|
||||
#else
|
||||
#define DEFAULT_VIBRATE_ON_KEYPRESS false
|
||||
#endif
|
||||
|
||||
#define DEFAULT_ENABLE_DEVICE_VIBRATION false
|
||||
|
||||
/* Defines the strength of rumble effects
|
||||
* on OpenDingux devices */
|
||||
@@ -1592,9 +1644,9 @@ static const bool enable_device_vibration = false;
|
||||
#endif
|
||||
#else
|
||||
#if defined(__x86_64__) || defined(_M_X64)
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x64/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)
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/x86/latest/"
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows/x86/latest/"
|
||||
#elif defined(__arm__) || defined(_M_ARM)
|
||||
#define DEFAULT_BUILDBOT_SERVER_URL "http://buildbot.libretro.com/nightly/windows-msvc2017-uwp/arm/latest/"
|
||||
#elif defined(__aarch64__) || defined(_M_ARM64)
|
||||
@@ -1646,7 +1698,7 @@ static const bool enable_device_vibration = false;
|
||||
|
||||
#define DEFAULT_AI_SERVICE_TARGET_LANG 0
|
||||
|
||||
#define DEFAULT_AI_SERVICE_ENABLE true
|
||||
#define DEFAULT_AI_SERVICE_ENABLE false
|
||||
|
||||
#define DEFAULT_AI_SERVICE_PAUSE false
|
||||
|
||||
|
||||
@@ -409,6 +409,13 @@ static const struct retro_keybind retro_keybinds_1[] = {
|
||||
RARCH_SHADER_PREV, NO_BTN, NO_BTN, 0,
|
||||
true
|
||||
},
|
||||
{
|
||||
NULL, NULL,
|
||||
AXIS_NONE, AXIS_NONE, AXIS_NONE,
|
||||
MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_TOGGLE, RETROK_UNKNOWN,
|
||||
RARCH_SHADER_TOGGLE, NO_BTN, NO_BTN, 0,
|
||||
true
|
||||
},
|
||||
{
|
||||
NULL, NULL,
|
||||
AXIS_NONE, AXIS_NONE, AXIS_NONE,
|
||||
@@ -998,6 +1005,13 @@ static const struct retro_keybind retro_keybinds_1[] = {
|
||||
RARCH_SHADER_PREV, NO_BTN, NO_BTN, 0,
|
||||
true
|
||||
},
|
||||
{
|
||||
NULL, NULL,
|
||||
AXIS_NONE, AXIS_NONE, AXIS_NONE,
|
||||
MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_TOGGLE, RETROK_UNKNOWN,
|
||||
RARCH_SHADER_TOGGLE, NO_BTN, NO_BTN, 0,
|
||||
true
|
||||
},
|
||||
{
|
||||
NULL, NULL,
|
||||
AXIS_NONE, AXIS_NONE, AXIS_NONE,
|
||||
@@ -1597,6 +1611,13 @@ static const struct retro_keybind retro_keybinds_1[] = {
|
||||
RARCH_SHADER_PREV, NO_BTN, NO_BTN, 0,
|
||||
true
|
||||
},
|
||||
{
|
||||
NULL, NULL,
|
||||
AXIS_NONE, AXIS_NONE, AXIS_NONE,
|
||||
MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_TOGGLE, RETROK_COMMA,
|
||||
RARCH_SHADER_TOGGLE, NO_BTN, NO_BTN, 0,
|
||||
true
|
||||
},
|
||||
{
|
||||
NULL, NULL,
|
||||
AXIS_NONE, AXIS_NONE, AXIS_NONE,
|
||||
|
||||
+516
-396
File diff suppressed because it is too large.
Load diff
+58
-32
@@ -30,7 +30,6 @@
|
||||
#endif
|
||||
|
||||
#include "gfx/video_defines.h"
|
||||
#include "input/input_defines.h"
|
||||
#include "led/led_defines.h"
|
||||
|
||||
#ifdef HAVE_LAKKA
|
||||
@@ -69,8 +68,6 @@
|
||||
strlcpy(var, newvar, sizeof(var)); \
|
||||
}
|
||||
|
||||
#define INPUT_CONFIG_BIND_MAP_GET(i) ((const struct input_bind_map*)&input_config_bind_map[(i)])
|
||||
|
||||
enum crt_switch_type
|
||||
{
|
||||
CRT_SWITCH_NONE = 0,
|
||||
@@ -90,25 +87,6 @@ enum override_type
|
||||
|
||||
RETRO_BEGIN_DECLS
|
||||
|
||||
/* Input config. */
|
||||
struct input_bind_map
|
||||
{
|
||||
const char *base;
|
||||
|
||||
enum msg_hash_enums desc;
|
||||
|
||||
/* Meta binds get input as prefix, not input_playerN".
|
||||
* 0 = libretro related.
|
||||
* 1 = Common hotkey.
|
||||
* 2 = Uncommon/obscure hotkey.
|
||||
*/
|
||||
uint8_t meta;
|
||||
|
||||
uint8_t retro_key;
|
||||
|
||||
bool valid;
|
||||
};
|
||||
|
||||
typedef struct settings
|
||||
{
|
||||
struct
|
||||
@@ -146,6 +124,16 @@ typedef struct settings
|
||||
int video_window_offset_y;
|
||||
#endif
|
||||
int content_favorites_size;
|
||||
#ifdef _3DS
|
||||
int bottom_font_color_red;
|
||||
int bottom_font_color_green;
|
||||
int bottom_font_color_blue;
|
||||
int bottom_font_color_opacity;
|
||||
#endif
|
||||
#ifdef HAVE_XMB
|
||||
int menu_xmb_title_margin;
|
||||
int menu_xmb_title_margin_horizontal_offset;
|
||||
#endif
|
||||
} ints;
|
||||
|
||||
struct
|
||||
@@ -201,6 +189,8 @@ typedef struct settings
|
||||
unsigned netplay_port;
|
||||
unsigned netplay_max_connections;
|
||||
unsigned netplay_max_ping;
|
||||
unsigned netplay_chat_color_name;
|
||||
unsigned netplay_chat_color_msg;
|
||||
unsigned netplay_input_latency_frames_min;
|
||||
unsigned netplay_input_latency_frames_range;
|
||||
unsigned netplay_share_digital;
|
||||
@@ -224,7 +214,9 @@ typedef struct settings
|
||||
unsigned video_monitor_index;
|
||||
unsigned video_fullscreen_x;
|
||||
unsigned video_fullscreen_y;
|
||||
unsigned video_scale;
|
||||
unsigned video_max_swapchain_images;
|
||||
unsigned video_max_frame_latency;
|
||||
unsigned video_swap_interval;
|
||||
unsigned video_hard_sync_frames;
|
||||
unsigned video_frame_delay;
|
||||
@@ -278,7 +270,6 @@ typedef struct settings
|
||||
unsigned menu_xmb_color_theme;
|
||||
unsigned menu_xmb_thumbnail_scale_factor;
|
||||
unsigned menu_xmb_vertical_fade_factor;
|
||||
unsigned menu_xmb_title_margin;
|
||||
unsigned menu_materialui_color_theme;
|
||||
unsigned menu_materialui_transition_animation;
|
||||
unsigned menu_materialui_thumbnail_view_portrait;
|
||||
@@ -298,6 +289,7 @@ typedef struct settings
|
||||
unsigned menu_content_show_contentless_cores;
|
||||
unsigned menu_screensaver_timeout;
|
||||
unsigned menu_screensaver_animation;
|
||||
unsigned menu_remember_selection;
|
||||
|
||||
unsigned playlist_entry_remove_enable;
|
||||
unsigned playlist_show_inline_core_name;
|
||||
@@ -308,8 +300,12 @@ typedef struct settings
|
||||
unsigned camera_width;
|
||||
unsigned camera_height;
|
||||
|
||||
#ifdef HAVE_OVERLAY
|
||||
unsigned input_overlay_show_inputs;
|
||||
unsigned input_overlay_show_inputs_port;
|
||||
unsigned input_overlay_dpad_diagonal_sensitivity;
|
||||
unsigned input_overlay_abxy_diagonal_sensitivity;
|
||||
#endif
|
||||
|
||||
unsigned run_ahead_frames;
|
||||
|
||||
@@ -332,6 +328,7 @@ typedef struct settings
|
||||
|
||||
unsigned core_updater_auto_backup_history_size;
|
||||
unsigned video_black_frame_insertion;
|
||||
unsigned video_autoswitch_refresh_rate;
|
||||
unsigned quit_on_close_content;
|
||||
|
||||
#ifdef HAVE_LAKKA
|
||||
@@ -339,12 +336,15 @@ typedef struct settings
|
||||
unsigned cpu_min_freq;
|
||||
unsigned cpu_max_freq;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_MIST
|
||||
unsigned steam_rich_presence_format;
|
||||
#endif
|
||||
} uints;
|
||||
|
||||
struct
|
||||
{
|
||||
float placeholder;
|
||||
float video_scale;
|
||||
float video_aspect_ratio;
|
||||
float video_refresh_rate;
|
||||
float crt_video_refresh_rate;
|
||||
@@ -396,6 +396,9 @@ typedef struct settings
|
||||
float input_analog_deadzone;
|
||||
float input_axis_threshold;
|
||||
float input_analog_sensitivity;
|
||||
#ifdef _3DS
|
||||
float bottom_font_scale;
|
||||
#endif
|
||||
} floats;
|
||||
|
||||
struct
|
||||
@@ -432,9 +435,6 @@ typedef struct settings
|
||||
|
||||
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 youtube_stream_key[PATH_MAX_LENGTH];
|
||||
char twitch_stream_key[PATH_MAX_LENGTH];
|
||||
char facebook_stream_key[PATH_MAX_LENGTH];
|
||||
@@ -467,6 +467,9 @@ typedef struct settings
|
||||
|
||||
char path_stream_url[8192];
|
||||
|
||||
char bundle_assets_src[PATH_MAX_LENGTH];
|
||||
char bundle_assets_dst[PATH_MAX_LENGTH];
|
||||
char bundle_assets_dst_subdir[PATH_MAX_LENGTH];
|
||||
char path_menu_xmb_font[PATH_MAX_LENGTH];
|
||||
char menu_content_show_settings_password[PATH_MAX_LENGTH];
|
||||
char kiosk_mode_password[PATH_MAX_LENGTH];
|
||||
@@ -497,7 +500,6 @@ typedef struct settings
|
||||
char directory_video_filter[PATH_MAX_LENGTH];
|
||||
char directory_video_shader[PATH_MAX_LENGTH];
|
||||
char directory_libretro[PATH_MAX_LENGTH];
|
||||
char directory_cursor[PATH_MAX_LENGTH];
|
||||
char directory_input_remapping[PATH_MAX_LENGTH];
|
||||
char directory_overlay[PATH_MAX_LENGTH];
|
||||
#ifdef HAVE_VIDEO_LAYOUT
|
||||
@@ -521,7 +523,9 @@ typedef struct settings
|
||||
char directory_menu_config[PATH_MAX_LENGTH];
|
||||
char directory_menu_content[PATH_MAX_LENGTH];
|
||||
char streaming_title[PATH_MAX_LENGTH];
|
||||
|
||||
#ifdef _3DS
|
||||
char directory_bottom_assets[PATH_MAX_LENGTH];
|
||||
#endif
|
||||
char log_dir[PATH_MAX_LENGTH];
|
||||
} paths;
|
||||
|
||||
@@ -537,6 +541,7 @@ typedef struct settings
|
||||
bool video_vsync;
|
||||
bool video_adaptive_vsync;
|
||||
bool video_hard_sync;
|
||||
bool video_waitable_swapchains;
|
||||
bool video_vfilter;
|
||||
bool video_smooth;
|
||||
bool video_ctx_scaling;
|
||||
@@ -565,7 +570,9 @@ typedef struct settings
|
||||
bool video_framecount_show;
|
||||
bool video_memory_show;
|
||||
bool video_msg_bgcolor_enable;
|
||||
#ifdef _3DS
|
||||
bool video_3ds_lcd_bottom;
|
||||
#endif
|
||||
bool video_wiiu_prefer_drc;
|
||||
bool video_notch_write_over_enable;
|
||||
#ifdef HAVE_VIDEO_LAYOUT
|
||||
@@ -606,6 +613,7 @@ typedef struct settings
|
||||
bool input_descriptor_hide_unbound;
|
||||
bool input_all_users_control_menu;
|
||||
bool input_menu_swap_ok_cancel_buttons;
|
||||
bool input_menu_swap_scroll_buttons;
|
||||
bool input_backtouch_enable;
|
||||
bool input_backtouch_toggle;
|
||||
bool input_small_keyboard_enable;
|
||||
@@ -704,6 +712,7 @@ typedef struct settings
|
||||
bool menu_rgui_particle_effect_screensaver;
|
||||
bool menu_xmb_shadows_enable;
|
||||
bool menu_xmb_vertical_thumbnails;
|
||||
bool menu_xmb_show_title_header;
|
||||
bool menu_content_show_settings;
|
||||
bool menu_content_show_favorites;
|
||||
bool menu_content_show_images;
|
||||
@@ -717,6 +726,8 @@ typedef struct settings
|
||||
bool menu_use_preferred_system_color_theme;
|
||||
bool menu_preferred_system_color_theme_set;
|
||||
bool menu_unified_controls;
|
||||
bool menu_disable_info_button;
|
||||
bool menu_disable_search_button;
|
||||
bool menu_ticker_smooth;
|
||||
bool settings_show_drivers;
|
||||
bool settings_show_video;
|
||||
@@ -740,10 +751,14 @@ typedef struct settings
|
||||
bool settings_show_playlists;
|
||||
bool settings_show_user;
|
||||
bool settings_show_directory;
|
||||
#ifdef HAVE_MIST
|
||||
bool settings_show_steam;
|
||||
#endif
|
||||
bool quick_menu_show_resume_content;
|
||||
bool quick_menu_show_restart_content;
|
||||
bool quick_menu_show_close_content;
|
||||
bool quick_menu_show_take_screenshot;
|
||||
bool quick_menu_show_savestate_submenu;
|
||||
bool quick_menu_show_save_load_state;
|
||||
bool quick_menu_show_undo_save_load_state;
|
||||
bool quick_menu_show_add_to_favorites;
|
||||
@@ -770,13 +785,14 @@ typedef struct settings
|
||||
|
||||
/* Netplay */
|
||||
bool netplay_show_only_connectable;
|
||||
bool netplay_show_only_installed_cores;
|
||||
bool netplay_show_passworded;
|
||||
bool netplay_public_announce;
|
||||
bool netplay_start_as_spectator;
|
||||
bool netplay_fade_chat;
|
||||
bool netplay_allow_pausing;
|
||||
bool netplay_allow_slaves;
|
||||
bool netplay_require_slaves;
|
||||
bool netplay_stateless_mode;
|
||||
bool netplay_nat_traversal;
|
||||
bool netplay_use_mitm_server;
|
||||
bool netplay_request_devices[MAX_USERS];
|
||||
@@ -832,6 +848,11 @@ typedef struct settings
|
||||
/* Driver */
|
||||
bool driver_switch_enable;
|
||||
|
||||
#ifdef HAVE_MIST
|
||||
/* Steam */
|
||||
bool steam_rich_presence_enable;
|
||||
#endif
|
||||
|
||||
/* Misc. */
|
||||
bool discord_enable;
|
||||
bool threaded_data_runloop_enable;
|
||||
@@ -848,6 +869,7 @@ typedef struct settings
|
||||
bool run_ahead_secondary_instance;
|
||||
bool run_ahead_hide_warnings;
|
||||
bool pause_nonactive;
|
||||
bool pause_on_disconnect;
|
||||
bool block_sram_overwrite;
|
||||
bool savestate_auto_index;
|
||||
bool savestate_auto_save;
|
||||
@@ -880,6 +902,7 @@ typedef struct settings
|
||||
bool sort_savestates_by_content_enable;
|
||||
bool sort_screenshots_by_content_enable;
|
||||
bool config_save_on_exit;
|
||||
bool remap_save_on_exit;
|
||||
bool show_hidden_files;
|
||||
bool use_last_start_directory;
|
||||
|
||||
@@ -927,6 +950,11 @@ typedef struct settings
|
||||
bool gamemode_enable;
|
||||
#ifdef _3DS
|
||||
bool new3ds_speedup_enable;
|
||||
bool bottom_font_enable;
|
||||
#endif
|
||||
|
||||
#ifdef ANDROID
|
||||
bool android_input_disconnect_workaround;
|
||||
#endif
|
||||
} bools;
|
||||
|
||||
@@ -1141,8 +1169,6 @@ void input_config_parse_mouse_button(
|
||||
|
||||
const char *input_config_get_prefix(unsigned user, bool meta);
|
||||
|
||||
extern const struct input_bind_map input_config_bind_map[RARCH_BIND_LIST_END_NULL];
|
||||
|
||||
RETRO_END_DECLS
|
||||
|
||||
#endif
|
||||
@@ -84,8 +84,7 @@ bool content_undo_load_state(void);
|
||||
/* Restores the last savestate file which was overwritten */
|
||||
bool content_undo_save_state(void);
|
||||
|
||||
void content_get_status(bool *contentless,
|
||||
bool *is_inited);
|
||||
uint8_t content_get_flags(void);
|
||||
|
||||
void content_set_does_not_need_content(void);
|
||||
|
||||
@@ -100,7 +99,7 @@ void content_deinit(void);
|
||||
bool content_init(void);
|
||||
|
||||
/* Resets the state and savefile backup buffers */
|
||||
bool content_reset_savestate_backups(void);
|
||||
void content_reset_savestate_backups(void);
|
||||
|
||||
/* Checks if the buffers are empty */
|
||||
bool content_undo_load_buf_is_empty(void);
|
||||
|
||||
@@ -41,12 +41,15 @@ bool core_run(void);
|
||||
bool core_reset(void);
|
||||
|
||||
bool core_serialize_size(retro_ctx_size_info_t *info);
|
||||
bool core_serialize_size_special(retro_ctx_size_info_t *info);
|
||||
|
||||
uint64_t core_serialization_quirks(void);
|
||||
|
||||
bool core_serialize(retro_ctx_serialize_info_t *info);
|
||||
bool core_serialize_special(retro_ctx_serialize_info_t *info);
|
||||
|
||||
bool core_unserialize(retro_ctx_serialize_info_t *info);
|
||||
bool core_unserialize_special(retro_ctx_serialize_info_t *info);
|
||||
|
||||
bool core_set_cheat(retro_ctx_cheat_info_t *info);
|
||||
|
||||
|
||||
+13
-15
@@ -55,9 +55,6 @@ static bool core_backup_get_backup_dir(
|
||||
char core_file_id[PATH_MAX_LENGTH];
|
||||
char tmp[PATH_MAX_LENGTH];
|
||||
|
||||
core_file_id[0] = '\0';
|
||||
tmp[0] = '\0';
|
||||
|
||||
/* Extract core file 'ID' (name without extension + suffix)
|
||||
* from core path */
|
||||
if (string_is_empty(dir_libretro) ||
|
||||
@@ -87,11 +84,13 @@ static bool core_backup_get_backup_dir(
|
||||
/* Get core backup directory
|
||||
* > If no assets directory is defined, use
|
||||
* core directory as a base */
|
||||
fill_pathname_join(tmp, string_is_empty(dir_core_assets) ?
|
||||
dir_libretro : dir_core_assets,
|
||||
fill_pathname_join_special(tmp,
|
||||
string_is_empty(dir_core_assets)
|
||||
? dir_libretro
|
||||
: dir_core_assets,
|
||||
"core_backups", sizeof(tmp));
|
||||
|
||||
fill_pathname_join(backup_dir, tmp,
|
||||
fill_pathname_join_special(backup_dir, tmp,
|
||||
core_file_id, len);
|
||||
|
||||
if (string_is_empty(backup_dir))
|
||||
@@ -113,8 +112,10 @@ static bool core_backup_get_backup_dir(
|
||||
/* Generates a timestamped core backup file path from
|
||||
* the specified core path. Returns true if successful */
|
||||
bool core_backup_get_backup_path(
|
||||
const char *core_path, uint32_t crc, enum core_backup_mode backup_mode,
|
||||
const char *dir_core_assets, char *backup_path, size_t len)
|
||||
const char *core_path, uint32_t crc,
|
||||
enum core_backup_mode backup_mode,
|
||||
const char *dir_core_assets,
|
||||
char *backup_path, size_t len)
|
||||
{
|
||||
time_t current_time;
|
||||
struct tm time_info;
|
||||
@@ -123,7 +124,6 @@ bool core_backup_get_backup_path(
|
||||
char backup_dir[PATH_MAX_LENGTH];
|
||||
char backup_filename[PATH_MAX_LENGTH];
|
||||
|
||||
core_dir[0] = '\0';
|
||||
backup_dir[0] = '\0';
|
||||
backup_filename[0] = '\0';
|
||||
|
||||
@@ -165,7 +165,7 @@ bool core_backup_get_backup_path(
|
||||
FILE_PATH_CORE_BACKUP_EXTENSION);
|
||||
|
||||
/* Build final path */
|
||||
fill_pathname_join(backup_path, backup_dir,
|
||||
fill_pathname_join_special(backup_path, backup_dir,
|
||||
backup_filename, len);
|
||||
|
||||
return true;
|
||||
@@ -281,9 +281,7 @@ bool core_backup_get_backup_crc(char *backup_path, uint32_t *crc)
|
||||
goto error;
|
||||
|
||||
/* Convert to an integer */
|
||||
*crc = (uint32_t)string_hex_to_unsigned(crc_str);
|
||||
|
||||
if (*crc == 0)
|
||||
if ((*crc = (uint32_t)string_hex_to_unsigned(crc_str)) == 0)
|
||||
goto error;
|
||||
|
||||
string_list_free(metadata_list);
|
||||
@@ -383,7 +381,7 @@ enum core_backup_type core_backup_get_core_path(
|
||||
break;
|
||||
|
||||
/* All good - build core path */
|
||||
fill_pathname_join(core_path, dir_libretro,
|
||||
fill_pathname_join_special(core_path, dir_libretro,
|
||||
core_filename, len);
|
||||
|
||||
backup_type = CORE_BACKUP_TYPE_ARCHIVE;
|
||||
@@ -391,7 +389,7 @@ enum core_backup_type core_backup_get_core_path(
|
||||
break;
|
||||
case CORE_BACKUP_TYPE_LIB:
|
||||
/* This is a plain dynamic library file */
|
||||
fill_pathname_join(core_path, dir_libretro,
|
||||
fill_pathname_join_special(core_path, dir_libretro,
|
||||
backup_filename, len);
|
||||
backup_type = CORE_BACKUP_TYPE_LIB;
|
||||
break;
|
||||
|
||||
+318
-634
File diff suppressed because it is too large.
Load diff
@@ -202,8 +202,6 @@ void core_info_qsort(core_info_list_t *core_info_list, enum core_info_list_qsort
|
||||
bool core_info_list_get_info(core_info_list_t *core_info_list,
|
||||
core_info_t *out_info, const char *core_path);
|
||||
|
||||
bool core_info_hw_api_supported(core_info_t *info);
|
||||
|
||||
/* Convenience wrapper functions used to interpret
|
||||
* the 'savestate_support_level' parameter of
|
||||
* the currently loaded core. If no core is
|
||||
|
||||
+62
-80
@@ -27,9 +27,6 @@
|
||||
#include "core_option_manager.h"
|
||||
#include "msg_hash.h"
|
||||
|
||||
#define CORE_OPTION_MANAGER_MAP_TAG "#"
|
||||
#define CORE_OPTION_MANAGER_MAP_DELIM ":"
|
||||
|
||||
/*********************/
|
||||
/* Option Conversion */
|
||||
/*********************/
|
||||
@@ -70,9 +67,8 @@ struct retro_core_options_v2 *core_option_manager_convert_v1(
|
||||
return NULL;
|
||||
|
||||
/* Allocate output retro_core_options_v2 struct */
|
||||
options_v2 = (struct retro_core_options_v2 *)
|
||||
malloc(sizeof(*options_v2));
|
||||
if (!options_v2)
|
||||
if (!(options_v2 = (struct retro_core_options_v2 *)
|
||||
malloc(sizeof(*options_v2))))
|
||||
return NULL;
|
||||
|
||||
/* Note: v1 options have no concept of
|
||||
@@ -85,10 +81,8 @@ struct retro_core_options_v2 *core_option_manager_convert_v1(
|
||||
* > One extra entry required for terminating NULL entry
|
||||
* > Note that calloc() sets terminating NULL entry and
|
||||
* correctly 'nullifies' each values array */
|
||||
option_v2_defs = (struct retro_core_option_v2_definition *)
|
||||
calloc(num_options + 1, sizeof(*option_v2_defs));
|
||||
|
||||
if (!option_v2_defs)
|
||||
if (!(option_v2_defs = (struct retro_core_option_v2_definition *)
|
||||
calloc(num_options + 1, sizeof(*option_v2_defs))))
|
||||
{
|
||||
free(options_v2);
|
||||
return NULL;
|
||||
@@ -103,7 +97,7 @@ struct retro_core_options_v2 *core_option_manager_convert_v1(
|
||||
size_t num_values = 0;
|
||||
|
||||
/* Set key */
|
||||
option_v2_defs[i].key = options_v1[i].key;
|
||||
option_v2_defs[i].key = options_v1[i].key;
|
||||
|
||||
/* Set default value */
|
||||
option_v2_defs[i].default_value = options_v1[i].default_value;
|
||||
@@ -186,9 +180,8 @@ struct retro_core_options_v2 *core_option_manager_convert_v1_intl(
|
||||
return NULL;
|
||||
|
||||
/* Allocate output retro_core_options_v2 struct */
|
||||
options_v2 = (struct retro_core_options_v2 *)
|
||||
malloc(sizeof(*options_v2));
|
||||
if (!options_v2)
|
||||
if (!(options_v2 = (struct retro_core_options_v2 *)
|
||||
malloc(sizeof(*options_v2))))
|
||||
return NULL;
|
||||
|
||||
/* Note: v1 options have no concept of
|
||||
@@ -201,10 +194,8 @@ struct retro_core_options_v2 *core_option_manager_convert_v1_intl(
|
||||
* > One extra entry required for terminating NULL entry
|
||||
* > Note that calloc() sets terminating NULL entry and
|
||||
* correctly 'nullifies' each values array */
|
||||
option_v2_defs = (struct retro_core_option_v2_definition *)
|
||||
calloc(num_options + 1, sizeof(*option_v2_defs));
|
||||
|
||||
if (!option_v2_defs)
|
||||
if (!(option_v2_defs = (struct retro_core_option_v2_definition *)
|
||||
calloc(num_options + 1, sizeof(*option_v2_defs))))
|
||||
{
|
||||
core_option_manager_free_converted(options_v2);
|
||||
return NULL;
|
||||
@@ -374,9 +365,8 @@ struct retro_core_options_v2 *core_option_manager_convert_v2_intl(
|
||||
return NULL;
|
||||
|
||||
/* Allocate output retro_core_options_v2 struct */
|
||||
options_v2 = (struct retro_core_options_v2 *)
|
||||
malloc(sizeof(*options_v2));
|
||||
if (!options_v2)
|
||||
if (!(options_v2 = (struct retro_core_options_v2 *)
|
||||
malloc(sizeof(*options_v2))))
|
||||
return NULL;
|
||||
|
||||
options_v2->categories = NULL;
|
||||
@@ -387,10 +377,8 @@ struct retro_core_options_v2 *core_option_manager_convert_v2_intl(
|
||||
* > Note that calloc() sets terminating NULL entry */
|
||||
if (num_categories > 0)
|
||||
{
|
||||
option_v2_cats = (struct retro_core_option_v2_category *)
|
||||
calloc(num_categories + 1, sizeof(*option_v2_cats));
|
||||
|
||||
if (!option_v2_cats)
|
||||
if (!(option_v2_cats = (struct retro_core_option_v2_category *)
|
||||
calloc(num_categories + 1, sizeof(*option_v2_cats))))
|
||||
{
|
||||
core_option_manager_free_converted(options_v2);
|
||||
return NULL;
|
||||
@@ -403,10 +391,8 @@ struct retro_core_options_v2 *core_option_manager_convert_v2_intl(
|
||||
* > One extra entry required for terminating NULL entry
|
||||
* > Note that calloc() sets terminating NULL entry and
|
||||
* correctly 'nullifies' each values array */
|
||||
option_v2_defs = (struct retro_core_option_v2_definition *)
|
||||
calloc(num_options + 1, sizeof(*option_v2_defs));
|
||||
|
||||
if (!option_v2_defs)
|
||||
if (!(option_v2_defs = (struct retro_core_option_v2_definition *)
|
||||
calloc(num_options + 1, sizeof(*option_v2_defs))))
|
||||
{
|
||||
core_option_manager_free_converted(options_v2);
|
||||
return NULL;
|
||||
@@ -741,8 +727,8 @@ static bool core_option_manager_parse_variable(
|
||||
option->vals->elems[i].userdata = (void*)value_hash;
|
||||
|
||||
/* Redundant safely check... */
|
||||
value_label = string_is_empty(value_label) ?
|
||||
value : value_label;
|
||||
if (string_is_empty(value_label))
|
||||
value_label = value;
|
||||
|
||||
/* Append value label string */
|
||||
string_list_append(option->val_labels, value_label, attr);
|
||||
@@ -819,9 +805,7 @@ core_option_manager_t *core_option_manager_new_vars(
|
||||
if (!vars)
|
||||
return NULL;
|
||||
|
||||
opt = (core_option_manager_t*)malloc(sizeof(*opt));
|
||||
|
||||
if (!opt)
|
||||
if (!(opt = (core_option_manager_t*)malloc(sizeof(*opt))))
|
||||
return NULL;
|
||||
|
||||
opt->conf = NULL;
|
||||
@@ -859,8 +843,7 @@ core_option_manager_t *core_option_manager_new_vars(
|
||||
goto error;
|
||||
|
||||
/* Create options array */
|
||||
opt->opts = (struct core_option*)calloc(size, sizeof(*opt->opts));
|
||||
if (!opt->opts)
|
||||
if (!(opt->opts = (struct core_option*)calloc(size, sizeof(*opt->opts))))
|
||||
goto error;
|
||||
|
||||
opt->size = size;
|
||||
@@ -875,7 +858,8 @@ core_option_manager_t *core_option_manager_new_vars(
|
||||
* the map */
|
||||
char address[256];
|
||||
|
||||
address[0] = '\0';
|
||||
address[0] = '#';
|
||||
address[1] = '\0';
|
||||
|
||||
/* Address string is normally:
|
||||
* <category_key><delim><tag><option_key>
|
||||
@@ -885,8 +869,7 @@ core_option_manager_t *core_option_manager_new_vars(
|
||||
* so we could just set the address to
|
||||
* <option_key> - but for consistency with
|
||||
* 'modern' options, we apply the tag regardless */
|
||||
snprintf(address, sizeof(address),
|
||||
CORE_OPTION_MANAGER_MAP_TAG "%s", var->key);
|
||||
strlcat(address, var->key, sizeof(address));
|
||||
|
||||
if (!nested_list_add_item(opt->option_map,
|
||||
address, NULL, (const void*)&opt->opts[size]))
|
||||
@@ -947,7 +930,7 @@ static bool core_option_manager_parse_option(
|
||||
* character */
|
||||
if (opt->cats &&
|
||||
!string_is_empty(category_key) &&
|
||||
!strstr(category_key, CORE_OPTION_MANAGER_MAP_DELIM))
|
||||
!strstr(category_key, ":"))
|
||||
{
|
||||
for (i = 0; i < opt->cats_size; i++)
|
||||
{
|
||||
@@ -978,7 +961,7 @@ static bool core_option_manager_parse_option(
|
||||
/* If option has a category, option key
|
||||
* cannot contain a map delimiter character */
|
||||
if (!string_is_empty(option->category_key) &&
|
||||
strstr(key, CORE_OPTION_MANAGER_MAP_DELIM))
|
||||
strstr(key, ":"))
|
||||
return false;
|
||||
|
||||
option->key = strdup(key);
|
||||
@@ -1028,8 +1011,8 @@ static bool core_option_manager_parse_option(
|
||||
value, value_label);
|
||||
|
||||
/* > Redundant safely check... */
|
||||
value_label = string_is_empty(value_label) ?
|
||||
value : value_label;
|
||||
if (string_is_empty(value_label))
|
||||
value_label = value;
|
||||
|
||||
/* Append value label string */
|
||||
string_list_append(option->val_labels, value_label, attr);
|
||||
@@ -1113,9 +1096,7 @@ core_option_manager_t *core_option_manager_new(
|
||||
option_cats = options_v2->categories;
|
||||
option_defs = options_v2->definitions;
|
||||
|
||||
opt = (core_option_manager_t*)malloc(sizeof(*opt));
|
||||
|
||||
if (!opt)
|
||||
if (!(opt = (core_option_manager_t*)malloc(sizeof(*opt))))
|
||||
return NULL;
|
||||
|
||||
opt->conf = NULL;
|
||||
@@ -1166,8 +1147,8 @@ core_option_manager_t *core_option_manager_new(
|
||||
/* Create categories array */
|
||||
if (cats_size > 0)
|
||||
{
|
||||
opt->cats = (struct core_catagory*)calloc(size, sizeof(*opt->cats));
|
||||
if (!opt->cats)
|
||||
if (!(opt->cats = (struct core_category*)calloc(size,
|
||||
sizeof(*opt->cats))))
|
||||
goto error;
|
||||
|
||||
opt->cats_size = cats_size;
|
||||
@@ -1190,8 +1171,7 @@ core_option_manager_t *core_option_manager_new(
|
||||
}
|
||||
|
||||
/* Create options array */
|
||||
opt->opts = (struct core_option*)calloc(size, sizeof(*opt->opts));
|
||||
if (!opt->opts)
|
||||
if (!(opt->opts = (struct core_option*)calloc(size, sizeof(*opt->opts))))
|
||||
goto error;
|
||||
|
||||
opt->size = size;
|
||||
@@ -1210,7 +1190,6 @@ core_option_manager_t *core_option_manager_new(
|
||||
const char *category_key = opt->opts[size].category_key;
|
||||
char address[256];
|
||||
|
||||
address[0] = '\0';
|
||||
|
||||
/* Address string is nominally:
|
||||
* <category_key><delim><tag><option_key>
|
||||
@@ -1218,15 +1197,22 @@ core_option_manager_t *core_option_manager_new(
|
||||
* key in order to avoid category/option key
|
||||
* collisions */
|
||||
if (string_is_empty(category_key))
|
||||
snprintf(address, sizeof(address),
|
||||
CORE_OPTION_MANAGER_MAP_TAG "%s", option_def->key);
|
||||
{
|
||||
address[0] = '#';
|
||||
address[1] = '\0';
|
||||
strlcat(address, option_def->key, sizeof(address));
|
||||
}
|
||||
else
|
||||
snprintf(address, sizeof(address),
|
||||
"%s" CORE_OPTION_MANAGER_MAP_DELIM CORE_OPTION_MANAGER_MAP_TAG "%s",
|
||||
category_key, option_def->key);
|
||||
{
|
||||
size_t _len = strlcpy(address, category_key, sizeof(address));
|
||||
address[_len ] = ':';
|
||||
address[_len+1] = '#';
|
||||
address[_len+2] = '\0';
|
||||
strlcat(address, option_def->key, sizeof(address));
|
||||
}
|
||||
|
||||
if (!nested_list_add_item(opt->option_map,
|
||||
address, CORE_OPTION_MANAGER_MAP_DELIM,
|
||||
address, ":",
|
||||
(const void*)&opt->opts[size]))
|
||||
goto error;
|
||||
}
|
||||
@@ -1338,21 +1324,21 @@ const char *core_option_manager_get_category_desc(core_option_manager_t *opt,
|
||||
uint32_t key_hash;
|
||||
size_t i;
|
||||
|
||||
if (!opt ||
|
||||
string_is_empty(key))
|
||||
if ( !opt
|
||||
|| string_is_empty(key))
|
||||
return NULL;
|
||||
|
||||
key_hash = core_option_manager_hash_string(key);
|
||||
|
||||
for (i = 0; i < opt->cats_size; i++)
|
||||
{
|
||||
struct core_catagory *catagory = &opt->cats[i];
|
||||
struct core_category *category = &opt->cats[i];
|
||||
|
||||
if ((key_hash == catagory->key_hash) &&
|
||||
!string_is_empty(catagory->key) &&
|
||||
string_is_equal(key, catagory->key))
|
||||
if ((key_hash == category->key_hash) &&
|
||||
!string_is_empty(category->key) &&
|
||||
string_is_equal(key, category->key))
|
||||
{
|
||||
return catagory->desc;
|
||||
return category->desc;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1387,13 +1373,13 @@ const char *core_option_manager_get_category_info(core_option_manager_t *opt,
|
||||
|
||||
for (i = 0; i < opt->cats_size; i++)
|
||||
{
|
||||
struct core_catagory *catagory = &opt->cats[i];
|
||||
struct core_category *category = &opt->cats[i];
|
||||
|
||||
if ((key_hash == catagory->key_hash) &&
|
||||
!string_is_empty(catagory->key) &&
|
||||
string_is_equal(key, catagory->key))
|
||||
if ((key_hash == category->key_hash) &&
|
||||
!string_is_empty(category->key) &&
|
||||
string_is_equal(key, category->key))
|
||||
{
|
||||
return catagory->info;
|
||||
return category->info;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1412,7 +1398,7 @@ const char *core_option_manager_get_category_info(core_option_manager_t *opt,
|
||||
* be visible if at least one of the options
|
||||
* in the category is visible)
|
||||
*
|
||||
* Returns: true if option category should be
|
||||
* @return true if option category should be
|
||||
* displayed by the frontend, otherwise false.
|
||||
**/
|
||||
bool core_option_manager_get_category_visible(core_option_manager_t *opt,
|
||||
@@ -1429,16 +1415,12 @@ bool core_option_manager_get_category_visible(core_option_manager_t *opt,
|
||||
return false;
|
||||
|
||||
/* Fetch category item from map */
|
||||
category_item = nested_list_get_item(opt->option_map,
|
||||
key, NULL);
|
||||
|
||||
if (!category_item)
|
||||
if (!(category_item = nested_list_get_item(opt->option_map,
|
||||
key, NULL)))
|
||||
return false;
|
||||
|
||||
/* Get child options of specified category */
|
||||
option_list = nested_list_item_get_children(category_item);
|
||||
|
||||
if (!option_list)
|
||||
if (!(option_list = nested_list_item_get_children(category_item)))
|
||||
return false;
|
||||
|
||||
/* Loop over child options */
|
||||
@@ -1472,7 +1454,7 @@ bool core_option_manager_get_category_visible(core_option_manager_t *opt,
|
||||
* Fetches the index of the core option identified
|
||||
* by the specified @key.
|
||||
*
|
||||
* Returns: true if option matching the specified
|
||||
* @return true if option matching the specified
|
||||
* key was found, otherwise false.
|
||||
**/
|
||||
bool core_option_manager_get_idx(core_option_manager_t *opt,
|
||||
@@ -1703,8 +1685,8 @@ const char *core_option_manager_get_val_label(core_option_manager_t *opt,
|
||||
bool core_option_manager_get_visible(core_option_manager_t *opt,
|
||||
size_t idx)
|
||||
{
|
||||
if (!opt ||
|
||||
(idx >= opt->size))
|
||||
if ( !opt
|
||||
|| (idx >= opt->size))
|
||||
return false;
|
||||
|
||||
return opt->opts[idx].visible;
|
||||
|
||||
@@ -51,7 +51,7 @@ struct core_option
|
||||
bool visible;
|
||||
};
|
||||
|
||||
struct core_catagory
|
||||
struct core_category
|
||||
{
|
||||
char *key;
|
||||
char *desc;
|
||||
@@ -68,7 +68,7 @@ struct core_option_manager
|
||||
config_file_t *conf;
|
||||
char conf_path[PATH_MAX_LENGTH];
|
||||
|
||||
struct core_catagory *cats;
|
||||
struct core_category *cats;
|
||||
struct core_option *opts;
|
||||
nested_list_t *option_map;
|
||||
|
||||
@@ -252,7 +252,7 @@ const char *core_option_manager_get_category_info(core_option_manager_t *opt,
|
||||
* be visible if at least one of the options
|
||||
* in the category is visible)
|
||||
*
|
||||
* Returns: true if option category should be
|
||||
* @return true if option category should be
|
||||
* displayed by the frontend, otherwise false.
|
||||
**/
|
||||
bool core_option_manager_get_category_visible(core_option_manager_t *opt,
|
||||
@@ -274,7 +274,7 @@ bool core_option_manager_get_category_visible(core_option_manager_t *opt,
|
||||
* Fetches the index of the core option identified
|
||||
* by the specified @key.
|
||||
*
|
||||
* Returns: true if option matching the specified
|
||||
* @return true if option matching the specified
|
||||
* key was found, otherwise false.
|
||||
**/
|
||||
bool core_option_manager_get_idx(core_option_manager_t *opt,
|
||||
|
||||
+25
-44
@@ -278,14 +278,9 @@ bool core_updater_list_get_core(
|
||||
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;
|
||||
|
||||
num_entries = RBUF_LEN(core_list->entries);
|
||||
|
||||
if (num_entries < 1)
|
||||
if ((num_entries = RBUF_LEN(core_list->entries)) < 1)
|
||||
return false;
|
||||
|
||||
/* Resolve absolute pathname of local_core_path */
|
||||
@@ -376,9 +371,7 @@ static bool core_updater_list_set_crc(
|
||||
if (!entry || string_is_empty(crc_str))
|
||||
return false;
|
||||
|
||||
crc = (uint32_t)string_hex_to_unsigned(crc_str);
|
||||
|
||||
if (crc == 0)
|
||||
if ((crc = (uint32_t)string_hex_to_unsigned(crc_str)) == 0)
|
||||
return false;
|
||||
|
||||
entry->crc = crc;
|
||||
@@ -405,19 +398,15 @@ static bool core_updater_list_set_paths(
|
||||
* source files have non-standard file names (which
|
||||
* will not be recognised by regular core handling
|
||||
* routines) */
|
||||
bool resolve_symlinks = (list_type != CORE_UPDATER_LIST_TYPE_PFD);
|
||||
char remote_core_path[PATH_MAX_LENGTH];
|
||||
char local_core_path[PATH_MAX_LENGTH];
|
||||
char local_info_path[PATH_MAX_LENGTH];
|
||||
bool resolve_symlinks = (list_type != CORE_UPDATER_LIST_TYPE_PFD);
|
||||
|
||||
remote_core_path[0] = '\0';
|
||||
local_core_path[0] = '\0';
|
||||
local_info_path[0] = '\0';
|
||||
|
||||
if (!entry ||
|
||||
string_is_empty(filename_str) ||
|
||||
string_is_empty(path_dir_libretro) ||
|
||||
string_is_empty(path_libretro_info))
|
||||
if ( !entry
|
||||
|| string_is_empty(filename_str)
|
||||
|| string_is_empty(path_dir_libretro)
|
||||
|| string_is_empty(path_libretro_info))
|
||||
return false;
|
||||
|
||||
/* Only buildbot cores require the buildbot URL */
|
||||
@@ -441,14 +430,14 @@ static bool core_updater_list_set_paths(
|
||||
* > Leave blank if this is not a buildbot core */
|
||||
if (list_type == CORE_UPDATER_LIST_TYPE_BUILDBOT)
|
||||
{
|
||||
fill_pathname_join(
|
||||
fill_pathname_join_special(
|
||||
remote_core_path,
|
||||
network_buildbot_url,
|
||||
filename_str,
|
||||
sizeof(remote_core_path));
|
||||
|
||||
/* > Apply proper URL encoding (messy...) */
|
||||
tmp_url = strdup(remote_core_path);
|
||||
tmp_url = strdup(remote_core_path);
|
||||
remote_core_path[0] = '\0';
|
||||
net_http_urlencode_full(
|
||||
remote_core_path, tmp_url, sizeof(remote_core_path));
|
||||
@@ -464,8 +453,7 @@ static bool core_updater_list_set_paths(
|
||||
|
||||
entry->remote_core_path = strdup(remote_core_path);
|
||||
|
||||
/* local_core_path */
|
||||
fill_pathname_join(
|
||||
fill_pathname_join_special(
|
||||
local_core_path,
|
||||
path_dir_libretro,
|
||||
filename_str,
|
||||
@@ -485,12 +473,12 @@ static bool core_updater_list_set_paths(
|
||||
|
||||
entry->local_core_path = strdup(local_core_path);
|
||||
|
||||
/* local_info_path */
|
||||
fill_pathname_join_noext(
|
||||
fill_pathname_join_special(
|
||||
local_info_path,
|
||||
path_libretro_info,
|
||||
filename_str,
|
||||
sizeof(local_info_path));
|
||||
path_remove_extension(local_info_path);
|
||||
|
||||
if (is_archive)
|
||||
path_remove_extension(local_info_path);
|
||||
@@ -533,9 +521,9 @@ static bool core_updater_list_set_core_info(
|
||||
{
|
||||
core_updater_info_t *core_info = NULL;
|
||||
|
||||
if (!entry ||
|
||||
string_is_empty(local_info_path) ||
|
||||
string_is_empty(filename_str))
|
||||
if ( !entry
|
||||
|| string_is_empty(local_info_path)
|
||||
|| string_is_empty(filename_str))
|
||||
return false;
|
||||
|
||||
/* Clear any existing core info */
|
||||
@@ -567,9 +555,7 @@ static bool core_updater_list_set_core_info(
|
||||
* Would be better to cache this globally
|
||||
* (at present, we only cache info for
|
||||
* *installed* cores...) */
|
||||
core_info = core_info_get_core_updater_info(local_info_path);
|
||||
|
||||
if (core_info)
|
||||
if ((core_info = core_info_get_core_updater_info(local_info_path)))
|
||||
{
|
||||
/* display_name + is_experimental */
|
||||
if (!string_is_empty(core_info->display_name))
|
||||
@@ -590,7 +576,7 @@ static bool core_updater_list_set_core_info(
|
||||
if (!string_is_empty(core_info->description))
|
||||
entry->description = strdup(core_info->description);
|
||||
else
|
||||
entry->description = strdup("");
|
||||
entry->description = strldup("", sizeof(""));
|
||||
|
||||
/* licenses_list */
|
||||
if (!string_is_empty(core_info->licenses))
|
||||
@@ -606,7 +592,7 @@ static bool core_updater_list_set_core_info(
|
||||
* cores must have a valid/complete core info file) */
|
||||
entry->display_name = strdup(filename_str);
|
||||
entry->is_experimental = true;
|
||||
entry->description = strdup("");
|
||||
entry->description = strldup("", sizeof(""));
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -691,9 +677,9 @@ static void core_updater_list_add_entry(
|
||||
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))
|
||||
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
|
||||
@@ -770,13 +756,10 @@ static void core_updater_list_qsort(core_updater_list_t *core_list)
|
||||
|
||||
if (!core_list)
|
||||
return;
|
||||
|
||||
num_entries = RBUF_LEN(core_list->entries);
|
||||
|
||||
if (num_entries < 2)
|
||||
if ((num_entries = RBUF_LEN(core_list->entries)) < 2)
|
||||
return;
|
||||
|
||||
qsort(
|
||||
if (core_list->entries)
|
||||
qsort(
|
||||
core_list->entries, num_entries,
|
||||
sizeof(core_updater_list_entry_t),
|
||||
(int (*)(const void *, const void *))
|
||||
@@ -808,9 +791,7 @@ bool core_updater_list_parse_network_data(
|
||||
|
||||
/* 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)
|
||||
if (!(data_buf = (char*)malloc((len + 1) * sizeof(char))))
|
||||
goto error;
|
||||
|
||||
memcpy(data_buf, data, len * sizeof(char));
|
||||
|
||||
@@ -1085,11 +1085,9 @@ static enum AVPixelFormat select_decoder(AVCodecContext *ctx,
|
||||
if (!force_sw_decoder)
|
||||
{
|
||||
if (hw_decoder == AV_HWDEVICE_TYPE_NONE)
|
||||
{
|
||||
format = auto_hw_decoder(ctx, pix_fmts);
|
||||
}
|
||||
format = auto_hw_decoder(ctx, pix_fmts);
|
||||
else
|
||||
format = init_hw_decoder(ctx, hw_decoder, pix_fmts);
|
||||
format = init_hw_decoder(ctx, hw_decoder, pix_fmts);
|
||||
}
|
||||
|
||||
/* Fallback to SW rendering */
|
||||
@@ -1099,17 +1097,17 @@ static enum AVPixelFormat select_decoder(AVCodecContext *ctx,
|
||||
|
||||
log_cb(RETRO_LOG_INFO, "[FFMPEG] Using SW decoding.\n");
|
||||
|
||||
ctx->thread_type = FF_THREAD_FRAME;
|
||||
ctx->thread_count = sw_decoder_threads;
|
||||
ctx->thread_type = FF_THREAD_FRAME;
|
||||
ctx->thread_count = sw_decoder_threads;
|
||||
log_cb(RETRO_LOG_INFO, "[FFMPEG] Configured software decoding threads: %d\n", sw_decoder_threads);
|
||||
|
||||
format = fctx->streams[video_stream_index]->codecpar->format;
|
||||
format = (enum AVPixelFormat)fctx->streams[video_stream_index]->codecpar->format;
|
||||
|
||||
#if ENABLE_HW_ACCEL
|
||||
hw_decoding_enabled = false;
|
||||
hw_decoding_enabled = false;
|
||||
}
|
||||
else
|
||||
hw_decoding_enabled = true;
|
||||
hw_decoding_enabled = true;
|
||||
#endif
|
||||
|
||||
return format;
|
||||
@@ -1122,10 +1120,10 @@ static enum AVPixelFormat get_format(AVCodecContext *ctx,
|
||||
{
|
||||
/* Look if we can reuse the current decoder */
|
||||
for (size_t i = 0; pix_fmts[i] != AV_PIX_FMT_NONE; i++)
|
||||
{
|
||||
if (pix_fmts[i] == pix_fmt)
|
||||
{
|
||||
return pix_fmt;
|
||||
}
|
||||
}
|
||||
|
||||
pix_fmt = select_decoder(ctx, pix_fmts);
|
||||
|
||||
@@ -1135,8 +1133,7 @@ static enum AVPixelFormat get_format(AVCodecContext *ctx,
|
||||
|
||||
static bool open_codec(AVCodecContext **ctx, enum AVMediaType type, unsigned index)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
int ret = 0;
|
||||
const AVCodec *codec = avcodec_find_decoder(fctx->streams[index]->codecpar->codec_id);
|
||||
if (!codec)
|
||||
{
|
||||
|
||||
@@ -314,12 +314,12 @@ static void fft_init(fft_t *fft)
|
||||
|
||||
window = (GLushort*)calloc(fft->size, sizeof(GLushort));
|
||||
|
||||
window_mod = 1.0 / kaiser_window_function(0.0, KAISER_BETA);
|
||||
window_mod = 1.0 / besseli0(KAISER_BETA);
|
||||
|
||||
for (i = 0; i < fft->size; i++)
|
||||
{
|
||||
double phase = (double)(i - (int)(fft->size) / 2) / ((int)(fft->size) / 2);
|
||||
double w = kaiser_window_function(phase, KAISER_BETA);
|
||||
double w = besseli0(KAISER_BETA * sqrtf(1 - phase * phase));
|
||||
window[i] = round(0xffff * w * window_mod);
|
||||
}
|
||||
glBindTexture(GL_TEXTURE_2D, fft->window_tex);
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
#include <sys/stat.h>
|
||||
#include <3ds.h>
|
||||
#include "ctr/ctr_debug.h"
|
||||
|
||||
#define FILE_CHUNK_SIZE 4096
|
||||
|
||||
PrintConsole debugConsoleTop;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 argc;
|
||||
@@ -60,6 +63,18 @@ static int isCiaInstalled(u64 titleId, u16 version)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int deleteCia(u64 TitleId)
|
||||
{
|
||||
u64 currTitleId = 0;
|
||||
|
||||
/* Do not delete if the titleid is currently running. */
|
||||
if (R_FAILED(APT_GetAppletInfo((NS_APPID) envGetAptAppId(), &currTitleId, NULL, NULL, NULL, NULL)) || TitleId != currTitleId)
|
||||
{
|
||||
AM_DeleteTitle(MEDIATYPE_SD, TitleId);
|
||||
AM_DeleteTicket(TitleId);
|
||||
}
|
||||
}
|
||||
|
||||
static int installCia(Handle ciaFile)
|
||||
{
|
||||
Handle outputHandle;
|
||||
@@ -91,15 +106,24 @@ static int installCia(Handle ciaFile)
|
||||
}
|
||||
|
||||
failed = FSFILE_Write(outputHandle, &bytesWritten,
|
||||
fileOffset, transferBuffer, bytesRead, 0);
|
||||
fileOffset, transferBuffer, bytesRead, FS_WRITE_FLUSH);
|
||||
if (R_FAILED(failed))
|
||||
{
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
if (R_DESCRIPTION(failed) == RD_ALREADY_EXISTS)
|
||||
return 1;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf(PRINTFPOS(27,0)" %llu / %llu\n\n", fileOffset, fileSize);
|
||||
|
||||
int progress = roundf(((float)fileOffset/(float)fileSize)*50);
|
||||
for (int i = 0; i < progress; i++)
|
||||
{
|
||||
printf("#");
|
||||
}
|
||||
|
||||
if (bytesWritten != bytesRead)
|
||||
{
|
||||
AM_CancelCIAInstall(outputHandle);
|
||||
@@ -121,6 +145,12 @@ int exec_cia(const char* path, const char** args)
|
||||
struct stat sBuff;
|
||||
bool fileExists;
|
||||
bool inited;
|
||||
#ifdef USE_CTRULIB_2
|
||||
if (!gspHasGpuRight())
|
||||
#endif
|
||||
gfxInitDefault();
|
||||
|
||||
consoleInit(GFX_TOP, &debugConsoleTop);
|
||||
|
||||
if (!path || path[0] == '\0')
|
||||
{
|
||||
@@ -175,10 +205,20 @@ int exec_cia(const char* path, const char** args)
|
||||
}
|
||||
else if (ciaInstalled == 0)
|
||||
{
|
||||
/* not installed */
|
||||
/* titleid with version not installed. */
|
||||
consoleSelect(&debugConsoleTop);
|
||||
printf(PRINTFPOS(2,0)"Do not close RetroArch or turn off your console.");
|
||||
printf(PRINTFPOS(5,0)"Installing core:\n%s\n", path);
|
||||
|
||||
/* Delete existing content of the pending titleid. */
|
||||
deleteCia(ciaInfo.titleID);
|
||||
|
||||
int error = installCia(ciaFile);
|
||||
if (error == -1)
|
||||
error_and_quit("Cant install CIA.");
|
||||
{
|
||||
printf(PRINTFPOS(25,0)"CIA install failed.\n");
|
||||
wait_for_input();
|
||||
}
|
||||
}
|
||||
|
||||
FSFILE_Close(ciaFile);
|
||||
|
||||
+377
-67
@@ -34,94 +34,418 @@ int database_info_build_query_enum(char *s, size_t len,
|
||||
enum database_query_type type,
|
||||
const char *path)
|
||||
{
|
||||
bool add_quotes = true;
|
||||
bool add_glob = false;
|
||||
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = '\0';
|
||||
size_t pos = 0;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case DATABASE_QUERY_ENTRY:
|
||||
strlcat(s, "name", len);
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'n';
|
||||
s[3] = 'a';
|
||||
s[4] = 'm';
|
||||
s[5] = 'e';
|
||||
s[6] = '\'';
|
||||
s[7] = ':';
|
||||
s[8] = '"';
|
||||
s[9] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '"';
|
||||
s[pos+1] = '}';
|
||||
s[pos+2] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_PUBLISHER:
|
||||
strlcat(s, "publisher", len);
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'p';
|
||||
s[3] = 'u';
|
||||
s[4] = 'b';
|
||||
s[5] = 'l';
|
||||
s[6] = 'i';
|
||||
s[7] = 's';
|
||||
s[8] = 'h';
|
||||
s[9] = 'e';
|
||||
s[10] = 'r';
|
||||
s[11] = '\'';
|
||||
s[12] = ':';
|
||||
s[13] = '"';
|
||||
s[14] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '"';
|
||||
s[pos+1] = '}';
|
||||
s[pos+2] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_DEVELOPER:
|
||||
strlcat(s, "developer", len);
|
||||
add_glob = true;
|
||||
add_quotes = false;
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'd';
|
||||
s[3] = 'e';
|
||||
s[4] = 'v';
|
||||
s[5] = 'e';
|
||||
s[6] = 'l';
|
||||
s[7] = 'o';
|
||||
s[8] = 'p';
|
||||
s[9] = 'e';
|
||||
s[10] = 'r';
|
||||
s[11] = '\'';
|
||||
s[12] = ':';
|
||||
s[13] = 'g';
|
||||
s[14] = 'l';
|
||||
s[15] = 'o';
|
||||
s[16] = 'b';
|
||||
s[17] = '(';
|
||||
s[18] = '\'';
|
||||
s[19] = '*';
|
||||
s[20] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '*';
|
||||
s[pos+1] = '\'';
|
||||
s[pos+2] = ')';
|
||||
s[pos+3] = '}';
|
||||
s[pos+4] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_ORIGIN:
|
||||
strlcat(s, "origin", len);
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'o';
|
||||
s[3] = 'r';
|
||||
s[4] = 'i';
|
||||
s[5] = 'g';
|
||||
s[6] = 'i';
|
||||
s[7] = 'n';
|
||||
s[8] = '\'';
|
||||
s[9] = ':';
|
||||
s[10] = '"';
|
||||
s[11] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '"';
|
||||
s[pos+1] = '}';
|
||||
s[pos+2] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_FRANCHISE:
|
||||
strlcat(s, "franchise", len);
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'f';
|
||||
s[3] = 'r';
|
||||
s[4] = 'a';
|
||||
s[5] = 'n';
|
||||
s[6] = 'c';
|
||||
s[7] = 'h';
|
||||
s[8] = 'i';
|
||||
s[9] = 's';
|
||||
s[10] = 'e';
|
||||
s[11] = '\'';
|
||||
s[12] = ':';
|
||||
s[13] = '"';
|
||||
s[14] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '"';
|
||||
s[pos+1] = '}';
|
||||
s[pos+2] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_RATING:
|
||||
strlcat(s, "esrb_rating", len);
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'e';
|
||||
s[3] = 's';
|
||||
s[4] = 'r';
|
||||
s[5] = 'b';
|
||||
s[6] = '_';
|
||||
s[7] = 'r';
|
||||
s[8] = 'a';
|
||||
s[9] = 't';
|
||||
s[10] = 'i';
|
||||
s[11] = 'n';
|
||||
s[12] = 'g';
|
||||
s[13] = '\'';
|
||||
s[14] = ':';
|
||||
s[15] = '"';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '"';
|
||||
s[pos+1] = '}';
|
||||
s[pos+2] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_BBFC_RATING:
|
||||
strlcat(s, "bbfc_rating", len);
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'b';
|
||||
s[3] = 'b';
|
||||
s[4] = 'f';
|
||||
s[5] = 'c';
|
||||
s[6] = '_';
|
||||
s[7] = 'r';
|
||||
s[8] = 'a';
|
||||
s[9] = 't';
|
||||
s[10] = 'i';
|
||||
s[11] = 'n';
|
||||
s[12] = 'g';
|
||||
s[13] = '\'';
|
||||
s[14] = ':';
|
||||
s[15] = '"';
|
||||
s[16] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '"';
|
||||
s[pos+1] = '}';
|
||||
s[pos+2] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_ELSPA_RATING:
|
||||
strlcat(s, "elspa_rating", len);
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'e';
|
||||
s[3] = 'l';
|
||||
s[4] = 's';
|
||||
s[5] = 'p';
|
||||
s[6] = 'a';
|
||||
s[7] = '_';
|
||||
s[8] = 'r';
|
||||
s[9] = 'a';
|
||||
s[10] = 't';
|
||||
s[11] = 'i';
|
||||
s[12] = 'n';
|
||||
s[13] = 'g';
|
||||
s[14] = '\'';
|
||||
s[15] = ':';
|
||||
s[16] = '"';
|
||||
s[17] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '"';
|
||||
s[pos+1] = '}';
|
||||
s[pos+2] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_ESRB_RATING:
|
||||
strlcat(s, "esrb_rating", len);
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'e';
|
||||
s[3] = 's';
|
||||
s[4] = 'r';
|
||||
s[5] = 'b';
|
||||
s[6] = '_';
|
||||
s[7] = 'r';
|
||||
s[8] = 'a';
|
||||
s[9 ] = 't';
|
||||
s[10] = 'i';
|
||||
s[11] = 'n';
|
||||
s[12] = 'g';
|
||||
s[13] = '\'';
|
||||
s[14] = ':';
|
||||
s[15] = '"';
|
||||
s[16] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '"';
|
||||
s[pos+1] = '}';
|
||||
s[pos+2] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_PEGI_RATING:
|
||||
strlcat(s, "pegi_rating", len);
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'p';
|
||||
s[3] = 'e';
|
||||
s[4] = 'g';
|
||||
s[5] = 'i';
|
||||
s[6] = '_';
|
||||
s[7] = 'r';
|
||||
s[8] = 'a';
|
||||
s[9] = 't';
|
||||
s[10] = 'i';
|
||||
s[11] = 'n';
|
||||
s[12] = 'g';
|
||||
s[13] = '\'';
|
||||
s[14] = ':';
|
||||
s[15] = '"';
|
||||
s[16] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '"';
|
||||
s[pos+1] = '}';
|
||||
s[pos+2] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_CERO_RATING:
|
||||
strlcat(s, "cero_rating", len);
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'c';
|
||||
s[3] = 'e';
|
||||
s[4] = 'r';
|
||||
s[5] = 'o';
|
||||
s[6] = '_';
|
||||
s[7] = 'r';
|
||||
s[8] = 'a';
|
||||
s[9] = 't';
|
||||
s[10] = 'i';
|
||||
s[11] = 'n';
|
||||
s[12] = 'g';
|
||||
s[13] = '\'';
|
||||
s[14] = ':';
|
||||
s[15] = '"';
|
||||
s[16] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '"';
|
||||
s[pos+1] = '}';
|
||||
s[pos+2] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_ENHANCEMENT_HW:
|
||||
strlcat(s, "enhancement_hw", len);
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'e';
|
||||
s[3] = 'n';
|
||||
s[4] = 'h';
|
||||
s[5] = 'a';
|
||||
s[6] = 'n';
|
||||
s[7] = 'c';
|
||||
s[8] = 'e';
|
||||
s[9] = 'm';
|
||||
s[10] = 'e';
|
||||
s[11] = 'n';
|
||||
s[12] = 't';
|
||||
s[13] = '_';
|
||||
s[14] = 'h';
|
||||
s[15] = 'w';
|
||||
s[16] = '\'';
|
||||
s[17] = ':';
|
||||
s[18] = '"';
|
||||
s[19] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '"';
|
||||
s[pos+1] = '}';
|
||||
s[pos+2] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_EDGE_MAGAZINE_RATING:
|
||||
strlcat(s, "edge_rating", len);
|
||||
add_quotes = false;
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'e';
|
||||
s[3] = 'd';
|
||||
s[4] = 'g';
|
||||
s[5] = 'e';
|
||||
s[6] = '_';
|
||||
s[7] = 'r';
|
||||
s[8] = 'a';
|
||||
s[9] = 't';
|
||||
s[10] = 'i';
|
||||
s[11] = 'n';
|
||||
s[12] = 'g';
|
||||
s[13] = '\'';
|
||||
s[14] = ':';
|
||||
s[15] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '}';
|
||||
s[pos+1] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_EDGE_MAGAZINE_ISSUE:
|
||||
strlcat(s, "edge_issue", len);
|
||||
add_quotes = false;
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'e';
|
||||
s[3] = 'd';
|
||||
s[4] = 'g';
|
||||
s[5] = 'e';
|
||||
s[6] = '_';
|
||||
s[7] = 'i';
|
||||
s[8] = 's';
|
||||
s[9] = 's';
|
||||
s[10] = 'u';
|
||||
s[11] = 'e';
|
||||
s[12] = '\'';
|
||||
s[13] = ':';
|
||||
s[14] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '}';
|
||||
s[pos+1] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_FAMITSU_MAGAZINE_RATING:
|
||||
strlcat(s, "famitsu_rating", len);
|
||||
add_quotes = false;
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'f';
|
||||
s[3] = 'a';
|
||||
s[4] = 'm';
|
||||
s[5] = 'i';
|
||||
s[6] = 't';
|
||||
s[7] = 's';
|
||||
s[8] = 'u';
|
||||
s[9] = '_';
|
||||
s[10] = 'r';
|
||||
s[11] = 'a';
|
||||
s[12] = 't';
|
||||
s[13] = 'i';
|
||||
s[14] = 'n';
|
||||
s[15] = 'g';
|
||||
s[16] = '\'';
|
||||
s[17] = ':';
|
||||
s[18] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '}';
|
||||
s[pos+1] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_RELEASEDATE_MONTH:
|
||||
strlcat(s, "releasemonth", len);
|
||||
add_quotes = false;
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'r';
|
||||
s[3] = 'e';
|
||||
s[4] = 'l';
|
||||
s[5] = 'e';
|
||||
s[6] = 'a';
|
||||
s[7] = 's';
|
||||
s[8] = 'e';
|
||||
s[9] = 'm';
|
||||
s[10] = 'o';
|
||||
s[11] = 'n';
|
||||
s[12] = 't';
|
||||
s[13] = 'h';
|
||||
s[14] = '\'';
|
||||
s[15] = ':';
|
||||
s[16] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '}';
|
||||
s[pos+1] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_RELEASEDATE_YEAR:
|
||||
strlcat(s, "releaseyear", len);
|
||||
add_quotes = false;
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'r';
|
||||
s[3] = 'e';
|
||||
s[4] = 'l';
|
||||
s[5] = 'e';
|
||||
s[6] = 'a';
|
||||
s[7] = 's';
|
||||
s[8] = 'e';
|
||||
s[9] = 'y';
|
||||
s[10] = 'e';
|
||||
s[11] = 'a';
|
||||
s[12] = 'r';
|
||||
s[13] = '\'';
|
||||
s[14] = ':';
|
||||
s[15] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '}';
|
||||
s[pos+1] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_ENTRY_MAX_USERS:
|
||||
strlcat(s, "users", len);
|
||||
add_quotes = false;
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = 'u';
|
||||
s[3] = 's';
|
||||
s[4] = 'e';
|
||||
s[5] = 'r';
|
||||
s[6] = 's';
|
||||
s[7] = '\'';
|
||||
s[8] = ':';
|
||||
s[9] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '}';
|
||||
s[pos+1] = '\0';
|
||||
break;
|
||||
case DATABASE_QUERY_NONE:
|
||||
s[0] = '{';
|
||||
s[1] = '\'';
|
||||
s[2] = '\'';
|
||||
s[3] = ':';
|
||||
s[4] = '\'';
|
||||
s[5] = ':';
|
||||
s[6] = '"';
|
||||
s[7] = '\0';
|
||||
pos = strlcat(s, path, len);
|
||||
s[pos ] = '"';
|
||||
s[pos+1] = '}';
|
||||
s[pos+2] = '\0';
|
||||
break;
|
||||
}
|
||||
|
||||
strlcat(s, "':", len);
|
||||
if (add_glob)
|
||||
strlcat(s, "glob('*", len);
|
||||
if (add_quotes)
|
||||
strlcat(s, "\"", len);
|
||||
strlcat(s, path, len);
|
||||
if (add_glob)
|
||||
strlcat(s, "*')", len);
|
||||
if (add_quotes)
|
||||
strlcat(s, "\"", len);
|
||||
|
||||
strlcat(s, "}", len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -418,14 +742,6 @@ error:
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int database_cursor_close(libretrodb_t *db, libretrodb_cursor_t *cur)
|
||||
{
|
||||
libretrodb_cursor_close(cur);
|
||||
libretrodb_close(db);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool type_is_prioritized(const char *path)
|
||||
{
|
||||
const char *ext = path_get_extension(path);
|
||||
@@ -465,11 +781,9 @@ database_info_handle_t *database_info_dir_init(const char *dir,
|
||||
|
||||
core_info_get_list(&core_info_list);
|
||||
|
||||
list = dir_list_new(dir, core_info_list ? core_info_list->all_ext : NULL,
|
||||
if (!(list = dir_list_new(dir, core_info_list ? core_info_list->all_ext : NULL,
|
||||
false, show_hidden_files,
|
||||
false, true);
|
||||
|
||||
if (!list)
|
||||
false, true)))
|
||||
{
|
||||
free(db);
|
||||
return NULL;
|
||||
@@ -496,16 +810,13 @@ database_info_handle_t *database_info_file_init(const char *path,
|
||||
if (!db)
|
||||
return NULL;
|
||||
|
||||
attr.i = 0;
|
||||
|
||||
list = string_list_new();
|
||||
|
||||
if (!list)
|
||||
if (!(list = string_list_new()))
|
||||
{
|
||||
free(db);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
attr.i = 0;
|
||||
string_list_append(list, path, attr);
|
||||
|
||||
db->status = DATABASE_STATUS_ITERATE;
|
||||
@@ -518,10 +829,8 @@ database_info_handle_t *database_info_file_init(const char *path,
|
||||
|
||||
void database_info_free(database_info_handle_t *db)
|
||||
{
|
||||
if (!db)
|
||||
return;
|
||||
|
||||
string_list_free(db->list);
|
||||
if (db)
|
||||
string_list_free(db->list);
|
||||
}
|
||||
|
||||
database_info_list_t *database_info_list_new(
|
||||
@@ -666,7 +975,8 @@ database_info_list_t *database_info_list_new(
|
||||
end:
|
||||
if (db)
|
||||
{
|
||||
database_cursor_close(db, cur);
|
||||
libretrodb_cursor_close(cur);
|
||||
libretrodb_close(db);
|
||||
libretrodb_free(db);
|
||||
}
|
||||
if (cur)
|
||||
|
||||
+3
-1
@@ -35,6 +35,9 @@ enum default_dirs
|
||||
DEFAULT_DIR_AUDIO_FILTER,
|
||||
DEFAULT_DIR_VIDEO_FILTER,
|
||||
DEFAULT_DIR_ASSETS,
|
||||
#ifdef _3DS
|
||||
DEFAULT_DIR_BOTTOM_ASSETS,
|
||||
#endif
|
||||
DEFAULT_DIR_CORE,
|
||||
DEFAULT_DIR_CORE_INFO,
|
||||
DEFAULT_DIR_OVERLAY,
|
||||
@@ -59,7 +62,6 @@ enum default_dirs
|
||||
DEFAULT_DIR_WALLPAPERS,
|
||||
DEFAULT_DIR_THUMBNAILS,
|
||||
DEFAULT_DIR_DATABASE,
|
||||
DEFAULT_DIR_CURSOR,
|
||||
DEFAULT_DIR_CHEATS,
|
||||
DEFAULT_DIR_RECORD_CONFIG,
|
||||
DEFAULT_DIR_RECORD_OUTPUT,
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ extern "C" {
|
||||
/*
|
||||
** Copyright 2013-2020 The Khronos Group Inc.
|
||||
** SPDX-License-Identifier: Apache-2.0
|
||||
/*
|
||||
**
|
||||
** This header is generated from the Khronos EGL XML API Registry.
|
||||
** The current version of the Registry, generator scripts
|
||||
** used to make the header, and the header can be found at
|
||||
|
||||
Vendored
+18
-16
@@ -52,9 +52,10 @@ class JsonWriter
|
||||
|
||||
static int writer_io(const void* inbuf, int inlen, void *user_data)
|
||||
{
|
||||
JsonWriter* self = (JsonWriter*)user_data;
|
||||
JsonWriter* self = (JsonWriter*)user_data;
|
||||
size_t buf_remain = (self->buf_cap - self->buf_len);
|
||||
if ((size_t)inlen > buf_remain) inlen = (int)buf_remain;
|
||||
if ((size_t)inlen > buf_remain)
|
||||
inlen = (int)buf_remain;
|
||||
memcpy(self->buf + self->buf_len, inbuf, inlen);
|
||||
self->buf_len += inlen;
|
||||
self->buf[self->buf_len - (self->buf_len == self->buf_cap ? 1 : 0)] = '\0';
|
||||
@@ -82,40 +83,41 @@ class JsonWriter
|
||||
|
||||
void WriteComma()
|
||||
{
|
||||
if (!need_comma) return;
|
||||
rjsonwriter_add_comma(writer);
|
||||
if (!need_comma)
|
||||
return;
|
||||
rjsonwriter_raw(writer, ",", 1);
|
||||
need_comma = false;
|
||||
}
|
||||
|
||||
void StartObject()
|
||||
{
|
||||
WriteComma();
|
||||
rjsonwriter_add_start_object(writer);
|
||||
rjsonwriter_raw(writer, "{", 1);
|
||||
}
|
||||
|
||||
void StartArray()
|
||||
{
|
||||
WriteComma();
|
||||
rjsonwriter_add_start_array(writer);
|
||||
WriteComma();
|
||||
rjsonwriter_raw(writer, "[", 1);
|
||||
}
|
||||
|
||||
void EndObject()
|
||||
{
|
||||
rjsonwriter_add_end_object(writer);
|
||||
need_comma = true;
|
||||
rjsonwriter_raw(writer, "}", 1);
|
||||
need_comma = true;
|
||||
}
|
||||
|
||||
void EndArray()
|
||||
{
|
||||
rjsonwriter_add_end_array(writer);
|
||||
need_comma = true;
|
||||
rjsonwriter_raw(writer, "]", 1);
|
||||
need_comma = true;
|
||||
}
|
||||
|
||||
void Key(const char* key)
|
||||
{
|
||||
WriteComma();
|
||||
rjsonwriter_add_string(writer, key);
|
||||
rjsonwriter_add_colon(writer);
|
||||
rjsonwriter_raw(writer, ":", 1);
|
||||
}
|
||||
|
||||
void String(const char* val)
|
||||
@@ -125,10 +127,10 @@ class JsonWriter
|
||||
need_comma = true;
|
||||
}
|
||||
|
||||
void Int(int val)
|
||||
void Int(int value)
|
||||
{
|
||||
WriteComma();
|
||||
rjsonwriter_add_int(writer, val);
|
||||
rjsonwriter_rawf(writer, "%d", value);
|
||||
need_comma = true;
|
||||
}
|
||||
|
||||
@@ -155,10 +157,10 @@ class JsonWriter
|
||||
need_comma = true;
|
||||
}
|
||||
|
||||
void Bool(bool val)
|
||||
void Bool(bool value)
|
||||
{
|
||||
WriteComma();
|
||||
rjsonwriter_add_bool(writer, val);
|
||||
rjsonwriter_raw(writer, (value ? "true" : "false"), (value ? 4 : 5));
|
||||
need_comma = true;
|
||||
}
|
||||
};
|
||||
|
||||
Vendored
+10
-33
@@ -141,9 +141,8 @@ __attribute__((always_inline)) static inline int internal_bind_libgamemode_symbo
|
||||
__attribute__((always_inline)) static inline int internal_load_libgamemode(void)
|
||||
{
|
||||
/* We start at 1, 0 is a success and -1 is a fail */
|
||||
if (internal_libgamemode_loaded != 1) {
|
||||
if (internal_libgamemode_loaded != 1)
|
||||
return internal_libgamemode_loaded;
|
||||
}
|
||||
|
||||
/* Anonymous struct type to define our bindings */
|
||||
struct binding {
|
||||
@@ -227,10 +226,8 @@ __attribute__((always_inline)) static inline const char *gamemode_error_string(v
|
||||
{
|
||||
/* If we fail to load the system gamemode, or we have an error string already, return our error
|
||||
* string instead of diverting to the system version */
|
||||
if (internal_load_libgamemode() < 0 || internal_gamemode_client_error_string[0] != '\0') {
|
||||
if (internal_load_libgamemode() < 0 || internal_gamemode_client_error_string[0] != '\0')
|
||||
return internal_gamemode_client_error_string;
|
||||
}
|
||||
|
||||
return REAL_internal_gamemode_error_string();
|
||||
}
|
||||
|
||||
@@ -247,19 +244,11 @@ __attribute__((always_inline)) static inline
|
||||
int gamemode_request_start(void)
|
||||
{
|
||||
/* Need to load gamemode */
|
||||
if (internal_load_libgamemode() < 0) {
|
||||
#ifdef GAMEMODE_AUTO
|
||||
fprintf(stderr, "gamemodeauto: %s\n", gamemode_error_string());
|
||||
#endif
|
||||
if (internal_load_libgamemode() < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (REAL_internal_gamemode_request_start() < 0) {
|
||||
#ifdef GAMEMODE_AUTO
|
||||
fprintf(stderr, "gamemodeauto: %s\n", gamemode_error_string());
|
||||
#endif
|
||||
if (REAL_internal_gamemode_request_start() < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -273,19 +262,11 @@ __attribute__((always_inline)) static inline
|
||||
int gamemode_request_end(void)
|
||||
{
|
||||
/* Need to load gamemode */
|
||||
if (internal_load_libgamemode() < 0) {
|
||||
#ifdef GAMEMODE_AUTO
|
||||
fprintf(stderr, "gamemodeauto: %s\n", gamemode_error_string());
|
||||
#endif
|
||||
if (internal_load_libgamemode() < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (REAL_internal_gamemode_request_end() < 0) {
|
||||
#ifdef GAMEMODE_AUTO
|
||||
fprintf(stderr, "gamemodeauto: %s\n", gamemode_error_string());
|
||||
#endif
|
||||
if (REAL_internal_gamemode_request_end() < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -294,9 +275,8 @@ int gamemode_request_end(void)
|
||||
__attribute__((always_inline)) static inline int gamemode_query_status(void)
|
||||
{
|
||||
/* Need to load gamemode */
|
||||
if (internal_load_libgamemode() < 0) {
|
||||
if (internal_load_libgamemode() < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (REAL_internal_gamemode_query_status == NULL) {
|
||||
snprintf(internal_gamemode_client_error_string,
|
||||
@@ -312,9 +292,8 @@ __attribute__((always_inline)) static inline int gamemode_query_status(void)
|
||||
__attribute__((always_inline)) static inline int gamemode_request_start_for(pid_t pid)
|
||||
{
|
||||
/* Need to load gamemode */
|
||||
if (internal_load_libgamemode() < 0) {
|
||||
if (internal_load_libgamemode() < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (REAL_internal_gamemode_request_start_for == NULL) {
|
||||
snprintf(internal_gamemode_client_error_string,
|
||||
@@ -330,9 +309,8 @@ __attribute__((always_inline)) static inline int gamemode_request_start_for(pid_
|
||||
__attribute__((always_inline)) static inline int gamemode_request_end_for(pid_t pid)
|
||||
{
|
||||
/* Need to load gamemode */
|
||||
if (internal_load_libgamemode() < 0) {
|
||||
if (internal_load_libgamemode() < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (REAL_internal_gamemode_request_end_for == NULL) {
|
||||
snprintf(internal_gamemode_client_error_string,
|
||||
@@ -348,9 +326,8 @@ __attribute__((always_inline)) static inline int gamemode_request_end_for(pid_t
|
||||
__attribute__((always_inline)) static inline int gamemode_query_status_for(pid_t pid)
|
||||
{
|
||||
/* Need to load gamemode */
|
||||
if (internal_load_libgamemode() < 0) {
|
||||
if (internal_load_libgamemode() < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (REAL_internal_gamemode_query_status_for == NULL) {
|
||||
snprintf(internal_gamemode_client_error_string,
|
||||
|
||||
+3
-1
@@ -5364,8 +5364,10 @@ spv::Id TGlslangToSpvTraverser::createAtomicOperation(glslang::TOperator op, spv
|
||||
// Create group invocation operations.
|
||||
spv::Id TGlslangToSpvTraverser::createInvocationsOperation(glslang::TOperator op, spv::Id typeId, std::vector<spv::Id>& operands, glslang::TBasicType typeProxy)
|
||||
{
|
||||
#ifdef AMD_EXTENSIONS
|
||||
bool isUnsigned = isTypeUnsignedInt(typeProxy);
|
||||
bool isFloat = isTypeFloat(typeProxy);
|
||||
bool isFloat = isTypeFloat(typeProxy);
|
||||
#endif
|
||||
|
||||
spv::Op opCode = spv::OpNop;
|
||||
std::vector<spv::Id> spvGroupOperands;
|
||||
|
||||
File mode changed.
File mode changed.
File mode changed.
File mode changed.
File mode changed.
File mode changed.
File mode changed.
File mode changed.
File mode changed.
File mode changed.
Vendored
Executable → Regular
File mode changed.
Vendored
Executable → Regular
File mode changed.
Loaded 100 of 1145 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user