destroy and recreate voice on suspend and resume

This commit is contained in:
Sebastian Krzyszkowiak 2019-02-07 04:11:40 +01:00
parent b07c9033e9
commit 26a32fd083
No known key found for this signature in database
GPG key ID: E8F235CF3BDBC3FF
3 changed files with 32 additions and 13 deletions

View file

@ -177,6 +177,28 @@ SYMBOL_INTERNAL void ResizeGamestates(struct Game* game) {
} }
} }
SYMBOL_INTERNAL int SetupAudio(struct Game* game) {
int samplerate = strtol(GetConfigOptionDefault(game, "SuperDerpy", "samplerate", "44100"), NULL, 10);
#ifdef __EMSCRIPTEN__
game->audio.v = al_create_voice(samplerate, ALLEGRO_AUDIO_DEPTH_FLOAT32, ALLEGRO_CHANNEL_CONF_2);
#else
game->audio.v = al_create_voice(samplerate, ALLEGRO_AUDIO_DEPTH_INT16, ALLEGRO_CHANNEL_CONF_2);
if (!game->audio.v) {
// fallback
game->audio.v = al_create_voice(samplerate, ALLEGRO_AUDIO_DEPTH_FLOAT32, ALLEGRO_CHANNEL_CONF_2);
}
#endif
al_set_default_voice(game->audio.v);
if (game->audio.v) {
al_attach_mixer_to_voice(game->audio.mixer, game->audio.v);
} else {
PrintConsole(game, "Could not create audio voice!");
return 1;
}
return 0;
}
SYMBOL_INTERNAL void DrawConsole(struct Game* game) { SYMBOL_INTERNAL void DrawConsole(struct Game* game) {
double game_time = al_get_time(); double game_time = al_get_time();
if (game->_priv.showconsole) { if (game->_priv.showconsole) {
@ -572,7 +594,11 @@ SYMBOL_INTERNAL void PauseExecution(struct Game* game) {
return; return;
} }
game->_priv.paused = true; game->_priv.paused = true;
if (game->audio.v) {
al_detach_voice(game->audio.v); al_detach_voice(game->audio.v);
}
al_set_default_voice(NULL);
game->audio.v = NULL;
FreezeGamestates(game); FreezeGamestates(game);
PrintConsole(game, "Engine halted."); PrintConsole(game, "Engine halted.");
} }
@ -606,7 +632,7 @@ SYMBOL_INTERNAL void ResumeExecution(struct Game* game) {
return; return;
} }
UnfreezeGamestates(game); UnfreezeGamestates(game);
al_attach_mixer_to_voice(game->audio.mixer, game->audio.v); SetupAudio(game);
game->_priv.paused = false; game->_priv.paused = false;
game->_priv.timestamp = al_get_time(); game->_priv.timestamp = al_get_time();
PrintConsole(game, "Engine resumed."); PrintConsole(game, "Engine resumed.");

View file

@ -101,6 +101,7 @@ void ReloadGamestates(struct Game* game);
void FreezeGamestates(struct Game* game); void FreezeGamestates(struct Game* game);
void UnfreezeGamestates(struct Game* game); void UnfreezeGamestates(struct Game* game);
void ResizeGamestates(struct Game* game); void ResizeGamestates(struct Game* game);
int SetupAudio(struct Game* game);
void DrawConsole(struct Game* game); void DrawConsole(struct Game* game);
void Console_Load(struct Game* game); void Console_Load(struct Game* game);
void Console_Unload(struct Game* game); void Console_Unload(struct Game* game);

View file

