diff --git a/Cocoa/Document.m b/Cocoa/Document.m index 0418c56..03d4acd 100644 --- a/Cocoa/Document.m +++ b/Cocoa/Document.m @@ -309,16 +309,17 @@ static void audioCallback(GB_gameboy_t *gb, GB_sample_t *sample) GB_set_sample_rate(&gb, 96000); self.audioClient = [[GBAudioClient alloc] initWithRendererBlock:^(UInt32 sampleRate, UInt32 nFrames, GB_sample_t *buffer) { [audioLock lock]; - if (stopping) { - memset(buffer, 0, nFrames * sizeof(*buffer)); - [audioLock unlock]; - } if (audioBufferPosition < nFrames) { audioBufferNeeded = nFrames; [audioLock wait]; } + if (stopping) { + memset(buffer, 0, nFrames * sizeof(*buffer)); + [audioLock unlock]; + } + if (audioBufferPosition >= nFrames && audioBufferPosition < nFrames + 4800) { memcpy(buffer, audioBuffer, nFrames * sizeof(*buffer)); memmove(audioBuffer, audioBuffer + nFrames, (audioBufferPosition - nFrames) * sizeof(*buffer)); @@ -376,6 +377,7 @@ static void audioCallback(GB_gameboy_t *gb, GB_sample_t *sample) } [audioLock lock]; stopping = true; + [audioLock signal]; [audioLock unlock]; running = false; while (stopping);