diff --git a/docs/_docs/running.md b/docs/_docs/running.md index 58bcfded..4968f04a 100644 --- a/docs/_docs/running.md +++ b/docs/_docs/running.md @@ -13,9 +13,9 @@ Command line flags are loaded from and saved to `$HOME/.redream/flags` each run. ``` --bios Path to BIOS [default: dc_boot.bin] --flash Path to flash ROM [default: dc_flash.bin] - --latency Set preferred audio latency in MS [default: 100] - --controller Path to controller profile - --throttle Throttle emulation speed to match the original hardware [default: 1] + --audio Enable audio [default: 1] + --latency Preferred audio latency in MS [default: 100] + --profile Path to controller profile --verbose Enable debug logging [default: 0] --perf Write perf-compatible maps for generated code [default: 0] --gdb Start GDB debug server [default: 0] diff --git a/src/audio/soundio_backend.c b/src/audio/soundio_backend.c index 5a419e46..3c8c2c5d 100644 --- a/src/audio/soundio_backend.c +++ b/src/audio/soundio_backend.c @@ -2,7 +2,7 @@ #include "audio/audio_backend.h" #include "hw/aica/aica.h" -DEFINE_OPTION_INT(latency, 100, "Set preferred audio latency in MS"); +DEFINE_OPTION_INT(latency, 100, "Preferred audio latency in MS"); struct audio_backend { struct aica *aica; diff --git a/src/emu/emulator.c b/src/emu/emulator.c index 1021697f..a3c2a010 100644 --- a/src/emu/emulator.c +++ b/src/emu/emulator.c @@ -19,6 +19,8 @@ DEFINE_AGGREGATE_COUNTER(frames); +DEFINE_OPTION_INT(audio, 1, "Enable audio"); + struct emu { struct window *window; struct window_listener listener; @@ -145,12 +147,15 @@ static void emu_close(void *data) { static void *emu_core_thread(void *data) { struct emu *emu = data; - struct audio_backend *audio = audio_create(emu->dc->aica); + struct audio_backend *audio = NULL; - if (!audio) { - LOG_WARNING("Audio backend creation failed"); - emu->running = 0; - return 0; + if (OPTION_audio) { + audio = audio_create(emu->dc->aica); + + if (!audio) { + LOG_WARNING("Audio backend creation failed"); + goto exit; + } } static const int64_t MACHINE_STEP = HZ_TO_NANO(1000); @@ -158,22 +163,29 @@ static void *emu_core_thread(void *data) { int64_t next_pump_time = 0; while (emu->running) { - while (audio_buffer_low(audio) && emu->running) { + /* run a slice of dreamcast time if the available audio is running low. this + effectively synchronizes the emulation speed with the host audio clock. + note however, if audio is disabled, the emulator will run as fast as + possible */ + if (!audio || audio_buffer_low(audio)) { dc_tick(emu->dc, MACHINE_STEP); + } - current_time = time_nanoseconds(); + /* update profiler stats */ + current_time = time_nanoseconds(); + prof_update(current_time); - prof_update(current_time); - - /* audio events are just for device connections, check infrequently */ - if (current_time > next_pump_time) { - audio_pump_events(audio); - next_pump_time = current_time + NS_PER_SEC; - } + /* check audio events (device connect / disconnect, etc.) infrequently */ + if (audio && current_time > next_pump_time) { + audio_pump_events(audio); + next_pump_time = current_time + NS_PER_SEC; } } - audio_destroy(audio); +exit: + if (audio) { + audio_destroy(audio); + } emu->running = 0;