diff options
author | JP Cimalando <jpcima@users.noreply.github.com> | 2018-11-10 16:59:35 +0100 |
---|---|---|
committer | JP Cimalando <jpcima@users.noreply.github.com> | 2018-11-10 19:04:45 +0100 |
commit | 298160f0154a05030681a208a247e2ed309f89db (patch) | |
tree | 653ca82dc19f300fa492727f9c4ea444debe762e /src/adlmidi_midiplay.hpp | |
parent | c519585c1d167c2d0237c83068c4338193c0f463 (diff) | |
download | libADLMIDI-298160f0154a05030681a208a247e2ed309f89db.tar.gz libADLMIDI-298160f0154a05030681a208a247e2ed309f89db.tar.bz2 libADLMIDI-298160f0154a05030681a208a247e2ed309f89db.zip |
linked list structure + users
Diffstat (limited to 'src/adlmidi_midiplay.hpp')
-rw-r--r-- | src/adlmidi_midiplay.hpp | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/src/adlmidi_midiplay.hpp b/src/adlmidi_midiplay.hpp index 02a45a9..d16d851 100644 --- a/src/adlmidi_midiplay.hpp +++ b/src/adlmidi_midiplay.hpp @@ -27,6 +27,7 @@ #include "adldata.hh" #include "adlmidi_private.hpp" #include "adlmidi_ptr.hpp" +#include "structures/pl_list.hpp" /** * @brief Hooks of the internal events @@ -413,7 +414,6 @@ public: }; struct LocationData { - LocationData *prev, *next; Location loc; enum { Sustain_None = 0x00, @@ -429,6 +429,15 @@ public: //! Timeout until note will be allowed to be killed by channel manager while it is on int64_t kon_time_until_neglible_us; int64_t vibdelay_us; + + struct FindPredicate + { + FindPredicate(Location loc) + : loc(loc) {} + bool operator()(const LocationData &ld) const + { return ld.loc == loc; } + Location loc; + }; }; //! Time left until sounding will be muted after key off @@ -437,42 +446,41 @@ public: //! Recently passed instrument, improves a goodness of released but busy channel when matching MIDIchannel::NoteInfo::Phys recent_ins; - enum { users_max = 128 }; - LocationData *users_first, *users_free_cells; - LocationData users_cells[users_max]; - unsigned users_size; + pl_list<LocationData> users; + typedef typename pl_list<LocationData>::iterator users_iterator; + typedef typename pl_list<LocationData>::const_iterator const_users_iterator; - bool users_empty() const; - LocationData *users_find(Location loc); - LocationData *users_allocate(); - LocationData *users_find_or_create(Location loc); - LocationData *users_insert(const LocationData &x); - void users_erase(LocationData *user); - void users_clear(); - void users_assign(const LocationData *users, size_t count); + users_iterator find_user(const Location &loc) + { + return users.find_if(LocationData::FindPredicate(loc)); + } + + users_iterator find_or_create_user(const Location &loc) + { + users_iterator it = find_user(loc); + if(it.is_end() && users.size() != users.capacity()) + { + LocationData ld; + ld.loc = loc; + it = users.insert(users.end(), ld); + } + return it; + } // For channel allocation: - AdlChannel(): koff_time_until_neglible_us(0) + AdlChannel(): koff_time_until_neglible_us(0), users(128) { - users_clear(); std::memset(&recent_ins, 0, sizeof(MIDIchannel::NoteInfo::Phys)); } - AdlChannel(const AdlChannel &oth): koff_time_until_neglible_us(oth.koff_time_until_neglible_us) + AdlChannel(const AdlChannel &oth): koff_time_until_neglible_us(oth.koff_time_until_neglible_us), users(oth.users) { - if(oth.users_first) - { - users_first = NULL; - users_assign(oth.users_first, oth.users_size); - } - else - users_clear(); } AdlChannel &operator=(const AdlChannel &oth) { koff_time_until_neglible_us = oth.koff_time_until_neglible_us; - users_assign(oth.users_first, oth.users_size); + users = oth.users; return *this; } @@ -934,7 +942,7 @@ private: */ void killOrEvacuate( size_t from_channel, - AdlChannel::LocationData *j, + AdlChannel::users_iterator j, MIDIchannel::activenoteiterator i); /** |