diff options
author | Robin Gareus <robin@gareus.org> | 2018-12-23 19:40:48 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2018-12-23 21:58:55 +0100 |
commit | 217ef4d365136c9396375acf12a4805c70b2557c (patch) | |
tree | bd3a998a4705201bab6992ca8c866f30d4fb3584 /libs/backends/alsa | |
parent | 54ee23623e3767e05eae2824dcd1bf5416dbe2bb (diff) |
Use hash for ALSA-MIDI device name/ID
Diffstat (limited to 'libs/backends/alsa')
-rw-r--r-- | libs/backends/alsa/alsa_audiobackend.cc | 26 | ||||
-rw-r--r-- | libs/backends/alsa/alsa_audiobackend.h | 3 |
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; |