summaryrefslogtreecommitdiff
path: root/src/mixer
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2024-05-25 20:22:59 -0400
committerAndrew Opalach <andrew@akon.city> 2024-05-25 20:22:59 -0400
commit2f9a0945bfeee3296cec3d38d094e4c49f9cb65f (patch)
treece80b220accbb44920932b1a2a6ca49ed31752a4 /src/mixer
parent90e0930d820972802d1bb2fb27d7dded304483d6 (diff)
downloadcamu-2f9a0945bfeee3296cec3d38d094e4c49f9cb65f.tar.gz
camu-2f9a0945bfeee3296cec3d38d094e4c49f9cb65f.tar.bz2
camu-2f9a0945bfeee3296cec3d38d094e4c49f9cb65f.zip
wip
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/mixer')
-rw-r--r--src/mixer/audio.h2
-rw-r--r--src/mixer/audio_miniaudio.c5
-rw-r--r--src/mixer/audio_miniaudio.h1
-rw-r--r--src/mixer/mixer.c6
4 files changed, 9 insertions, 5 deletions
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 <al/log.h>
+#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 <miniaudio.h>
#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)