diff options
Diffstat (limited to 'src/library_sdl.js')
-rw-r--r-- | src/library_sdl.js | 80 |
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 |