Skip to content

Fix random crash when exporting channels as WAV#93

Merged
Gumball2415 merged 2 commits intoDn-Programming-Core-Management:masterfrom
nyanpasu64:fix-channel-export-race
Nov 10, 2021
Merged

Fix random crash when exporting channels as WAV#93
Gumball2415 merged 2 commits intoDn-Programming-Core-Management:masterfrom
nyanpasu64:fix-channel-export-race

Conversation

@nyanpasu64
Copy link
Copy Markdown
Collaborator

Hopefully this code is approximately correct. I've tested it with CWavProgressDlg's timer set to run continuously (switch 200 to 0), and it seems to work without issues.

This code fixes the random crash when exporting multiple channels (due to a data race/race condition), and a theoretical issue that causes WAV files to be skipped entirely if the GUI dialog's progress bar timer fires before the audio thread gets a chance to start rendering (which is unlikely to happen unless the timer is modified to run continuously, as mentioned above).

Fixes #92.

If CWavProgressDlg::OnInitDialog() is modified to start a timer with a 0
millisecond period, then sometimes CWavProgressDlg::OnTimer() will run
before the render starts (CSoundGen::OnStartRender() is called). The
dialog calls CSoundGen::IsRendering() which returns false, and then
closes and initiates the next render, skipping the current one
(and leaving the file handle open).

This commit makes CSoundGen::IsRendering() return true before the render
starts, so the dialog properly waits for the render to finish.
@nyanpasu64 nyanpasu64 marked this pull request as ready for review November 6, 2021 09:05
@Gumball2415 Gumball2415 merged commit fe33fdd into Dn-Programming-Core-Management:master Nov 10, 2021
@nyanpasu64 nyanpasu64 deleted the fix-channel-export-race branch November 22, 2021 01:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Crash when writing to WAV (channel export?)

2 participants