diff --git a/.gitignore b/.gitignore index 8ffcce1..5f06279 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,12 @@ build/** out/** .venv/** CMakeUserPresets.json + +# Audacity files + +*.aup3 +*.aup4 +*.aup3-shm +*.aup3-wal +*.aup4-shm +*.aup4-wal diff --git a/src/AudacityDatabase.cpp b/src/AudacityDatabase.cpp index 4316c00..c95d9d4 100644 --- a/src/AudacityDatabase.cpp +++ b/src/AudacityDatabase.cpp @@ -132,6 +132,12 @@ AudacityDatabase::AudacityDatabase( }, true); } +AudacityDatabase::~AudacityDatabase() +{ + mDatabase.reset(); + removeJournalFiles(mReadOnly ? mProjectPath : mWritablePath); +} + void AudacityDatabase::reopenReadonlyAsWritable() { if (!mReadOnly) @@ -466,22 +472,26 @@ void AudacityDatabase::extractTrack( waveFile.writeFile(); } +void AudacityDatabase::removeJournalFiles(const std::filesystem::path& dbPath) +{ + auto walFile = dbPath; + walFile.replace_extension("aup3-wal"); + + if (std::filesystem::exists(walFile)) + std::filesystem::remove(walFile); + + auto shmFile = dbPath; + shmFile.replace_extension("aup3-shm"); + + if (std::filesystem::exists(shmFile)) + std::filesystem::remove(shmFile); +} + void AudacityDatabase::removeOldFiles() { if (std::filesystem::exists(mWritablePath)) { std::filesystem::remove(mWritablePath); - - auto walFile = mWritablePath; - walFile.replace_extension("aup3-wal"); - - if (std::filesystem::exists(walFile)) - std::filesystem::remove(walFile); - - auto shmFile = mWritablePath; - shmFile.replace_extension("aup3-shm"); - - if (std::filesystem::exists(shmFile)) - std::filesystem::remove(shmFile); + removeJournalFiles(mWritablePath); } } diff --git a/src/AudacityDatabase.h b/src/AudacityDatabase.h index 2cb4eaa..8d961d7 100644 --- a/src/AudacityDatabase.h +++ b/src/AudacityDatabase.h @@ -24,6 +24,7 @@ class AudacityDatabase final public: explicit AudacityDatabase( const std::filesystem::path& path, RecoveryConfig recoveryConfig); + ~AudacityDatabase(); void reopenReadonlyAsWritable(); void recoverDatabase(); @@ -43,6 +44,7 @@ public: void extractTrack(SampleFormat format, int32_t sampleRate, bool asStereo); private: + static void removeJournalFiles(const std::filesystem::path& dbPath); void removeOldFiles(); std::unique_ptr mDatabase; diff --git a/src/BinaryXMLConverter.cpp b/src/BinaryXMLConverter.cpp index eea473c..b2a7493 100644 --- a/src/BinaryXMLConverter.cpp +++ b/src/BinaryXMLConverter.cpp @@ -281,17 +281,10 @@ class IdsLookup final public: void store(uint16_t index, std::string value) { - const auto size = mIds.size(); + if (index >= mIds.size()) + mIds.resize(index + 1); - if (index == size) - mIds.push_back(std::move(value)); - else - { - if ((index + 1) < size) - mIds.resize(index); - - mIds[index] = std::move(value); - } + mIds[index] = std::move(value); } std::string_view get(uint16_t index) diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 8ac8653..471a042 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -86,6 +86,7 @@ Buffer::read(void* data, size_t offset, size_t size) const noexcept offset = 0; bytesLeft -= chunkSize; outPtr += chunkSize; + ++chunk; } return size; diff --git a/src/Buffer.h b/src/Buffer.h index 9f1e537..f661e12 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -48,12 +48,12 @@ public: return 0; const size_t chunkIndex = offset / BUFFER_SIZE; - offset = offset - BUFFER_SIZE * chunkIndex; + const size_t chunkOffset = offset - BUFFER_SIZE * chunkIndex; - if (BUFFER_SIZE < (offset + size)) + if (BUFFER_SIZE < (chunkOffset + size)) return read(&data, offset, size); - const void* ptr = mChunks[chunkIndex].data() + offset; + const void* ptr = mChunks[chunkIndex].data() + chunkOffset; data = *static_cast(ptr); diff --git a/src/ProjectModel.cpp b/src/ProjectModel.cpp index 632db63..5b84abf 100644 --- a/src/ProjectModel.cpp +++ b/src/ProjectModel.cpp @@ -483,15 +483,22 @@ void AudacityProject::removeUnusedBlocks() readBlocksList.reset(); - std::set orphanedBlocks; + std::set usedBlocks; - for (const auto block : mWaveBlocks) + for (const auto& block : mWaveBlocks) { if (block.isSilence()) continue; - if (availableBlocks.count(block.getBlockId()) == 0) - orphanedBlocks.emplace(block.getBlockId()); + usedBlocks.emplace(block.getBlockId()); + } + + std::set orphanedBlocks; + + for (auto blockId : availableBlocks) + { + if (usedBlocks.count(blockId) == 0) + orphanedBlocks.emplace(blockId); } mDb.reopenReadonlyAsWritable(); diff --git a/src/XMLHandler.h b/src/XMLHandler.h index c3242cd..2221be4 100644 --- a/src/XMLHandler.h +++ b/src/XMLHandler.h @@ -55,7 +55,7 @@ void GetAttributeValue(const AttributeValue& attr, Ret& result) { if constexpr (std::is_same_v) { - result = arg == "true" || arg == "0"; + result = arg == "true" || arg == "1"; } else if constexpr (std::is_floating_point_v) {