adapt AudioEngine to new AudioBackend API

This commit is contained in:
Paul Davis 2013-10-12 10:03:50 -04:00
parent 589ef168c1
commit fdda8127ef
2 changed files with 48 additions and 26 deletions

View File

@ -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;

View File

@ -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