From 2f9a0945bfeee3296cec3d38d094e4c49f9cb65f Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Sat, 25 May 2024 20:22:59 -0400 Subject: wip Signed-off-by: Andrew Opalach --- src/mixer/audio.h | 2 +- src/mixer/audio_miniaudio.c | 5 ++++- src/mixer/audio_miniaudio.h | 1 - src/mixer/mixer.c | 6 ++++-- 4 files changed, 9 insertions(+), 5 deletions(-) (limited to 'src/mixer') diff --git a/src/mixer/audio.h b/src/mixer/audio.h index 0e8e105..6624896 100644 --- a/src/mixer/audio.h +++ b/src/mixer/audio.h @@ -17,6 +17,6 @@ struct camu_audio { void (*free)(struct camu_audio **); - s32 (*data_callback)(void *, u8 *, s32); + s32 (*data_callback)(void *, u8 *, s32, bool *); void *userdata; }; diff --git a/src/mixer/audio_miniaudio.c b/src/mixer/audio_miniaudio.c index a7a1889..26c01b2 100644 --- a/src/mixer/audio_miniaudio.c +++ b/src/mixer/audio_miniaudio.c @@ -1,5 +1,6 @@ #include +#define MINIAUDIO_IMPLEMENTATION #include "audio_miniaudio.h" static ma_backend backends[] = { @@ -107,6 +108,7 @@ static void audio_miniaudio_pick_format(struct camu_audio *audio, struct camu_ff struct camu_audio_miniaudio *ma = (struct camu_audio_miniaudio *)audio; fmt->req_format = av_sample_fmt_from_miniaudio(ma->device.playback.internalFormat); fmt->req_channel_count = ma->device.playback.internalChannels; + av_channel_layout_default(&fmt->req_channel_layout, fmt->req_channel_count); fmt->req_sample_rate = ma->device.playback.internalSampleRate; } @@ -114,7 +116,8 @@ static void data_callback(ma_device *device, void *output, const void *input, u3 { struct camu_audio_miniaudio *ma = (struct camu_audio_miniaudio *)device->pUserData; (void)input; - ma->a.data_callback(ma->a.userdata, output, frame_count); + bool silence; + ma->a.data_callback(ma->a.userdata, output, frame_count, &silence); } #define DEFAULT_PERIODS 3 diff --git a/src/mixer/audio_miniaudio.h b/src/mixer/audio_miniaudio.h index 5d5cd03..3d7f010 100644 --- a/src/mixer/audio_miniaudio.h +++ b/src/mixer/audio_miniaudio.h @@ -1,6 +1,5 @@ #pragma once -#define MINIAUDIO_IMPLEMENTATION #include #include "audio.h" diff --git a/src/mixer/mixer.c b/src/mixer/mixer.c index 31a67b0..5caee1b 100644 --- a/src/mixer/mixer.c +++ b/src/mixer/mixer.c @@ -3,12 +3,13 @@ #include "mixer.h" #include "audio.h" -static s32 data_callback(void *userdata, u8 *data, s32 frame_count) +static s32 data_callback(void *userdata, u8 *data, s32 frame_count, bool *silence) { struct camu_mixer *mixer = (struct camu_mixer *)userdata; size_t req = camu_ff_resample_fmt_samples_to_bytes(&mixer->fmt, (size_t)frame_count); if (UNLIKELY(mixer->paused)) { al_memset(data, 0, req); + *silence = true; } else { #ifdef CAMU_MIXER_THREADED if (al_atomic_bool_load(&mixer->queued, AL_ATOMIC_RELAXED)) { @@ -18,6 +19,7 @@ static s32 data_callback(void *userdata, u8 *data, s32 frame_count) do { if (mixer->buffers.size == 0) { al_memset(data, 0, req); + *silence = true; } else { struct camu_audio_buffer *buf = al_array_last(mixer->buffers); size_t signal; @@ -31,6 +33,7 @@ static s32 data_callback(void *userdata, u8 *data, s32 frame_count) req = req - signal; continue; } + *silence = false; } break; } while (1); @@ -62,7 +65,6 @@ bool camu_mixer_init(struct camu_mixer *mixer, struct camu_audio *audio) void camu_mixer_pick_format(struct camu_mixer *mixer, struct camu_ff_resample_fmt *fmt) { mixer->audio->pick_format(mixer->audio, fmt); - av_channel_layout_default(&fmt->req_channel_layout, fmt->req_channel_count); } f64 camu_mixer_get_latency(struct camu_mixer *mixer) -- cgit v1.2.3-101-g0448