summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cache/handlers/file.c2
-rw-r--r--src/codec/codec.h2
-rw-r--r--src/codec/ffmpeg/common.c16
-rw-r--r--src/codec/ffmpeg/decoder.c17
-rw-r--r--src/codec/ffmpeg/decoder.h2
-rw-r--r--src/codec/ffmpeg/demuxer.c12
-rw-r--r--src/codec/ffmpeg/meson.build157
-rw-r--r--src/codec/ffmpeg/packet_ext.c8
-rw-r--r--src/fruits/cmsrv/ui.c2
-rw-r--r--src/fruits/cmv/cmv.c12
-rw-r--r--src/liana/list_cmp.h6
-rw-r--r--src/libsink/desktop.c4
-rw-r--r--src/mixer/audio_miniaudio.c3
-rw-r--r--src/mixer/meson.build20
-rw-r--r--src/render/meson.build215
15 files changed, 261 insertions, 217 deletions
diff --git a/src/cache/handlers/file.c b/src/cache/handlers/file.c
index dba5649..1a70350 100644
--- a/src/cache/handlers/file.c
+++ b/src/cache/handlers/file.c
@@ -30,7 +30,7 @@ static s32 handler_file_guess_format(struct cch_handler *handler)
struct cch_backing_file *backing = (struct cch_backing_file *)file->backing;
str *path = &backing->file.path;
u32 dot = al_str_rfind(path, '.');
- if (dot != AL_STR_NPOS) {
+ if (dot != AL_STR_NO_POS) {
str ext = al_str_substr(path, dot, path->length);
return camu_guess_format(NULL, &ext, NULL);
}
diff --git a/src/codec/codec.h b/src/codec/codec.h
index 701ef16..9820316 100644
--- a/src/codec/codec.h
+++ b/src/codec/codec.h
@@ -56,8 +56,10 @@ enum {
CAMU_SAMPLE_FORMAT_S32P = AV_SAMPLE_FMT_S32P,
CAMU_SAMPLE_FORMAT_FLTP = AV_SAMPLE_FMT_FLTP,
CAMU_SAMPLE_FORMAT_DBLP = AV_SAMPLE_FMT_DBLP,
+#ifndef CAMU_OLD_FFMPEG
CAMU_SAMPLE_FORMAT_S64 = AV_SAMPLE_FMT_S64,
CAMU_SAMPLE_FORMAT_S64P = AV_SAMPLE_FMT_S64P
+#endif
};
enum {
diff --git a/src/codec/ffmpeg/common.c b/src/codec/ffmpeg/common.c
index 5226df6..e697a00 100644
--- a/src/codec/ffmpeg/common.c
+++ b/src/codec/ffmpeg/common.c
@@ -1,4 +1,5 @@
#define AL_LOG_SECTION "ff"
+//#define AL_LOG_ENABLE_TRACE
#include <al/log.h>
#include <al/lib.h>
#include <libavutil/log.h>
@@ -27,10 +28,6 @@ static void av_log_callback(void *userdata, s32 level, const char *fmt, va_list
{
(void)userdata;
- if (level >= AV_LOG_DEBUG) {
- return;
- }
-
char *offset = log_context.buf + log_context.pos;
s32 ret = al_vsnprintf(offset, AV_LOG_MAX_CHUNK, fmt, args);
al_assert(ret > 0);
@@ -41,8 +38,10 @@ static void av_log_callback(void *userdata, s32 level, const char *fmt, va_list
if ((log_context.pos > 0 && *(offset - 1) == '\n') || log_context.pos >= AV_LOG_MAX_CHUNK) {
if (level < AV_LOG_WARNING) {
log_info(log_context.buf);
- } else {
+ } else if (level < AL_LOG_DEBUG) {
log_debug(log_context.buf);
+ } else {
+ log_trace(log_context.buf);
}
log_context.pos = 0;
}
@@ -55,9 +54,14 @@ void camu_ff_set_log_callback(void (*callback)(void *, s32, const char *, va_lis
void camu_ff_common_init(void)
{
- log_info("Using FFmpeg version "FFMPEG_VERSION".");
+
#ifdef CAMU_OLD_FFMPEG
+ log_info("Using FFmpeg version "FFMPEG_VERSION" (old).");
+ AL_IGNORE_WARNING("-Wdeprecated-declarations")
av_register_all();
+ AL_IGNORE_WARNING_END
+#else
+ log_info("Using FFmpeg version "FFMPEG_VERSION".");
#endif
camu_ff_set_log_callback(av_log_callback);
}
diff --git a/src/codec/ffmpeg/decoder.c b/src/codec/ffmpeg/decoder.c
index 7be21a2..47bab44 100644
--- a/src/codec/ffmpeg/decoder.c
+++ b/src/codec/ffmpeg/decoder.c
@@ -5,17 +5,20 @@
#include "decoder.h"
-#if !defined CAMU_SINK_NO_VIDEO && defined CAMU_FF_DECODER_HWACCEL
+#ifdef CAMU_FF_DECODER_HWACCEL
#include "../../render/renderer.h"
static const char *hwdevces[] = {
-#if defined STELA_API_VULKAN
+#ifdef CAMU_HAVE_VULKAN_DECODE
"vulkan",
-#else
-#if defined NAUNET_ON_WINDOWS
- "d3d11va",
-#else
+#endif
+#ifdef CAMU_HAVE_VAAPI
"vaapi",
#endif
+#ifdef CAMU_HAVE_D3D11VA
+ "d3d11va",
+#endif
+#ifdef CAMU_HAVE_DXVA2
+ "dxva2",
#endif
};
#endif
@@ -179,6 +182,8 @@ static bool get_hwdevice_config(struct camu_ff_decoder *av, const AVCodec *codec
return true;
}
}
+ const char *hwdevice_name = av_hwdevice_get_type_name(hw_device_type);
+ log_warn("No hw_config for device type %s (type: %d).", hwdevice_name, hw_device_type);
return false;
}
diff --git a/src/codec/ffmpeg/decoder.h b/src/codec/ffmpeg/decoder.h
index 85b88dc..ff513b9 100644
--- a/src/codec/ffmpeg/decoder.h
+++ b/src/codec/ffmpeg/decoder.h
@@ -4,7 +4,7 @@
#include "../codec.h"
-#ifdef CAMU_USE_HWACCEL
+#if defined CAMU_TRY_HWACCEL && !defined CAMU_SINK_NO_VIDEO
#define CAMU_FF_DECODER_HWACCEL
#endif
diff --git a/src/codec/ffmpeg/demuxer.c b/src/codec/ffmpeg/demuxer.c
index f05cfa9..a8f1df7 100644
--- a/src/codec/ffmpeg/demuxer.c
+++ b/src/codec/ffmpeg/demuxer.c
@@ -1,4 +1,5 @@
#define AL_LOG_SECTION "ff_demuxer"
+//#define AL_LOG_ENABLE_TRACE
#include <al/log.h>
#include <al/lib.h>
@@ -9,7 +10,12 @@ static void close_internal(struct camu_ff_demuxer *av)
{
if (av->io_context) {
av_free(av->io_context->buffer);
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 80, 100)
avio_context_free(&av->io_context);
+#else
+ av_free(av->io_context);
+ av->io_context = NULL;
+#endif
}
if (av->format_context) {
avformat_flush(av->format_context);
@@ -126,9 +132,13 @@ static bool ff_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handl
}));
}
+#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(60, 30, 100)
av_format_inject_global_side_data(av->format_context);
+#endif
- //av_dump_format(av->format_context, 0, "", 0);
+#ifdef AL_LOG_ENABLE_TRACE
+ av_dump_format(av->format_context, 0, "", 0);
+#endif
av->eof = false;
diff --git a/src/codec/ffmpeg/meson.build b/src/codec/ffmpeg/meson.build
index 56a75b2..6482426 100644
--- a/src/codec/ffmpeg/meson.build
+++ b/src/codec/ffmpeg/meson.build
@@ -1,97 +1,88 @@
-ffmpeg_src = [
- 'common.c',
- 'packet_ext.c',
-]
+ffmpeg_src = ['common.c', 'packet_ext.c']
ffmpeg_args = ['-DCAMU_HAVE_FFMPEG']
-if get_option('codec-hwaccel').enabled()
- ffmpeg_args += ['-DCAMU_USE_HWACCEL']
-endif
-ffmpeg_deps = []
-
-ffmpeg_server_src = [
- ffmpeg_src,
- 'demuxer.c',
- 'avio.c'
-]
-ffmpeg_server_deps = []
-
-ffmpeg_client_src = [
- ffmpeg_src,
- 'decoder.c',
- 'resampler.c',
- 'scaler.c'
-]
-ffmpeg_client_deps = []
+ffmpeg_server_src = [ffmpeg_src, 'demuxer.c', 'avio.c']
server_transcode = not get_option('sink-only')
if server_transcode
- ffmpeg_server_src += [
- 'decoder.c',
- 'resampler.c',
- 'scaler.c',
- 'encoder.c'
- ]
+ ffmpeg_server_src += ['decoder.c', 'resampler.c', 'scaler.c', 'encoder.c']
endif
+ffmpeg_server_deps = []
+
+ffmpeg_client_src = [ffmpeg_src, 'decoder.c', 'resampler.c', 'scaler.c']
+ffmpeg_client_deps = []
-libavutil = dependency('libavutil', required: false)
-libavformat = dependency('libavformat', required: false)
-libavcodec = dependency('libavcodec', required: false)
-#libavdevice = dependency('libavdevice', required: false)
-libswresample = dependency('libswresample', required: false)
-libswscale = dependency('libswscale', required: false)
-if not (libavutil.found() and libavformat.found() and libavcodec.found() and libswresample.found() and libswscale.found())
- if get_option('win32-compat')
- ffmpeg_proj = subproject('ffmpeg-compat', required: false)
- ffmpeg_args += ['-DCAMU_OLD_FFMPEG']
+ffmpeg_force_fallback = false
+foreach dep: ['ffmpeg', 'libavutil', 'libavformat', 'libavcodec', 'libavdevice', 'libswresample', 'libswscale']
+ if dep in get_option('force_fallback_for')
+ ffmpeg_force_fallback = true
+ break
+ endif
+endforeach
+ffmpeg_version_option = get_option('codec-ffmpeg-version')
+# Check for FFmpeg version in the environment.
+if not ffmpeg_force_fallback
+ libavutil_version_map = { '54': '2', '55': '3', '56': '4', '57': '5', '58': '6', '59': '7', '60': '8' }
+ libavutil_version_rev = { '2': '54', '3': '55', '4': '56', '5': '57', '6': '58', '7': '59', '8': '60' }
+ if ffmpeg_version_option != 'system'
+ ffmpeg_version_int = ffmpeg_version_option.to_int()
+ # Overriding a found dependency will error but overriding a found dependency of the wrong version is allowed.
+ libavutil_version_request = ['>=' + libavutil_version_rev[(ffmpeg_version_int).to_string()] + '.0.0']
+ if ffmpeg_version_int < 8
+ libavutil_version_request += ['<' + libavutil_version_rev[(ffmpeg_version_int + 1).to_string()] + '.0.0']
+ endif
+ libavutil = dependency('libavutil', required: false, allow_fallback: false, version: libavutil_version_request)
else
- ffmpeg_proj = subproject('ffmpeg', required: false)
+ libavutil = dependency('libavutil', required: false, allow_fallback: false)
endif
- if ffmpeg_proj.found()
- libavutil = ffmpeg_proj.get_variable('avutil')
- libavformat = ffmpeg_proj.get_variable('avformat')
- libavcodec = ffmpeg_proj.get_variable('avcodec')
- #libavdevice = ffmpeg_proj.get_variable('avdevice')
- libswresample = ffmpeg_proj.get_variable('swresample')
- libswscale = ffmpeg_proj.get_variable('swscale')
- # Only used to set include dirs for FFmpeg.
- ffmpeg_deps += [ffmpeg_proj.get_variable('ffmpeg_include')]
- # We explicitly enable zlib and maybe bzlib in the FFmpeg build.
- ffmpeg_deps += [dependency('zlib')]
- if not get_option('sink-only')
- ffmpeg_deps += [dependency('bzip2')]
+ if libavutil.found()
+ ffmpeg_version_string = run_command('sh', join_paths(meson.current_source_dir(), 'version.sh'), check: true).stdout().strip()
+ if ffmpeg_version_string == '(unknown)'
+ ffmpeg_version_string = libavutil_version_map[libavutil.version().split('.')[0]] + '.x'
endif
- if is_windows and not get_option('win32-compat')
- # Extra static dependencies for Windows.
- ffmpeg_client_deps += [compiler.find_library('bcrypt')]
- elif is_android
- # Android MediaCodec HW decoding.
- ffmpeg_client_deps += [compiler.find_library('mediandk')]
+ ffmpeg_args += ['-DFFMPEG_VERSION="' + ffmpeg_version_string + '"']
+ if get_option('codec-hwaccels').length() > 0
+ hwaccel_map = {
+ 'vulkan': '-DCAMU_HAVE_VULKAN_DECODE',
+ 'vaapi': '-DCAMU_HAVE_VAAPI',
+ 'd3d11va': '-DCAMU_HAVE_D3D11VA',
+ 'dxva2': '-DCAMU_HAVE_DXVA2',
+ 'mediacodec': '-DCAMU_HAVE_MEDIACODEC',
+ }
+ foreach hwaccel: get_option('codec-hwaccels')
+ if hwaccel in hwaccel_map
+ ffmpeg_args += hwaccel_map[hwaccel]
+ endif
+ endforeach
+ ffmpeg_args += ['-DCAMU_TRY_HWACCEL']
endif
- ffmpeg_version_string = ffmpeg_proj.get_variable('ffmpeg_version_string')
+ elif ffmpeg_version_option == 'system'
+ error('System FFmpeg requested but not found. Add \'--force-fallback-for=ffmpeg\' or \'-Dcodec-ffmpeg-version=[8,7,6,...]\'.')
endif
-else
- ffmpeg_version_string = run_command('sh', join_paths(meson.current_source_dir(), 'version.sh'), check: true).stdout().strip()
endif
-
-if libavutil.found() and libavformat.found() and libavcodec.found() and libswresample.found() and libswscale.found()
- # This is probably meaningless compared to libav* versions, it's just something I wanted.
- ffmpeg_args += ['-DFFMPEG_VERSION="' + ffmpeg_version_string + '"']
- ffmpeg_server_deps += [libavutil, libavformat, libavcodec]
- if server_transcode
- ffmpeg_server_deps += [libswresample, libswscale]
- endif
- ffmpeg_client_deps += [libavutil, libavformat, libavcodec, libswresample, libswscale]
- soxr = compiler.find_library('soxr', required: false)
- if soxr.found()
- ffmpeg_client_deps += [soxr]
- ffmpeg_args += ['-DCAMU_HAVE_SOXR']
+# Fallback if requested or necessary.
+if ffmpeg_force_fallback or not libavutil.found()
+ if ffmpeg_version_option == 'system'
+ ffmpeg_version_option = '8' # Default to current latest.
endif
- codec_server_deps += [
- declare_dependency(sources: ffmpeg_server_src,
- dependencies: [ffmpeg_deps, ffmpeg_server_deps], compile_args: ffmpeg_args)
- ]
- codec_client_deps += [
- declare_dependency(sources: ffmpeg_client_src,
- dependencies: [ffmpeg_deps, ffmpeg_client_deps], compile_args: ffmpeg_args)
- ]
+ subproject('ffmpeg' + ffmpeg_version_option) # Override libav dependencies.
+endif
+
+libavutil = dependency('libavutil')
+libavutil_version = libavutil.version().split('.')[0].to_int()
+if libavutil_version <= 54
+ error('FFmpeg version 2.x and lower currently unsupported.')
+elif libavutil_version <= 56
+ ffmpeg_args += ['-DCAMU_OLD_FFMPEG']
+endif
+libavformat = dependency('libavformat')
+libavcodec = dependency('libavcodec')
+libavdevice = dependency('libavdevice')
+libswresample = dependency('libswresample')
+libswscale = dependency('libswscale')
+ffmpeg_server_deps += [libavutil, libavformat, libavcodec]
+if server_transcode
+ ffmpeg_server_deps += [libswresample, libswscale]
endif
+ffmpeg_client_deps += [libavutil, libavformat, libavcodec, libswresample, libswscale]
+codec_server_deps += [declare_dependency(sources: ffmpeg_server_src, dependencies: ffmpeg_server_deps, compile_args: ffmpeg_args)]
+codec_client_deps += [declare_dependency(sources: ffmpeg_client_src, dependencies: ffmpeg_client_deps, compile_args: ffmpeg_args)]
diff --git a/src/codec/ffmpeg/packet_ext.c b/src/codec/ffmpeg/packet_ext.c
index 7dcda88..6b66dd1 100644
--- a/src/codec/ffmpeg/packet_ext.c
+++ b/src/codec/ffmpeg/packet_ext.c
@@ -16,7 +16,7 @@ void nn_packet_write_av_codec_parameters(struct nn_packet *packet, AVCodecParame
NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->width);
NNWT_PACKET_WRITE_TYPE(packet, s32, codecpar->height);
NNWT_PACKET_WRITE_TYPE(packet, AVRational, codecpar->sample_aspect_ratio);
-#if !defined CAMU_OLD_FFMPEG && LIBAVCODEC_VERSION_INT >= 60
+#if !defined CAMU_OLD_FFMPEG && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(60, 11, 100)
NNWT_PACKET_WRITE_TYPE(packet, AVRational, codecpar->framerate);
#endif
NNWT_PACKET_WRITE_TYPE(packet, enum AVFieldOrder, codecpar->field_order);
@@ -108,6 +108,10 @@ void nn_packet_write_av_packet(struct nn_packet *packet, AVPacket *pkt)
#endif
}
+// @TODO: coded_side_data
+// https://github.com/FFmpeg/FFmpeg/blob/f62d8789116fef8d8cd7f20062b16ccd93f7ce23/doc/APIchanges#L537
+// https://ffmpeg.org/doxygen/8.0/structAVCodecParameters.html#ad54da9241deabb3601e6e0e8fa832c19
+// #if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(60, 30, 100)
void nn_packet_read_av_codec_parameters(struct nn_packet *packet, AVCodecParameters *codecpar)
{
NNWT_PACKET_READ_TYPE(packet, enum AVMediaType, codecpar->codec_type);
@@ -127,7 +131,7 @@ void nn_packet_read_av_codec_parameters(struct nn_packet *packet, AVCodecParamet
NNWT_PACKET_READ_TYPE(packet, s32, codecpar->width);
NNWT_PACKET_READ_TYPE(packet, s32, codecpar->height);
NNWT_PACKET_READ_TYPE(packet, AVRational, codecpar->sample_aspect_ratio);
-#if !defined CAMU_OLD_FFMPEG && LIBAVCODEC_VERSION_INT >= 60
+#if !defined CAMU_OLD_FFMPEG && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(60, 11, 100)
NNWT_PACKET_READ_TYPE(packet, AVRational, codecpar->framerate);
#endif
NNWT_PACKET_READ_TYPE(packet, enum AVFieldOrder, codecpar->field_order);
diff --git a/src/fruits/cmsrv/ui.c b/src/fruits/cmsrv/ui.c
index 4f1ece4..1dd5fa2 100644
--- a/src/fruits/cmsrv/ui.c
+++ b/src/fruits/cmsrv/ui.c
@@ -158,9 +158,11 @@ static void render_lists(struct cmsrv_ui *ui)
if (resource->type == CAMU_RESOURCE_PORTAL) {
putnwstr_maxwidth_yx(n, y, x, max_width - x, &resource->post->title);
} else {
+#endif
char *c_str = al_str_to_c_str(&entry->brief);
ncplane_putstr_yx(n, y, x, c_str);
al_free(c_str);
+#ifdef CAMU_HAVE_PORTAL
}
#endif
if (++current_line >= max_height) break;
diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c
index 6875dd1..63e035d 100644
--- a/src/fruits/cmv/cmv.c
+++ b/src/fruits/cmv/cmv.c
@@ -49,9 +49,9 @@ static nn_thread_result NNWT_THREADCALL event_loop_thread(void *userdata)
static bool parse_exe_name_params(str *exe_name, str *addr, struct lia_prefs *prefs)
{
u32 index = al_str_rfind(exe_name, '/');
- if (index == AL_STR_NPOS) {
+ if (index == AL_STR_NO_POS) {
index = al_str_rfind(exe_name, '\\');
- if (index == AL_STR_NPOS) goto def;
+ if (index == AL_STR_NO_POS) goto def;
}
str sub = al_str_substr(exe_name, index + 1, exe_name->length);
@@ -62,19 +62,19 @@ static bool parse_exe_name_params(str *exe_name, str *addr, struct lia_prefs *pr
// Skip version.
index = al_str_find(&sub, '-');
- if (index == AL_STR_NPOS) goto def;
+ if (index == AL_STR_NO_POS) goto def;
sub = al_str_substr(&sub, index + 1, sub.length);
index = al_str_find(&sub, '-');
- if (index == AL_STR_NPOS) goto def;
+ if (index == AL_STR_NO_POS) goto def;
*addr = al_str_substr(&sub, 0, index);
for (;;) {
sub = al_str_substr(&sub, index + 1, sub.length);
index = al_str_find(&sub, '-');
- if (index == AL_STR_NPOS) {
+ if (index == AL_STR_NO_POS) {
index = al_str_find(&sub, '.');
- if (index == AL_STR_NPOS) {
+ if (index == AL_STR_NO_POS) {
index = sub.length;
} else {
sub.length = index;
diff --git a/src/liana/list_cmp.h b/src/liana/list_cmp.h
index ee9b3f8..30f6e7d 100644
--- a/src/liana/list_cmp.h
+++ b/src/liana/list_cmp.h
@@ -9,7 +9,7 @@ AL_IGNORE_WARNING("-Wunused-function")
static void camu_db_num_from_path(str *path, s64 *id, s64 *index)
{
u32 last_slash = al_str_rfind(path, '/');
- if (last_slash == AL_WSTR_NPOS) {
+ if (last_slash == AL_WSTR_NO_POS) {
return;
}
str sub = al_str_substr(path, last_slash + 1, path->length);
@@ -20,7 +20,7 @@ static void camu_db_num_from_path(str *path, s64 *id, s64 *index)
}
u32 target = al_str_find(&sub, '_');
- if (target == AL_WSTR_NPOS) {
+ if (target == AL_WSTR_NO_POS) {
return;
}
sub = al_str_substr(&sub, 0, target);
@@ -32,7 +32,7 @@ static void camu_db_num_from_path(str *path, s64 *id, s64 *index)
u32 ext_dot = al_str_rfind(path, '.');
u32 a_of_media = al_str_rfind(path, 'a');
- if (ext_dot == AL_WSTR_NPOS || a_of_media == AL_WSTR_NPOS) {
+ if (ext_dot == AL_WSTR_NO_POS || a_of_media == AL_WSTR_NO_POS) {
return;
}
sub = al_str_substr(path, a_of_media + 1, ext_dot);
diff --git a/src/libsink/desktop.c b/src/libsink/desktop.c
index 6dee662..35c0b1b 100644
--- a/src/libsink/desktop.c
+++ b/src/libsink/desktop.c
@@ -1,7 +1,9 @@
#define AL_LOG_SECTION "desktop"
#include <al/log.h>
-//#define DESKTOP_NULL_AUDIO
+#ifdef CAMU_NO_MINIAUDIO_BACKENDS
+#define DESKTOP_NULL_AUDIO
+#endif
#ifdef DESKTOP_NULL_AUDIO
#include "../mixer/audio_null.h"
diff --git a/src/mixer/audio_miniaudio.c b/src/mixer/audio_miniaudio.c
index bc2da0d..9355f35 100644
--- a/src/mixer/audio_miniaudio.c
+++ b/src/mixer/audio_miniaudio.c
@@ -74,6 +74,9 @@ static void miniaudio_log_callback(void *userdata, u32 level, const char *messag
static bool audio_miniaudio_init(struct camu_audio *audio, str *name)
{
struct camu_audio_miniaudio *ma = (struct camu_audio_miniaudio *)audio;
+#ifdef CAMU_NO_MINIAUDIO_BACKENDS
+ al_assert_and_return(false);
+#endif
ma_log_init(&alloc_callbacks, &ma->log);
ma_log_register_callback(&ma->log, ma_log_callback_init(miniaudio_log_callback, NULL));
ma->context_config = ma_context_config_init();
diff --git a/src/mixer/meson.build b/src/mixer/meson.build
index e4840c1..f65d624 100644
--- a/src/mixer/meson.build
+++ b/src/mixer/meson.build
@@ -17,10 +17,20 @@ if use_miniaudio
'-DMA_NO_GENERATION',
]
if is_linux
- libpulse = dependency('libpulse')
- alsa = dependency('alsa')
- mixer_deps += [libpulse, alsa]
- mixer_args += ['-DMA_ENABLE_ALSA', '-DMA_ENABLE_PULSEAUDIO', '-DMA_NO_RUNTIME_LINKING']
+ mixer_args += ['-DMA_NO_RUNTIME_LINKING']
+ libpulse = dependency('libpulse', required: false)
+ if libpulse.found()
+ mixer_deps += [libpulse]
+ mixer_args += ['-DMA_ENABLE_PULSEAUDIO']
+ endif
+ alsa = dependency('alsa', required: false)
+ if alsa.found()
+ mixer_deps += [alsa]
+ mixer_args += ['-DMA_ENABLE_ALSA']
+ endif
+ if not (libpulse.found() or alsa.found())
+ mixer_args += ['-DCAMU_NO_MINIAUDIO_BACKENDS']
+ endif
elif is_windows
if get_option('win32-compat')
mixer_args += ['-DMA_ENABLE_DSOUND']
@@ -29,6 +39,8 @@ if use_miniaudio
endif
elif is_android
mixer_args += ['-DMA_ENABLE_AAUDIO']
+ else
+ mixer_args += ['-DCAMU_NO_MINIAUDIO_BACKENDS']
endif
endif
diff --git a/src/render/meson.build b/src/render/meson.build
index b567a03..4274758 100644
--- a/src/render/meson.build
+++ b/src/render/meson.build
@@ -8,118 +8,127 @@ if get_option('renderer') == 'momo'
render_deps += [momo]
render_args += ['-DCAMU_RENDERER_MOMO']
elif get_option('renderer') == 'libplacebo'
- libplacebo_opts = ['warning_level=2', 'demos=false', 'tests=false', 'bench=false', 'fuzz=false',
- 'glslang=disabled',
- 'gl-proc-addr=disabled',
- 'vk-proc-addr=disabled',
- 'lcms=auto',
- 'dovi=auto',
- 'libdovi=auto',
- 'xxhash=auto'
- ]
+ libplacebo_found = false
+ if 'libplacebo' not in get_option('force_fallback_for')
+ libplacebo = dependency('libplacebo', required: false, allow_fallback: false)
+ if libplacebo.found()
+ libplacebo_found = true
+ endif
+ endif
+ if not libplacebo_found
+ libplacebo_opts = ['warning_level=2', 'demos=false', 'tests=false', 'bench=false', 'fuzz=false',
+ 'gl-proc-addr=disabled',
+ 'vk-proc-addr=disabled',
+ 'lcms=auto',
+ 'dovi=auto',
+ 'libdovi=auto',
+ 'xxhash=auto'
+ ]
- if get_option('renderer-api') == 'vulkan' or get_option('renderer-api') == 'dx11'
- if is_windows
- shaderc = dependency('shaderc_combined', required: false, allow_fallback: false)
+ if get_option('renderer-api') == 'vulkan' or get_option('renderer-api') == 'dx11'
+ if get_option('renderer-compiler') == 'shaderc'
+ if is_windows
+ shaderc = dependency('shaderc_combined', required: false, allow_fallback: false)
+ else
+ shaderc = dependency('shaderc', required: false, allow_fallback: false)
+ endif
+ if shaderc.found()
+ render_deps += [shaderc]
+ else
+ shaderc_opts = cmake.subproject_options()
+ shaderc_opts.set_override_option('warning_level', '0') # Doesn't work.
+ reltype = is_minsize ? 'MinSizeRel' : 'Release'
+ shaderc_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype })
+ shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_INSTALL': true })
+ shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_TESTS': true })
+ shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_EXAMPLES': true })
+ shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_COPYRIGHT_CHECK': true })
+ shaderc_opts.add_cmake_defines({ 'ENABLE_GLSLANG_BINARIES': false })
+ shaderc_opts.add_cmake_defines({ 'ENABLE_SPVREMAPPER': false })
+ shaderc_opts.add_cmake_defines({ 'ENABLE_HLSL': false })
+ spirv_optimizer = true
+ shaderc_opts.add_cmake_defines({ 'ENABLE_OPT': spirv_optimizer })
+ shaderc_opts.add_cmake_defines({ 'ENABLE_EXCEPTIONS_ON_MSVC': false })
+ shaderc_proj = cmake.subproject('shaderc', options: shaderc_opts)
+ shaderc = shaderc_proj.dependency('shaderc')
+ meson.override_dependency('shaderc', shaderc)
+ render_deps += [
+ shaderc_proj.dependency('shaderc_util'),
+ shaderc_proj.dependency('glslang'),
+ shaderc_proj.dependency('MachineIndependent'),
+ shaderc_proj.dependency('OSDependent'),
+ shaderc_proj.dependency('GenericCodeGen'),
+ shaderc_proj.dependency('SPIRV'),
+ shaderc_proj.dependency('SPIRV-Tools-static')
+ ]
+ if spirv_optimizer
+ render_deps += [
+ shaderc_proj.dependency('SPIRV-Tools-opt'),
+ ]
+ endif
+ endif
+ libplacebo_opts += ['shaderc=enabled', 'glslang=disabled']
+ else
+ glslang = dependency('glslang', required: false, allow_fallback: false)
+ if glslang.found()
+ render_deps += [glslang]
+ else
+ glslang_opts = cmake.subproject_options()
+ glslang_opts.set_override_option('warning_level', '0')
+ reltype = is_minsize ? 'MinSizeRel' : 'Release'
+ glslang_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype })
+ spirv_optimizer = false
+ glslang_opts.add_cmake_defines({ 'ENABLE_OPT': spirv_optimizer })
+ glslang_proj = cmake.subproject('glslang', options: glslang_opts)
+ spirv = glslang_proj.dependency('SPIRV')
+ glslang = glslang_proj.dependency('glslang')
+ glslang_default_resource_limits = glslang_proj.dependency('glslang-default-resource-limits')
+ meson.override_dependency('SPIRV', spirv)
+ meson.override_dependency('glslang', glslang)
+ meson.override_dependency('glslang-default-resource-limits', glslang_default_resource_limits)
+ render_deps += [
+ glslang_proj.dependency('MachineIndependent'),
+ glslang_proj.dependency('OSDependent'),
+ glslang_proj.dependency('GenericCodeGen'),
+ spirv,
+ glslang,
+ glslang_default_resource_limits
+ ]
+ endif
+ libplacebo_opts += ['glslang=enabled', 'shaderc=disabled']
+ endif
else
- shaderc = dependency('shaderc', required: false, allow_fallback: false)
+ libplacebo_opts += ['glslang=disabled', 'shaderc=disabled']
endif
- if shaderc.found()
- render_deps += [shaderc]
- else
- shaderc_opts = cmake.subproject_options()
- shaderc_opts.set_override_option('warning_level', '0') # Doesn't work.
+
+ if get_option('renderer-api') == 'vulkan'
+ libplacebo_opts += ['vulkan=enabled', 'd3d11=disabled', 'opengl=disabled']
+ elif get_option('renderer-api') == 'dx11'
+ spirv_cross_opts = cmake.subproject_options()
reltype = is_minsize ? 'MinSizeRel' : 'Release'
- shaderc_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype })
- shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_INSTALL': true })
- shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_TESTS': true })
- shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_EXAMPLES': true })
- shaderc_opts.add_cmake_defines({ 'SHADERC_SKIP_COPYRIGHT_CHECK': true })
- shaderc_opts.add_cmake_defines({ 'ENABLE_GLSLANG_BINARIES': false })
- shaderc_opts.add_cmake_defines({ 'ENABLE_SPVREMAPPER': false })
- shaderc_opts.add_cmake_defines({ 'ENABLE_HLSL': false })
- spirv_optimizer = true
- shaderc_opts.add_cmake_defines({ 'ENABLE_OPT': spirv_optimizer })
- shaderc_opts.add_cmake_defines({ 'ENABLE_EXCEPTIONS_ON_MSVC': false })
- shaderc_proj = cmake.subproject('shaderc', options: shaderc_opts)
- shaderc = shaderc_proj.dependency('shaderc')
- meson.override_dependency('shaderc', shaderc)
+ spirv_cross_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype })
+ spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_CLI': false })
+ spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_TESTS': false })
+ spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_MSL': false })
+ spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_CPP': false })
+ spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_REFLECT': false })
+ spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_UTIL': false })
+ spirv_cross_proj = cmake.subproject('SPIRV-Cross', options: spirv_cross_opts)
+ spirv_cross_c_shared = spirv_cross_proj.dependency('spirv-cross-c')
render_deps += [
- shaderc_proj.dependency('shaderc_util'),
- shaderc_proj.dependency('glslang'),
- shaderc_proj.dependency('MachineIndependent'),
- shaderc_proj.dependency('OSDependent'),
- shaderc_proj.dependency('GenericCodeGen'),
- shaderc_proj.dependency('SPIRV'),
- shaderc_proj.dependency('SPIRV-Tools-static')
+ spirv_cross_proj.dependency('spirv-cross-glsl'),
+ spirv_cross_proj.dependency('spirv-cross-hlsl'),
+ spirv_cross_proj.dependency('spirv-cross-core'),
+ spirv_cross_c_shared
]
- if spirv_optimizer
- render_deps += [
- shaderc_proj.dependency('SPIRV-Tools-opt'),
- ]
- endif
+ meson.override_dependency('spirv-cross-c-shared', spirv_cross_c_shared)
+ libplacebo_opts += ['d3d11=enabled', 'vulkan=disabled', 'opengl=disabled']
+ else
+ libplacebo_opts += ['opengl=enabled', 'vulkan=disabled', 'd3d11=disabled']
endif
- #glslang = dependency('glslang', required: false, allow_fallback: false)
- #if glslang.found()
- # render_deps += [glslang]
- #else
- # #spirv_tools_opts = cmake.subproject_options()
- # #spirv_tools_opts.set_override_option('warning_level', '0')
- # #reltype = is_minsize ? 'MinSizeRel' : 'Release'
- # #spirv_tools_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype })
- # #spirv_tools_proj = cmake.subproject('SPIRV-Tools', options: spirv_tools_opts)
- # glslang_opts = cmake.subproject_options()
- # glslang_opts.set_override_option('warning_level', '0')
- # reltype = is_minsize ? 'MinSizeRel' : 'Release'
- # glslang_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype })
- # #glslang_opts.add_cmake_defines({ 'ALLOW_EXTERNAL_SPIRV_TOOLS': true })
- # glslang_opts.add_cmake_defines({ 'ENABLE_OPT': '0' })
- # glslang_proj = cmake.subproject('glslang', options: glslang_opts)
- # #message('CMake targets:\n - ' + '\n - '.join(glslang_proj.target_list()))
- # glslang = glslang_proj.dependency('glslang')
- # spirv = glslang_proj.dependency('SPIRV')
- # glslang_default_resource_limits = glslang_proj.dependency('glslang-default-resource-limits')
- # meson.override_dependency('glslang', glslang)
- # meson.override_dependency('SPIRV', spirv)
- # meson.override_dependency('glslang-default-resource-limits', glslang_default_resource_limits)
- # render_deps += [
- # glslang_proj.dependency('MachineIndependent'),
- # glslang_proj.dependency('OSDependent'),
- # glslang_proj.dependency('GenericCodeGen'),
- # glslang,
- # spirv,
- # glslang_default_resource_limits
- # ]
- #endif
- endif
- if get_option('renderer-api') == 'vulkan'
- libplacebo_opts += ['shaderc=enabled', 'vulkan=enabled', 'd3d11=disabled', 'opengl=disabled']
- elif get_option('renderer-api') == 'dx11'
- spirv_cross_opts = cmake.subproject_options()
- reltype = is_minsize ? 'MinSizeRel' : 'Release'
- spirv_cross_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : reltype })
- spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_CLI': false })
- spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_TESTS': false })
- spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_MSL': false })
- spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_CPP': false })
- spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_REFLECT': false })
- spirv_cross_opts.add_cmake_defines({ 'SPIRV_CROSS_ENABLE_UTIL': false })
- spirv_cross_proj = cmake.subproject('SPIRV-Cross', options: spirv_cross_opts)
- spirv_cross_c_shared = spirv_cross_proj.dependency('spirv-cross-c')
- render_deps += [
- spirv_cross_proj.dependency('spirv-cross-glsl'),
- spirv_cross_proj.dependency('spirv-cross-hlsl'),
- spirv_cross_proj.dependency('spirv-cross-core'),
- spirv_cross_c_shared
- ]
- meson.override_dependency('spirv-cross-c-shared', spirv_cross_c_shared)
- libplacebo_opts += ['shaderc=enabled', 'd3d11=enabled', 'vulkan=disabled', 'opengl=disabled']
- else
- libplacebo_opts += ['shaderc=disabled', 'opengl=enabled', 'vulkan=disabled', 'd3d11=disabled']
+ libplacebo = dependency('libplacebo', default_options: libplacebo_opts)
endif
-
- libplacebo = dependency('libplacebo', default_options: libplacebo_opts)
render_src += ['renderer_libplacebo.c', 'queue_libplacebo.c']
render_deps += [libplacebo]
render_args += ['-DCAMU_RENDERER_LIBPLACEBO']