diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-08-06 14:19:19 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-08-06 14:19:19 +0000 |
commit | b9b6ba8be490622dff662c23d9c77c9eee1291b3 (patch) | |
tree | db5eaba409c1808ecce47e97623d0fe110ac6d8d /libs | |
parent | 684ef0eb7a1ca371a1e93fdceb271aa9d40a7dae (diff) |
merge changes to libmidi++ API from 2.0-ongoing
git-svn-id: svn://localhost/ardour2/trunk@2256 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/configuration_vars.h | 3 | ||||
-rw-r--r-- | libs/ardour/ardour/session.h | 3 | ||||
-rw-r--r-- | libs/ardour/session_midi.cc | 96 | ||||
-rw-r--r-- | libs/ardour/session_state.cc | 10 | ||||
-rw-r--r-- | libs/midi++2/midi++/alsa_rawmidi.h | 7 | ||||
-rw-r--r-- | libs/midi++2/midi++/alsa_sequencer.h | 10 | ||||
-rw-r--r-- | libs/midi++2/midi++/coremidi_midiport.h | 26 | ||||
-rw-r--r-- | libs/midi++2/midi++/factory.h | 6 | ||||
-rw-r--r-- | libs/midi++2/midi++/fd_midiport.h | 7 | ||||
-rw-r--r-- | libs/midi++2/midi++/fifomidi.h | 7 | ||||
-rw-r--r-- | libs/midi++2/midi++/jack.h | 7 | ||||
-rw-r--r-- | libs/midi++2/midi++/manager.h | 3 | ||||
-rw-r--r-- | libs/midi++2/midi++/mmc.h | 9 | ||||
-rw-r--r-- | libs/midi++2/midi++/nullmidi.h | 7 | ||||
-rw-r--r-- | libs/midi++2/midi++/port_request.h | 7 | ||||
-rw-r--r-- | libs/midi++2/midifactory.cc | 103 | ||||
-rw-r--r-- | libs/midi++2/midimanager.cc | 43 | ||||
-rw-r--r-- | libs/midi++2/mmc.cc | 16 | ||||
-rw-r--r-- | libs/pbd/convert.cc | 16 | ||||
-rw-r--r-- | libs/pbd/pbd/convert.h | 1 |
20 files changed, 278 insertions, 109 deletions
diff --git a/libs/ardour/ardour/configuration_vars.h b/libs/ardour/ardour/configuration_vars.h index 3051a0b44b..4d5579a9a0 100644 --- a/libs/ardour/ardour/configuration_vars.h +++ b/libs/ardour/ardour/configuration_vars.h @@ -36,7 +36,8 @@ CONFIG_VARIABLE (bool, send_mtc, "send-mtc", false) CONFIG_VARIABLE (bool, send_mmc, "send-mmc", false) CONFIG_VARIABLE (bool, mmc_control, "mmc-control", false) CONFIG_VARIABLE (bool, midi_feedback, "midi-feedback", false) -CONFIG_VARIABLE (uint8_t, mmc_device_id, "mmc-device-id", 0) +CONFIG_VARIABLE (uint8_t, mmc_receive_device_id, "mmc-receive-device-id", 0) +CONFIG_VARIABLE (uint8_t, mmc_send_device_id, "mmc-send-device-id", 0) /* control surfaces */ diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 63be24d9f7..9cfdf1187e 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -744,7 +744,8 @@ class Session : public PBD::StatefulDestructible void deliver_midi (MIDI::Port*, MIDI::byte*, int32_t size); - void set_mmc_device_id (uint32_t id); + void set_mmc_receive_device_id (uint32_t id); + void set_mmc_send_device_id (uint32_t id); /* Scrubbing */ diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc index 7f88766b63..ba3e6401e6 100644 --- a/libs/ardour/session_midi.cc +++ b/libs/ardour/session_midi.cc @@ -88,97 +88,66 @@ Session::use_config_midi_ports () int Session::set_mtc_port (string port_tag) { -#if 0 - MIDI::byte old_device_id = 0; - bool reset_id = false; + MTC_Slave *ms; if (port_tag.length() == 0) { - if (_mmc_port == 0) { + + if (_slave && ((ms = dynamic_cast<MTC_Slave*> (_slave)) != 0)) { + error << _("Ardour is slaved to MTC - port cannot be reset") << endmsg; + return -1; + } + + if (_mtc_port == 0) { return 0; } - _mmc_port = 0; + + _mtc_port = 0; goto out; } MIDI::Port* port; if ((port = MIDI::Manager::instance()->port (port_tag)) == 0) { + error << string_compose (_("unknown port %1 requested for MTC"), port_tag) << endl; return -1; } - _mmc_port = port; + _mtc_port = port; - if (mmc) { - old_device_id = mmc->device_id(); - reset_id = true; - delete mmc; + if (_slave && ((ms = dynamic_cast<MTC_Slave*> (_slave)) != 0)) { + ms->rebind (*port); } - mmc = new MIDI::MachineControl (*_mmc_port, 1.0, - MMC_CommandSignature, - MMC_ResponseSignature); - - if (reset_id) { - mmc->set_device_id (old_device_id); - } - - mmc->Play.connect - (mem_fun (*this, &Session::mmc_deferred_play)); - mmc->DeferredPlay.connect - (mem_fun (*this, &Session::mmc_deferred_play)); - mmc->Stop.connect - (mem_fun (*this, &Session::mmc_stop)); - mmc->FastForward.connect - (mem_fun (*this, &Session::mmc_fast_forward)); - mmc->Rewind.connect - (mem_fun (*this, &Session::mmc_rewind)); - mmc->Pause.connect - (mem_fun (*this, &Session::mmc_pause)); - mmc->RecordPause.connect - (mem_fun (*this, &Session::mmc_record_pause)); - mmc->RecordStrobe.connect - (mem_fun (*this, &Session::mmc_record_strobe)); - mmc->RecordExit.connect - (mem_fun (*this, &Session::mmc_record_exit)); - mmc->Locate.connect - (mem_fun (*this, &Session::mmc_locate)); - mmc->Step.connect - (mem_fun (*this, &Session::mmc_step)); - mmc->Shuttle.connect - (mem_fun (*this, &Session::mmc_shuttle)); - mmc->TrackRecordStatusChange.connect - (mem_fun (*this, &Session::mmc_record_enable)); - - - /* also handle MIDI SPP because its so common */ - - _mmc_port->input()->start.connect (mem_fun (*this, &Session::spp_start)); - _mmc_port->input()->contineu.connect (mem_fun (*this, &Session::spp_continue)); - _mmc_port->input()->stop.connect (mem_fun (*this, &Session::spp_stop)); - - Config->set_mmc_port_name (port_tag); + Config->set_mtc_port_name (port_tag); out: - MMC_PortChanged(); /* EMIT SIGNAL */ + MTC_PortChanged(); /* EMIT SIGNAL */ change_midi_ports (); set_dirty(); -#endif return 0; } void -Session::set_mmc_device_id (uint32_t device_id) +Session::set_mmc_receive_device_id (uint32_t device_id) { if (mmc) { - mmc->set_device_id (device_id); + mmc->set_receive_device_id (device_id); + } +} + +void +Session::set_mmc_send_device_id (uint32_t device_id) +{ + if (mmc) { + mmc->set_send_device_id (device_id); } } int Session::set_mmc_port (string port_tag) { -#if 0 - MIDI::byte old_device_id = 0; + MIDI::byte old_recv_device_id = 0; + MIDI::byte old_send_device_id = 0; bool reset_id = false; if (port_tag.length() == 0) { @@ -198,7 +167,8 @@ Session::set_mmc_port (string port_tag) _mmc_port = port; if (mmc) { - old_device_id = mmc->device_id(); + old_recv_device_id = mmc->receive_device_id(); + old_recv_device_id = mmc->send_device_id(); reset_id = true; delete mmc; } @@ -208,7 +178,8 @@ Session::set_mmc_port (string port_tag) MMC_ResponseSignature); if (reset_id) { - mmc->set_device_id (old_device_id); + mmc->set_receive_device_id (old_recv_device_id); + mmc->set_send_device_id (old_send_device_id); } mmc->Play.connect @@ -248,7 +219,6 @@ Session::set_mmc_port (string port_tag) Config->set_mmc_port_name (port_tag); out: -#endif MMC_PortChanged(); /* EMIT SIGNAL */ change_midi_ports (); set_dirty(); @@ -438,7 +408,7 @@ Session::setup_midi_control () mmc_buffer[0] = 0xf0; // SysEx mmc_buffer[1] = 0x7f; // Real Time SysEx ID for MMC - mmc_buffer[2] = 0x7f; // "broadcast" device ID + mmc_buffer[2] = mmc->send_device_id(); mmc_buffer[3] = 0x6; // MCC /* Set up the qtr frame message */ diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index a7c8dc0200..48fb932b30 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -2872,10 +2872,16 @@ Session::config_changed (const char* parameter_name) //poke_midi_thread (); - } else if (PARAM_IS ("mmc-device-id")) { + } else if (PARAM_IS ("mmc-device-id") || PARAM_IS ("mmc-receive-id")) { if (mmc) { - mmc->set_device_id (Config->get_mmc_device_id()); + mmc->set_receive_device_id (Config->get_mmc_receive_device_id()); + } + + } else if (PARAM_IS ("mmc-send-id")) { + + if (mmc) { + mmc->set_send_device_id (Config->get_mmc_send_device_id()); } } else if (PARAM_IS ("midi-control")) { diff --git a/libs/midi++2/midi++/alsa_rawmidi.h b/libs/midi++2/midi++/alsa_rawmidi.h index 8e50609fbe..54b86edd70 100644 --- a/libs/midi++2/midi++/alsa_rawmidi.h +++ b/libs/midi++2/midi++/alsa_rawmidi.h @@ -37,6 +37,13 @@ class ALSA_RawMidiPort : public MIDI::FD_MidiPort ALSA_RawMidiPort (MIDI::PortRequest &req) : FD_MidiPort (req, "/dev/snd", "midi") {} virtual ~ALSA_RawMidiPort () {} + + static std::string typestring; + + protected: + std::string get_typestring () const { + return typestring; + } }; } // namespace MIDI diff --git a/libs/midi++2/midi++/alsa_sequencer.h b/libs/midi++2/midi++/alsa_sequencer.h index 7fe880fe63..b54486416a 100644 --- a/libs/midi++2/midi++/alsa_sequencer.h +++ b/libs/midi++2/midi++/alsa_sequencer.h @@ -30,8 +30,9 @@ namespace MIDI { -class ALSA_SequencerMidiPort : public Port +class PortRequest; +class ALSA_SequencerMidiPort : public Port { public: ALSA_SequencerMidiPort (PortRequest &req); @@ -41,6 +42,13 @@ class ALSA_SequencerMidiPort : public Port virtual int selectable() const; + static std::string typestring; + + protected: + std::string get_typestring () const { + return typestring; + } + protected: /* Direct I/O */ int write (byte *msg, size_t msglen, timestamp_t timestamp); diff --git a/libs/midi++2/midi++/coremidi_midiport.h b/libs/midi++2/midi++/coremidi_midiport.h index 30e07e01a5..91eccea4a5 100644 --- a/libs/midi++2/midi++/coremidi_midiport.h +++ b/libs/midi++2/midi++/coremidi_midiport.h @@ -32,14 +32,24 @@ namespace MIDI { -class CoreMidi_MidiPort:public Port { - public: - CoreMidi_MidiPort(PortRequest & req); - virtual ~ CoreMidi_MidiPort(); - - virtual int selectable() const { - return -1; - } +namespace PortRequest; + +class CoreMidi_MidiPort:public Port +{ + public: + CoreMidi_MidiPort(PortRequest & req); + virtual ~ CoreMidi_MidiPort(); + + virtual int selectable() const { + return -1; + } + static std::string typestring; + + protected: + std::string get_typestring () const { + return typestring; + } + protected: /* Direct I/O */ int write (byte *msg, size_t msglen, timestamp_t timestamp); diff --git a/libs/midi++2/midi++/factory.h b/libs/midi++2/midi++/factory.h index df7f35e073..9954ea72fe 100644 --- a/libs/midi++2/midi++/factory.h +++ b/libs/midi++2/midi++/factory.h @@ -23,6 +23,7 @@ #include <string> #include <midi++/port.h> +#include <midi++/port_request.h> namespace MIDI { @@ -31,6 +32,11 @@ class PortFactory { Port *create_port (PortRequest &req, void* data); static bool ignore_duplicate_devices (Port::Type); + static int get_known_ports (std::vector<PortSet>&); + static std::string default_port_type (); + static Port::Type string_to_type (const std::string&); + static std::string mode_to_string (int); + static int string_to_mode (const std::string&); }; } // namespace MIDI diff --git a/libs/midi++2/midi++/fd_midiport.h b/libs/midi++2/midi++/fd_midiport.h index 8a1af55967..34e2e27a1a 100644 --- a/libs/midi++2/midi++/fd_midiport.h +++ b/libs/midi++2/midi++/fd_midiport.h @@ -48,6 +48,13 @@ class FD_MidiPort : public Port virtual int selectable() const; static std::vector<std::string *> *list_devices (); + static std::string typestring; + + protected: + std::string get_typestring () const { + return typestring; + } + protected: int _fd; virtual void open (PortRequest &req); diff --git a/libs/midi++2/midi++/fifomidi.h b/libs/midi++2/midi++/fifomidi.h index 57d1502c45..ea644dde06 100644 --- a/libs/midi++2/midi++/fifomidi.h +++ b/libs/midi++2/midi++/fifomidi.h @@ -37,6 +37,13 @@ class FIFO_MidiPort : public MIDI::FD_MidiPort FIFO_MidiPort (PortRequest &req); ~FIFO_MidiPort () {}; + static std::string typestring; + + protected: + std::string get_typestring () const { + return typestring; + } + private: void open (PortRequest &req); }; diff --git a/libs/midi++2/midi++/jack.h b/libs/midi++2/midi++/jack.h index c20b2693f1..1f25609aac 100644 --- a/libs/midi++2/midi++/jack.h +++ b/libs/midi++2/midi++/jack.h @@ -47,6 +47,13 @@ public: virtual void cycle_start(nframes_t nframes); + static std::string typestring; + + protected: + std::string get_typestring () const { + return typestring; + } + protected: /* Direct I/O */ int write(byte *msg, size_t msglen, timestamp_t timestamp); diff --git a/libs/midi++2/midi++/manager.h b/libs/midi++2/midi++/manager.h index 80de408ee1..eef52abe52 100644 --- a/libs/midi++2/midi++/manager.h +++ b/libs/midi++2/midi++/manager.h @@ -50,10 +50,9 @@ class Manager { void cycle_end(); Port *add_port (PortRequest &); - int remove_port (std::string port); + int remove_port (Port*); Port *port (std::string name); - Port *port (size_t number); size_t nports () { return ports_by_device.size(); } diff --git a/libs/midi++2/midi++/mmc.h b/libs/midi++2/midi++/mmc.h index bc23beb0a1..6abbed8207 100644 --- a/libs/midi++2/midi++/mmc.h +++ b/libs/midi++2/midi++/mmc.h @@ -91,8 +91,10 @@ class MachineControl : public sigc::trackable Port &port() { return _port; } - void set_device_id (byte id); - byte device_id () const { return _device_id; } + void set_receive_device_id (byte id); + void set_send_device_id (byte id); + byte receive_device_id () const { return _receive_device_id; } + byte send_device_id () const { return _send_device_id; } static bool is_mmc (byte *sysex_buf, size_t len); @@ -244,7 +246,8 @@ class MachineControl : public sigc::trackable byte resume; private: - byte _device_id; + byte _receive_device_id; + byte _send_device_id; MIDI::Port &_port; void process_mmc_message (Parser &p, byte *, size_t len); diff --git a/libs/midi++2/midi++/nullmidi.h b/libs/midi++2/midi++/nullmidi.h index 1474da77ed..6ed94db71c 100644 --- a/libs/midi++2/midi++/nullmidi.h +++ b/libs/midi++2/midi++/nullmidi.h @@ -55,6 +55,13 @@ class Null_MidiPort : public Port } virtual int selectable() const { return -1; } + + static std::string typestring; + + protected: + std::string get_typestring () const { + return typestring; + } }; } // namespace MIDI diff --git a/libs/midi++2/midi++/port_request.h b/libs/midi++2/midi++/port_request.h index 0cb4ffded6..dfde87a63c 100644 --- a/libs/midi++2/midi++/port_request.h +++ b/libs/midi++2/midi++/port_request.h @@ -53,6 +53,13 @@ struct PortRequest { const std::string &xtype); }; +struct PortSet { + PortSet (std::string str) : owner (str) { } + + std::string owner; + std::list<PortRequest> ports; +}; + } // namespace MIDI #endif // __midi_port_request_h__ diff --git a/libs/midi++2/midifactory.cc b/libs/midi++2/midifactory.cc index de4a246bcf..9d98d9f6a7 100644 --- a/libs/midi++2/midifactory.cc +++ b/libs/midi++2/midifactory.cc @@ -18,6 +18,10 @@ */ #include <cassert> + +#include <pbd/error.h> +#include <pbd/convert.h> + #include <midi++/types.h> #include <midi++/factory.h> #include <midi++/nullmidi.h> @@ -25,20 +29,32 @@ #ifdef WITH_JACK_MIDI #include <midi++/jack.h> + +std::string MIDI::JACK_MidiPort::typestring = "jack"; #endif // WITH_JACK_MIDI +std::string MIDI::Null_MidiPort::typestring = "null"; +std::string MIDI::FIFO_MidiPort::typestring = "fifo"; + #ifdef WITH_ALSA #include <midi++/alsa_sequencer.h> #include <midi++/alsa_rawmidi.h> + +std::string MIDI::ALSA_SequencerMidiPort::typestring = "alsa/sequencer"; +std::string MIDI::ALSA_RawMidiPort::typestring = "alsa/raw"; + #endif // WITH_ALSA #ifdef WITH_COREMIDI #include <midi++/coremidi_midiport.h> -#endif // WITH_COREMIDI +std::string MIDI::CoreMidi_MidiPort::typestring = "coremidi"; + +#endif // WITH_COREMIDI using namespace std; using namespace MIDI; +using namespace PBD; // FIXME: void* data pointer, filthy Port * @@ -114,3 +130,88 @@ PortFactory::ignore_duplicate_devices (Port::Type type) return ret; } +int +PortFactory::get_known_ports (vector<PortSet>& ports) +{ + int n = 0; +#ifdef WITH_ALSA + n += ALSA_SequencerMidiPort::discover (ports); +#endif // WITH_ALSA + +#if WITH_COREMIDI + n += CoreMidi_MidiPort::discover (ports); +#endif // WITH_COREMIDI + + return n; +} + +std::string +PortFactory::default_port_type () +{ +#ifdef WITH_JACK_MIDI + return "jack"; +#endif + +#ifdef WITH_ALSA + return "alsa/sequencer"; +#endif + +#ifdef WITH_COREMIDI + return "coremidi"; +#endif // WITH_COREMIDI + + PBD::fatal << "programming error: no default port type defined in midifactory.cc" << endmsg; + /*NOTREACHED*/ + return ""; +} + +Port::Type +PortFactory::string_to_type (const string& xtype) +{ + if (0){ +#ifdef WITH_ALSA + } else if (strings_equal_ignore_case (xtype, ALSA_RawMidiPort::typestring)) { + return Port::ALSA_RawMidi; + } else if (strings_equal_ignore_case (xtype, ALSA_SequencerMidiPort::typestring)) { + return Port::ALSA_Sequencer; +#endif +#ifdef WITH_COREMIDI + } else if (strings_equal_ignore_case (xtype, CoreMidi_MidiPort::typestring)) { + return Port::CoreMidi_MidiPort; +#endif + } else if (strings_equal_ignore_case (xtype, Null_MidiPort::typestring)) { + return Port::Null; + } else if (strings_equal_ignore_case (xtype, FIFO_MidiPort::typestring)) { + return Port::FIFO; +#ifdef WITH_JACK_MIDI + } else if (strings_equal_ignore_case (xtype, JACK_MidiPort::typestring)) { + return Port::JACK_Midi; +#endif + } + + return Port::Unknown; +} + +string +PortFactory::mode_to_string (int mode) +{ + if (mode == O_RDONLY) { + return "input"; + } else if (mode == O_WRONLY) { + return "output"; + } + + return "duplex"; +} + +int +PortFactory::string_to_mode (const string& str) +{ + if (strings_equal_ignore_case (str, "output") || strings_equal_ignore_case (str, "out")) { + return O_WRONLY; + } else if (strings_equal_ignore_case (str, "input") || strings_equal_ignore_case (str, "in")) { + return O_RDONLY; + } + + return O_RDWR; +} diff --git a/libs/midi++2/midimanager.cc b/libs/midi++2/midimanager.cc index 970674232d..ee73bdad86 100644 --- a/libs/midi++2/midimanager.cc +++ b/libs/midi++2/midimanager.cc @@ -126,44 +126,43 @@ Manager::add_port (PortRequest &req) } int -Manager::remove_port (string name) +Manager::remove_port (Port* port) { PortMap::iterator res; - if ((res = ports_by_device.find (name)) == ports_by_device.end()) { - return -1; + for (res = ports_by_device.begin(); res != ports_by_device.end(); ) { + PortMap::iterator tmp; + tmp = res; + ++tmp; + if (res->second == port) { + ports_by_device.erase (res); + } + res = tmp; } - - ports_by_device.erase (res); - ports_by_device.erase ((*res).second->name()); - - delete (*res).second; - return 0; -} - -Port * -Manager::port (string name) -{ - PortMap::iterator res; - for (res = ports_by_tag.begin(); res != ports_by_tag.end(); res++) { - if (name == (*res).first) { - return (*res).second; - } + for (res = ports_by_tag.begin(); res != ports_by_tag.end(); ) { + PortMap::iterator tmp; + tmp = res; + ++tmp; + if (res->second == port) { + ports_by_tag.erase (res); + } + res = tmp; } + + delete port; return 0; } Port * -Manager::port (size_t portnum) - +Manager::port (string name) { PortMap::iterator res; for (res = ports_by_tag.begin(); res != ports_by_tag.end(); res++) { - if ((*res).second->number() == portnum) { + if (name == (*res).first) { return (*res).second; } } diff --git a/libs/midi++2/mmc.cc b/libs/midi++2/mmc.cc index 28d6393fb4..1ede281c28 100644 --- a/libs/midi++2/mmc.cc +++ b/libs/midi++2/mmc.cc @@ -202,7 +202,8 @@ MachineControl::MachineControl (Port &p, float version, build_mmc_cmd_map (); - _device_id = 0; + _receive_device_id = 0; + _send_device_id = 0x7f; if ((parser = _port.input()) != 0) { parser->mmc.connect @@ -214,10 +215,15 @@ MachineControl::MachineControl (Port &p, float version, } void -MachineControl::set_device_id (byte id) +MachineControl::set_receive_device_id (byte id) +{ + _receive_device_id = id & 0x7f; +} +void +MachineControl::set_send_device_id (byte id) { - _device_id = id & 0x7f; + _send_device_id = id & 0x7f; } bool @@ -258,14 +264,14 @@ MachineControl::process_mmc_message (Parser &p, byte *msg, size_t len) */ #if 0 - cerr << "*** me = " << (int) _device_id << " MMC message: len = " << len << "\n\t"; + cerr << "*** me = " << (int) _receive_device_id << " MMC message: len = " << len << "\n\t"; for (size_t i = 0; i < len; i++) { cerr << hex << (int) msg[i] << dec << ' '; } cerr << endl; #endif - if (msg[1] != 0x7f && msg[1] != _device_id) { + if (msg[1] != 0x7f && msg[1] != _receive_device_id) { return; } diff --git a/libs/pbd/convert.cc b/libs/pbd/convert.cc index 832c54acd8..07fcc09ace 100644 --- a/libs/pbd/convert.cc +++ b/libs/pbd/convert.cc @@ -233,5 +233,21 @@ length2string (const int64_t frames, const double sample_rate) return duration_str; } +static bool +chars_equal_ignore_case(char x, char y) +{ + static std::locale loc; + return toupper(x, loc) == toupper(y, loc); +} + +bool +strings_equal_ignore_case (const string& a, const string& b) +{ + if (a.length() == b.length()) { + return std::equal (a.begin(), a.end(), b.begin(), chars_equal_ignore_case); + } + return false; +} + } // namespace PBD diff --git a/libs/pbd/pbd/convert.h b/libs/pbd/pbd/convert.h index 55006529ae..00176659cf 100644 --- a/libs/pbd/pbd/convert.h +++ b/libs/pbd/pbd/convert.h @@ -35,6 +35,7 @@ void url_decode (std::string&); std::string length2string (const int64_t frames, const double sample_rate); std::vector<std::string> internationalize (const char *, const char **); +bool strings_equal_ignore_case (const std::string& a, const std::string& b); } //namespace PBD |