mirror of
https://github.com/libretro/RetroArch
synced 2025-04-16 08:43:10 +00:00
Emscripten related fixes.
- audio/audio_dsp_filter.c: append_plugs() should only be called if HAVE_DYLIB - emscripten/library_rwebaudio.js: Performance improvements, and fallback support for browsers that don't support the Performance API. (e.g. mobile Safari) - emscripten/library_rwebinput.js: Improve mouse handling. Still not optimal, but works with browsers that don't support mouse capturing. - frontend/drivers/platform_emscripten.c: Added global function for easy access to certain RetroArch features from JavaScript. - gfx/video_driver.h: Disabling HAVE_MENU incorrectly disabled set_texture_enable() - input/drivers/rwebinput_input.c: Missing header file: "../input_joypad.h". - Makefile.emscripten: Cleanup and make sure the appropriate functions are exported.
This commit is contained in:
parent
3222351ef0
commit
58748da89d
@ -23,7 +23,11 @@ ifneq ($(NATIVE_ZLIB),)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
LIBS :=
|
LIBS :=
|
||||||
LDFLAGS := -L. -s TOTAL_MEMORY=$(MEMORY) -s OUTLINING_LIMIT=50000 --js-library emscripten/library_rwebaudio.js --js-library emscripten/library_rwebinput.js --js-library emscripten/library_rwebcam.js --no-heap-copy
|
LDFLAGS := -L. --no-heap-copy -s USE_ZLIB=1 `-s TOTAL_MEMORY=$(MEMORY) -s OUTLINING_LIMIT=50000 \
|
||||||
|
-s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_load_state', '_cmd_take_screenshot']" \
|
||||||
|
--js-library emscripten/library_rwebaudio.js \
|
||||||
|
--js-library emscripten/library_rwebinput.js \
|
||||||
|
--js-library emscripten/library_rwebcam.js
|
||||||
|
|
||||||
include Makefile.common
|
include Makefile.common
|
||||||
|
|
||||||
@ -67,7 +71,8 @@ else
|
|||||||
CFLAGS += -O2
|
CFLAGS += -O2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CFLAGS += -Wall -Wno-unused-result -Wno-unused-variable -I. -Ilibretro-common/include -std=gnu99
|
CFLAGS += -DWANT_RPNG -Wall -Wno-unused-result -Wno-unused-variable -I. -Ilibretro-common/include -std=gnu99 -s USE_ZLIB=1 \
|
||||||
|
-s EXPORTED_FUNCTIONS="['_main', '_malloc', '_cmd_savefiles', '_cmd_save_state', '_cmd_take_screenshot']"
|
||||||
|
|
||||||
all: $(TARGET)
|
all: $(TARGET)
|
||||||
|
|
||||||
|
@ -246,8 +246,11 @@ rarch_dsp_filter_t *rarch_dsp_filter_new(
|
|||||||
if (!plugs)
|
if (!plugs)
|
||||||
goto error;
|
goto error;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_DYLIB)
|
||||||
if (!append_plugs(dsp, plugs))
|
if (!append_plugs(dsp, plugs))
|
||||||
goto error;
|
goto error;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (plugs)
|
if (plugs)
|
||||||
string_list_free(plugs);
|
string_list_free(plugs);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//"use strict";
|
"use strict";
|
||||||
|
|
||||||
var LibraryRWebAudio = {
|
var LibraryRWebAudio = {
|
||||||
$RA__deps: ['$Browser', 'usleep'],
|
$RA__deps: ['$Browser', 'usleep'],
|
||||||
@ -11,19 +11,33 @@ var LibraryRWebAudio = {
|
|||||||
bufIndex: 0,
|
bufIndex: 0,
|
||||||
bufOffset: 0,
|
bufOffset: 0,
|
||||||
startTime: 0,
|
startTime: 0,
|
||||||
|
performance: null,
|
||||||
nonblock: false,
|
nonblock: false,
|
||||||
currentTimeWorkaround: false,
|
performanceSupported: false,
|
||||||
|
|
||||||
setStartTime: function() {
|
setStartTime: function() {
|
||||||
|
RA.performance = window['performance'] || window['webkitPerformance'] || window['msPerformance'] || window['mozPerformance'];
|
||||||
|
if (RA.performance) {
|
||||||
|
RA.performanceSupported = true;
|
||||||
|
} else {
|
||||||
|
RA.performanceSupported = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (RA.context.currentTime) {
|
if (RA.context.currentTime) {
|
||||||
RA.startTime = window['performance']['now']() - RA.context.currentTime * 1000;
|
var now = RA.performanceSupported ? RA.performance.now() : Date.now();
|
||||||
Module["resumeMainLoop"]();
|
RA.startTime = now - RA.context.currentTime * 1000;
|
||||||
} else window['setTimeout'](RA.setStartTime, 0);
|
Module["resumeMainLoop"];
|
||||||
|
} else {
|
||||||
|
window.setTimeout(RA.setStartTime, 0);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
getCurrentPerfTime: function() {
|
getCurrentPerfTime: function() {
|
||||||
if (RA.startTime) return (window['performance']['now']() - RA.startTime) / 1000;
|
if (true === RA.performanceSupported) {
|
||||||
else throw 'getCurrentPerfTime() called before start time set';
|
return (RA.performance.now() - RA.startTime) / 1000;
|
||||||
|
} else {
|
||||||
|
return (Date.now() - RA.startTime) / 1000;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
process: function(queueBuffers) {
|
process: function(queueBuffers) {
|
||||||
@ -78,11 +92,14 @@ var LibraryRWebAudio = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
RWebAudioInit: function(latency) {
|
RWebAudioInit: function(latency) {
|
||||||
var ac = window['AudioContext'] || window['webkitAudioContext'];
|
Module.pauseMainLoop();
|
||||||
|
if (!RA.context) {
|
||||||
if (!ac) return 0;
|
var ac = window['AudioContext'] || window['webkitAudioContext'];
|
||||||
|
if (!ac) {
|
||||||
RA.context = new ac();
|
return 0;
|
||||||
|
}
|
||||||
|
RA.context = new ac();
|
||||||
|
}
|
||||||
|
|
||||||
RA.numBuffers = ((latency * RA.context.sampleRate) / (1000 * RA.BUFFER_SIZE))|0;
|
RA.numBuffers = ((latency * RA.context.sampleRate) / (1000 * RA.BUFFER_SIZE))|0;
|
||||||
if (RA.numBuffers < 2) RA.numBuffers = 2;
|
if (RA.numBuffers < 2) RA.numBuffers = 2;
|
||||||
@ -93,8 +110,8 @@ var LibraryRWebAudio = {
|
|||||||
RA.startTime = 0;
|
RA.startTime = 0;
|
||||||
// chrome hack to get currentTime running
|
// chrome hack to get currentTime running
|
||||||
RA.context.createGain();
|
RA.context.createGain();
|
||||||
window['setTimeout'](RA.setStartTime, 0);
|
RA.setStartTime();
|
||||||
Module["pauseMainLoop"]();
|
|
||||||
return 1;
|
return 1;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -5,22 +5,13 @@ var LibraryRWebInput = {
|
|||||||
$RI: {
|
$RI: {
|
||||||
temp: null,
|
temp: null,
|
||||||
contexts: [],
|
contexts: [],
|
||||||
|
stateX: 0,
|
||||||
|
stateY: 0,
|
||||||
|
currentX: 0,
|
||||||
|
currentY: 0,
|
||||||
|
|
||||||
eventHandler: function(event) {
|
canvasEventHandler: function(event) {
|
||||||
var i;
|
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
case 'mousemove':
|
|
||||||
var x = event['movementX'] || event['mozMovementX'] || event['webkitMovementX'];
|
|
||||||
var y = event['movementY'] || event['mozMovementY'] || event['webkitMovementY'];
|
|
||||||
for (i = 0; i < RI.contexts.length; i++) {
|
|
||||||
var oldX = {{{ makeGetValue('RI.contexts[i].state', '32', 'i32') }}};
|
|
||||||
var oldY = {{{ makeGetValue('RI.contexts[i].state', '36', 'i32') }}};
|
|
||||||
x += oldX;
|
|
||||||
y += oldY;
|
|
||||||
{{{ makeSetValue('RI.contexts[i].state', '32', 'x', 'i32') }}};
|
|
||||||
{{{ makeSetValue('RI.contexts[i].state', '36', 'y', 'i32') }}};
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'mouseup':
|
case 'mouseup':
|
||||||
case 'mousedown':
|
case 'mousedown':
|
||||||
var value;
|
var value;
|
||||||
@ -30,10 +21,53 @@ var LibraryRWebInput = {
|
|||||||
else break;
|
else break;
|
||||||
if (event.type === 'mouseup') value = 0;
|
if (event.type === 'mouseup') value = 0;
|
||||||
else value = 1;
|
else value = 1;
|
||||||
for (i = 0; i < RI.contexts.length; i++) {
|
for (var i = 0; i < RI.contexts.length; i++) {
|
||||||
{{{ makeSetValue('RI.contexts[i].state', 'offset', 'value', 'i8') }}};
|
{{{ makeSetValue('RI.contexts[i].state', 'offset', 'value', 'i8') }}};
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
eventHandler: function(event) {
|
||||||
|
var i;
|
||||||
|
switch (event.type) {
|
||||||
|
case 'mousemove':
|
||||||
|
var x = 0;
|
||||||
|
var y = 0;
|
||||||
|
|
||||||
|
var newX = event['clientX'] - Module.canvas.offsetLeft;
|
||||||
|
var newY = event['clientY'] - Module.canvas.offsetTop;
|
||||||
|
|
||||||
|
if (newX < 0) {
|
||||||
|
newX = 0;
|
||||||
|
x = -Module.canvas.offsetWidth;
|
||||||
|
} else if (newX > Module.canvas.offsetWidth) {
|
||||||
|
newX = Module.canvas.offsetWidth;
|
||||||
|
x = Module.canvas.offsetWidth;
|
||||||
|
} else {
|
||||||
|
x = newX - RI.currentX;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newY < 0) {
|
||||||
|
newY = 0;
|
||||||
|
y = -Module.canvas.offsetHeight;
|
||||||
|
} else if (newY > Module.canvas.offsetHeight) {
|
||||||
|
newY = Module.canvas.offsetHeight;
|
||||||
|
y = Module.canvas.offsetHeight;
|
||||||
|
} else {
|
||||||
|
y = newY - RI.currentY;
|
||||||
|
}
|
||||||
|
|
||||||
|
RI.currentX = newX;
|
||||||
|
RI.currentY = newY;
|
||||||
|
|
||||||
|
for (i = 0; i < RI.contexts.length; i++) {
|
||||||
|
{{{ makeSetValue('RI.contexts[i].state', '32', 'x', 'i32') }}};
|
||||||
|
{{{ makeSetValue('RI.contexts[i].state', '36', 'y', 'i32') }}};
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
case 'keyup':
|
case 'keyup':
|
||||||
case 'keydown':
|
case 'keydown':
|
||||||
var key = event.keyCode;
|
var key = event.keyCode;
|
||||||
@ -48,6 +82,7 @@ var LibraryRWebInput = {
|
|||||||
}
|
}
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'blur':
|
case 'blur':
|
||||||
case 'visibilitychange':
|
case 'visibilitychange':
|
||||||
for (i = 0; i < RI.contexts.length; i++) {
|
for (i = 0; i < RI.contexts.length; i++) {
|
||||||
@ -63,8 +98,8 @@ var LibraryRWebInput = {
|
|||||||
document.addEventListener('keyup', RI.eventHandler, false);
|
document.addEventListener('keyup', RI.eventHandler, false);
|
||||||
document.addEventListener('keydown', RI.eventHandler, false);
|
document.addEventListener('keydown', RI.eventHandler, false);
|
||||||
document.addEventListener('mousemove', RI.eventHandler, false);
|
document.addEventListener('mousemove', RI.eventHandler, false);
|
||||||
document.addEventListener('mouseup', RI.eventHandler, false);
|
Module.canvas.addEventListener('mouseup', RI.canvasEventHandler, false);
|
||||||
document.addEventListener('mousedown', RI.eventHandler, false);
|
Module.canvas.addEventListener('mousedown', RI.canvasEventHandler, false);
|
||||||
document.addEventListener('blur', RI.eventHandler, false);
|
document.addEventListener('blur', RI.eventHandler, false);
|
||||||
document.addEventListener('onvisbilitychange', RI.eventHandler, false);
|
document.addEventListener('onvisbilitychange', RI.eventHandler, false);
|
||||||
}
|
}
|
||||||
@ -95,8 +130,8 @@ var LibraryRWebInput = {
|
|||||||
document.removeEventListener('keyup', RI.eventHandler, false);
|
document.removeEventListener('keyup', RI.eventHandler, false);
|
||||||
document.removeEventListener('keydown', RI.eventHandler, false);
|
document.removeEventListener('keydown', RI.eventHandler, false);
|
||||||
document.removeEventListener('mousemove', RI.eventHandler, false);
|
document.removeEventListener('mousemove', RI.eventHandler, false);
|
||||||
document.removeEventListener('mouseup', RI.eventHandler, false);
|
Module.canvas.removeEventListener('mouseup', RI.canvasEventHandler, false);
|
||||||
document.removeEventListener('mousedown', RI.eventHandler, false);
|
Module.canvas.removeEventListener('mousedown', RI.canvasEventHandler, false);
|
||||||
document.removeEventListener('blur', RI.eventHandler, false);
|
document.removeEventListener('blur', RI.eventHandler, false);
|
||||||
document.removeEventListener('onvisbilitychange', RI.eventHandler, false);
|
document.removeEventListener('onvisbilitychange', RI.eventHandler, false);
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,8 @@
|
|||||||
#include <file/config_file.h>
|
#include <file/config_file.h>
|
||||||
#include "../../content.h"
|
#include "../../content.h"
|
||||||
#include "../frontend.h"
|
#include "../frontend.h"
|
||||||
|
//#include "../../retroarch.h"
|
||||||
|
//#include "../../runloop.h"
|
||||||
#include "../frontend_driver.h"
|
#include "../frontend_driver.h"
|
||||||
#include "../runloop_data.h"
|
#include "../runloop_data.h"
|
||||||
|
|
||||||
@ -34,6 +36,27 @@ static void emscripten_mainloop(void)
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cmd_savefiles()
|
||||||
|
{
|
||||||
|
rarch_main_command(RARCH_CMD_SAVEFILES);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmd_save_state()
|
||||||
|
{
|
||||||
|
rarch_main_command(RARCH_CMD_SAVE_STATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmd_load_state()
|
||||||
|
{
|
||||||
|
rarch_main_command(RARCH_CMD_LOAD_STATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmd_take_screenshot()
|
||||||
|
{
|
||||||
|
rarch_main_command(RARCH_CMD_TAKE_SCREENSHOT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
settings_t *settings = config_get_ptr();
|
settings_t *settings = config_get_ptr();
|
||||||
|
@ -115,10 +115,10 @@ typedef struct video_poke_interface
|
|||||||
/* Update texture. */
|
/* Update texture. */
|
||||||
void (*set_texture_frame)(void *data, const void *frame, bool rgb32,
|
void (*set_texture_frame)(void *data, const void *frame, bool rgb32,
|
||||||
unsigned width, unsigned height, float alpha);
|
unsigned width, unsigned height, float alpha);
|
||||||
|
#endif
|
||||||
/* Enable or disable rendering. */
|
/* Enable or disable rendering. */
|
||||||
void (*set_texture_enable)(void *data, bool enable, bool full_screen);
|
void (*set_texture_enable)(void *data, bool enable, bool full_screen);
|
||||||
#endif
|
|
||||||
void (*set_osd_msg)(void *data, const char *msg,
|
void (*set_osd_msg)(void *data, const char *msg,
|
||||||
const struct font_params *params, void *font);
|
const struct font_params *params, void *font);
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "../input_autodetect.h"
|
#include "../input_autodetect.h"
|
||||||
#include "../input_common.h"
|
#include "../input_common.h"
|
||||||
#include "../input_keymaps.h"
|
#include "../input_keymaps.h"
|
||||||
|
//#include "../input_joypad.h"
|
||||||
|
|
||||||
#include "../../driver.h"
|
#include "../../driver.h"
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user