Trim get_nth_physical port methods.

git-svn-id: svn://localhost/ardour2/branches/3.0@7518 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington
2010-07-28 01:40:36 +00:00
parent 922488427a
commit c2cf3c5bfd
4 changed files with 66 additions and 82 deletions

View File

@@ -169,14 +169,6 @@ class AudioEngine : public SessionHandlePtr
void get_physical_outputs (DataType type, std::vector<std::string>&);
void get_physical_inputs (DataType type, std::vector<std::string>&);
std::string get_nth_physical_output (DataType type, uint32_t n) {
return get_nth_physical (type, n, JackPortIsInput);
}
std::string get_nth_physical_input (DataType type, uint32_t n) {
return get_nth_physical (type, n, JackPortIsOutput);
}
void update_total_latencies ();
void update_total_latency (const Port&);
@@ -282,7 +274,6 @@ _ the regular process() call to session->process() is not made.
void finish_process_cycle (int status);
void remove_all_ports ();
std::string get_nth_physical (DataType type, uint32_t n, int flags);
ChanCount n_physical (unsigned long) const;
void get_physical (DataType, unsigned long, std::vector<std::string> &);

View File

@@ -1178,36 +1178,6 @@ AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
get_physical (type, JackPortIsOutput, outs);
}
string
AudioEngine::get_nth_physical (DataType type, uint32_t n, int flag)
{
GET_PRIVATE_JACK_POINTER_RET (_jack,"");
const char ** ports;
uint32_t i;
uint32_t idx;
string ret;
assert(type != DataType::NIL);
if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical|flag)) == 0) {
return ret;
}
for (i = 0, idx = 0; idx < n && ports[i]; ++i) {
if (!strstr (ports[i], "Midi-Through")) {
++idx;
}
}
if (ports[idx]) {
ret = ports[idx];
}
free ((const char **) ports);
return ret;
}
void
AudioEngine::update_total_latency (const Port& port)
{

View File

@@ -59,12 +59,17 @@ Auditioner::init ()
string left = _session.config.get_auditioner_output_left();
string right = _session.config.get_auditioner_output_right();
vector<string> outputs;
_session.engine().get_physical_outputs (DataType::AUDIO, outputs);
if (left == "default") {
if (_session.monitor_out()) {
left = _session.monitor_out()->input()->audio (0)->name();
via_monitor = true;
} else {
left = _session.engine().get_nth_physical_output (DataType::AUDIO, 0);
if (outputs.size() > 0) {
left = outputs[0];
}
}
}
@@ -73,7 +78,9 @@ Auditioner::init ()
right = _session.monitor_out()->input()->audio (1)->name();
via_monitor = true;
} else {
right = _session.engine().get_nth_physical_output (DataType::AUDIO, 1);
if (outputs.size() > 1) {
right = outputs[1];
}
}
}
@@ -231,8 +238,12 @@ Auditioner::output_changed (IOChange change, void* /*src*/)
if (change & ConnectionsChanged) {
string phys;
vector<string> connections;
vector<string> outputs;
_session.engine().get_physical_outputs (DataType::AUDIO, outputs);
if (_output->nth (0)->get_connections (connections)) {
phys = _session.engine().get_nth_physical_output (DataType::AUDIO, 0);
if (outputs.size() > 0) {
phys = outputs[0];
}
if (phys != connections[0]) {
_session.config.set_auditioner_output_left (connections[0]);
} else {
@@ -245,7 +256,9 @@ Auditioner::output_changed (IOChange change, void* /*src*/)
connections.clear ();
if (_output->nth (1)->get_connections (connections)) {
phys = _session.engine().get_nth_physical_output (DataType::AUDIO, 1);
if (outputs.size() > 1) {
phys = outputs[1];
}
if (phys != connections[0]) {
_session.config.set_auditioner_output_right (connections[0]);
} else {

View File

@@ -397,22 +397,23 @@ Session::when_engine_running ()
/* default state for Click: dual-mono to first 2 physical outputs */
for (int physport = 0; physport < 2; ++physport) {
string physical_output = _engine.get_nth_physical_output (DataType::AUDIO, physport);
vector<string> outs;
_engine.get_physical_outputs (DataType::AUDIO, outs);
if (physical_output.length()) {
if (_click_io->add_port (physical_output, this)) {
// relax, even though its an error
}
}
}
if (_click_io->n_ports () > ChanCount::ZERO) {
_clicking = Config->get_clicking ();
}
for (uint32_t physport = 0; physport < 2; ++physport) {
if (outs.size() > physport) {
if (_click_io->add_port (outs[physport], this)) {
// relax, even though its an error
}
}
}
if (_click_io->n_ports () > ChanCount::ZERO) {
_clicking = Config->get_clicking ();
}
}
}
catch (failed_constructor& err) {
error << _("cannot setup Click I/O") << endmsg;
}
@@ -427,6 +428,13 @@ Session::when_engine_running ()
BootMessage (_("Set up standard connections"));
vector<string> inputs[DataType::num_types];
vector<string> outputs[DataType::num_types];
for (uint32_t i = 0; i < DataType::num_types; ++i) {
_engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
_engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
}
/* Create a set of Bundle objects that map
to the physical I/O currently available. We create both
mono and stereo bundles, so that the common cases of mono
@@ -437,28 +445,28 @@ Session::when_engine_running ()
/* mono output bundles */
for (uint32_t np = 0; np < n_physical_outputs.n_audio(); ++np) {
for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
char buf[32];
snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
shared_ptr<Bundle> c (new Bundle (buf, true));
c->add_channel (_("mono"), DataType::AUDIO);
c->set_port (0, _engine.get_nth_physical_output (DataType::AUDIO, np));
c->set_port (0, outputs[DataType::AUDIO][np]);
add_bundle (c);
}
/* stereo output bundles */
for (uint32_t np = 0; np < n_physical_outputs.n_audio(); np += 2) {
if (np + 1 < n_physical_outputs.n_audio ()) {
for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
if (np + 1 < outputs[DataType::AUDIO].size()) {
char buf[32];
snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
shared_ptr<Bundle> c (new Bundle (buf, true));
c->add_channel (_("L"), DataType::AUDIO);
c->set_port (0, _engine.get_nth_physical_output (DataType::AUDIO, np));
c->set_port (0, outputs[DataType::AUDIO][np]);
c->add_channel (_("R"), DataType::AUDIO);
c->set_port (1, _engine.get_nth_physical_output (DataType::AUDIO, np + 1));
c->set_port (1, outputs[DataType::AUDIO][np + 1]);
add_bundle (c);
}
@@ -466,29 +474,29 @@ Session::when_engine_running ()
/* mono input bundles */
for (uint32_t np = 0; np < n_physical_inputs.n_audio(); ++np) {
for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
char buf[32];
snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
shared_ptr<Bundle> c (new Bundle (buf, false));
c->add_channel (_("mono"), DataType::AUDIO);
c->set_port (0, _engine.get_nth_physical_input (DataType::AUDIO, np));
c->set_port (0, inputs[DataType::AUDIO][np]);
add_bundle (c);
}
/* stereo input bundles */
for (uint32_t np = 0; np < n_physical_inputs.n_audio(); np += 2) {
if (np + 1 < n_physical_inputs.n_audio()) {
for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
if (np + 1 < inputs[DataType::AUDIO].size()) {
char buf[32];
snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
shared_ptr<Bundle> c (new Bundle (buf, false));
c->add_channel (_("L"), DataType::AUDIO);
c->set_port (0, _engine.get_nth_physical_input (DataType::AUDIO, np));
c->set_port (0, inputs[DataType::AUDIO][np]);
c->add_channel (_("R"), DataType::AUDIO);
c->set_port (1, _engine.get_nth_physical_input (DataType::AUDIO, np + 1));
c->set_port (1, inputs[DataType::AUDIO][np + 1]);
add_bundle (c);
}
@@ -496,29 +504,25 @@ Session::when_engine_running ()
/* MIDI input bundles */
for (uint32_t np = 0; np < n_physical_inputs.n_midi(); ++np) {
string const p = _engine.get_nth_physical_input (DataType::MIDI, np);
string n = p;
for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
string n = inputs[DataType::MIDI][np];
boost::erase_first (n, X_("alsa_pcm:"));
shared_ptr<Bundle> c (new Bundle (n, false));
shared_ptr<Bundle> c (new Bundle (n, true));
c->add_channel ("", DataType::MIDI);
c->set_port (0, p);
c->set_port (0, inputs[DataType::MIDI][np]);
add_bundle (c);
}
/* MIDI output bundles */
for (uint32_t np = 0; np < n_physical_outputs.n_midi(); ++np) {
string const p = _engine.get_nth_physical_output (DataType::MIDI, np);
string n = p;
for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
string n = outputs[DataType::MIDI][np];
boost::erase_first (n, X_("alsa_pcm:"));
shared_ptr<Bundle> c (new Bundle (n, true));
shared_ptr<Bundle> c (new Bundle (n, false));
c->add_channel ("", DataType::MIDI);
c->set_port (0, p);
c->set_port (0, outputs[DataType::MIDI][np]);
add_bundle (c);
}
@@ -539,7 +543,10 @@ Session::when_engine_running ()
for (uint32_t n = 0; n < limit; ++n) {
Port* p = _master_out->output()->nth (n);
string connect_to = _engine.get_nth_physical_output (DataType (p->type()), n);
string connect_to;
if (outputs[p->type()].size() > n) {
connect_to = outputs[p->type()][n];
}
if (!connect_to.empty() && p->connected_to (connect_to) == false) {
if (_master_out->output()->connect (p, connect_to, this)) {
@@ -605,7 +612,10 @@ Session::when_engine_running ()
for (uint32_t n = 0; n < limit; ++n) {
Port* p = _monitor_out->output()->ports().port(*t, n);
string connect_to = _engine.get_nth_physical_output (*t, (n % mod));
string connect_to;
if (outputs[*t].size() > (n % mod)) {
connect_to = outputs[*t][n % mod];
}
if (!connect_to.empty()) {
if (_monitor_out->output()->connect (p, connect_to, this)) {