diff options
| -rw-r--r-- | src/buffer/volume.h | 40 | ||||
| -rw-r--r-- | src/codec/codec.h | 3 | ||||
| -rw-r--r-- | src/liana/client.c | 2 | ||||
| -rw-r--r-- | src/liana/vcr.c | 2 | ||||
| -rw-r--r-- | src/libsink/common.h | 2 | ||||
| -rw-r--r-- | src/libsink/sink.c | 22 | ||||
| -rw-r--r-- | src/mixer/audio_miniaudio.c | 32 | ||||
| -rw-r--r-- | src/mixer/meson.build | 5 | ||||
| -rw-r--r-- | src/portal/cpy/portal.pyx | 38 | ||||
| -rw-r--r-- | src/portal/py/log.py | 32 | ||||
| -rw-r--r-- | src/portal/py/modules/youtube.py | 20 | ||||
| -rw-r--r-- | src/portal/py/tests/logger.py | 6 | ||||
| -rw-r--r-- | src/render/renderer_libplacebo.c | 9 | ||||
| -rw-r--r-- | src/screen/screen.c | 12 | ||||
| -rw-r--r-- | src/screen/screen.h | 2 | ||||
| -rw-r--r-- | subprojects/miniaudio.wrap | 4 | ||||
| -rw-r--r-- | subprojects/packagefiles/miniaudio/meson.build | 5 | ||||
| -rw-r--r-- | subprojects/packagefiles/miniaudio/miniaudio_alsa_compile.diff | 72 |
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(¤t->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; |