@ -283,20 +283,10 @@ SYMBOL_EXPORT struct Game* libsuperderpy_init(int argc, char** argv, const char*
} }
int samplerate = strtol(GetConfigOptionDefault(game, "SuperDerpy", "samplerate", "44100"), NULL, 10); int samplerate = strtol(GetConfigOptionDefault(game, "SuperDerpy", "samplerate", "44100"), NULL, 10);
#ifdef __EMSCRIPTEN__
game->audio.v = al_create_voice(samplerate, ALLEGRO_AUDIO_DEPTH_FLOAT32, ALLEGRO_CHANNEL_CONF_2);
#else
game->audio.v = al_create_voice(samplerate, ALLEGRO_AUDIO_DEPTH_INT16, ALLEGRO_CHANNEL_CONF_2);
if (!game->audio.v) {
// fallback
game->audio.v = al_create_voice(samplerate, ALLEGRO_AUDIO_DEPTH_FLOAT32, ALLEGRO_CHANNEL_CONF_2);
}
#endif
game->audio.mixer = al_create_mixer(samplerate, ALLEGRO_AUDIO_DEPTH_FLOAT32, ALLEGRO_CHANNEL_CONF_2); game->audio.mixer = al_create_mixer(samplerate, ALLEGRO_AUDIO_DEPTH_FLOAT32, ALLEGRO_CHANNEL_CONF_2);
game->audio.fx = al_create_mixer(samplerate, ALLEGRO_AUDIO_DEPTH_FLOAT32, ALLEGRO_CHANNEL_CONF_2); game->audio.fx = al_create_mixer(samplerate, ALLEGRO_AUDIO_DEPTH_FLOAT32, ALLEGRO_CHANNEL_CONF_2);
game->audio.music = al_create_mixer(samplerate, ALLEGRO_AUDIO_DEPTH_FLOAT32, ALLEGRO_CHANNEL_CONF_2); game->audio.music = al_create_mixer(samplerate, ALLEGRO_AUDIO_DEPTH_FLOAT32, ALLEGRO_CHANNEL_CONF_2);
game->audio.voice = al_create_mixer(samplerate, ALLEGRO_AUDIO_DEPTH_FLOAT32, ALLEGRO_CHANNEL_CONF_2); game->audio.voice = al_create_mixer(samplerate, ALLEGRO_AUDIO_DEPTH_FLOAT32, ALLEGRO_CHANNEL_CONF_2);
al_attach_mixer_to_voice(game->audio.mixer, game->audio.v);
al_attach_mixer_to_mixer(game->audio.fx, game->audio.mixer); al_attach_mixer_to_mixer(game->audio.fx, game->audio.mixer);
al_attach_mixer_to_mixer(game->audio.music, game->audio.mixer); al_attach_mixer_to_mixer(game->audio.music, game->audio.mixer);
al_attach_mixer_to_mixer(game->audio.voice, game->audio.mixer); al_attach_mixer_to_mixer(game->audio.voice, game->audio.mixer);
@ -304,6 +294,7 @@ SYMBOL_EXPORT struct Game* libsuperderpy_init(int argc, char** argv, const char*
al_set_mixer_gain(game->audio.music, game->config.music / 10.0); al_set_mixer_gain(game->audio.music, game->config.music / 10.0);
al_set_mixer_gain(game->audio.voice, game->config.voice / 10.0); al_set_mixer_gain(game->audio.voice, game->config.voice / 10.0);
al_set_mixer_gain(game->audio.mixer, game->config.mute ? 0.0 : 1.0); al_set_mixer_gain(game->audio.mixer, game->config.mute ? 0.0 : 1.0);
SetupAudio(game);
al_set_default_mixer(game->audio.mixer); al_set_default_mixer(game->audio.mixer);
setlocale(LC_NUMERIC, "C"); setlocale(LC_NUMERIC, "C");
@ -477,11 +468,12 @@ SYMBOL_EXPORT void libsuperderpy_destroy(struct Game* game) {
al_destroy_display(game->display); al_destroy_display(game->display);
al_destroy_user_event_source(&(game->event_source)); al_destroy_user_event_source(&(game->event_source));
al_destroy_event_queue(game->_priv.event_queue); al_destroy_event_queue(game->_priv.event_queue);
al_set_default_mixer(NULL); // does not destroy anything
al_destroy_mixer(game->audio.fx); al_destroy_mixer(game->audio.fx);
al_destroy_mixer(game->audio.music); al_destroy_mixer(game->audio.music);
al_destroy_mixer(game->audio.voice); al_destroy_mixer(game->audio.voice);
al_destroy_mixer(game->audio.mixer); al_destroy_mixer(game->audio.mixer);
al_destroy_voice(game->audio.v); al_set_default_voice(NULL); // destroys game->audio.v voice
al_destroy_cond(game->_priv.texture_sync_cond); al_destroy_cond(game->_priv.texture_sync_cond);
al_destroy_mutex(game->_priv.texture_sync_mutex); al_destroy_mutex(game->_priv.texture_sync_mutex);
al_destroy_cond(game->_priv.bsod_cond); al_destroy_cond(game->_priv.bsod_cond);