From c24b456211be44d4a0af9c14846a2c6ac823a41d Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 5 Jun 2023 00:02:54 +0200 Subject: [PATCH] Windows: unconditionally request high timer resolution Previously timeBeginPeriod() was only called when MIDI system was set to WinMME. It was also possible that it was never unset in case starting the engine failed. This significantly speeds up freewheel export which uses Glib::usleep(100) when MIDI is disabled. see also: https://randomascii.wordpress.com/2020/10/04/windows-timer-resolution-the-great-rule-change/ --- libs/backends/dummy/dummy_audiobackend.cc | 7 +++++++ libs/backends/portaudio/portaudio_backend.cc | 3 +++ libs/backends/portaudio/winmmemidi_io.cc | 4 ---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc index 9c757d95ab..aed0a30921 100644 --- a/libs/backends/dummy/dummy_audiobackend.cc +++ b/libs/backends/dummy/dummy_audiobackend.cc @@ -932,6 +932,10 @@ DummyAudioBackend::main_process_thread () manager.registration_callback(); manager.graph_order_callback(); +#ifdef PLATFORM_WINDOWS + PBD::MMTIMERS::set_min_resolution(); +#endif + int64_t clock1; clock1 = -1; while (_running) { @@ -1036,6 +1040,9 @@ DummyAudioBackend::main_process_thread () } } +#ifdef PLATFORM_WINDOWS + PBD::MMTIMERS::reset_resolution(); +#endif _running = false; return 0; } diff --git a/libs/backends/portaudio/portaudio_backend.cc b/libs/backends/portaudio/portaudio_backend.cc index ab1044639a..4a4ed2580d 100644 --- a/libs/backends/portaudio/portaudio_backend.cc +++ b/libs/backends/portaudio/portaudio_backend.cc @@ -681,12 +681,14 @@ PortAudioBackend::_start (bool for_latency_measurement) if (!start_blocking_process_thread()) { return ProcessThreadStartError; } + PBD::MMTIMERS::set_min_resolution(); } else { if (_pcmio->start_stream() != paNoError) { DEBUG_AUDIO("Unable to start stream\n"); return AudioDeviceOpenError; } + PBD::MMTIMERS::set_min_resolution(); if (!start_freewheel_process_thread()) { DEBUG_AUDIO("Unable to start freewheel thread\n"); stop(); @@ -833,6 +835,7 @@ PortAudioBackend::stop () } _midiio->stop(); + PBD::MMTIMERS::reset_resolution(); _run = false; diff --git a/libs/backends/portaudio/winmmemidi_io.cc b/libs/backends/portaudio/winmmemidi_io.cc index 5b8b31b55c..e288eae40d 100644 --- a/libs/backends/portaudio/winmmemidi_io.cc +++ b/libs/backends/portaudio/winmmemidi_io.cc @@ -26,7 +26,6 @@ #include "pbd/error.h" #include "pbd/compose.h" -#include "pbd/windows_timer_utils.h" #include "winmmemidi_io.h" #include "debug.h" @@ -137,7 +136,6 @@ WinMMEMidiIO::start () m_run = true; DEBUG_MIDI ("Starting MIDI driver\n"); - PBD::MMTIMERS::set_min_resolution(); discover(); start_devices (); } @@ -156,8 +154,6 @@ WinMMEMidiIO::stop () pthread_mutex_lock (&m_device_lock); cleanup (); pthread_mutex_unlock (&m_device_lock); - - PBD::MMTIMERS::reset_resolution(); } void