summaryrefslogtreecommitdiff
path: root/src/mixer
diff options
context:
space:
mode:
Diffstat (limited to 'src/mixer')
-rw-r--r--src/mixer/audio_miniaudio.c4
-rw-r--r--src/mixer/mixer.c36
-rw-r--r--src/mixer/mixer.h3
3 files changed, 41 insertions, 2 deletions
diff --git a/src/mixer/audio_miniaudio.c b/src/mixer/audio_miniaudio.c
index 2a93491..7db1b5a 100644
--- a/src/mixer/audio_miniaudio.c
+++ b/src/mixer/audio_miniaudio.c
@@ -158,9 +158,9 @@ static bool audio_miniaudio_configure_stream(struct camu_audio *audio, void *opa
ma->config.performanceProfile = ma_performance_profile_conservative;
ma->config.periods = DEFAULT_PERIODS;
ma->config.periodSizeInMilliseconds = DEFAULT_PERIOD_SIZE_IN_MILLISECONDS;
- ma->config.playback.format = ma_format_s32;
+ ma->config.playback.format = ma_format_unknown;
ma->config.playback.channels = 2;
- ma->config.sampleRate = 44100;
+ ma->config.sampleRate = 0;
ma->config.dataCallback = data_callback;
ma->config.pUserData = ma;
ma->config.noPreSilencedOutputBuffer = MA_TRUE;
diff --git a/src/mixer/mixer.c b/src/mixer/mixer.c
index 5af63b7..7608efc 100644
--- a/src/mixer/mixer.c
+++ b/src/mixer/mixer.c
@@ -68,6 +68,7 @@ bool camu_mixer_init(struct camu_mixer *mixer, struct camu_audio *audio)
mixer->audio->data_callback = data_callback;
mixer->audio->userdata = mixer;
mixer->audio->init(mixer->audio, al_str_c("cmv"));
+ mixer->volume = 1.f;
mixer->paused = true;
mixer->empty_after = 0;
al_array_init(mixer->buffers);
@@ -85,6 +86,40 @@ void camu_mixer_pick_format(struct camu_mixer *mixer, struct camu_resampler_form
mixer->audio->pick_format(mixer->audio, fmt);
}
+void camu_mixer_set_volume(struct camu_mixer *mixer, f32 volume)
+{
+#ifdef CAMU_MIXER_THREADED
+ aki_mutex_lock(&mixer->mutex);
+#endif
+ mixer->volume = volume;
+ struct camu_audio_buffer *buf;
+ al_array_foreach(mixer->buffers, i, buf) {
+ camu_audio_buffer_set_volume(buf, mixer->volume);
+ }
+#ifdef CAMU_MIXER_THREADED
+ aki_mutex_unlock(&mixer->mutex);
+#endif
+}
+
+void camu_mixer_offset_volume(struct camu_mixer *mixer, f32 amount)
+{
+#ifdef CAMU_MIXER_THREADED
+ aki_mutex_lock(&mixer->mutex);
+#endif
+ if (FLT_MAX - mixer->volume < amount) {
+ mixer->volume = FLT_MAX;
+ } else {
+ mixer->volume = AL_MAX(0.f, mixer->volume + amount);
+ }
+ struct camu_audio_buffer *buf;
+ al_array_foreach(mixer->buffers, i, buf) {
+ camu_audio_buffer_set_volume(buf, mixer->volume);
+ }
+#ifdef CAMU_MIXER_THREADED
+ aki_mutex_unlock(&mixer->mutex);
+#endif
+}
+
f64 camu_mixer_get_latency(struct camu_mixer *mixer)
{
return mixer->audio->get_latency(mixer->audio) / 1000000.0;
@@ -92,6 +127,7 @@ f64 camu_mixer_get_latency(struct camu_mixer *mixer)
static void add_buffer_internal(struct camu_mixer *mixer, struct camu_audio_buffer *buf)
{
+ camu_audio_buffer_set_volume(buf, mixer->volume);
#ifdef CAMU_MIXER_THREADED
al_atomic_store(u8)(&buf->ref, 1, AL_ATOMIC_RELAXED);
#endif
diff --git a/src/mixer/mixer.h b/src/mixer/mixer.h
index 9a15751..356e2b1 100644
--- a/src/mixer/mixer.h
+++ b/src/mixer/mixer.h
@@ -15,6 +15,7 @@ enum {
struct camu_mixer {
struct camu_audio *audio;
+ f32 volume;
struct camu_resampler_format fmt;
bool paused;
u8 empty_after;
@@ -31,6 +32,8 @@ struct camu_mixer {
bool camu_mixer_init(struct camu_mixer *mixer, struct camu_audio *audio);
void camu_mixer_pick_format(struct camu_mixer *mixer, struct camu_resampler_format *fmt);
+void camu_mixer_set_volume(struct camu_mixer *mixer, f32 volume);
+void camu_mixer_offset_volume(struct camu_mixer *mixer, f32 amount);
f64 camu_mixer_get_latency(struct camu_mixer *mixer);
void camu_mixer_add_buffer(struct camu_mixer *mixer, struct camu_audio_buffer *buf);
void camu_mixer_remove_buffer(struct camu_mixer *mixer, struct camu_audio_buffer *buf);