Merge pull request #12 from kryksyh/bugfixes

Bugfixes
This commit is contained in:
Dmitry Makarenko 2026-01-27 12:29:36 +03:00 committed by GitHub
commit 40322b0650
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 52 additions and 30 deletions

9
.gitignore vendored
View File

@ -36,3 +36,12 @@ build/**
out/**
.venv/**
CMakeUserPresets.json
# Audacity files
*.aup3
*.aup4
*.aup3-shm
*.aup3-wal
*.aup4-shm
*.aup4-wal

View File

@ -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);
}
}

View File

@ -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<SQLite::Database> mDatabase;

View File

@ -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)

View File

@ -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;

View File

@ -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<const T*>(ptr);

View File

@ -483,15 +483,22 @@ void AudacityProject::removeUnusedBlocks()
readBlocksList.reset();
std::set<int64_t> orphanedBlocks;
std::set<int64_t> 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<int64_t> orphanedBlocks;
for (auto blockId : availableBlocks)
{
if (usedBlocks.count(blockId) == 0)
orphanedBlocks.emplace(blockId);
}
mDb.reopenReadonlyAsWritable();

View File

@ -55,7 +55,7 @@ void GetAttributeValue(const AttributeValue& attr, Ret& result)
{
if constexpr (std::is_same_v<Ret, bool>)
{
result = arg == "true" || arg == "0";
result = arg == "true" || arg == "1";
}
else if constexpr (std::is_floating_point_v<Ret>)
{