diff --git a/usermods/audioreactive/audio_reactive.h b/usermods/audioreactive/audio_reactive.h index b0d495666..55fe0169d 100644 --- a/usermods/audioreactive/audio_reactive.h +++ b/usermods/audioreactive/audio_reactive.h @@ -664,7 +664,7 @@ class AudioReactive : public Usermod { void removeAudioPalettes(void); void createAudioPalettes(void); CRGB getCRGBForBand(int x, int pal); - void fillAudioPalette(int pal); + void fillAudioPalettes(void); //////////////////// // Debug support // @@ -1371,7 +1371,7 @@ class AudioReactive : public Usermod { lastTime = millis(); } - for (int i=0; i0) { strip.customPalettes.pop_back(); DEBUG_PRINTLN(palettes); palettes--; @@ -1869,6 +1869,7 @@ void AudioReactive::removeAudioPalettes(void) { void AudioReactive::createAudioPalettes(void) { DEBUG_PRINT(F("Total # of palettes: ")); DEBUG_PRINTLN(strip.customPalettes.size()); + if (palettes) return; DEBUG_PRINTLN(F("Adding audio palettes.")); for (int i=0; i=palettes) return; // palette does not exist +void AudioReactive::fillAudioPalettes() { + if (!palettes) return; + size_t lastCustPalette = strip.customPalettes.size(); + if (lastCustPalette >= palettes) lastCustPalette -= palettes; + for (size_t pal=0; pal %p\n", &orig, this); memcpy((void*)this, (void*)&orig, sizeof(Segment)); _t = nullptr; // copied segment cannot be in transition - if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } else { name = nullptr; } - if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); } else { data = nullptr; _dataLen = 0; } + name = nullptr; + data = nullptr; + _dataLen = 0; + if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } + if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); } } // move constructor Segment::Segment(Segment &&orig) noexcept { //DEBUG_PRINTF("-- Move segment constructor: %p -> %p\n", &orig, this); memcpy((void*)this, (void*)&orig, sizeof(Segment)); + orig._t = nullptr; // old segment cannot be in transition any more orig.name = nullptr; orig.data = nullptr; orig._dataLen = 0; - orig._t = nullptr; // old segment cannot be in transition any more } // copy assignment @@ -110,14 +113,7 @@ Segment& Segment::operator= (const Segment &orig) { if (this != &orig) { // clean destination if (name) { delete[] name; name = nullptr; } - if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } - if (_t) { - #ifndef WLED_DISABLE_MODE_BLEND - if (_t->_segT._dataT) free(_t->_segT._dataT); - #endif - delete _t; - _t = nullptr; // copied segment cannot be in transition - } + stopTransition(); deallocateData(); // copy source memcpy((void*)this, (void*)&orig, sizeof(Segment)); @@ -125,6 +121,7 @@ Segment& Segment::operator= (const Segment &orig) { data = nullptr; _dataLen = 0; // copy source data + if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); } } return *this; @@ -135,13 +132,7 @@ Segment& Segment::operator= (Segment &&orig) noexcept { //DEBUG_PRINTF("-- Moving segment: %p -> %p\n", &orig, this); if (this != &orig) { if (name) { delete[] name; name = nullptr; } // free old name - if (_t) { - #ifndef WLED_DISABLE_MODE_BLEND - if (_t->_segT._dataT) free(_t->_segT._dataT); - #endif - delete _t; - _t = nullptr; - } + stopTransition(); deallocateData(); // free old runtime data memcpy((void*)this, (void*)&orig, sizeof(Segment)); orig.name = nullptr; @@ -312,7 +303,7 @@ void Segment::startTransition(uint16_t dur) { if (_dataLen > 0 && data) { _t->_segT._dataT = (byte *)malloc(_dataLen); if (_t->_segT._dataT) { - //DEBUG_PRINTF("-- Allocated duplicate data (%d): %p\n", _dataLen, _t->_segT._dataT); + //DEBUG_PRINTF("-- Allocated duplicate data (%d) for %p: %p\n", _dataLen, this, _t->_segT._dataT); memcpy(_t->_segT._dataT, data, _dataLen); _t->_segT._dataLenT = _dataLen; } @@ -330,7 +321,7 @@ void Segment::stopTransition() { if (isInTransition()) { #ifndef WLED_DISABLE_MODE_BLEND if (_t->_segT._dataT && _t->_segT._dataLenT > 0) { - //DEBUG_PRINTF("-- Released duplicate data (%d): %p\n", _t->_segT._dataLenT, _t->_segT._dataT); + //DEBUG_PRINTF("-- Released duplicate data (%d) for %p: %p\n", _t->_segT._dataLenT, this, _t->_segT._dataT); free(_t->_segT._dataT); _t->_segT._dataT = nullptr; _t->_segT._dataLenT = 0; diff --git a/wled00/json.cpp b/wled00/json.cpp index 77bdd1745..2a14be073 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -33,9 +33,9 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId) //DEBUG_PRINTLN("-- JSON deserialize segment."); Segment& seg = strip.getSegment(id); - //DEBUG_PRINTF("-- Original segment: %p\n", &seg); - Segment prev = seg; //make a backup so we can tell if something changed - //DEBUG_PRINTF("-- Duplicate segment: %p\n", &prev); + //DEBUG_PRINTF("-- Original segment: %p (%p)\n", &seg, seg.data); + Segment prev = seg; //make a backup so we can tell if something changed (calling copy constructor) + //DEBUG_PRINTF("-- Duplicate segment: %p (%p)\n", &prev, prev.data); uint16_t start = elem["start"] | seg.start; if (stop < 0) {