mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 23:05:04 +01:00
Move coreaudio_set_realtime_policy into libpbd
This commit is contained in:
parent
fee03dc467
commit
c0dbe8eaaf
4 changed files with 41 additions and 35 deletions
|
|
@ -333,10 +333,10 @@ CoreAudioBackend::set_buffer_size (uint32_t bs)
|
||||||
_samples_per_period = bs;
|
_samples_per_period = bs;
|
||||||
_pcmio->set_samples_per_period(bs);
|
_pcmio->set_samples_per_period(bs);
|
||||||
if (_run) {
|
if (_run) {
|
||||||
coreaudio_set_realtime_policy (_main_thread);
|
pbd_mach_set_realtime_policy (_main_thread, 1e9 * _samples_per_period / _samplerate);
|
||||||
}
|
}
|
||||||
for (std::vector<pthread_t>::const_iterator i = _threads.begin (); i != _threads.end (); ++i) {
|
for (std::vector<pthread_t>::const_iterator i = _threads.begin (); i != _threads.end (); ++i) {
|
||||||
coreaudio_set_realtime_policy (*i);
|
pbd_mach_set_realtime_policy (*i, 1e9 * _samples_per_period / _samplerate);
|
||||||
}
|
}
|
||||||
//engine.buffer_size_change (bs);
|
//engine.buffer_size_change (bs);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
@ -822,34 +822,6 @@ CoreAudioBackend::coreaudio_process_thread (void *arg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
CoreAudioBackend::coreaudio_set_realtime_policy (pthread_t thread_id) const
|
|
||||||
{
|
|
||||||
thread_time_constraint_policy_data_t policy;
|
|
||||||
#ifndef NDEBUG
|
|
||||||
mach_msg_type_number_t msgt = 4;
|
|
||||||
boolean_t dflt = false;
|
|
||||||
kern_return_t rv = thread_policy_get (pthread_mach_thread_np (_main_thread),
|
|
||||||
THREAD_TIME_CONSTRAINT_POLICY, (thread_policy_t) &policy,
|
|
||||||
&msgt, &dflt);
|
|
||||||
printf ("Coreaudio Main Thread(%p) %d %d %d %d DFLT %d OK: %d\n", _main_thread, policy.period, policy.computation, policy.constraint, policy.preemptible, dflt, rv == KERN_SUCCESS);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
double period_ns = 1e9 * _samples_per_period / _samplerate;
|
|
||||||
policy.period = AudioConvertNanosToHostTime (period_ns);
|
|
||||||
policy.computation = AudioConvertNanosToHostTime (period_ns * .9);
|
|
||||||
policy.constraint = AudioConvertNanosToHostTime (period_ns * .95);
|
|
||||||
policy.preemptible = true;
|
|
||||||
kern_return_t res = thread_policy_set (pthread_mach_thread_np (thread_id),
|
|
||||||
THREAD_TIME_CONSTRAINT_POLICY, (thread_policy_t) &policy,
|
|
||||||
THREAD_TIME_CONSTRAINT_POLICY_COUNT);
|
|
||||||
|
|
||||||
#ifndef NDEBUG
|
|
||||||
printf ("Coreaudio Proc Thread(%p) %d %d %d %d OK: %d\n", thread_id, policy.period, policy.computation, policy.constraint, policy.preemptible, res == KERN_SUCCESS);
|
|
||||||
#endif
|
|
||||||
return res != KERN_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
CoreAudioBackend::create_process_thread (boost::function<void()> func)
|
CoreAudioBackend::create_process_thread (boost::function<void()> func)
|
||||||
{
|
{
|
||||||
|
|
@ -872,7 +844,7 @@ CoreAudioBackend::create_process_thread (boost::function<void()> func)
|
||||||
pthread_attr_destroy (&attr);
|
pthread_attr_destroy (&attr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (coreaudio_set_realtime_policy (thread_id)) {
|
if (pbd_mach_set_realtime_policy (thread_id, 1e9 * _samples_per_period / _samplerate)) {
|
||||||
PBD::warning << _("AudioEngine: process thread failed to set mach realtime policy.") << endmsg;
|
PBD::warning << _("AudioEngine: process thread failed to set mach realtime policy.") << endmsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1733,7 +1705,7 @@ CoreAudioBackend::freewheel_thread ()
|
||||||
AudioEngine::thread_init_callback (this);
|
AudioEngine::thread_init_callback (this);
|
||||||
_midiio->set_enabled(false);
|
_midiio->set_enabled(false);
|
||||||
reset_midi_parsers ();
|
reset_midi_parsers ();
|
||||||
coreaudio_set_realtime_policy (_main_thread);
|
pbd_mach_set_realtime_policy (_main_thread, 1e9 * _samples_per_period / _samplerate);
|
||||||
}
|
}
|
||||||
|
|
||||||
// process port updates first in every cycle.
|
// process port updates first in every cycle.
|
||||||
|
|
@ -1799,7 +1771,7 @@ CoreAudioBackend::process_callback (const uint32_t n_samples, const uint64_t hos
|
||||||
_reinit_thread_callback = false;
|
_reinit_thread_callback = false;
|
||||||
_main_thread = pthread_self();
|
_main_thread = pthread_self();
|
||||||
AudioEngine::thread_init_callback (this);
|
AudioEngine::thread_init_callback (this);
|
||||||
coreaudio_set_realtime_policy (_main_thread);
|
pbd_mach_set_realtime_policy (_main_thread, 1e9 * _samples_per_period / _samplerate);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pthread_mutex_trylock (&_process_callback_mutex)) {
|
if (pthread_mutex_trylock (&_process_callback_mutex)) {
|
||||||
|
|
|
||||||
|
|
@ -439,7 +439,6 @@ class CoreAudioBackend : public AudioBackend {
|
||||||
|
|
||||||
/* process threads */
|
/* process threads */
|
||||||
static void* coreaudio_process_thread (void *);
|
static void* coreaudio_process_thread (void *);
|
||||||
bool coreaudio_set_realtime_policy (pthread_t) const;
|
|
||||||
std::vector<pthread_t> _threads;
|
std::vector<pthread_t> _threads;
|
||||||
|
|
||||||
struct ThreadData {
|
struct ThreadData {
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,7 @@ LIBPBD_API int pbd_realtime_pthread_create (
|
||||||
void *arg);
|
void *arg);
|
||||||
|
|
||||||
LIBPBD_API int pbd_set_thread_priority (pthread_t, const int policy, int priority);
|
LIBPBD_API int pbd_set_thread_priority (pthread_t, const int policy, int priority);
|
||||||
|
LIBPBD_API bool pbd_mach_set_realtime_policy (pthread_t thread_id, double period_ns);
|
||||||
|
|
||||||
namespace PBD {
|
namespace PBD {
|
||||||
LIBPBD_API extern void notify_event_loops_about_thread_creation (pthread_t, const std::string&, int requests = 256);
|
LIBPBD_API extern void notify_event_loops_about_thread_creation (pthread_t, const std::string&, int requests = 256);
|
||||||
|
|
|
||||||
|
|
@ -266,3 +266,37 @@ pbd_set_thread_priority (pthread_t thread, const int policy, int priority)
|
||||||
|
|
||||||
return pthread_setschedparam (thread, SCHED_FIFO, ¶m);
|
return pthread_setschedparam (thread, SCHED_FIFO, ¶m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
pbd_mach_set_realtime_policy (pthread_t thread_id, double period_ns)
|
||||||
|
{
|
||||||
|
#ifdef _APPLE_
|
||||||
|
thread_time_constraint_policy_data_t policy;
|
||||||
|
#ifndef NDEBUG
|
||||||
|
mach_msg_type_number_t msgt = 4;
|
||||||
|
boolean_t dflt = false;
|
||||||
|
kern_return_t rv = thread_policy_get (pthread_mach_thread_np (_main_thread),
|
||||||
|
THREAD_TIME_CONSTRAINT_POLICY, (thread_policy_t) &policy,
|
||||||
|
&msgt, &dflt);
|
||||||
|
printf ("Mach Thread(%p) %d %d %d %d DFLT %d OK: %d\n", _main_thread, policy.period, policy.computation, policy.constraint, policy.preemptible, dflt, rv == KERN_SUCCESS);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
mach_timebase_info_data_t timebase_info;
|
||||||
|
mach_timebase_info(&timebase_info);
|
||||||
|
const double period_clk = period_ns * (double)timebase_info.denom / (double)timebase_info.numer;
|
||||||
|
|
||||||
|
policy.period = period_clk;
|
||||||
|
policy.computation = period_clk * .9;
|
||||||
|
policy.constraint = period_clk * .95;
|
||||||
|
policy.preemptible = true;
|
||||||
|
kern_return_t res = thread_policy_set (pthread_mach_thread_np (thread_id),
|
||||||
|
THREAD_TIME_CONSTRAINT_POLICY, (thread_policy_t) &policy,
|
||||||
|
THREAD_TIME_CONSTRAINT_POLICY_COUNT);
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
printf ("Mach Thread(%p) %d %d %d %d OK: %d\n", thread_id, policy.period, policy.computation, policy.constraint, policy.preemptible, res == KERN_SUCCESS);
|
||||||
|
#endif
|
||||||
|
return res != KERN_SUCCESS;
|
||||||
|
#endif
|
||||||
|
return false; // OK
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue