From 24856ea494f6b3a84bc3d3d313a57b1882181913 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Nusser?= Date: Sat, 22 May 2021 22:08:19 +0200 Subject: Add assert to break infinite loop in case of a bug. --- src/sample_selection.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sample_selection.cc b/src/sample_selection.cc index 1195703..31313bb 100644 --- a/src/sample_selection.cc +++ b/src/sample_selection.cc @@ -103,6 +103,8 @@ const Sample* SampleSelection::get(level_t level, std::size_t pos) { DEBUG(rand, "%d %d", (int)up_index, (int)down_index); + assert(down_index <= up_index); + std::size_t current_index; if (up_value_lb < down_value_lb) { -- cgit v1.2.3 From a638001e3249edf7264b5ee0f6d5280229aeb671 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Thu, 10 Jun 2021 06:58:46 +0200 Subject: Add missing include --- src/translation.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/translation.h b/src/translation.h index 7f506a6..d8a6072 100644 --- a/src/translation.h +++ b/src/translation.h @@ -26,6 +26,8 @@ */ #pragma once +#include + #include #ifdef WITH_NLS -- cgit v1.2.3 From fe1986214251bcd110837b81ed2159d75c58f8e2 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 10 Apr 2021 18:36:47 +0200 Subject: Get rid of big stack allocation during resampler (re-)configuration. --- src/drumgizmo.cc | 11 +++++++---- src/drumgizmo.h | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index ca91c12..345e89d 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -463,10 +463,13 @@ void DrumGizmo::setSamplerate(float samplerate, float resampling_quality) zita[c].set_inp_data(nullptr); zita[c].set_inp_count(null_size); - constexpr auto sz = 4096 * 16; - sample_t s[sz]; - zita[c].set_out_data(s); - zita[c].set_out_count(sz); + auto scratch_buffer_size = (null_size / ratio) + 1; + if(scratch_buffer.size() < scratch_buffer_size) + { + scratch_buffer.resize(scratch_buffer_size); + } + zita[c].set_out_data(scratch_buffer.data()); + zita[c].set_out_count(scratch_buffer_size); zita[c].process(); } diff --git a/src/drumgizmo.h b/src/drumgizmo.h index f08c9f7..89c2960 100644 --- a/src/drumgizmo.h +++ b/src/drumgizmo.h @@ -107,5 +107,5 @@ protected: std::array zita; std::array, NUM_CHANNELS> resampler_input_buffer; double ratio = 1.0; - + std::vector scratch_buffer; }; -- cgit v1.2.3 From da3d7a913c0b10b4aa776b97def10a3727e07bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Nusser?= Date: Sun, 11 Apr 2021 20:23:04 +0200 Subject: Add clear member function to EventsDS. --- src/events_ds.cc | 19 +++++++++++++++++++ src/events_ds.h | 3 +++ src/memory_heap.h | 8 ++++++++ 3 files changed, 30 insertions(+) diff --git a/src/events_ds.cc b/src/events_ds.cc index ee21f93..0195a89 100644 --- a/src/events_ds.cc +++ b/src/events_ds.cc @@ -99,6 +99,25 @@ void EventsDS::startAddingNewGroup(InstrumentID instrument_id) } } +void EventsDS::clear() +{ + // *this = EventsDS(); + + id_to_info.clear(); + id_to_group_data.clear(); + for (auto& channel_data: channel_data_array) + { + channel_data.sample_events.clear(); + } + for (auto& event_group_ids: instruments_sample_event_group_ids) + { + event_group_ids.clear(); + } + + current_group_id.invalidate(); + current_groups_instrument_id.invalidate(); +} + void EventsDS::removeGroup(EventGroupID group_id, InstrumentID instrument_id) { // if we remove the current group, then invalidate it diff --git a/src/events_ds.h b/src/events_ds.h index 5855711..fdab881 100644 --- a/src/events_ds.h +++ b/src/events_ds.h @@ -96,6 +96,9 @@ public: //! when startAddingNewGroup is again called. void startAddingNewGroup(InstrumentID instrument_id = InstrumentID()); + //! Clears the whole data structure to make it ready for a new drum kit. + void clear(); + private: struct ChannelData { diff --git a/src/memory_heap.h b/src/memory_heap.h index 3f0105a..658598c 100644 --- a/src/memory_heap.h +++ b/src/memory_heap.h @@ -61,6 +61,7 @@ public: T& get(Index index); const T& get(Index index) const; void remove(Index index); + void clear(); private: std::vector memory; @@ -119,3 +120,10 @@ void MemoryHeap::remove(Index index) { free_indices.push_back(index); } + +template +void MemoryHeap::clear() +{ + memory.clear(); + free_indices.clear(); +} -- cgit v1.2.3 From 71e6faeaaa0bb3085fcd838046166025990424a6 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Mon, 12 Apr 2021 20:48:14 +0200 Subject: Add unit-test for EventsDS::clear() method. --- test/eventsdstest.cc | 57 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/test/eventsdstest.cc b/test/eventsdstest.cc index 3c0af68..822cf14 100644 --- a/test/eventsdstest.cc +++ b/test/eventsdstest.cc @@ -34,7 +34,8 @@ class EventsDSTest public: EventsDSTest() { - uUNIT_TEST(EventsDSTest::test_all); + uTEST(EventsDSTest::test_all); + uTEST(EventsDSTest::test_clear); } public: @@ -48,27 +49,27 @@ public: events_ds.emplace(13, 13, 1.0, nullptr, "b", 42); events_ds.emplace(13, 13, 1.0, nullptr, "c", 42); - uUNIT_ASSERT(events_ds.getSampleEventGroupIDsOf(13).empty()); - uUNIT_ASSERT(events_ds.getSampleEventGroupIDsOf(42).size() == 1); + uASSERT(events_ds.getSampleEventGroupIDsOf(13).empty()); + uASSERT(events_ds.getSampleEventGroupIDsOf(42).size() == 1); auto group_id = events_ds.getSampleEventGroupIDsOf(42).back(); const auto& event_ids = events_ds.getEventIDsOf(group_id); - uUNIT_ASSERT(event_ids.size() == 3); + uASSERT(event_ids.size() == 3); // group 2 events_ds.startAddingNewGroup(42); events_ds.emplace(13, 13, 1.0, nullptr, "d", 42); - uUNIT_ASSERT(events_ds.getSampleEventGroupIDsOf(42).size() == 2); + uASSERT(events_ds.getSampleEventGroupIDsOf(42).size() == 2); // group 3 events_ds.startAddingNewGroup(23); events_ds.emplace(7, 7, 1.0, nullptr, "foo", 23); events_ds.emplace(7, 7, 1.0, nullptr, "bar", 23); - uUNIT_ASSERT(events_ds.getSampleEventGroupIDsOf(42).size() == 2); - uUNIT_ASSERT(events_ds.numberOfEvents(13) == 4); - uUNIT_ASSERT(events_ds.numberOfEvents(7) == 2); + uASSERT(events_ds.getSampleEventGroupIDsOf(42).size() == 2); + uASSERT(events_ds.numberOfEvents(13) == 4); + uASSERT(events_ds.numberOfEvents(7) == 2); // iterate over std::string group_concat = ""; @@ -76,27 +77,55 @@ public: { group_concat.append(sample_event.group); } - uUNIT_ASSERT(group_concat == "abcd"); + uASSERT(group_concat == "abcd"); // get and getType for (const auto& sample_event: events_ds.iterateOver(13)) { - uUNIT_ASSERT(events_ds.get(sample_event.id).channel == 13); - uUNIT_ASSERT(events_ds.getType(sample_event.id) == Event::Type::SampleEvent); + uASSERT(events_ds.get(sample_event.id).channel == 13); + uASSERT(events_ds.getType(sample_event.id) == Event::Type::SampleEvent); } // remove auto event_id = events_ds.getEventIDsOf(events_ds.getSampleEventGroupIDsOf(42).back()).back(); events_ds.remove(event_id); - uUNIT_ASSERT(events_ds.getSampleEventGroupIDsOf(42).size() == 1); + uASSERT(events_ds.getSampleEventGroupIDsOf(42).size() == 1); event_id = events_ds.getEventIDsOf(events_ds.getSampleEventGroupIDsOf(23).back()).back(); events_ds.remove(event_id); - uUNIT_ASSERT(!events_ds.getSampleEventGroupIDsOf(23).empty()); + uASSERT(!events_ds.getSampleEventGroupIDsOf(23).empty()); event_id = events_ds.getEventIDsOf(events_ds.getSampleEventGroupIDsOf(23).back()).back(); events_ds.remove(event_id); - uUNIT_ASSERT(events_ds.getSampleEventGroupIDsOf(23).empty()); + uASSERT(events_ds.getSampleEventGroupIDsOf(23).empty()); } + + void test_clear() + { + EventsDS events_ds; + + uASSERT_EQUAL(0u, events_ds.getSampleEventGroupIDsOf(42).size()); + uASSERT_EQUAL(0u, events_ds.getSampleEventGroupIDsOf(43).size()); + + // group 1 + events_ds.startAddingNewGroup(42); + events_ds.emplace(13, 13, 1.0, nullptr, "a", 42); + events_ds.emplace(13, 13, 1.0, nullptr, "b", 42); + events_ds.emplace(13, 13, 1.0, nullptr, "c", 42); + + // group 2 + events_ds.startAddingNewGroup(43); + events_ds.emplace(13, 13, 1.0, nullptr, "a", 43); + events_ds.emplace(13, 13, 1.0, nullptr, "b", 43); + events_ds.emplace(13, 13, 1.0, nullptr, "c", 43); + + uASSERT_EQUAL(1u, events_ds.getSampleEventGroupIDsOf(42).size() == 1); + uASSERT_EQUAL(1u, events_ds.getSampleEventGroupIDsOf(43).size() == 1); + + events_ds.clear(); + + uASSERT_EQUAL(0u, events_ds.getSampleEventGroupIDsOf(42).size()); + uASSERT_EQUAL(0u, events_ds.getSampleEventGroupIDsOf(43).size()); +} }; // Registers the fixture into the 'registry' -- cgit v1.2.3 From 2a3a269b12a28f0bfadca30ed800184a98f215b8 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sun, 4 Jul 2021 19:04:56 +0200 Subject: Clear all active events (ie. stop playing samples) when loading a new kit. --- src/drumgizmo.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index 345e89d..d84799d 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -119,6 +119,12 @@ void DrumGizmo::setRandomSeed(unsigned int seed) bool DrumGizmo::run(size_t pos, sample_t *samples, size_t nsamples) { + if(settings_getter.drumkit_file.hasChanged()) + { + // New kit loaded/loading - old events no longer makes sense. + events_ds.clear(); + } + if(settings_getter.enable_resampling.hasChanged()) { enable_resampling = settings_getter.enable_resampling.getValue(); -- cgit v1.2.3 From 39118c5f8577451c434531cf38c7505762c69484 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sun, 4 Jul 2021 19:05:38 +0200 Subject: Skip events whose audio-files has not yet been loaded. --- src/drumgizmo.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index d84799d..a38186f 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -352,8 +352,9 @@ void DrumGizmo::getSamples(int ch, int pos, sample_t* s, size_t sz) if(!af.isLoaded() || !af.isValid() || (s == nullptr)) { - removeevent = true; - break; + // This event cannot be played - schedule for deletion and continue. + to_remove.push_back(sample_event.id); + continue; } if(sample_event.offset > (pos + sz)) -- cgit v1.2.3 From 17dbc476f4c2d984d083d66d142cca496ed5f84e Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sun, 4 Jul 2021 19:06:01 +0200 Subject: Fix compiler warning. --- src/drumgizmo.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index a38186f..d3665c2 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -438,7 +438,7 @@ float DrumGizmo::samplerate() void DrumGizmo::setSamplerate(float samplerate, float resampling_quality) { - DEBUG(dgeditor, "%s samplerate: %f\n", __PRETTY_FUNCTION__, samplerate); + DEBUG(engine, "%s samplerate: %f\n", __PRETTY_FUNCTION__, samplerate); settings.samplerate.store(samplerate); // Notify input engine of the samplerate change. @@ -470,7 +470,8 @@ void DrumGizmo::setSamplerate(float samplerate, float resampling_quality) zita[c].set_inp_data(nullptr); zita[c].set_inp_count(null_size); - auto scratch_buffer_size = (null_size / ratio) + 1; + std::size_t scratch_buffer_size = (null_size / ratio); + if(scratch_buffer.size() < scratch_buffer_size) { scratch_buffer.resize(scratch_buffer_size); -- cgit v1.2.3 From 62f7f2b2b004162b06af844dbc1a3cda696cfd9e Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Wed, 28 Jul 2021 18:46:45 +0200 Subject: Fix aftertouch choke regression error. --- src/inputprocessor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/inputprocessor.cc b/src/inputprocessor.cc index 4bafb1d..abd2898 100644 --- a/src/inputprocessor.cc +++ b/src/inputprocessor.cc @@ -336,7 +336,7 @@ bool InputProcessor::processChoke(event_t& event, event_sample.rampdown_count == -1) // Only if not already ramping. { // Fixed group rampdown time of 68ms, independent of samplerate - applyChoke(settings, event_sample, 68, event_sample.offset); + applyChoke(settings, event_sample, 68, event.offset); } } } -- cgit v1.2.3