Fix handling paused devices with the wave writer backend
This commit is contained in:
+14
-10
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user