summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buffer/volume.h40
-rw-r--r--src/codec/codec.h3
-rw-r--r--src/liana/client.c2
-rw-r--r--src/liana/vcr.c2
-rw-r--r--src/libsink/common.h2
-rw-r--r--src/libsink/sink.c22
-rw-r--r--src/mixer/audio_miniaudio.c32
-rw-r--r--src/mixer/meson.build5
-rw-r--r--src/portal/cpy/portal.pyx38
-rw-r--r--src/portal/py/log.py32
-rw-r--r--src/portal/py/modules/youtube.py20
-rw-r--r--src/portal/py/tests/logger.py6
-rw-r--r--src/render/renderer_libplacebo.c9
-rw-r--r--src/screen/screen.c12
-rw-r--r--src/screen/screen.h2
-rw-r--r--subprojects/miniaudio.wrap4
-rw-r--r--subprojects/packagefiles/miniaudio/meson.build5
-rw-r--r--subprojects/packagefiles/miniaudio/miniaudio_alsa_compile.diff72
18 files changed, 207 insertions, 101 deletions
diff --git a/src/buffer/volume.h b/src/buffer/volume.h
index f785eb9..0cad8d3 100644
--- a/src/buffer/volume.h
+++ b/src/buffer/volume.h
@@ -2,13 +2,43 @@
AL_UNUSED_FUNCTION_PUSH
-static inline f32 apply_audio_f32(f32 *data, size_t sample_count, s32 channel_count, f32 volume, f32 step)
+// https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1AB9U8lJL6yAngGVG6AMKpaAVxYMQ0hwBk8DTAA5dwAjTGIvAFZSAAdUBUJbBmc3Dy9Y%2BMSBPwDgljCIyWjLTGskoQImYgIU909pErKBCqqCHKDQ8KiLSuratIbetv8O/K6igEoLVFdiZHYOAFIAJgBmf2Q3LABqRdXHBQJ8QQA6BD3sRY0AQRX1hk3XHb2Do6wqM4ur27WNrcxdvsqLRUEwCJ9Vpcbt87u8Rttrj5jABZa4ADQgTFI2xCE22%2BIJu0ijm%2BEEWAHYAEKEmm0ukExbE76E0wEACeMUwqCopkxeOMTEBABFtkw9tSiSSbizjOzOdzebjtsYQsKceL8YypdcWYKLsrVXsAGLKwUgA0awlamHkoUTGFrOEBBFI5EASUCmOxStp1puZKp9KD9L9OoJrI5XJ5xj5prVYtWEtDMrlUcV/MNqxFIUtyfDev2BsBJoF23NKstDKZ0Nt9uhjswNGdiOMjh812RyggDGxIOxCDweJb7s9A%2Bxw/RED72wYEzrtxuqfe238BAAHLLtgo1%2BLvkvG9tXKuNwRDzvE3vI8vV1wAGybhR33eLq8Ho%2BCO%2Bb1xPi8vznXwRVmWB8gOfa59yoQ9VyAr9QN/cDX0g1db0kB8ULAiCoMEFCv3Q%2BDL3/A9gVBU8qDgykCMwZd0BmEJ6G2Kg8Io6EbkOME8GQBigOVAUCAIYg8BCVwCEwUxtigBhUH8WgRjnUUYhiWg2WMAA3Fx3FEsjlmobiACp0DBLEtzwAAvUTTwUVhFNEtBXEEbEFG45AEEMAJaGMWz7K45ZtjU1JMGxLStxEmJ5wpZiw3xfhiHE1xuLwNUNA1BKXi3Kz6A8mZBGSlYKOWSk8XC5k6TwSCIBS5ZIm2ZzXMwdzPNPPYhSa7YNEKqliuDPyNLVFs2w7LturYXZ8uCzAYmxDQTiobEuGm%2B14JDW1OppRjJDSlhrLVagUImAzKkZSk8EZZrFrpSzNvo3SWqGzAwPpfaxUiI6Tu2rSJj69tOwgC7rOxI0fAAFRRD1/qBlF0QWiKVopZrpQJYhMAIWYGF89S2DA2GYRuVdthYJh/AgNS8HQMKOvhqLuMew6uGWSRlhO%2B6CSC261TmpKzvxVmWqYBSlNU9HNKAiBHtmunlmxCW0f8yaTg0LguCoKGVsR5HiFRjnodtDgploThIl4TxuF4VBOEcLcZjmAE7h4UgCE0HWpgAaxASJVhOLgAE5PbXenPciOnPdWLhoj1jhJENh3SFNjheAUEANDth2pjgWAkDQTa6HCchKAzmIs4iZBNkMYAuFWeW%2BDoETiHjiAQijkJ/CqNlOFtxvmGINkAHkQm0Up7eN0gM7YQQu4YJSo6wITgEcMRaHjwesHxoxxA4LRSHwRGyhUzAF/XzBVFKYSFlt1c6qjmSQmIZvnCwKP%2BLwFhW94HfiBCeJMCFTBl%2BAGSjGTvgBhgAKAAGp4EwAAdy7pyI2tt%2BCCBEGIdgUgZCCEUCodQa8dAgAlgYf%2BpgPL6EEvHSAUxUAxBsAIBeABaQ46AmrIG9tsahXcfLUPxnMc4WYTIMFfmwlgyMAhNR4Xwk2r8BJYBIRAKYjRKGeAgA4fonguCkF8CMPIBQ9BxASHIpRWjMhyPaBoroKjZHlCGHo0xdV%2B7mNaEYzoERTEWPRsonodj1EOIkDIy28wvH6H1pHLB0dODbFUGuW81CULVTwcAbYZc5Ye3ErgQgJARrBwmLwAeWg5ykBdpIW8Jw1waHlpEckGhJDkkiBoW8a5yT%2BPDoE9eMc44JyTlgnJYdliNJNpwTJycpivwSHYSQQA
+
+static inline f32 apply_volume_f32(f32 *data, size_t sample_count, s32 channel_count, f32 volume, f32 step)
+{
+ for (u32 i = 0; i < sample_count; i++) {
+ if (i % channel_count == 0) {
+ volume = AL_CLAMP(volume + step, 0.f, 1.f);
+ }
+ f64 sample = (f64)data[i];
+ sample *= volume;
+ data[i] = (f32)AL_CLAMP(sample, FLT_MIN, FLT_MAX);
+ }
+ return volume;
+}
+
+static inline f32 apply_volume_s32(s32 *data, size_t sample_count, s32 channel_count, f32 volume, f32 step)
+{
+ for (u32 i = 0; i < sample_count; i++) {
+ if (i % channel_count == 0) {
+ volume = AL_CLAMP(volume + step, 0.f, 1.f);
+ }
+ f64 sample = (f64)data[i];
+ sample *= volume;
+ data[i] = (s32)AL_CLAMP(sample, INT32_MIN, INT32_MAX);
+ }
+ return volume;
+}
+
+static inline f32 apply_volume_s16(s16 *data, size_t sample_count, s32 channel_count, f32 volume, f32 step)
{
for (u32 i = 0; i < sample_count; i++) {
- if ((i + 1) % channel_count == 0) {
+ if (i % channel_count == 0) {
volume = AL_CLAMP(volume + step, 0.f, 1.f);
}
- data[i] *= volume;
+ f64 sample = (f64)data[i];
+ sample *= volume;
+ data[i] = (s16)AL_CLAMP(sample, INT16_MIN, INT16_MAX);
}
return volume;
}
@@ -20,13 +50,15 @@ static inline f32 apply_volume(u8 *data, size_t size, struct camu_audio_format *
case 4:
sample_count = size / 4;
if (fmt->format == CAMU_SAMPLE_FORMAT_S32) {
+ return apply_volume_s32((s32 *)data, sample_count, fmt->channel_count, volume, step);
} else if (fmt->format == CAMU_SAMPLE_FORMAT_FLT) {
- return apply_audio_f32((f32 *)data, sample_count, fmt->channel_count, volume, step);
+ return apply_volume_f32((f32 *)data, sample_count, fmt->channel_count, volume, step);
}
break;
case 2:
sample_count = size / 2;
if (fmt->format == CAMU_SAMPLE_FORMAT_S16) {
+ return apply_volume_s16((s16 *)data, sample_count, fmt->channel_count, volume, step);
}
break;
}
diff --git a/src/codec/codec.h b/src/codec/codec.h
index 68f45f6..6fd42e9 100644
--- a/src/codec/codec.h
+++ b/src/codec/codec.h
@@ -1,6 +1,5 @@
#pragma once
-#include <al/types.h>
#include <al/array.h>
#include <aki/common.h>
#ifdef CAMU_HAVE_FFMPEG
@@ -243,7 +242,7 @@ static const char *camu_audio_format_name(s32 format)
static inline s32 camu_audio_format_bytes_per_sample(struct camu_audio_format *fmt)
{
-#if CAMU_HAVE_FFMPEG
+#ifdef CAMU_HAVE_FFMPEG
return av_get_bytes_per_sample(fmt->format);
#else
switch (fmt->format) {
diff --git a/src/liana/client.c b/src/liana/client.c
index 5d770c0..55a925a 100644
--- a/src/liana/client.c
+++ b/src/liana/client.c
@@ -88,7 +88,7 @@ static void parse_info_packet(struct lia_client *client, struct aki_packet *pack
track->stream.mode = mode;
if (!track->client->init(track->client, client->renderer, &track->stream)) {
track->client->free(&track->client);
-#if CAMU_HAVE_FFMPEG
+#ifdef CAMU_HAVE_FFMPEG
if (track->stream.mode == CAMU_FFMPEG_COMPAT) {
avformat_free_context(track->stream.av.format_context);
}
diff --git a/src/liana/vcr.c b/src/liana/vcr.c
index 40aa757..0f3eac4 100644
--- a/src/liana/vcr.c
+++ b/src/liana/vcr.c
@@ -227,7 +227,7 @@ void lia_vcr_free(struct lia_vcr *vcr)
al_array_foreach(vcr->tracks, i, track) {
aki_packet_cache_free(&track->cache);
track->client->free(&track->client);
-#if CAMU_HAVE_FFMPEG
+#ifdef CAMU_HAVE_FFMPEG
if (track->stream.mode == CAMU_FFMPEG_COMPAT) {
avformat_free_context(track->stream.av.format_context);
}
diff --git a/src/libsink/common.h b/src/libsink/common.h
index c29e494..0bb3ded 100644
--- a/src/libsink/common.h
+++ b/src/libsink/common.h
@@ -1,6 +1,6 @@
#pragma once
-#define CAMU_SINK_LOCAL 0
+#define CAMU_SINK_LOCAL
enum {
CAMU_SINK_SET = 0,
diff --git a/src/libsink/sink.c b/src/libsink/sink.c
index da8f47f..2c8790b 100644
--- a/src/libsink/sink.c
+++ b/src/libsink/sink.c
@@ -136,7 +136,7 @@ static void set_or_queue_entry(struct camu_sink_entry *entry)
#endif
}
-#if CAMU_SINK_LOCAL
+#ifdef CAMU_SINK_LOCAL
static void sink_local_pause(struct camu_sink *sink, struct camu_sink_entry *entry)
{
if (camu_clock_is_paused(&entry->clock)) {
@@ -236,7 +236,7 @@ static void handle_sink_cmd(struct camu_sink *sink, struct camu_sink_cmd *cmd)
break;
}
case TOGGLE_PAUSE: {
-#if CAMU_SINK_LOCAL
+#ifdef CAMU_SINK_LOCAL
sink_local_pause(sink, (struct camu_sink_entry *)cmd->opaque);
#else
if (!sink->conn) return;
@@ -468,7 +468,7 @@ static void video_buffer_callback(void *userdata, u8 op)
static void evaluate_latency(struct camu_sink *sink, struct camu_sink_entry *entry)
{
-#if CAMU_SINK_LOCAL
+#ifdef CAMU_SINK_LOCAL
#ifndef CAMU_SINK_NO_VIDEO
// Entry has both audio and video configured.
if (!BUFFER_EMPTY(&entry->audio) && !BUFFER_EMPTY(&entry->video)) {
@@ -482,9 +482,11 @@ static void evaluate_latency(struct camu_sink *sink, struct camu_sink_entry *ent
// To sync clients with differing audio latencies our only option is to factor the mixer
// latency directly into the audio buffer.
f64 audio = camu_mixer_get_latency(sink->audio.mixer);
- s32 frames = audio / entry->video.buf.avg_frame_duration;
- frames += sink->video.renderer->get_latency(sink->video.renderer);
- camu_video_buffer_set_latency(&entry->video.buf, frames);
+ if (!BUFFER_EMPTY(&entry->video)) {
+ s32 frames = audio / entry->video.buf.avg_frame_duration;
+ frames += sink->video.renderer->get_latency(sink->video.renderer);
+ camu_video_buffer_set_latency(&entry->video.buf, frames);
+ }
camu_audio_buffer_set_latency(&entry->audio.buf, audio);
#endif
}
@@ -788,7 +790,7 @@ static bool set_command_callback(void *userdata, struct aki_rpc_connection *conn
aki_mutex_lock(&sink->mutex);
u8 op = aki_packet_read_u8(packet);
-#if CAMU_SINK_LOCAL
+#ifdef CAMU_SINK_LOCAL
if (op == LIANA_SINK_UNSET) {
if (sink->current) {
remove_entry_buffers(sink, sink->current);
@@ -839,7 +841,7 @@ static bool set_command_callback(void *userdata, struct aki_rpc_connection *conn
goto out;
}
-#if CAMU_SINK_LOCAL
+#ifdef CAMU_SINK_LOCAL
(void)at;
(void)pause;
if (sink->current && !camu_clock_is_paused(&sink->current->clock)) {
@@ -944,7 +946,7 @@ static bool pause_command_callback(void *userdata, struct aki_rpc_connection *co
struct camu_sink_entry *current = sink->current;
if (!current) goto out;
-#if CAMU_SINK_LOCAL
+#ifdef CAMU_SINK_LOCAL
(void)sequence;
(void)at;
(void)pause;
@@ -990,7 +992,7 @@ static bool seek_command_callback(void *userdata, struct aki_rpc_connection *con
if (current->sequence == sequence) {
current->ended = false;
-#if CAMU_SINK_LOCAL
+#ifdef CAMU_SINK_LOCAL
(void)at;
lia_client_seek(&current->client, pos, 0);
#else
diff --git a/src/mixer/audio_miniaudio.c b/src/mixer/audio_miniaudio.c
index 5695a31..72e1cd8 100644
--- a/src/mixer/audio_miniaudio.c
+++ b/src/mixer/audio_miniaudio.c
@@ -2,6 +2,7 @@
#if defined(__clang__) || defined(__GNUC__)
_Pragma("GCC diagnostic push") \
_Pragma("GCC diagnostic ignored \"-Wunused-function\"")
+_Pragma("GCC diagnostic ignored \"-Wunused-variable\"")
_Pragma("GCC diagnostic ignored \"-Wincompatible-pointer-types\"")
_Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"")
#elif _MSC_VER
@@ -18,6 +19,7 @@ _Pragma("GCC diagnostic pop")
static ma_backend backends[] = {
#ifndef _WIN32
ma_backend_pulseaudio,
+ ma_backend_alsa
#else
ma_backend_wasapi
// ma_backend_dsound
@@ -75,24 +77,28 @@ static bool audio_miniaudio_init(struct camu_audio *audio, str *name)
al_log_error("audio_miniaudio", "Failed to initialize context (%d).", ret);
return false;
}
- /*
+ ma->selected_device = NULL;
if (ma_context_get_devices(&ma->context, &ma->infos, &ma->info_count, NULL, NULL) != MA_SUCCESS) {
return false;
}
+ /*
for (u32 i = 0; i < ma->info_count; i++) {
ma_device_info *info = &ma->infos[i];
+ if (strcmp(info->id.alsa, "front:CARD=D10,DEV=0") == 0) {
+ ma->selected_device = info;
+ break;
+ }
ma_device_info real_info;
ma_context_get_device_info(&ma->context, ma_device_type_playback, &info->id, &real_info);
for (u32 j = 0; j < real_info.nativeDataFormatCount; j++) {
- //al_printf("%s\n", real_info.id.alsa);
- //al_printf("%s\n", real_info.id.pulse);
- //al_printf("%i\n", real_info.nativeDataFormats[j].format);
- //al_printf("%i\n", real_info.nativeDataFormats[j].channels);
- //al_printf("%i\n", real_info.nativeDataFormats[j].sampleRate);
- //al_printf("\n");
+ al_printf("%s\n", real_info.id.alsa);
+ al_printf("%s\n", real_info.id.pulse);
+ al_printf("%i\n", real_info.nativeDataFormats[j].format);
+ al_printf("%i\n", real_info.nativeDataFormats[j].channels);
+ al_printf("%i\n", real_info.nativeDataFormats[j].sampleRate);
+ al_printf("\n");
}
}
- //al_printf("%i\n", ma->info_count);
*/
return true;
}
@@ -144,15 +150,15 @@ static bool audio_miniaudio_configure_stream(struct camu_audio *audio, void *opa
struct camu_ff_resample_fmt *fmt = (struct camu_ff_resample_fmt *)opaque;
(void)fmt;
ma->config = ma_device_config_init(ma_device_type_playback);
- //ma->config.playback.pDeviceID = &ma->selected_device->id;
- //ma->config.performanceProfile = ma_performance_profile_low_latency;
+ if (ma->selected_device) {
+ ma->config.playback.pDeviceID = &ma->selected_device->id;
+ }
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_unknown;
- ma->config.playback.format = ma_format_f32;
+ ma->config.playback.format = ma_format_s32;
ma->config.playback.channels = 2;
- ma->config.sampleRate = 0;
+ ma->config.sampleRate = 44100;
ma->config.dataCallback = data_callback;
ma->config.pUserData = ma;
ma->config.noPreSilencedOutputBuffer = MA_TRUE;
diff --git a/src/mixer/meson.build b/src/mixer/meson.build
index ea9356c..be5894f 100644
--- a/src/mixer/meson.build
+++ b/src/mixer/meson.build
@@ -18,8 +18,9 @@ if use_miniaudio
]
if not is_windows
libpulse = dependency('libpulse')
- mixer_deps += [libpulse]
- mixer_args += ['-DMA_ENABLE_PULSEAUDIO', '-DMA_NO_RUNTIME_LINKING']
+ alsa = dependency('alsa')
+ mixer_deps += [libpulse, alsa]
+ mixer_args += ['-DMA_ENABLE_ALSA', '-DMA_ENABLE_PULSEAUDIO', '-DMA_NO_RUNTIME_LINKING']
else
mixer_args += ['-DMA_ENABLE_WASAPI']
#mixer_args += ['-DMA_ENABLE_DSOUND']
diff --git a/src/portal/cpy/portal.pyx b/src/portal/cpy/portal.pyx
index ec33ac6..28af444 100644
--- a/src/portal/cpy/portal.pyx
+++ b/src/portal/cpy/portal.pyx
@@ -6,17 +6,17 @@ cimport bridge
import sys
sys.path.append('./py')
-cdef public int log_info(char *msg) except -1:
- return lib.al_log_info("portal", "%s", msg)
+cdef public int log_info(char *message) except -1:
+ return lib.al_log_info("portal", "%s", message)
-cdef public int log_warn(char *msg) except -1:
- return lib.al_log_warn("portal", "%s", msg)
+cdef public int log_warn(char *message) except -1:
+ return lib.al_log_warn("portal", "%s", message)
-cdef public int log_error(char *msg) except -1:
- return lib.al_log_error("portal", "%s", msg)
+cdef public int log_error(char *message) except -1:
+ return lib.al_log_error("portal", "%s", message)
-cdef public int log_debug(char *msg) except -1:
- return lib.al_log_debug("portal", "%s", msg)
+cdef public int log_debug(char *message) except -1:
+ return lib.al_log_debug("portal", "%s", message)
def encode_str(str):
return str.encode('UTF-8')
@@ -31,9 +31,9 @@ class OutputHook(object):
def __getattr__(self, attr):
return getattr(self.fd, attr)
- def write(self, msg):
- if len(msg) > 0 and msg != '\n':
- log_info(encode_str(msg))
+ def write(self, message):
+ if len(message) > 0 and message != '\n':
+ log_info(encode_str(message))
hook = OutputHook()
sys.stdout = hook
@@ -42,17 +42,17 @@ sys.stderr = hook
import log
class PortalLogger():
- def debug(self, msg):
- log_debug(encode_str(msg))
+ def debug(self, message):
+ log_debug(encode_str(message))
- def info(self, msg):
- log_info(encode_str(msg))
+ def info(self, message):
+ log_info(encode_str(message))
- def warn(self, msg):
- log_warn(encode_str(msg))
+ def warn(self, message):
+ log_warn(encode_str(message))
- def error(self, msg):
- log_error(encode_str(msg))
+ def error(self, message):
+ log_error(encode_str(message))
log.set_logger(PortalLogger())
diff --git a/src/portal/py/log.py b/src/portal/py/log.py
index b693a4c..8d52d0e 100644
--- a/src/portal/py/log.py
+++ b/src/portal/py/log.py
@@ -1,15 +1,15 @@
class DefaultLogger():
- def debug(self, msg):
- print(msg)
+ def debug(self, message):
+ print(message)
- def info(self, msg):
- print(msg)
+ def info(self, message):
+ print(message)
- def warn(self, msg):
- print(msg)
+ def warn(self, message):
+ print(message)
- def error(self, msg):
- print(msg)
+ def error(self, message):
+ print(message)
LOGGER = DefaultLogger()
@@ -17,18 +17,18 @@ def set_logger(logger):
global LOGGER
LOGGER = logger
-def debug(msg):
+def debug(message):
global LOGGER
- LOGGER.debug(msg)
+ LOGGER.debug(message)
-def info(msg):
+def info(message):
global LOGGER
- LOGGER.info(msg)
+ LOGGER.info(message)
-def warn(msg):
+def warn(message):
global LOGGER
- LOGGER.warn(msg)
+ LOGGER.warn(message)
-def error(msg):
+def error(message):
global LOGGER
- LOGGER.error(msg)
+ LOGGER.error(message)
diff --git a/src/portal/py/modules/youtube.py b/src/portal/py/modules/youtube.py
index f809ff6..9645ada 100644
--- a/src/portal/py/modules/youtube.py
+++ b/src/portal/py/modules/youtube.py
@@ -7,20 +7,20 @@ from query_parser import QueryParser
from yt_dlp import YoutubeDL
class YDLLogger():
- def debug(self, msg):
- if msg.startswith('[debug] '):
- log.debug(msg)
+ def debug(self, message):
+ if message.startswith('[debug] '):
+ log.debug(message)
else:
- log.info(msg)
+ log.info(message)
- def info(self, msg):
- log.info(msg)
+ def info(self, message):
+ log.info(message)
- def warning(self, msg):
- log.warn(msg)
+ def warning(self, message):
+ log.warn(message)
- def error(self, msg):
- log.error(msg)
+ def error(self, message):
+ log.error(message)
ydl_opts = {
'quiet': False,
diff --git a/src/portal/py/tests/logger.py b/src/portal/py/tests/logger.py
index 80e22da..3adf792 100644
--- a/src/portal/py/tests/logger.py
+++ b/src/portal/py/tests/logger.py
@@ -5,10 +5,10 @@ class Logger():
self.file = open(path, 'a+')
self.mutex = threading.Lock()
- def write(self, msg):
+ def write(self, message):
with self.mutex:
- print(msg)
- self.file.write(msg + '\n')
+ print(message)
+ self.file.write(message + '\n')
self.file.flush()
def close(self):
diff --git a/src/render/renderer_libplacebo.c b/src/render/renderer_libplacebo.c
index 4f64fc2..ae341f3 100644
--- a/src/render/renderer_libplacebo.c
+++ b/src/render/renderer_libplacebo.c
@@ -19,11 +19,11 @@ static void renderer_lp_resize(struct camu_renderer *renderer, s32 *width, s32 *
if (lr->swapchain) pl_swapchain_resize(lr->swapchain, width, height);
}
-static void log_callback(void *userdata, enum pl_log_level level, const char *msg)
+static void log_callback(void *userdata, enum pl_log_level level, const char *message)
{
(void)userdata;
(void)level;
- al_log_debug("render_libplacebo", msg);
+ al_log_debug("render_libplacebo", message);
}
static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *width, s32 *height,
@@ -63,7 +63,6 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid
.extensions = extensions,
.num_extensions = num,
));
-
if (!lr->vk_inst) {
al_log_error("render_libplacebo", "Failed to create vulkan instance.");
goto err;
@@ -81,7 +80,6 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid
.get_proc_addr = lr->vk_inst->get_proc_addr,
.surface = lr->surface
));
-
if (!lr->vk) {
al_log_error("render_libplacebo", "Failed to create vulkan device.");
goto err;
@@ -91,7 +89,6 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid
.surface = lr->surface,
.present_mode = VK_PRESENT_MODE_FIFO_KHR
));
-
if (!lr->swapchain) {
al_log_error("render_libplacebo", "Failed to create vulkan swapchain.");
goto err;
@@ -109,7 +106,6 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid
.get_proc_addr_ex = NULL,
.priv = priv,
));
-
if (!lr->gl) {
al_log_error("render_libplacebo", "Failed to create GL device.");
goto err;
@@ -120,7 +116,6 @@ static bool renderer_lp_create_renderer(struct camu_renderer *renderer, s32 *wid
.swap_buffers = gl_swap_buffers,
.priv = priv
));
-
if (!lr->swapchain) {
al_log_error("render_libplacebo", "Failed to create GL swapchain.");
goto err;
diff --git a/src/screen/screen.c b/src/screen/screen.c
index 30c77d6..7f1ad30 100644
--- a/src/screen/screen.c
+++ b/src/screen/screen.c
@@ -119,7 +119,7 @@ static bool mouse_button_callback(void *userdata, u8 state, u8 button)
return false;
}
-#if defined STELA_WINDOW_WAYLAND
+#ifdef STELA_WINDOW_WAYLAND
#define SCROLL_MULTIPLIER 155.0
#else
#define SCROLL_MULTIPLIER 13.0
@@ -275,7 +275,7 @@ bool camu_screen_init(struct camu_screen *scr)
return true;
}
-#if defined STELA_EVENT_BUFFER
+#ifdef STELA_EVENT_BUFFER
static aki_thread_result AKI_THREADCALL event_thread(void *userdata)
{
struct camu_screen *scr = (struct camu_screen *)userdata;
@@ -294,7 +294,7 @@ bool camu_screen_create_window(struct camu_screen *scr, const char *name)
}
scr->width = scr->window->width;
scr->height = scr->window->height;
-#if defined STELA_EVENT_BUFFER
+#ifdef STELA_EVENT_BUFFER
aki_thread_create(&scr->thread, event_thread, scr);
#endif
return true;
@@ -435,7 +435,7 @@ void camu_screen_set_state(struct camu_screen *scr, s32 state)
bool camu_screen_poll(struct camu_screen *scr, bool block)
{
-#if defined STELA_EVENT_BUFFER
+#ifdef STELA_EVENT_BUFFER
if (block) {
aki_thread_sleep(AKI_TS_FROM_USEC(1000000/CAMU_SCREEN_POLL_HZ));
}
@@ -444,7 +444,7 @@ bool camu_screen_poll(struct camu_screen *scr, bool block)
scr->window->poll(scr->window, block);
scr->window->process_events(scr->window);
#endif
-#if defined STELA_PAUSE
+#ifdef STELA_PAUSE
return scr->window->should_refresh(scr->window);
#else
return true;
@@ -487,7 +487,7 @@ void camu_screen_close(struct camu_screen *scr)
#endif
al_array_free(scr->videos);
al_atomic_store(s32)(&scr->state, CAMU_SCREEN_CLOSED, AL_ATOMIC_RELAXED);
-#if defined STELA_EVENT_BUFFER
+#ifdef STELA_EVENT_BUFFER
aki_thread_join(&scr->thread);
#endif
scr->window->free(&scr->window);
diff --git a/src/screen/screen.h b/src/screen/screen.h
index af4169e..5ed33b3 100644
--- a/src/screen/screen.h
+++ b/src/screen/screen.h
@@ -48,7 +48,7 @@ struct camu_screen {
atomic(s32) state;
u32 flags;
struct stl_window *window;
-#if defined STELA_EVENT_BUFFER
+#ifdef STELA_EVENT_BUFFER
struct aki_thread thread;
#endif
struct camu_renderer *renderer;
diff --git a/subprojects/miniaudio.wrap b/subprojects/miniaudio.wrap
index 984b6a5..fb397b9 100644
--- a/subprojects/miniaudio.wrap
+++ b/subprojects/miniaudio.wrap
@@ -1,6 +1,6 @@
[wrap-git]
url = https://github.com/mackron/miniaudio.git
-revision = 0.11.21
+revision = 12a8d4e4911c5ab4f4c089b4d039433975ed8a66
depth = 1
patch_directory = miniaudio
-diff_files = miniaudio/miniaudio_pulse_flush.diff
+diff_files = miniaudio/miniaudio_pulse_flush.diff, miniaudio/miniaudio_alsa_compile.diff
diff --git a/subprojects/packagefiles/miniaudio/meson.build b/subprojects/packagefiles/miniaudio/meson.build
index 0296803..5e8ab38 100644
--- a/subprojects/packagefiles/miniaudio/meson.build
+++ b/subprojects/packagefiles/miniaudio/meson.build
@@ -1,3 +1,2 @@
-project('miniaudio', 'c', version: '0.11.21')
-miniaudio = declare_dependency(sources: ['extras/miniaudio_split/miniaudio.c'],
- include_directories: include_directories('extras/miniaudio_split'))
+project('miniaudio', 'c', version: 'git-12a8d4e')
+miniaudio = declare_dependency(include_directories: include_directories('.'))
diff --git a/subprojects/packagefiles/miniaudio/miniaudio_alsa_compile.diff b/subprojects/packagefiles/miniaudio/miniaudio_alsa_compile.diff
new file mode 100644
index 0000000..e1b1199
--- /dev/null
+++ b/subprojects/packagefiles/miniaudio/miniaudio_alsa_compile.diff
@@ -0,0 +1,72 @@
+diff --git a/miniaudio.h b/miniaudio.h
+index a00d394..ca28153 100644
+--- a/miniaudio.h
++++ b/miniaudio.h
+@@ -26694,6 +26694,17 @@ typedef snd_pcm_state_t ma_snd_pcm_state_t;
+ #define MA_SND_PCM_NO_AUTO_RESAMPLE SND_PCM_NO_AUTO_RESAMPLE
+ #define MA_SND_PCM_NO_AUTO_CHANNELS SND_PCM_NO_AUTO_CHANNELS
+ #define MA_SND_PCM_NO_AUTO_FORMAT SND_PCM_NO_AUTO_FORMAT
++
++/* snd_pcm_state_t */
++#define MA_SND_PCM_STATE_OPEN 0
++#define MA_SND_PCM_STATE_SETUP 1
++#define MA_SND_PCM_STATE_PREPARED 2
++#define MA_SND_PCM_STATE_RUNNING 3
++#define MA_SND_PCM_STATE_XRUN 4
++#define MA_SND_PCM_STATE_DRAINING 5
++#define MA_SND_PCM_STATE_PAUSED 6
++#define MA_SND_PCM_STATE_SUSPENDED 7
++#define MA_SND_PCM_STATE_DISCONNECTED 8
+ #else
+ #include <errno.h> /* For EPIPE, etc. */
+ typedef unsigned long ma_snd_pcm_uframes_t;
+@@ -26719,17 +26730,6 @@ typedef struct
+ unsigned int pos[1];
+ } ma_snd_pcm_chmap_t;
+
+-/* snd_pcm_state_t */
+-#define MA_SND_PCM_STATE_OPEN 0
+-#define MA_SND_PCM_STATE_SETUP 1
+-#define MA_SND_PCM_STATE_PREPARED 2
+-#define MA_SND_PCM_STATE_RUNNING 3
+-#define MA_SND_PCM_STATE_XRUN 4
+-#define MA_SND_PCM_STATE_DRAINING 5
+-#define MA_SND_PCM_STATE_PAUSED 6
+-#define MA_SND_PCM_STATE_SUSPENDED 7
+-#define MA_SND_PCM_STATE_DISCONNECTED 8
+-
+ /* snd_pcm_stream_t */
+ #define MA_SND_PCM_STREAM_PLAYBACK 0
+ #define MA_SND_PCM_STREAM_CAPTURE 1
+@@ -26817,6 +26817,7 @@ typedef int (* ma_snd_pcm_hw_params_set_channels_minmax_proc) (
+ typedef int (* ma_snd_pcm_hw_params_set_rate_resample_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val);
+ typedef int (* ma_snd_pcm_hw_params_set_rate_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val, int dir);
+ typedef int (* ma_snd_pcm_hw_params_set_rate_near_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
++typedef int (* ma_snd_pcm_hw_params_set_rate_minmax_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir);
+ typedef int (* ma_snd_pcm_hw_params_set_buffer_size_near_proc)(ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_uframes_t *val);
+ typedef int (* ma_snd_pcm_hw_params_set_periods_near_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
+ typedef int (* ma_snd_pcm_hw_params_set_access_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_access_t _access);
+@@ -28570,8 +28571,9 @@ static ma_result ma_context_init__alsa(ma_context* pContext, const ma_context_co
+ ma_snd_pcm_hw_params_get_format_mask_proc _snd_pcm_hw_params_get_format_mask = snd_pcm_hw_params_get_format_mask;
+ ma_snd_pcm_hw_params_set_channels_proc _snd_pcm_hw_params_set_channels = snd_pcm_hw_params_set_channels;
+ ma_snd_pcm_hw_params_set_channels_near_proc _snd_pcm_hw_params_set_channels_near = snd_pcm_hw_params_set_channels_near;
++ ma_snd_pcm_hw_params_set_channels_minmax_proc _snd_pcm_hw_params_set_channels_minmax = snd_pcm_hw_params_set_channels_minmax;
+ ma_snd_pcm_hw_params_set_rate_resample_proc _snd_pcm_hw_params_set_rate_resample = snd_pcm_hw_params_set_rate_resample;
+- ma_snd_pcm_hw_params_set_rate_near _snd_pcm_hw_params_set_rate = snd_pcm_hw_params_set_rate;
++ ma_snd_pcm_hw_params_set_rate_near_proc _snd_pcm_hw_params_set_rate = snd_pcm_hw_params_set_rate;
+ ma_snd_pcm_hw_params_set_rate_near_proc _snd_pcm_hw_params_set_rate_near = snd_pcm_hw_params_set_rate_near;
+ ma_snd_pcm_hw_params_set_rate_minmax_proc _snd_pcm_hw_params_set_rate_minmax = snd_pcm_hw_params_set_rate_minmax;
+ ma_snd_pcm_hw_params_set_buffer_size_near_proc _snd_pcm_hw_params_set_buffer_size_near = snd_pcm_hw_params_set_buffer_size_near;
+@@ -28623,9 +28625,9 @@ static ma_result ma_context_init__alsa(ma_context* pContext, const ma_context_co
+ ma_snd_pcm_info_proc _snd_pcm_info = snd_pcm_info;
+ ma_snd_pcm_info_sizeof_proc _snd_pcm_info_sizeof = snd_pcm_info_sizeof;
+ ma_snd_pcm_info_get_name_proc _snd_pcm_info_get_name = snd_pcm_info_get_name;
+- ma_snd_pcm_poll_descriptors _snd_pcm_poll_descriptors = snd_pcm_poll_descriptors;
+- ma_snd_pcm_poll_descriptors_count _snd_pcm_poll_descriptors_count = snd_pcm_poll_descriptors_count;
+- ma_snd_pcm_poll_descriptors_revents _snd_pcm_poll_descriptors_revents = snd_pcm_poll_descriptors_revents;
++ ma_snd_pcm_poll_descriptors_proc _snd_pcm_poll_descriptors = snd_pcm_poll_descriptors;
++ ma_snd_pcm_poll_descriptors_count_proc _snd_pcm_poll_descriptors_count = snd_pcm_poll_descriptors_count;
++ ma_snd_pcm_poll_descriptors_revents_proc _snd_pcm_poll_descriptors_revents = snd_pcm_poll_descriptors_revents;
+ ma_snd_config_update_free_global_proc _snd_config_update_free_global = snd_config_update_free_global;
+
+ pContext->alsa.snd_pcm_open = (ma_proc)_snd_pcm_open;