mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-07 15:25:01 +01:00
implement samples_since cycle start.
This commit is contained in:
parent
e243d328a4
commit
0446ff64f4
4 changed files with 29 additions and 12 deletions
|
|
@ -90,6 +90,7 @@ CoreAudioBackend::CoreAudioBackend (AudioEngine& e, AudioBackendInfo& info)
|
||||||
, _freewheel_ack (false)
|
, _freewheel_ack (false)
|
||||||
, _reinit_thread_callback (false)
|
, _reinit_thread_callback (false)
|
||||||
, _measure_latency (false)
|
, _measure_latency (false)
|
||||||
|
, _last_process_start (0)
|
||||||
, _audio_device("")
|
, _audio_device("")
|
||||||
, _midi_driver_option(_("None"))
|
, _midi_driver_option(_("None"))
|
||||||
, _samplerate (48000)
|
, _samplerate (48000)
|
||||||
|
|
@ -416,10 +417,10 @@ static void * pthread_freewheel (void *arg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int process_callback_ptr (void *arg)
|
static int process_callback_ptr (void *arg, const uint32_t n_samples, const uint64_t host_time)
|
||||||
{
|
{
|
||||||
CoreAudioBackend *d = static_cast<CoreAudioBackend*> (arg);
|
CoreAudioBackend *d = static_cast<CoreAudioBackend*> (arg);
|
||||||
return d->process_callback();
|
return d->process_callback(n_samples, host_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
@ -452,6 +453,7 @@ CoreAudioBackend::_start (bool for_latency_measurement)
|
||||||
|
|
||||||
_freewheel_ack = false;
|
_freewheel_ack = false;
|
||||||
_reinit_thread_callback = true;
|
_reinit_thread_callback = true;
|
||||||
|
_last_process_start = 0;
|
||||||
|
|
||||||
_pcmio->set_error_callback (error_callback_ptr, this);
|
_pcmio->set_error_callback (error_callback_ptr, this);
|
||||||
_pcmio->set_buffer_size_callback (buffer_size_callback_ptr, this);
|
_pcmio->set_buffer_size_callback (buffer_size_callback_ptr, this);
|
||||||
|
|
@ -648,8 +650,17 @@ CoreAudioBackend::sample_time_at_cycle_start ()
|
||||||
pframes_t
|
pframes_t
|
||||||
CoreAudioBackend::samples_since_cycle_start ()
|
CoreAudioBackend::samples_since_cycle_start ()
|
||||||
{
|
{
|
||||||
|
if (!_active_ca || !_run || _freewheeling || _freewheel) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if (_last_process_start == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint64_t now = AudioGetCurrentHostTime ();
|
||||||
|
const int64_t elapsed_time_ns = AudioConvertHostTimeToNanos(now - _last_process_start);
|
||||||
|
return std::max((pframes_t)0, (pframes_t)rint(1e-9 * elapsed_time_ns * _samplerate));
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t
|
uint32_t
|
||||||
CoreAudioBackend::name_to_id(std::string device_name) const {
|
CoreAudioBackend::name_to_id(std::string device_name) const {
|
||||||
|
|
@ -1503,6 +1514,7 @@ CoreAudioBackend::freewheel_thread ()
|
||||||
static_cast<CoreMidiBuffer*>((*it)->get_buffer(0))->clear ();
|
static_cast<CoreMidiBuffer*>((*it)->get_buffer(0))->clear ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_last_process_start = 0;
|
||||||
if (engine.process_callback (_samples_per_period)) {
|
if (engine.process_callback (_samples_per_period)) {
|
||||||
pthread_mutex_unlock (&_process_callback_mutex);
|
pthread_mutex_unlock (&_process_callback_mutex);
|
||||||
break;
|
break;
|
||||||
|
|
@ -1525,7 +1537,7 @@ CoreAudioBackend::freewheel_thread ()
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
CoreAudioBackend::process_callback ()
|
CoreAudioBackend::process_callback (const uint32_t n_samples, const uint64_t host_time)
|
||||||
{
|
{
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
uint64_t clock1, clock2;
|
uint64_t clock1, clock2;
|
||||||
|
|
@ -1548,6 +1560,10 @@ CoreAudioBackend::process_callback ()
|
||||||
|
|
||||||
if (pthread_mutex_trylock (&_process_callback_mutex)) {
|
if (pthread_mutex_trylock (&_process_callback_mutex)) {
|
||||||
// block while devices are added/removed
|
// block while devices are added/removed
|
||||||
|
#ifndef NDEBUG
|
||||||
|
printf("Xrun due to device change\n");
|
||||||
|
#endif
|
||||||
|
engine.Xrun();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1560,8 +1576,6 @@ CoreAudioBackend::process_callback ()
|
||||||
/* port-connection change */
|
/* port-connection change */
|
||||||
pre_process();
|
pre_process();
|
||||||
|
|
||||||
const uint32_t n_samples = _pcmio->n_samples();
|
|
||||||
|
|
||||||
// cycle-length in usec
|
// cycle-length in usec
|
||||||
const int64_t nominal_time = 1e6 * n_samples / _samplerate;
|
const int64_t nominal_time = 1e6 * n_samples / _samplerate;
|
||||||
|
|
||||||
|
|
@ -1595,6 +1609,7 @@ CoreAudioBackend::process_callback ()
|
||||||
}
|
}
|
||||||
|
|
||||||
_midiio->start_cycle();
|
_midiio->start_cycle();
|
||||||
|
_last_process_start = host_time;
|
||||||
|
|
||||||
if (engine.process_callback (n_samples)) {
|
if (engine.process_callback (n_samples)) {
|
||||||
fprintf(stderr, "ENGINE PROCESS ERROR\n");
|
fprintf(stderr, "ENGINE PROCESS ERROR\n");
|
||||||
|
|
|
||||||
|
|
@ -215,7 +215,7 @@ class CoreAudioBackend : public AudioBackend {
|
||||||
bool midi_device_enabled (std::string const) const;
|
bool midi_device_enabled (std::string const) const;
|
||||||
|
|
||||||
// really private, but needing static access:
|
// really private, but needing static access:
|
||||||
int process_callback();
|
int process_callback(uint32_t, uint64_t);
|
||||||
void error_callback();
|
void error_callback();
|
||||||
void xrun_callback();
|
void xrun_callback();
|
||||||
void buffer_size_callback();
|
void buffer_size_callback();
|
||||||
|
|
@ -322,6 +322,8 @@ class CoreAudioBackend : public AudioBackend {
|
||||||
bool _reinit_thread_callback;
|
bool _reinit_thread_callback;
|
||||||
bool _measure_latency;
|
bool _measure_latency;
|
||||||
|
|
||||||
|
uint64_t _last_process_start;
|
||||||
|
|
||||||
pthread_mutex_t _process_callback_mutex;
|
pthread_mutex_t _process_callback_mutex;
|
||||||
|
|
||||||
pthread_mutex_t _freewheel_mutex;
|
pthread_mutex_t _freewheel_mutex;
|
||||||
|
|
|
||||||
|
|
@ -765,7 +765,7 @@ int
|
||||||
CoreAudioPCM::pcm_start (
|
CoreAudioPCM::pcm_start (
|
||||||
uint32_t device_id_in, uint32_t device_id_out,
|
uint32_t device_id_in, uint32_t device_id_out,
|
||||||
uint32_t sample_rate, uint32_t samples_per_period,
|
uint32_t sample_rate, uint32_t samples_per_period,
|
||||||
int (process_callback (void*)), void *process_arg)
|
int (process_callback (void*, const uint32_t, const uint64_t)), void *process_arg)
|
||||||
{
|
{
|
||||||
|
|
||||||
assert(_device_ids);
|
assert(_device_ids);
|
||||||
|
|
@ -1095,9 +1095,9 @@ CoreAudioPCM::render_callback (
|
||||||
|
|
||||||
assert(_playback_channels == 0 || ioData->mNumberBuffers == _playback_channels);
|
assert(_playback_channels == 0 || ioData->mNumberBuffers == _playback_channels);
|
||||||
|
|
||||||
|
UInt64 cur_cycle_start = AudioGetCurrentHostTime ();
|
||||||
_cur_samples_per_period = inNumberFrames;
|
_cur_samples_per_period = inNumberFrames;
|
||||||
|
|
||||||
|
|
||||||
if (_capture_channels > 0) {
|
if (_capture_channels > 0) {
|
||||||
_input_audio_buffer_list->mNumberBuffers = _capture_channels;
|
_input_audio_buffer_list->mNumberBuffers = _capture_channels;
|
||||||
for (uint32_t i = 0; i < _capture_channels; ++i) {
|
for (uint32_t i = 0; i < _capture_channels; ++i) {
|
||||||
|
|
@ -1127,7 +1127,7 @@ CoreAudioPCM::render_callback (
|
||||||
int rv = -1;
|
int rv = -1;
|
||||||
|
|
||||||
if (_process_callback) {
|
if (_process_callback) {
|
||||||
rv = _process_callback(_process_arg);
|
rv = _process_callback(_process_arg, inNumberFrames, cur_cycle_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
_in_process = false;
|
_in_process = false;
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ public:
|
||||||
uint32_t output_device,
|
uint32_t output_device,
|
||||||
uint32_t sample_rate,
|
uint32_t sample_rate,
|
||||||
uint32_t samples_per_period,
|
uint32_t samples_per_period,
|
||||||
int (process_callback (void*)),
|
int (process_callback (void*, const uint32_t, const uint64_t)),
|
||||||
void * process_arg
|
void * process_arg
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -160,7 +160,7 @@ private:
|
||||||
bool _in_process;
|
bool _in_process;
|
||||||
size_t _n_devices;
|
size_t _n_devices;
|
||||||
|
|
||||||
int (* _process_callback) (void*);
|
int (* _process_callback) (void*, const uint32_t, const uint64_t);
|
||||||
void * _process_arg;
|
void * _process_arg;
|
||||||
|
|
||||||
void (* _error_callback) (void*);
|
void (* _error_callback) (void*);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue