aboutsummaryrefslogtreecommitdiff
path: root/src/library_sdl.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/library_sdl.js')
-rw-r--r--src/library_sdl.js80
1 files changed, 45 insertions, 35 deletions
diff --git a/src/library_sdl.js b/src/library_sdl.js
index 9d947cd4..631de481 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -90,6 +90,7 @@ mergeInto(LibraryManager.library, {
fonts: [null],
keyboardState: null,
+ startTime: null,
mouseX: 0,
mouseY: 0,
@@ -98,6 +99,7 @@ mergeInto(LibraryManager.library, {
40: 1105, // down arrow
37: 1104, // left arrow
39: 1103, // right arrow
+
17: 305, // control (right, or left)
18: 308, // alt
109: 45, // minus
@@ -378,7 +380,13 @@ mergeInto(LibraryManager.library, {
return 0; // success
},
- SDL_WasInit: function() { return 0 }, // TODO
+ SDL_WasInit__deps: ['SDL_Init'],
+ SDL_WasInit: function() {
+ if (SDL.startTime === null) {
+ _SDL_Init();
+ }
+ return 1;
+ },
SDL_GetVideoInfo: function() {
// %struct.SDL_VideoInfo = type { i32, i32, %struct.SDL_PixelFormat*, i32, i32 } - 5 fields of quantum size
@@ -409,6 +417,9 @@ mergeInto(LibraryManager.library, {
},
SDL_Quit: function() {
+ for (var i = 0; i < SDL.audios; i++) {
+ SDL.audios[i].pause();
+ }
Module.print('SDL_Quit called (and ignored)');
},
@@ -460,13 +471,14 @@ mergeInto(LibraryManager.library, {
assert(buffer % 4 == 0, 'Invalid buffer offset: ' + buffer);
var src = buffer >> 2;
var dst = 0;
+ var isScreen = surf == SDL.screen;
while (dst < num) {
// TODO: access underlying data buffer and write in 32-bit chunks or more
var val = HEAP32[src]; // This is optimized. Instead, we could do {{{ makeGetValue('buffer', 'dst', 'i32') }}};
- data[dst] = val & 0xff;
+ data[dst ] = val & 0xff;
data[dst+1] = (val >> 8) & 0xff;
data[dst+2] = (val >> 16) & 0xff;
- data[dst+3] = (val >> 24) & 0xff;
+ data[dst+3] = isScreen ? 0xff : ((val >> 24) & 0xff);
src++;
dst += 4;
}
@@ -717,15 +729,14 @@ mergeInto(LibraryManager.library, {
SDL_CondWait: function() {},
SDL_DestroyCond: function() {},
-//SDL_CreateYUVOverlay
-//SDL_CreateThread, SDL_WaitThread etc
-
// SDL Mixer
- Mix_OpenAudio: function() { return 0 },
+ Mix_OpenAudio: function(frequency, format, channels, chunksize) {
+ return 0;
+ },
Mix_HookMusicFinished: function(func) {
- SDL.hookMusicFinished = func; // TODO: use this
+ SDL.hookMusicFinished = func;
},
Mix_VolumeMusic: function(func) {
@@ -734,46 +745,39 @@ mergeInto(LibraryManager.library, {
Mix_LoadWAV_RW: function(filename, freesrc) {
filename = FS.standardizePath(Pointer_stringify(filename));
+ var raw = preloadedAudios[filename];
+ assert(raw, 'Cannot find preloaded audio ' + filename);
var id = SDL.audios.length;
SDL.audios.push({
- audio: new Audio(filename)
+ source: filename,
+ audio: raw
});
return id;
},
Mix_FreeChunk: function(id) {
- //SDL.audios[id].audio.pause();
- //SDL.audios[id] = null;
- return 0;
+ SDL.audios[id].audio.pause();
+ SDL.audios[id] = null;
},
Mix_PlayChannel: function(channel, id, loops) {
- //var audio = SDL.audios[id].audio;
- //audio.play();
- return 0; // XXX should return channel
+ // TODO: handle loops
+ var audio = SDL.audios[id].audio;
+ if (audio.currentTime) audio.src = audio.src; // This hack prevents lags on replaying // TODO: parallel sounds through //cloneNode(true).play()
+ audio.play();
+ return 1; // XXX should return channel
},
Mix_PlayChannelTimed: 'Mix_PlayChannel', // XXX ignore Timing
- Mix_LoadMUS: function(filename) {
- filename = FS.standardizePath(Pointer_stringify(filename));
- var id = SDL.audios.length;
- SDL.audios.push({
- audio: new Audio(filename)
- });
- return id;
- },
-
- Mix_FreeMusic: function(id) {
- SDL.audios[id].audio.pause();
- SDL.audios[id] = null;
- return 0;
- },
+ Mix_LoadMUS: 'Mix_LoadWAV_RW',
+ Mix_FreeMusic: 'Mix_FreeChunk',
Mix_PlayMusic: function(id, loops) {
- if (loops == 0) return;
+ loops = Math.max(loops, 1);
var audio = SDL.audios[id].audio;
- audio.loop = loop != 1; // TODO: handle N loops for finite N
+ audio.loop = loops != 1; // TODO: handle N loops for finite N
audio.play();
+ SDL.music = audio;
return 0;
},
@@ -789,15 +793,21 @@ mergeInto(LibraryManager.library, {
return 0;
},
- Mix_HaltMusic: function(id) {
- var audio = SDL.audios[id].audio;
- audio.pause(); // TODO: actually rewind to the beginning
+ Mix_HaltMusic: function() {
+ var audio = SDL.music;
+ if (!audio) return 0;
+ audio.src = audio.src; // rewind
+ audio.pause();
+ SDL.music = null;
+ if (SDL.hookMusicFinished) {
+ FUNCTION_TABLE[SDL.hookMusicFinished]();
+ }
return 0;
},
Mix_FadeInMusicPos: 'Mix_PlayMusic', // XXX ignore fading in effect
- Mix_FadeOutMusic: function(id) {}, // TODO
+ Mix_FadeOutMusic: 'Mix_HaltMusic', // XXX ignore fading out effect
// SDL TTF