Ok for future visitors, I finally got around to try it out and here's a 
solution that seems to work fine:

- I'm using soloud (http://sol.gfxile.net/soloud/) with the sdl_static 
backend
- I'm skipping soloud init and all calls into it until WebAudio has been 
'unlocked'
- in a mousedown / touchstart event handler installed with the 
emscripten_set_mousedown/touchstart_callback function I have a an inline 
EM_ASM block which calls SDL.openAudioContext() in the browser module 
before the SDL_OpenAudio does, and do the things described here 
(https://paulbakaus.com/tutorials/html5/web-audio-on-ios/ )

This is what the complete input event callback looks like (I'm currently 
doing the same thing on all browsers):

    // on iOS, WebAudio can only be initialized from a touch event,

    // so we initialize soloud from within here, and tell the soundMgr

    // that it is ok now to play audio 

    //

    // https://paulbakaus.com/tutorials/html5/web-audio-on-ios/

    EM_ASM(

        SDL.openAudioContext();

var buffer = SDL.audioContext.createBuffer(1, 1, 22050);

var source = SDL.audioContext.createBufferSource();

source.buffer = buffer;

source.connect(SDL.audioContext.destination);

source.start(0);

    );


    SoundMgr* self = (SoundMgr*) userData;

    if (!self->audioValid) {

        self->soloud.init();

        self->audioValid = true;

    }

    return false;


Am Freitag, 9. Dezember 2016 08:55:00 UTC+1 schrieb Floh:
>
> That link gives a good description of the problem and why Apple is doing 
> this, thanks!
>
> I'll play around with your suggestions, I think I'll the hooking to a 
> touch event first via the emscripten event functions and then use EM_ASM to 
> unlock the WebAudio context. I'd like to avoid to delay main() execution 
> until tapped, instead I'll just let the emulator 'freeze', and if I'm 
> detecting that it is in this frozen state, ask the user to "Tap to 
> Unfreeze" or something.
>
> The emulator is a bit of a special case because of thatl freeze if there's 
> no audio playback, I think most other apps/games would be fine if audio 
> playback is muted until the first tap.
>
> Cheers,
> -Floh.
>
> Am Donnerstag, 8. Dezember 2016 09:11:54 UTC+1 schrieb jj:
>>
>> I think the example 2 from 
>> https://paulbakaus.com/tutorials/html5/web-audio-on-ios/#How_do_I_know_when_my_context_is_unlocked
>>  
>> should be usable with fair ease, e.g. via a --pre-js, or via using the 
>> emscripten/html5.h event handler registration functions. Would that work?
>>
>> This could be done as a runDependency (add/removeRunDependency() 
>> functions) to create that kind of "tap to play" type of launcher, which 
>> user would need to tap on to make the Emscripten main() actually run. (or 
>> if you have another location after main() but before the render loop, that 
>> might be a suitable place as well)
>>
>> 2016-12-06 15:16 GMT+02:00 Floh <[email protected]>:
>>
>>> Hi, 
>>>
>>> on iOS Safari since iOS9, WebAudio will only work if 'unlocked' from an 
>>> input event handler connected to a touch input event. Apart from the fact 
>>> that I think that this is completely stupid and braindead behaviour of 
>>> Safari, I'm looking for advice on how to best deal with this from the 
>>> emscripten side (and more specifically, emscripten's SDL Audio wrapper)?
>>>
>>> This behaviour has the unfortunate effect in my emulator (
>>> http://floooh.github.io/virtualkc/), that the emulator simply 'freezes' 
>>> on iOS a few thousand cycles into the emulation since the emulator speed is 
>>> linked to the audio playback (the emulated CPU will wait for or catch up 
>>> whenever a new audio buffer is requested, but those buffer requests never 
>>> happen). All my other demos with sound output are completely silent.
>>>
>>> There is this issue thread on the topic: 
>>> https://github.com/emscripten-ports/SDL2/issues/19, but this looks like 
>>> a hack and is hard to integrate with my code (I'm simply using the SoLoud 
>>> audio lib with the SDL backend).
>>>
>>> So my questions:
>>>
>>> - did anybody find a smaller / more elegant workaround which doen't use 
>>> the SDL event system and is as non-intrusive as possible?
>>>
>>> - is this something that should better go into the emscripten SDL 
>>> wrapper code? (for instance, all SDL code would silently appear to work on 
>>> iOS without sound output until a touch event happens?)
>>>
>>> Thanks & Cheers,
>>> -Floh.
>>>
>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "emscripten-discuss" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to [email protected].
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to