Fix handling paused devices with the wave writer backend

This commit is contained in:
Chris Robinson
2021-01-21 06:51:29 -08:00
parent 19adb622ef
commit fb6585cf18
+14 -10
View File
@@ -176,9 +176,8 @@ int WaveBackend::mixerProc()
} }
} }
size_t fs{fwrite(mBuffer.data(), frameSize, mDevice->UpdateSize, mFile)}; const size_t fs{fwrite(mBuffer.data(), frameSize, mDevice->UpdateSize, mFile)};
(void)fs; if(fs < mDevice->UpdateSize || ferror(mFile))
if(ferror(mFile))
{ {
ERR("Error writing to file\n"); ERR("Error writing to file\n");
mDevice->handleDisconnect("Failed to write playback samples"); mDevice->handleDisconnect("Failed to write playback samples");
@@ -336,6 +335,8 @@ bool WaveBackend::reset()
void WaveBackend::start() void WaveBackend::start()
{ {
if(mDataStart > 0 && fseek(mFile, 0, SEEK_END) != 0)
WARN("Failed to seek on output file\n");
try { try {
mKillNow.store(false, std::memory_order_release); mKillNow.store(false, std::memory_order_release);
mThread = std::thread{std::mem_fn(&WaveBackend::mixerProc), this}; mThread = std::thread{std::mem_fn(&WaveBackend::mixerProc), this};
@@ -352,14 +353,17 @@ void WaveBackend::stop()
return; return;
mThread.join(); mThread.join();
long size{ftell(mFile)}; if(mDataStart > 0)
if(size > 0)
{ {
long dataLen{size - mDataStart}; long size{ftell(mFile)};
if(fseek(mFile, mDataStart-4, SEEK_SET) == 0) if(size > 0)
fwrite32le(static_cast<uint>(dataLen), mFile); // 'data' header len {
if(fseek(mFile, 4, SEEK_SET) == 0) long dataLen{size - mDataStart};
fwrite32le(static_cast<uint>(size-8), mFile); // 'WAVE' header len if(fseek(mFile, 4, SEEK_SET) == 0)
fwrite32le(static_cast<uint>(size-8), mFile); // 'WAVE' header len
if(fseek(mFile, mDataStart-4, SEEK_SET) == 0)
fwrite32le(static_cast<uint>(dataLen), mFile); // 'data' header len
}
} }
} }