diff options
author | Robin Gareus <robin@gareus.org> | 2015-03-09 16:59:59 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-03-09 17:17:50 +0100 |
commit | 0446ff64f40ff9b4d7e10c22dac60e23f52ccfb2 (patch) | |
tree | 6fed931240fe6ade54e7eaf07e301a74b5c5f3d3 /libs | |
parent | e243d328a4ba9c425341596888c19449785e3d3d (diff) |
implement samples_since cycle start.
Diffstat (limited to 'libs')
-rw-r--r-- | libs/backends/coreaudio/coreaudio_backend.cc | 27 | ||||
-rw-r--r-- | libs/backends/coreaudio/coreaudio_backend.h | 4 | ||||
-rw-r--r-- | libs/backends/coreaudio/coreaudio_pcmio.cc | 6 | ||||
-rw-r--r-- | libs/backends/coreaudio/coreaudio_pcmio.h | 4 |
4 files changed, 29 insertions, 12 deletions
diff --git a/libs/backends/coreaudio/coreaudio_backend.cc b/libs/backends/coreaudio/coreaudio_backend.cc index 8efcd0f32e..b3459511fb 100644 --- a/libs/backends/coreaudio/coreaudio_backend.cc +++ b/libs/backends/coreaudio/coreaudio_backend.cc @@ -90,6 +90,7 @@ CoreAudioBackend::CoreAudioBackend (AudioEngine& e, AudioBackendInfo& info) , _freewheel_ack (false) , _reinit_thread_callback (false) , _measure_latency (false) + , _last_process_start (0) , _audio_device("") , _midi_driver_option(_("None")) , _samplerate (48000) @@ -416,10 +417,10 @@ static void * pthread_freewheel (void *arg) 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); - return d->process_callback(); + return d->process_callback(n_samples, host_time); } int @@ -452,6 +453,7 @@ CoreAudioBackend::_start (bool for_latency_measurement) _freewheel_ack = false; _reinit_thread_callback = true; + _last_process_start = 0; _pcmio->set_error_callback (error_callback_ptr, this); _pcmio->set_buffer_size_callback (buffer_size_callback_ptr, this); @@ -648,7 +650,16 @@ CoreAudioBackend::sample_time_at_cycle_start () pframes_t CoreAudioBackend::samples_since_cycle_start () { - return 0; + if (!_active_ca || !_run || _freewheeling || _freewheel) { + 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 @@ -1503,6 +1514,7 @@ CoreAudioBackend::freewheel_thread () static_cast<CoreMidiBuffer*>((*it)->get_buffer(0))->clear (); } + _last_process_start = 0; if (engine.process_callback (_samples_per_period)) { pthread_mutex_unlock (&_process_callback_mutex); break; @@ -1525,7 +1537,7 @@ CoreAudioBackend::freewheel_thread () } int -CoreAudioBackend::process_callback () +CoreAudioBackend::process_callback (const uint32_t n_samples, const uint64_t host_time) { uint32_t i = 0; uint64_t clock1, clock2; @@ -1548,6 +1560,10 @@ CoreAudioBackend::process_callback () if (pthread_mutex_trylock (&_process_callback_mutex)) { // block while devices are added/removed +#ifndef NDEBUG + printf("Xrun due to device change\n"); +#endif + engine.Xrun(); return 1; } @@ -1560,8 +1576,6 @@ CoreAudioBackend::process_callback () /* port-connection change */ pre_process(); - const uint32_t n_samples = _pcmio->n_samples(); - // cycle-length in usec const int64_t nominal_time = 1e6 * n_samples / _samplerate; @@ -1595,6 +1609,7 @@ CoreAudioBackend::process_callback () } _midiio->start_cycle(); + _last_process_start = host_time; if (engine.process_callback (n_samples)) { fprintf(stderr, "ENGINE PROCESS ERROR\n"); diff --git a/libs/backends/coreaudio/coreaudio_backend.h b/libs/backends/coreaudio/coreaudio_backend.h index b36c53105c..3bd2f6b055 100644 --- a/libs/backends/coreaudio/coreaudio_backend.h +++ b/libs/backends/coreaudio/coreaudio_backend.h @@ -215,7 +215,7 @@ class CoreAudioBackend : public AudioBackend { bool midi_device_enabled (std::string const) const; // really private, but needing static access: - int process_callback(); + int process_callback(uint32_t, uint64_t); void error_callback(); void xrun_callback(); void buffer_size_callback(); @@ -322,6 +322,8 @@ class CoreAudioBackend : public AudioBackend { bool _reinit_thread_callback; bool _measure_latency; + uint64_t _last_process_start; + pthread_mutex_t _process_callback_mutex; pthread_mutex_t _freewheel_mutex; diff --git a/libs/backends/coreaudio/coreaudio_pcmio.cc b/libs/backends/coreaudio/coreaudio_pcmio.cc index 1c1123190f..19c1e3a8f9 100644 --- a/libs/backends/coreaudio/coreaudio_pcmio.cc +++ b/libs/backends/coreaudio/coreaudio_pcmio.cc @@ -765,7 +765,7 @@ int CoreAudioPCM::pcm_start ( uint32_t device_id_in, uint32_t device_id_out, 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); @@ -1095,9 +1095,9 @@ CoreAudioPCM::render_callback ( assert(_playback_channels == 0 || ioData->mNumberBuffers == _playback_channels); + UInt64 cur_cycle_start = AudioGetCurrentHostTime (); _cur_samples_per_period = inNumberFrames; - if (_capture_channels > 0) { _input_audio_buffer_list->mNumberBuffers = _capture_channels; for (uint32_t i = 0; i < _capture_channels; ++i) { @@ -1127,7 +1127,7 @@ CoreAudioPCM::render_callback ( int rv = -1; if (_process_callback) { - rv = _process_callback(_process_arg); + rv = _process_callback(_process_arg, inNumberFrames, cur_cycle_start); } _in_process = false; diff --git a/libs/backends/coreaudio/coreaudio_pcmio.h b/libs/backends/coreaudio/coreaudio_pcmio.h index 63ae495cbf..80702f1570 100644 --- a/libs/backends/coreaudio/coreaudio_pcmio.h +++ b/libs/backends/coreaudio/coreaudio_pcmio.h @@ -65,7 +65,7 @@ public: uint32_t output_device, uint32_t sample_rate, uint32_t samples_per_period, - int (process_callback (void*)), + int (process_callback (void*, const uint32_t, const uint64_t)), void * process_arg ); @@ -160,7 +160,7 @@ private: bool _in_process; size_t _n_devices; - int (* _process_callback) (void*); + int (* _process_callback) (void*, const uint32_t, const uint64_t); void * _process_arg; void (* _error_callback) (void*); |