diff --git a/src/gba/audio.c b/src/gba/audio.c index 6d30f9f08..dce744a45 100644 --- a/src/gba/audio.c +++ b/src/gba/audio.c @@ -822,10 +822,15 @@ static void _sample(struct GBAAudio* audio) { } produced = blip_samples_avail(audio->left); #endif - if (audio->p->stream) { + if (audio->p->stream && audio->p->stream->postAudioFrame) { audio->p->stream->postAudioFrame(audio->p->stream, sampleLeft, sampleRight); } - GBASyncProduceAudio(audio->p->sync, produced >= audio->samples); + bool wait = produced >= audio->samples; + GBASyncProduceAudio(audio->p->sync, wait); + + if (wait && audio->p->stream && audio->p->stream->postAudioBuffer) { + audio->p->stream->postAudioBuffer(audio->p->stream, audio); + } } void GBAAudioSerialize(const struct GBAAudio* audio, struct GBASerializedState* state) { diff --git a/src/gba/gba.h b/src/gba/gba.h index 386dae68d..3594b4ab8 100644 --- a/src/gba/gba.h +++ b/src/gba/gba.h @@ -99,6 +99,7 @@ typedef void (*GBALogHandler)(struct GBAThread*, enum GBALogLevel, const char* f struct GBAAVStream { void (*postVideoFrame)(struct GBAAVStream*, struct GBAVideoRenderer* renderer); void (*postAudioFrame)(struct GBAAVStream*, int16_t left, int16_t right); + void (*postAudioBuffer)(struct GBAAVStream*, struct GBAAudio*); }; struct GBATimer { diff --git a/src/platform/ffmpeg/ffmpeg-encoder.c b/src/platform/ffmpeg/ffmpeg-encoder.c index a53106a76..5d19bfd8c 100644 --- a/src/platform/ffmpeg/ffmpeg-encoder.c +++ b/src/platform/ffmpeg/ffmpeg-encoder.c @@ -33,6 +33,7 @@ void FFmpegEncoderInit(struct FFmpegEncoder* encoder) { encoder->d.postVideoFrame = _ffmpegPostVideoFrame; encoder->d.postAudioFrame = _ffmpegPostAudioFrame; + encoder->d.postAudioBuffer = 0; encoder->audioCodec = 0; encoder->videoCodec = 0; diff --git a/src/platform/imagemagick/imagemagick-gif-encoder.c b/src/platform/imagemagick/imagemagick-gif-encoder.c index 3a85db133..e47451d00 100644 --- a/src/platform/imagemagick/imagemagick-gif-encoder.c +++ b/src/platform/imagemagick/imagemagick-gif-encoder.c @@ -15,6 +15,7 @@ void ImageMagickGIFEncoderInit(struct ImageMagickGIFEncoder* encoder) { encoder->d.postVideoFrame = _magickPostVideoFrame; encoder->d.postAudioFrame = _magickPostAudioFrame; + encoder->d.postAudioBuffer = 0; encoder->frameskip = 2; }