summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2013-10-12 10:03:50 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2013-10-12 10:03:50 -0400
commitfdda8127eff8daad24a64ff9173d5ce4dc1e3f21 (patch)
treea080dd65fe94ec4b4a5afc53f44aa371cc93b309 /libs
parent589ef168c197c85ab1e557bc2e33ea9462cff430 (diff)
adapt AudioEngine to new AudioBackend API
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/audioengine.h7
-rw-r--r--libs/ardour/audioengine.cc67
2 files changed, 48 insertions, 26 deletions
diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h
index 45257d8129..d5dcbffe2b 100644
--- a/libs/ardour/ardour/audioengine.h
+++ b/libs/ardour/ardour/audioengine.h
@@ -83,8 +83,8 @@ public:
* just forward to a backend implementation.
*/
- int start ();
- int stop ();
+ int start (bool for_latency_measurement=false);
+ int stop (bool for_latency_measurement=false);
int pause ();
int freewheel (bool start_stop);
float get_cpu_load() const ;
@@ -194,7 +194,7 @@ public:
MTDM* mtdm();
int prepare_for_latency_measurement ();
- void start_latency_detection ();
+ int start_latency_detection ();
void stop_latency_detection ();
void set_latency_input_port (const std::string&);
void set_latency_output_port (const std::string&);
@@ -229,6 +229,7 @@ public:
std::string _latency_input_name;
std::string _latency_output_name;
framecnt_t _latency_signal_latency;
+ bool _stopped_for_latency;
bool _started_for_latency;
bool _in_destructor;
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc
index a9956666d8..c2224a8b5e 100644
--- a/libs/ardour/audioengine.cc
+++ b/libs/ardour/audioengine.cc
@@ -80,7 +80,7 @@ AudioEngine::AudioEngine ()
, _latency_output_port (0)
, _latency_flush_frames (0)
, _latency_signal_latency (0)
- , _started_for_latency (false)
+ , _stopped_for_latency (false)
, _in_destructor (false)
{
g_atomic_int_set (&m_meter_exit, 0);
@@ -596,7 +596,7 @@ AudioEngine::set_backend (const std::string& name, const std::string& arg1, cons
/* BACKEND PROXY WRAPPERS */
int
-AudioEngine::start ()
+AudioEngine::start (bool for_latency)
{
if (!_backend) {
return -1;
@@ -609,7 +609,7 @@ AudioEngine::start ()
_processed_frames = 0;
last_monitor_check = 0;
- if (_backend->start()) {
+ if (_backend->start (for_latency)) {
return -1;
}
@@ -625,7 +625,7 @@ AudioEngine::start ()
start_metering_thread ();
- if (!_started_for_latency) {
+ if (!for_latency) {
Running(); /* EMIT SIGNAL */
}
@@ -633,7 +633,7 @@ AudioEngine::start ()
}
int
-AudioEngine::stop ()
+AudioEngine::stop (bool for_latency)
{
if (!_backend) {
return 0;
@@ -654,7 +654,10 @@ AudioEngine::stop ()
stop_metering_thread ();
Port::PortDrop ();
- Stopped (); /* EMIT SIGNAL */
+
+ if (!for_latency) {
+ Stopped (); /* EMIT SIGNAL */
+ }
return 0;
}
@@ -1018,7 +1021,10 @@ AudioEngine::halted_callback (const char* why)
_running = false;
Port::PortDrop (); /* EMIT SIGNAL */
- Halted (why); /* EMIT SIGNAL */
+
+ if (!_started_for_latency) {
+ Halted (why); /* EMIT SIGNAL */
+ }
}
bool
@@ -1047,23 +1053,26 @@ AudioEngine::mtdm()
int
AudioEngine::prepare_for_latency_measurement ()
{
- if (!running()) {
- _started_for_latency = true;
+ if (running()) {
+ _stopped_for_latency = true;
+ stop (true);
+ }
- if (start()) {
- _started_for_latency = false;
- return -1;
- }
+ if (start (true)) {
+ _started_for_latency = true;
+ return -1;
}
return 0;
}
-void
+int
AudioEngine::start_latency_detection ()
{
- if (prepare_for_latency_measurement ()) {
- return;
+ if (!running()) {
+ if (prepare_for_latency_measurement ()) {
+ return -1;
+ }
}
PortEngine& pe (port_engine());
@@ -1077,27 +1086,32 @@ AudioEngine::start_latency_detection ()
PortEngine::PortHandle* in = pe.get_port_by_name (_latency_input_name);
if (!out || !in) {
- return;
+ stop (true);
+ return -1;
}
/* create the ports we will use to read/write data */
if ((_latency_output_port = pe.register_port ("latency_out", DataType::AUDIO, IsOutput)) == 0) {
- return;
+ stop (true);
+ return -1;
}
if (pe.connect (_latency_output_port, _latency_output_name)) {
pe.unregister_port (_latency_output_port);
- return;
+ stop (true);
+ return -1;
}
const string portname ("latency_in");
if ((_latency_input_port = pe.register_port (portname, DataType::AUDIO, IsInput)) == 0) {
pe.unregister_port (_latency_output_port);
- return;
+ stop (true);
+ return -1;
}
if (pe.connect (_latency_input_name, make_port_name_non_relative (portname))) {
pe.unregister_port (_latency_output_port);
- return;
+ stop (true);
+ return -1;
}
LatencyRange lr;
@@ -1113,6 +1127,7 @@ AudioEngine::start_latency_detection ()
_measuring_latency = true;
_latency_flush_frames = samples_per_cycle();
+ return 0;
}
void
@@ -1128,9 +1143,15 @@ AudioEngine::stop_latency_detection ()
port_engine().unregister_port (_latency_input_port);
_latency_input_port = 0;
}
- if (_started_for_latency) {
- stop ();
+
+ stop (true);
+
+ if (_stopped_for_latency) {
+ start ();
}
+
+ _stopped_for_latency = false;
+ _started_for_latency = false;
}
void