summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-03-09 16:59:59 +0100
committerRobin Gareus <robin@gareus.org>2015-03-09 17:17:50 +0100
commit0446ff64f40ff9b4d7e10c22dac60e23f52ccfb2 (patch)
tree6fed931240fe6ade54e7eaf07e301a74b5c5f3d3 /libs
parente243d328a4ba9c425341596888c19449785e3d3d (diff)
implement samples_since cycle start.
Diffstat (limited to 'libs')
-rw-r--r--libs/backends/coreaudio/coreaudio_backend.cc27
-rw-r--r--libs/backends/coreaudio/coreaudio_backend.h4
-rw-r--r--libs/backends/coreaudio/coreaudio_pcmio.cc6
-rw-r--r--libs/backends/coreaudio/coreaudio_pcmio.h4
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*);