Commit57e202ffRecorded29 Mar 2026Repositorysigil-audio
Convert to standalone package
Message
Convert from monorepo workspace package to standalone repo with from-git dependencies. Add sokol_log.h vendor header (previously referenced from sigil-app), dev-redirects.sgl, and .gitignore.
Changed
.gitignore | 1 +
dev-redirects.sgl | 6 +++
package.sgl | 30 +++++++++++----
vendor/sokol/sokol_log.h | 334 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 363 insertions(+), 8 deletions(-)Diff
.gitignoreadded
@@ -0,0 +1 @@
+1
build/dev-redirects.sgladded
@@ -0,0 +1,6 @@
+1
;; Development redirects — point dependencies at local checkouts+2
(redirects+3
repos: (list+4
(for-repo+5
url: "codeberg:sigil/sigil"+6
use: (from-path dir: "../sigil"))))package.sglmodified
@@ -3,22 +3,36 @@
3
;;; Provides audio playback capabilities via sokol_audio. 4
;;; Sound effects are loaded into memory, music is streamed via stb_vorbis. 5
+6
(define sigil-repo "codeberg:sigil/sigil")+7
8
(package 9
name: "sigil-audio" 10
version: "0.7.0" 11
description: "Audio playback and streaming for Sigil"−10
url: "https://codeberg.org/sigil/sigil"+12
url: "https://codeberg.org/sigil/sigil-audio" 13
license: "BSD-3-Clause" 14
authors: (list "David Wilson <[email protected]>") 15
+16
configs: (list+17
(config+18
name: 'dev+19
output-dir: "build/dev"+20
debug?: #t+21
optimize: 0)+22
(config+23
name: 'release+24
output-dir: "build/release"+25
debug?: #f+26
optimize: 2))+27
28
dependencies: (list−15
(from-workspace name: "sigil-stdlib"))+29
(from-git url: sigil-repo package: "sigil-stdlib")) 30
31
libraries: (list 32
(library 33
name: 'sigil-audio 34
c-sources: '("src/c/sokol-audio.c" "src/c/audio.c")−21
c-include-dirs: '("vendor/sokol" "vendor/stb" "../sigil-app/vendor/sokol")+35
c-include-dirs: '("vendor/sokol" "vendor/stb") 36
native-init: "sigil__init_sigil_audio_module" 37
;; Platform-specific linker flags for audio 38
link-flags: (case (host-os)@@ -33,12 +47,12 @@
47
steps: (list 48
(compile-c-sources 49
sources: '("src/c/sokol-audio.c" "src/c/audio.c")−36
include-dirs: '("../sigil-lib/include"−37
"../sigil-lib/src"+50
include-dirs: '("../sigil/packages/sigil-lib/include"+51
"../sigil/packages/sigil-lib/src" 52
"vendor/sokol"−39
"vendor/stb"−40
"../sigil-app/vendor/sokol")+53
"vendor/stb") 54
flags: '("-std=c99" "-D_GNU_SOURCE" 55
"-Wno-unused-parameter" "-Wno-unused-function" "-Wno-sign-compare")) 56
(create-static-library name: "sigil-audio")−44
(compile-sigil-modules sources: "src/**/*.sgl")))))+57
(compile-sigil-modules sources: "src/**/*.sgl"+58
output-dir: (config-output-subdir "lib"))))))vendor/sokol/sokol_log.hadded
@@ -0,0 +1,334 @@
+1
#if defined(SOKOL_IMPL) && !defined(SOKOL_LOG_IMPL)+2
#define SOKOL_LOG_IMPL+3
#endif+4
#ifndef SOKOL_LOG_INCLUDED+5
/*+6
sokol_log.h -- common logging callback for sokol headers+7
+8
Project URL: https://github.com/floooh/sokol+9
+10
Example code: https://github.com/floooh/sokol-samples+11
+12
Do this:+13
#define SOKOL_IMPL or+14
#define SOKOL_LOG_IMPL+15
before you include this file in *one* C or C++ file to create the+16
implementation.+17
+18
Optionally provide the following defines when building the implementation:+19
+20
SOKOL_ASSERT(c) - your own assert macro (default: assert(c))+21
SOKOL_UNREACHABLE() - a guard macro for unreachable code (default: assert(false))+22
SOKOL_LOG_API_DECL - public function declaration prefix (default: extern)+23
SOKOL_API_DECL - same as SOKOL_GFX_API_DECL+24
SOKOL_API_IMPL - public function implementation prefix (default: -)+25
+26
Optionally define the following for verbose output:+27
+28
SOKOL_DEBUG - by default this is defined if NDEBUG is not defined+29
+30
+31
OVERVIEW+32
========+33
sokol_log.h provides a default logging callback for other sokol headers.+34
+35
To use the default log callback, just include sokol_log.h and provide+36
a function pointer to the 'slog_func' function when setting up the+37
sokol library:+38
+39
For instance with sokol_audio.h:+40
+41
#include "sokol_log.h"+42
...+43
saudio_setup(&(saudio_desc){ .logger.func = slog_func });+44
+45
Logging output goes to stderr and/or a platform specific logging subsystem+46
(which means that in some scenarios you might see logging messages duplicated):+47
+48
- Windows: stderr + OutputDebugStringA()+49
- macOS/iOS/Linux: stderr + syslog()+50
- Emscripten: console.info()/warn()/error()+51
- Android: __android_log_write()+52
+53
On Windows with sokol_app.h also note the runtime config items to make+54
stdout/stderr output visible on the console for WinMain() applications+55
via sapp_desc.win32.console_attach or sapp_desc.win32.console_create,+56
however when running in a debugger on Windows, the logging output should+57
show up on the debug output UI panel.+58
+59
In debug mode, a log message might look like this:+60
+61
[sspine][error][id:12] /Users/floh/projects/sokol/util/sokol_spine.h:3472:0:+62
SKELETON_DESC_NO_ATLAS: no atlas object provided in sspine_skeleton_desc.atlas+63
+64
The source path and line number is formatted like compiler errors, in some IDEs (like VSCode)+65
such error messages are clickable.+66
+67
In release mode, logging is less verbose as to not bloat the executable with string data, but you still get+68
enough information to identify the type and location of an error:+69
+70
[sspine][error][id:12][line:3472]+71
+72
RULES FOR WRITING YOUR OWN LOGGING FUNCTION+73
===========================================+74
- must be re-entrant because it might be called from different threads+75
- must treat **all** provided string pointers as optional (can be null)+76
- don't store the string pointers, copy the string data instead+77
- must not return for log level panic+78
+79
LICENSE+80
=======+81
zlib/libpng license+82
+83
Copyright (c) 2023 Andre Weissflog+84
+85
This software is provided 'as-is', without any express or implied warranty.+86
In no event will the authors be held liable for any damages arising from the+87
use of this software.+88
+89
Permission is granted to anyone to use this software for any purpose,+90
including commercial applications, and to alter it and redistribute it+91
freely, subject to the following restrictions:+92
+93
1. The origin of this software must not be misrepresented; you must not+94
claim that you wrote the original software. If you use this software in a+95
product, an acknowledgment in the product documentation would be+96
appreciated but is not required.+97
+98
2. Altered source versions must be plainly marked as such, and must not+99
be misrepresented as being the original software.+100
+101
3. This notice may not be removed or altered from any source+102
distribution.+103
*/+104
#define SOKOL_LOG_INCLUDED (1)+105
#include <stdint.h>+106
+107
#if defined(SOKOL_API_DECL) && !defined(SOKOL_LOG_API_DECL)+108
#define SOKOL_LOG_API_DECL SOKOL_API_DECL+109
#endif+110
#ifndef SOKOL_LOG_API_DECL+111
#if defined(_WIN32) && defined(SOKOL_DLL) && defined(SOKOL_LOG_IMPL)+112
#define SOKOL_LOG_API_DECL __declspec(dllexport)+113
#elif defined(_WIN32) && defined(SOKOL_DLL)+114
#define SOKOL_LOG_API_DECL __declspec(dllimport)+115
#else+116
#define SOKOL_LOG_API_DECL extern+117
#endif+118
#endif+119
+120
#ifdef __cplusplus+121
extern "C" {+122
#endif+123
+124
/*+125
Plug this function into the 'logger.func' struct item when initializing any of the sokol+126
headers. For instance for sokol_audio.h it would look like this:+127
+128
saudio_setup(&(saudio_desc){+129
.logger = {+130
.func = slog_func+131
}+132
});+133
*/+134
SOKOL_LOG_API_DECL void slog_func(const char* tag, uint32_t log_level, uint32_t log_item, const char* message, uint32_t line_nr, const char* filename, void* user_data);+135
+136
#ifdef __cplusplus+137
} // extern "C"+138
#endif+139
#endif // SOKOL_LOG_INCLUDED+140
+141
// ██ ███ ███ ██████ ██ ███████ ███ ███ ███████ ███ ██ ████████ █████ ████████ ██ ██████ ███ ██+142
// ██ ████ ████ ██ ██ ██ ██ ████ ████ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██+143
// ██ ██ ████ ██ ██████ ██ █████ ██ ████ ██ █████ ██ ██ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██+144
// ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██+145
// ██ ██ ██ ██ ███████ ███████ ██ ██ ███████ ██ ████ ██ ██ ██ ██ ██ ██████ ██ ████+146
//+147
// >>implementation+148
#ifdef SOKOL_LOG_IMPL+149
#define SOKOL_LOG_IMPL_INCLUDED (1)+150
+151
#ifndef SOKOL_API_IMPL+152
#define SOKOL_API_IMPL+153
#endif+154
#ifndef SOKOL_DEBUG+155
#ifndef NDEBUG+156
#define SOKOL_DEBUG+157
#endif+158
#endif+159
#ifndef SOKOL_ASSERT+160
#include <assert.h>+161
#define SOKOL_ASSERT(c) assert(c)+162
#endif+163
+164
#ifndef _SOKOL_PRIVATE+165
#if defined(__GNUC__) || defined(__clang__)+166
#define _SOKOL_PRIVATE __attribute__((unused)) static+167
#else+168
#define _SOKOL_PRIVATE static+169
#endif+170
#endif+171
+172
#ifndef _SOKOL_UNUSED+173
#define _SOKOL_UNUSED(x) (void)(x)+174
#endif+175
+176
// platform detection+177
#if defined(__APPLE__)+178
#define _SLOG_APPLE (1)+179
#elif defined(__EMSCRIPTEN__)+180
#define _SLOG_EMSCRIPTEN (1)+181
#elif defined(_WIN32)+182
#define _SLOG_WINDOWS (1)+183
#elif defined(__ANDROID__)+184
#define _SLOG_ANDROID (1)+185
#elif defined(__linux__) || defined(__unix__)+186
#define _SLOG_LINUX (1)+187
#else+188
#error "sokol_log.h: unknown platform"+189
#endif+190
+191
#include <stdlib.h> // abort+192
#include <stdio.h> // fputs+193
#include <stddef.h> // size_t+194
+195
#if defined(_SLOG_EMSCRIPTEN)+196
#include <emscripten/emscripten.h>+197
#elif defined(_SLOG_WINDOWS)+198
#ifndef WIN32_LEAN_AND_MEAN+199
#define WIN32_LEAN_AND_MEAN+200
#endif+201
#ifndef NOMINMAX+202
#define NOMINMAX+203
#endif+204
#include <windows.h>+205
#elif defined(_SLOG_ANDROID)+206
#include <android/log.h>+207
#elif defined(_SLOG_LINUX) || defined(_SLOG_APPLE)+208
#include <syslog.h>+209
#endif+210
+211
// size of line buffer (on stack!) in bytes including terminating zero+212
#define _SLOG_LINE_LENGTH (512)+213
+214
_SOKOL_PRIVATE char* _slog_append(const char* str, char* dst, char* end) {+215
if (str) {+216
char c;+217
while (((c = *str++) != 0) && (dst < (end - 1))) {+218
*dst++ = c;+219
}+220
}+221
*dst = 0;+222
return dst;+223
}+224
+225
_SOKOL_PRIVATE char* _slog_itoa(uint32_t x, char* buf, size_t buf_size) {+226
const size_t max_digits_and_null = 11;+227
if (buf_size < max_digits_and_null) {+228
return 0;+229
}+230
char* p = buf + max_digits_and_null;+231
*--p = 0;+232
do {+233
*--p = '0' + (x % 10);+234
x /= 10;+235
} while (x != 0);+236
return p;+237
}+238
+239
#if defined(_SLOG_EMSCRIPTEN)+240
EM_JS(void, slog_js_log, (uint32_t level, const char* c_str), {+241
const str = UTF8ToString(c_str);+242
switch (level) {+243
case 0: console.error(str); break;+244
case 1: console.error(str); break;+245
case 2: console.warn(str); break;+246
default: console.info(str); break;+247
}+248
})+249
#endif+250
+251
SOKOL_API_IMPL void slog_func(const char* tag, uint32_t log_level, uint32_t log_item, const char* message, uint32_t line_nr, const char* filename, void* user_data) {+252
_SOKOL_UNUSED(user_data);+253
+254
const char* log_level_str;+255
switch (log_level) {+256
case 0: log_level_str = "panic"; break;+257
case 1: log_level_str = "error"; break;+258
case 2: log_level_str = "warning"; break;+259
default: log_level_str = "info"; break;+260
}+261
+262
// build log output line+263
char line_buf[_SLOG_LINE_LENGTH];+264
char* str = line_buf;+265
char* end = line_buf + sizeof(line_buf);+266
char num_buf[32];+267
if (tag) {+268
str = _slog_append("[", str, end);+269
str = _slog_append(tag, str, end);+270
str = _slog_append("]", str, end);+271
}+272
str = _slog_append("[", str, end);+273
str = _slog_append(log_level_str, str, end);+274
str = _slog_append("]", str, end);+275
str = _slog_append("[id:", str, end);+276
str = _slog_append(_slog_itoa(log_item, num_buf, sizeof(num_buf)), str, end);+277
str = _slog_append("]", str, end);+278
// if a filename is provided, build a clickable log message that's compatible with compiler error messages+279
if (filename) {+280
str = _slog_append(" ", str, end);+281
#if defined(_MSC_VER)+282
// MSVC compiler error format+283
str = _slog_append(filename, str, end);+284
str = _slog_append("(", str, end);+285
str = _slog_append(_slog_itoa(line_nr, num_buf, sizeof(num_buf)), str, end);+286
str = _slog_append("): ", str, end);+287
#else+288
// gcc/clang compiler error format+289
str = _slog_append(filename, str, end);+290
str = _slog_append(":", str, end);+291
str = _slog_append(_slog_itoa(line_nr, num_buf, sizeof(num_buf)), str, end);+292
str = _slog_append(":0: ", str, end);+293
#endif+294
}+295
else {+296
str = _slog_append("[line:", str, end);+297
str = _slog_append(_slog_itoa(line_nr, num_buf, sizeof(num_buf)), str, end);+298
str = _slog_append("] ", str, end);+299
}+300
if (message) {+301
str = _slog_append("\n\t", str, end);+302
str = _slog_append(message, str, end);+303
}+304
str = _slog_append("\n\n", str, end);+305
if (0 == log_level) {+306
str = _slog_append("ABORTING because of [panic]\n", str, end);+307
(void)str;+308
}+309
+310
// print to stderr?+311
#if defined(_SLOG_LINUX) || defined(_SLOG_WINDOWS) || defined(_SLOG_APPLE)+312
fputs(line_buf, stderr);+313
#endif+314
+315
// platform specific logging calls+316
#if defined(_SLOG_WINDOWS)+317
OutputDebugStringA(line_buf);+318
#elif defined(_SLOG_ANDROID)+319
int prio;+320
switch (log_level) {+321
case 0: prio = ANDROID_LOG_FATAL; break;+322
case 1: prio = ANDROID_LOG_ERROR; break;+323
case 2: prio = ANDROID_LOG_WARN; break;+324
default: prio = ANDROID_LOG_INFO; break;+325
}+326
__android_log_write(prio, "SOKOL", line_buf);+327
#elif defined(_SLOG_EMSCRIPTEN)+328
slog_js_log(log_level, line_buf);+329
#endif+330
if (0 == log_level) {+331
abort();+332
}+333
}+334
#endif // SOKOL_LOG_IMPL