summaryrefslogtreecommitdiff
path: root/libs/backends/alsa
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2018-12-23 19:40:48 +0100
committerRobin Gareus <robin@gareus.org>2018-12-23 21:58:55 +0100
commit217ef4d365136c9396375acf12a4805c70b2557c (patch)
treebd3a998a4705201bab6992ca8c866f30d4fb3584 /libs/backends/alsa
parent54ee23623e3767e05eae2824dcd1bf5416dbe2bb (diff)
Use hash for ALSA-MIDI device name/ID
Diffstat (limited to 'libs/backends/alsa')
-rw-r--r--libs/backends/alsa/alsa_audiobackend.cc26
-rw-r--r--libs/backends/alsa/alsa_audiobackend.h3
2 files changed, 18 insertions, 11 deletions
diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc
index ee1c6d6dce..dc085aadbd 100644
--- a/libs/backends/alsa/alsa_audiobackend.cc
+++ b/libs/backends/alsa/alsa_audiobackend.cc
@@ -73,8 +73,6 @@ AlsaAudioBackend::AlsaAudioBackend (AudioEngine& e, AudioBackendInfo& info)
, _systemic_audio_output_latency (0)
, _dsp_load (0)
, _processed_samples (0)
- , _midi_ins (0)
- , _midi_outs (0)
, _port_change_flag (false)
{
_instance_name = s_instance_name;
@@ -900,7 +898,6 @@ AlsaAudioBackend::_start (bool for_latency_measurement)
_measure_latency = for_latency_measurement;
- _midi_ins = _midi_outs = 0;
register_system_midi_ports();
if (register_system_audio_ports()) {
@@ -1016,7 +1013,6 @@ AlsaAudioBackend::stop ()
unregister_ports();
delete _pcmi; _pcmi = 0;
- _midi_ins = _midi_outs = 0;
_device_reservation.release_device();
_measure_latency = false;
@@ -1440,13 +1436,27 @@ static std::string replace_name_io (std::string const& name, bool in)
return name.substr (0, pos) + "(" + (in ? "In" : "Out") + ")";
}
+static uint32_t
+elf_hash (std::string const& s)
+{
+ const uint8_t* b = (const uint8_t*)s.c_str();
+ uint32_t h = 0;
+ for (size_t i = 0; i < s.length(); ++i) {
+ h = ( h << 4 ) + b[i];
+ uint32_t high = h & 0xF0000000;
+ if (high) {
+ h ^= high >> 24;
+ h &= ~high;
+ }
+ }
+ return h;
+}
+
int
AlsaAudioBackend::register_system_midi_ports(const std::string device)
{
std::map<std::string, std::string> devices;
- // TODO use consistent numbering when re-adding devices: _midi_ins, _midi_outs
-
if (_midi_driver_option == get_standard_device_name(DeviceNone)) {
return 0;
} else if (_midi_driver_option == _("ALSA raw devices")) {
@@ -1485,7 +1495,7 @@ AlsaAudioBackend::register_system_midi_ports(const std::string device)
delete mout;
} else {
char tmp[64];
- snprintf(tmp, sizeof(tmp), "system:midi_playback_%d", ++_midi_ins);
+ snprintf(tmp, sizeof(tmp), "system:midi_playback_%u", elf_hash (i->first + i->second));
PortHandle p = add_port(std::string(tmp), DataType::MIDI, static_cast<PortFlags>(IsInput | IsPhysical | IsTerminal));
if (!p) {
mout->stop();
@@ -1524,7 +1534,7 @@ AlsaAudioBackend::register_system_midi_ports(const std::string device)
delete midin;
} else {
char tmp[64];
- snprintf(tmp, sizeof(tmp), "system:midi_capture_%d", ++_midi_outs);
+ snprintf(tmp, sizeof(tmp), "system:midi_capture_%u", elf_hash (i->first + i->second));
PortHandle p = add_port(std::string(tmp), DataType::MIDI, static_cast<PortFlags>(IsOutput | IsPhysical | IsTerminal));
if (!p) {
midin->stop();
diff --git a/libs/backends/alsa/alsa_audiobackend.h b/libs/backends/alsa/alsa_audiobackend.h
index c74f881fd1..37889c78cb 100644
--- a/libs/backends/alsa/alsa_audiobackend.h
+++ b/libs/backends/alsa/alsa_audiobackend.h
@@ -434,9 +434,6 @@ class AlsaAudioBackend : public AudioBackend {
std::vector<AlsaMidiOut *> _rmidi_out;
std::vector<AlsaMidiIn *> _rmidi_in;
- unsigned _midi_ins;
- unsigned _midi_outs;
-
struct PortConnectData {
std::string a;
std::string b;