From 8b30a54600448bc4e8394cf74c4c16e38010bfb3 Mon Sep 17 00:00:00 2001 From: NishiOwO <89888985+NishiOwO@users.noreply.github.com> Date: Sun, 20 Apr 2025 15:20:53 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20NishiOwO?= =?UTF-8?q?/nishbox@1ad1e250e29433987621bfeb004bd6a889a5591b=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- engine/audio_8h.html | 4 +- engine/audio_8h_source.html | 70 +++-- engine/client_8h_source.html | 2 +- engine/functions.html | 3 + engine/functions_vars.html | 3 + engine/gf__audio_8c_source.html | 371 +++++++++++++++--------- engine/gf__audio_8h.html | 47 ++- engine/gf__audio_8h.js | 1 + engine/gf__audio_8h_source.html | 24 +- engine/globals.html | 1 + engine/globals_func.html | 1 + engine/navtreedata.js | 2 +- engine/navtreeindex0.js | 10 +- engine/navtreeindex1.js | 6 +- engine/search/all_13.js | 3 +- engine/search/all_7.js | 347 +++++++++++----------- engine/search/all_b.js | 9 +- engine/search/all_e.js | 7 +- engine/search/functions_0.js | 163 +++++------ engine/search/variables_11.js | 3 +- engine/search/variables_a.js | 7 +- engine/search/variables_d.js | 3 +- engine/structgf__audio__decoder__t.html | 71 ++++- engine/structgf__audio__decoder__t.js | 5 +- engine/structgf__audio__t.html | 10 +- 25 files changed, 699 insertions(+), 474 deletions(-) diff --git a/engine/audio_8h.html b/engine/audio_8h.html index 7809365..1c14b73 100644 --- a/engine/audio_8h.html +++ b/engine/audio_8h.html @@ -103,6 +103,8 @@ $(document).ready(function(){initNavTree('audio_8h.html',''); initResizable(); }
#include <gf_pre.h>
#include <gf_macro.h>
#include <miniaudio.h>
+#include <jar_xm.h>
+#include <jar_mod.h>
#include <gf_type/core.h>

Go to the source code of this file.

@@ -141,7 +143,7 @@ Macros

Max decoders audio interface can handle.

-

Definition at line 29 of file audio.h.

+

Definition at line 31 of file audio.h.

diff --git a/engine/audio_8h_source.html b/engine/audio_8h_source.html index ea8ba31..6ab4eb8 100644 --- a/engine/audio_8h_source.html +++ b/engine/audio_8h_source.html @@ -112,42 +112,50 @@ $(document).ready(function(){initNavTree('audio_8h_source.html',''); initResizab
16
17/* External library */
18#include <miniaudio.h>
-
19
-
20/* Engine */
-
21#include <gf_type/core.h>
-
22
-
23/* Standard */
+
19#include <jar_xm.h>
+
20#include <jar_mod.h>
+
21
+
22/* Engine */
+
23#include <gf_type/core.h>
24
-
29#define GF_AUDIO_MAX_DECODERS 64
-
30
-
45GF_DECLARE_TYPE(audio_decoder, {
-
46 ma_decoder_config decoder_config;
-
47 ma_decoder* decoder;
-
48 int used;
-
49});
-
50
-
68GF_DECLARE_TYPE(audio, {
-
69 gf_engine_t* engine;
-
70 ma_device_config device_config;
-
71 ma_device* device;
-
72 gf_audio_decoder_t decoder[GF_AUDIO_MAX_DECODERS];
-
73});
-
74#else
-
75typedef void gf_audio_decoder_t;
-
76typedef void gf_audio_t;
-
77#endif
-
78
-
79#endif
-
GF_AUDIO_MAX_DECODERS
#define GF_AUDIO_MAX_DECODERS
Max decoders audio interface can handle.
Definition audio.h:29
+
25/* Standard */
+
26
+
31#define GF_AUDIO_MAX_DECODERS 64
+
32
+
56GF_DECLARE_TYPE(audio_decoder, {
+
57 ma_decoder_config decoder_config;
+
58 ma_decoder* decoder;
+
59 jar_xm_context_t* xm;
+
60 jar_mod_context_t* mod;
+
61 int samples;
+
62 int used;
+
63});
+
64
+
82GF_DECLARE_TYPE(audio, {
+
83 gf_engine_t* engine;
+
84 ma_device_config device_config;
+
85 ma_device* device;
+
86 gf_audio_decoder_t decoder[GF_AUDIO_MAX_DECODERS];
+
87});
+
88#else
+
89typedef void gf_audio_decoder_t;
+
90typedef void gf_audio_t;
+
91#endif
+
92
+
93#endif
+
GF_AUDIO_MAX_DECODERS
#define GF_AUDIO_MAX_DECODERS
Max decoders audio interface can handle.
Definition audio.h:31
core.h
Type definitions related to core.
gf_macro.h
Macro.
GF_DECLARE_TYPE
#define GF_DECLARE_TYPE(n, b)
Macro to define engine type shorter.
Definition gf_macro.h:180
gf_pre.h
Required headers before anything.
-
gf_audio_decoder_t
Audio decoder.
Definition audio.h:49
-
gf_audio_decoder_t::decoder_config
ma_decoder_config decoder_config
miniaudio decoder config
Definition audio.h:49
-
gf_audio_decoder_t::used
int used
1 if used, otherwise 0
Definition audio.h:49
-
gf_audio_decoder_t::decoder
ma_decoder * decoder
miniaudio decoder
Definition audio.h:49
-
gf_audio_t
Audio interface.
Definition audio.h:73
+
gf_audio_decoder_t
Audio decoder.
Definition audio.h:63
+
gf_audio_decoder_t::xm
jar_xm_context_t * xm
XM context.
Definition audio.h:63
+
gf_audio_decoder_t::decoder_config
ma_decoder_config decoder_config
miniaudio decoder config
Definition audio.h:63
+
gf_audio_decoder_t::used
int used
1 if used, otherwise 0
Definition audio.h:63
+
gf_audio_decoder_t::samples
int samples
Remaining samples.
Definition audio.h:63
+
gf_audio_decoder_t::mod
jar_mod_context_t * mod
MOD context.
Definition audio.h:63
+
gf_audio_decoder_t::decoder
ma_decoder * decoder
miniaudio decoder
Definition audio.h:63
+
gf_audio_t
Audio interface.
Definition audio.h:87
gf_engine_t
Engine instance.
Definition core.h:46
diff --git a/engine/client_8h_source.html b/engine/client_8h_source.html index 8e49adb..5289473 100644 --- a/engine/client_8h_source.html +++ b/engine/client_8h_source.html @@ -137,7 +137,7 @@ $(document).ready(function(){initNavTree('client_8h_source.html',''); initResiza
GF_DECLARE_TYPE
#define GF_DECLARE_TYPE(n, b)
Macro to define engine type shorter.
Definition gf_macro.h:180
gf_pre.h
Required headers before anything.
input.h
Type definitions related to input interface.
-
gf_audio_t
Audio interface.
Definition audio.h:73
+
gf_audio_t
Audio interface.
Definition audio.h:87
gf_client_t
Client interface.
Definition client.h:48
gf_client_t::draw
gf_draw_t * draw
Drawing interface.
Definition client.h:48
gf_client_t::audio
gf_audio_t * audio
Audio interface.
Definition client.h:48
diff --git a/engine/functions.html b/engine/functions.html index 45517f4..51fe7b7 100644 --- a/engine/functions.html +++ b/engine/functions.html @@ -179,6 +179,7 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable();
  • major : gf_version_t
  • mesh : gf_model_t
  • minor : gf_version_t
  • +
  • mod : gf_audio_decoder_t
  • mouse_flag : gf_input_t
  • mouse_x : gf_input_t
  • mouse_y : gf_input_t
  • @@ -201,6 +202,7 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable();

    - s -

    @@ -229,6 +231,7 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable();

    - x -

    diff --git a/engine/functions_vars.html b/engine/functions_vars.html index 95e1a95..50fb5f3 100644 --- a/engine/functions_vars.html +++ b/engine/functions_vars.html @@ -179,6 +179,7 @@ $(document).ready(function(){initNavTree('functions_vars.html',''); initResizabl
  • major : gf_version_t
  • mesh : gf_model_t
  • minor : gf_version_t
  • +
  • mod : gf_audio_decoder_t
  • mouse_flag : gf_input_t
  • mouse_x : gf_input_t
  • mouse_y : gf_input_t
  • @@ -201,6 +202,7 @@ $(document).ready(function(){initNavTree('functions_vars.html',''); initResizabl

    - s -

    @@ -229,6 +231,7 @@ $(document).ready(function(){initNavTree('functions_vars.html',''); initResizabl

    - x -

    diff --git a/engine/gf__audio_8c_source.html b/engine/gf__audio_8c_source.html index 71e8cf1..0046fc9 100644 --- a/engine/gf__audio_8c_source.html +++ b/engine/gf__audio_8c_source.html @@ -119,157 +119,242 @@ $(document).ready(function(){initNavTree('gf__audio_8c_source.html',''); initRes
    18#include <string.h>
    19#include <math.h>
    20
    -
    21void gf_audio_callback(ma_device* dev, void* output, const void* input, ma_uint32 frame) {
    -
    22 int i;
    -
    23 gf_audio_t* audio = dev->pUserData;
    -
    24 ma_int16* out = (ma_int16*)output;
    -
    25 float* tmp = malloc(sizeof(*tmp) * frame * 2);
    -
    26
    -
    27 for(i = 0; i < frame; i++) {
    -
    28 tmp[2 * i + 0] = 0;
    -
    29 tmp[2 * i + 1] = 0;
    -
    30 }
    -
    31
    -
    32 for(i = 0; i < GF_AUDIO_MAX_DECODERS; i++) {
    -
    33 if(audio->decoder[i].used == 1) {
    -
    34 ma_uint64 readframe;
    -
    35 int j;
    -
    36 ma_int16* r = malloc(sizeof(*r) * frame * 2);
    -
    37 ma_decoder_read_pcm_frames(audio->decoder[i].decoder, r, frame, &readframe);
    -
    38 for(j = 0; j < readframe; j++) {
    -
    39 tmp[2 * j + 0] += (double)r[2 * j + 0] / 32768.0;
    -
    40 tmp[2 * j + 1] += (double)r[2 * j + 1] / 32768.0;
    -
    41 }
    -
    42 free(r);
    -
    43 if(frame > readframe) {
    -
    44 ma_decoder_uninit(audio->decoder[i].decoder);
    -
    45 free(audio->decoder[i].decoder);
    -
    46 audio->decoder[i].decoder = NULL;
    -
    47 audio->decoder[i].used = 0;
    -
    48 }
    -
    49 }
    -
    50 }
    -
    51
    -
    52 for(i = 0; i < frame; i++) {
    -
    53 out[2 * i + 0] = tmp[2 * i + 0] * 32768;
    -
    54 out[2 * i + 1] = tmp[2 * i + 1] * 32768;
    -
    55 }
    -
    56 free(tmp);
    -
    57}
    -
    58
    -
    -
    59int gf_audio_load(gf_audio_t* audio, const void* data, size_t size) {
    -
    60 int i;
    -
    61 for(i = 0; i < GF_AUDIO_MAX_DECODERS; i++) {
    -
    62 if(audio->decoder[i].used == 0) {
    -
    63 audio->decoder[i].decoder = malloc(sizeof(*audio->decoder[i].decoder));
    -
    64 if(ma_decoder_init_memory(data, size, &audio->decoder[i].decoder_config, audio->decoder[i].decoder) == MA_SUCCESS) {
    -
    65 audio->decoder[i].used = 1;
    -
    66 return 0;
    -
    67 }
    -
    68 free(audio->decoder[i].decoder);
    -
    69 audio->decoder[i].decoder = NULL;
    -
    70 return -1;
    -
    71 }
    -
    72 }
    -
    73 return -1;
    -
    74}
    -
    -
    75
    -
    -
    76int gf_audio_load_file(gf_audio_t* audio, const char* path) {
    -
    77 FILE* f = fopen(path, "rb");
    -
    78 size_t sz;
    -
    79 unsigned char* data;
    -
    80 int st;
    -
    81 if(f == NULL) return -1;
    -
    82 fseek(f, 0, SEEK_END);
    -
    83 sz = ftell(f);
    -
    84 fseek(f, 0, SEEK_SET);
    -
    85
    -
    86 data = malloc(sz);
    -
    87 fread(data, sz, 1, f);
    -
    88 st = gf_audio_load(audio, data, sz);
    -
    89
    -
    90 fclose(f);
    -
    91
    -
    92 return st;
    -
    93}
    -
    +
    21const char* gf_audio_mod_sig[] = {"M!K!", "M.K.", "FLT4", "FLT8", "4CHN", "6CHN", "8CHN", "10CH", "12CH", "14CH", "16CH", "18CH", "20CH", "22CH", "24CH", "26CH", "28CH", "30CH", "32CH"};
    +
    22
    +
    23void gf_audio_callback(ma_device* dev, void* output, const void* input, ma_uint32 frame) {
    +
    24 int i;
    +
    25 gf_audio_t* audio = dev->pUserData;
    +
    26 ma_int16* out = (ma_int16*)output;
    +
    27 float* tmp = malloc(sizeof(*tmp) * frame * 2);
    +
    28
    +
    29 for(i = 0; i < frame; i++) {
    +
    30 tmp[2 * i + 0] = 0;
    +
    31 tmp[2 * i + 1] = 0;
    +
    32 }
    +
    33
    +
    34 for(i = 0; i < GF_AUDIO_MAX_DECODERS; i++) {
    +
    35 if(audio->decoder[i].used && audio->decoder[i].decoder != NULL) {
    +
    36 ma_uint64 readframe;
    +
    37 int j;
    +
    38 ma_int16* r = malloc(sizeof(*r) * frame * 2);
    +
    39 ma_decoder_read_pcm_frames(audio->decoder[i].decoder, r, frame, &readframe);
    +
    40 for(j = 0; j < readframe; j++) {
    +
    41 tmp[2 * j + 0] += (double)r[2 * j + 0] / 32768.0;
    +
    42 tmp[2 * j + 1] += (double)r[2 * j + 1] / 32768.0;
    +
    43 }
    +
    44 free(r);
    +
    45 if(frame > readframe) {
    +
    46 gf_audio_decoder_destroy(&audio->decoder[i]);
    +
    47 }
    +
    48 } else if(audio->decoder[i].used && audio->decoder[i].xm != NULL) {
    +
    49 int j;
    +
    50 int gotframe;
    +
    51 float* r = malloc(sizeof(*r) * frame * 2);
    +
    52 jar_xm_generate_samples(audio->decoder[i].xm, r, frame);
    +
    53 gotframe = audio->decoder[i].samples > frame ? frame : audio->decoder[i].samples;
    +
    54 for(j = 0; j < gotframe; j++) {
    +
    55 tmp[2 * j + 0] += (double)r[2 * j + 0];
    +
    56 tmp[2 * j + 1] += (double)r[2 * j + 1];
    +
    57 }
    +
    58 free(r);
    +
    59 audio->decoder[i].samples -= frame;
    +
    60 if(audio->decoder[i].samples <= 0) {
    +
    61 gf_audio_decoder_destroy(&audio->decoder[i]);
    +
    62 }
    +
    63 } else if(audio->decoder[i].used && audio->decoder[i].mod != NULL) {
    +
    64 int j;
    +
    65 int gotframe;
    +
    66 ma_int16* r = malloc(sizeof(*r) * frame * 2);
    +
    67 jar_mod_fillbuffer(audio->decoder[i].mod, r, frame, NULL);
    +
    68 gotframe = audio->decoder[i].samples > frame ? frame : audio->decoder[i].samples;
    +
    69 for(j = 0; j < gotframe; j++) {
    +
    70 tmp[2 * j + 0] += (double)r[2 * j + 0] / 32768.0;
    +
    71 tmp[2 * j + 1] += (double)r[2 * j + 1] / 32768.0;
    +
    72 }
    +
    73 free(r);
    +
    74 audio->decoder[i].samples -= frame;
    +
    75 if(audio->decoder[i].samples <= 0) {
    +
    76 gf_audio_decoder_destroy(&audio->decoder[i]);
    +
    77 }
    +
    78 }
    +
    79 }
    +
    80
    +
    81 for(i = 0; i < frame; i++) {
    +
    82 out[2 * i + 0] = tmp[2 * i + 0] * 32768;
    +
    83 out[2 * i + 1] = tmp[2 * i + 1] * 32768;
    +
    84 }
    +
    85 free(tmp);
    +
    86}
    +
    87
    +
    +
    88int gf_audio_load(gf_audio_t* audio, const void* data, size_t size) {
    +
    89 int i;
    +
    90 for(i = 0; i < GF_AUDIO_MAX_DECODERS; i++) {
    +
    91 if(audio->decoder[i].used == 0) {
    +
    92 int xm_cond = size > 37 && memcmp(data, "Extended Module: ", 17) == 0 && ((char*)data)[37] == 0x1a;
    +
    93 int mod_cond = size > 1080;
    94
    -
    -
    95gf_audio_t* gf_audio_create(gf_engine_t* engine) {
    -
    96 gf_audio_t* audio = malloc(sizeof(*audio));
    -
    97 int i;
    -
    98
    -
    99 memset(audio, 0, sizeof(*audio));
    -
    100 audio->engine = engine;
    -
    101
    -
    102 audio->device_config = ma_device_config_init(ma_device_type_playback);
    -
    103 audio->device_config.playback.format = ma_format_s16;
    -
    104 audio->device_config.playback.channels = 2;
    -
    105 audio->device_config.sampleRate = 44100;
    -
    106 audio->device_config.dataCallback = gf_audio_callback;
    -
    107 audio->device_config.pUserData = audio;
    -
    108
    -
    109 for(i = 0; i < GF_AUDIO_MAX_DECODERS; i++) {
    -
    110 audio->decoder[i].used = 0;
    -
    111 audio->decoder[i].decoder = NULL;
    -
    112 audio->decoder[i].decoder_config = ma_decoder_config_init(audio->device_config.playback.format, audio->device_config.playback.channels, audio->device_config.sampleRate);
    -
    113 }
    -
    114
    -
    115 audio->device = malloc(sizeof(*audio->device));
    -
    116 if(ma_device_init(NULL, &audio->device_config, audio->device) != MA_SUCCESS) {
    -
    117 gf_log_function(engine, "Failed to open playback device", "");
    -
    118 free(audio->device);
    -
    119 audio->device = NULL;
    -
    120 gf_audio_destroy(audio);
    -
    121 return NULL;
    -
    122 }
    -
    123
    -
    124 if(ma_device_start(audio->device) != MA_SUCCESS) {
    -
    125 gf_log_function(engine, "Failed to start playback device", "");
    -
    126 gf_audio_destroy(audio);
    -
    127 return NULL;
    -
    128 }
    -
    129
    -
    130 gf_log_function(engine, "Audio interface started", "");
    -
    131
    -
    132 return audio;
    -
    133}
    +
    95 if(mod_cond) {
    +
    96 int j;
    +
    97 int mod_sig_cond = 0;
    +
    98 for(j = 0; j < sizeof(gf_audio_mod_sig) / sizeof(gf_audio_mod_sig[0]); j++) {
    +
    99 mod_sig_cond = mod_sig_cond || (memcmp(data + 1080, gf_audio_mod_sig[j], 4) == 0);
    +
    100 }
    +
    101 mod_cond = mod_cond && mod_sig_cond;
    +
    102 }
    +
    103
    +
    104 if(xm_cond) {
    +
    105 if(jar_xm_create_context_safe(&audio->decoder[i].xm, data, size, audio->device_config.sampleRate) == 0) {
    +
    106 audio->decoder[i].samples = jar_xm_get_remaining_samples(audio->decoder[i].xm);
    +
    107 audio->decoder[i].used = 1;
    +
    108 return 0;
    +
    109 }
    +
    110 audio->decoder[i].xm = NULL;
    +
    111 } else if(mod_cond) {
    +
    112 audio->decoder[i].mod = malloc(sizeof(*audio->decoder[i].mod));
    +
    113 jar_mod_init(audio->decoder[i].mod);
    +
    114 jar_mod_setcfg(audio->decoder[i].mod, audio->device_config.sampleRate, 16, 1, 0, 0);
    +
    115 if(jar_mod_load(audio->decoder[i].mod, (void*)data, size)) {
    +
    116 audio->decoder[i].samples = jar_mod_max_samples(audio->decoder[i].mod);
    +
    117 audio->decoder[i].used = 1;
    +
    118 return 0;
    +
    119 }
    +
    120 free(audio->decoder[i].mod);
    +
    121 audio->decoder[i].mod = NULL;
    +
    122 }
    +
    123 audio->decoder[i].decoder = malloc(sizeof(*audio->decoder[i].decoder));
    +
    124 if(ma_decoder_init_memory(data, size, &audio->decoder[i].decoder_config, audio->decoder[i].decoder) == MA_SUCCESS) {
    +
    125 audio->decoder[i].used = 1;
    +
    126 return 0;
    +
    127 }
    +
    128 free(audio->decoder[i].decoder);
    +
    129 audio->decoder[i].decoder = NULL;
    +
    130 return -1;
    +
    131 }
    +
    132 }
    +
    133 return -1;
    +
    134}
    -
    134
    -
    -
    135void gf_audio_destroy(gf_audio_t* audio) {
    -
    136 int i;
    -
    137 if(audio->device != NULL) {
    -
    138 ma_device_uninit(audio->device);
    -
    139 free(audio->device);
    -
    140 }
    -
    141 for(i = 0; i < GF_AUDIO_MAX_DECODERS; i++) {
    -
    142 if(audio->decoder[i].decoder != NULL) {
    -
    143 ma_decoder_uninit(audio->decoder[i].decoder);
    -
    144 free(audio->decoder[i].decoder);
    -
    145 }
    -
    146 }
    -
    147 gf_log_function(audio->engine, "Destroyed audio interface", "");
    -
    148 free(audio);
    -
    149}
    +
    135
    +
    +
    136int gf_audio_load_file(gf_audio_t* audio, const char* path) {
    +
    137 FILE* f = fopen(path, "rb");
    +
    138 size_t sz;
    +
    139 unsigned char* data;
    +
    140 int st;
    +
    141 if(f == NULL) return -1;
    +
    142 fseek(f, 0, SEEK_END);
    +
    143 sz = ftell(f);
    +
    144 fseek(f, 0, SEEK_SET);
    +
    145
    +
    146 data = malloc(sz);
    +
    147 fread(data, sz, 1, f);
    +
    148 st = gf_audio_load(audio, data, sz);
    +
    149
    +
    150 fclose(f);
    +
    151
    +
    152 return st;
    +
    153}
    -
    #define GF_AUDIO_MAX_DECODERS
    Max decoders audio interface can handle.
    Definition audio.h:29
    +
    154
    +
    +
    155gf_audio_t* gf_audio_create(gf_engine_t* engine) {
    +
    156 gf_audio_t* audio = malloc(sizeof(*audio));
    +
    157 int i;
    +
    158
    +
    159 memset(audio, 0, sizeof(*audio));
    +
    160 audio->engine = engine;
    +
    161
    +
    162 audio->device_config = ma_device_config_init(ma_device_type_playback);
    +
    163 audio->device_config.playback.format = ma_format_s16;
    +
    164 audio->device_config.playback.channels = 2;
    +
    165 audio->device_config.sampleRate = 48000;
    +
    166 audio->device_config.dataCallback = gf_audio_callback;
    +
    167 audio->device_config.pUserData = audio;
    +
    168
    +
    169 for(i = 0; i < GF_AUDIO_MAX_DECODERS; i++) {
    +
    170 audio->decoder[i].used = 0;
    +
    171 audio->decoder[i].decoder = NULL;
    +
    172 audio->decoder[i].xm = NULL;
    +
    173 audio->decoder[i].mod = NULL;
    +
    174 audio->decoder[i].decoder_config = ma_decoder_config_init(audio->device_config.playback.format, audio->device_config.playback.channels, audio->device_config.sampleRate);
    +
    175 }
    +
    176
    +
    177 gf_audio_load_file(audio, "test.xm");
    +
    178
    +
    179 audio->device = malloc(sizeof(*audio->device));
    +
    180 if(ma_device_init(NULL, &audio->device_config, audio->device) != MA_SUCCESS) {
    +
    181 gf_log_function(engine, "Failed to open playback device", "");
    +
    182 free(audio->device);
    +
    183 audio->device = NULL;
    +
    184 gf_audio_destroy(audio);
    +
    185 return NULL;
    +
    186 }
    +
    187
    +
    188 if(ma_device_start(audio->device) != MA_SUCCESS) {
    +
    189 gf_log_function(engine, "Failed to start playback device", "");
    +
    190 gf_audio_destroy(audio);
    +
    191 return NULL;
    +
    192 }
    +
    193
    +
    194 gf_log_function(engine, "Audio interface started", "");
    +
    195
    +
    196 return audio;
    +
    197}
    +
    +
    198
    +
    +
    199void gf_audio_decoder_destroy(gf_audio_decoder_t* decoder) {
    +
    200 if(decoder->decoder != NULL) {
    +
    201 ma_decoder_uninit(decoder->decoder);
    +
    202 free(decoder->decoder);
    +
    203 decoder->decoder = NULL;
    +
    204 }
    +
    205 if(decoder->xm != NULL) {
    +
    206 jar_xm_free_context(decoder->xm);
    +
    207 decoder->xm = NULL;
    +
    208 }
    +
    209 if(decoder->mod != NULL) {
    +
    210 jar_mod_unload(decoder->mod);
    +
    211 free(decoder->mod);
    +
    212 decoder->mod = NULL;
    +
    213 }
    +
    214 decoder->used = 0;
    +
    215}
    +
    +
    216
    +
    +
    217void gf_audio_destroy(gf_audio_t* audio) {
    +
    218 int i;
    +
    219 if(audio->device != NULL) {
    +
    220 ma_device_uninit(audio->device);
    +
    221 free(audio->device);
    +
    222 }
    +
    223 for(i = 0; i < GF_AUDIO_MAX_DECODERS; i++) {
    +
    224 gf_audio_decoder_destroy(&audio->decoder[i]);
    +
    225 }
    +
    226 gf_log_function(audio->engine, "Destroyed audio interface", "");
    +
    227 free(audio);
    +
    228}
    +
    +
    #define GF_AUDIO_MAX_DECODERS
    Max decoders audio interface can handle.
    Definition audio.h:31
    Audio interface.
    Logger.
    #define gf_log_function(engine, fmt,...)
    Output log with line number and function name.
    Definition gf_log.h:26
    Required headers before anything.
    Type definitions related to math.
    -
    ma_decoder_config decoder_config
    miniaudio decoder config
    Definition audio.h:49
    -
    int used
    1 if used, otherwise 0
    Definition audio.h:49
    -
    ma_decoder * decoder
    miniaudio decoder
    Definition audio.h:49
    -
    Audio interface.
    Definition audio.h:73
    -
    ma_device_config device_config
    miniaudio device config
    Definition audio.h:73
    -
    ma_device * device
    miniaudio device
    Definition audio.h:73
    -
    gf_audio_decoder_t decoder[64]
    Decoder.
    Definition audio.h:73
    -
    gf_engine_t * engine
    Engine instance.
    Definition audio.h:73
    +
    Audio decoder.
    Definition audio.h:63
    +
    jar_xm_context_t * xm
    XM context.
    Definition audio.h:63
    +
    ma_decoder_config decoder_config
    miniaudio decoder config
    Definition audio.h:63
    +
    int used
    1 if used, otherwise 0
    Definition audio.h:63
    +
    int samples
    Remaining samples.
    Definition audio.h:63
    +
    jar_mod_context_t * mod
    MOD context.
    Definition audio.h:63
    +
    ma_decoder * decoder
    miniaudio decoder
    Definition audio.h:63
    +
    Audio interface.
    Definition audio.h:87
    +
    ma_device_config device_config
    miniaudio device config
    Definition audio.h:87
    +
    ma_device * device
    miniaudio device
    Definition audio.h:87
    +
    gf_audio_decoder_t decoder[64]
    Decoder.
    Definition audio.h:87
    +
    gf_engine_t * engine
    Engine instance.
    Definition audio.h:87
    Engine instance.
    Definition core.h:46
    diff --git a/engine/gf__audio_8h.html b/engine/gf__audio_8h.html index 587a23b..333757e 100644 --- a/engine/gf__audio_8h.html +++ b/engine/gf__audio_8h.html @@ -115,6 +115,9 @@ Functions void gf_audio_destroy (gf_audio_t *audio)  Destroy audio interface.
      +void gf_audio_decoder_destroy (gf_audio_decoder_t *decoder) + Destroy audio decoder.
    +  int gf_audio_load_file (gf_audio_t *audio, const char *path)  Load and play file.
      @@ -160,7 +163,43 @@ Functions
    Returns
    Audio interface
    -

    Definition at line 95 of file gf_audio.c.

    +

    Definition at line 155 of file gf_audio.c.

    + + + + +

    ◆ gf_audio_decoder_destroy()

    + +
    +
    + + + + + +
    + + + + + + + + +
    void gf_audio_decoder_destroy (gf_audio_decoder_tdecoder)
    +
    +extern
    +
    + +

    Destroy audio decoder.

    +
    Parameters
    + + +
    decoderAudio decoder
    +
    +
    + +

    Definition at line 199 of file gf_audio.c.

    @@ -196,7 +235,7 @@ Functions -

    Definition at line 135 of file gf_audio.c.

    +

    Definition at line 217 of file gf_audio.c.

    @@ -243,7 +282,7 @@ Functions
    Returns
    0 if successful, otherwise -1
    -

    Definition at line 59 of file gf_audio.c.

    +

    Definition at line 88 of file gf_audio.c.

    @@ -283,7 +322,7 @@ Functions
    Returns
    0 if successful, otherwise -1
    -

    Definition at line 76 of file gf_audio.c.

    +

    Definition at line 136 of file gf_audio.c.

    diff --git a/engine/gf__audio_8h.js b/engine/gf__audio_8h.js index fa038d6..80d6452 100644 --- a/engine/gf__audio_8h.js +++ b/engine/gf__audio_8h.js @@ -1,6 +1,7 @@ var gf__audio_8h = [ [ "gf_audio_create", "gf__audio_8h.html#a52e61cbf2518774a590141631e053330", null ], + [ "gf_audio_decoder_destroy", "gf__audio_8h.html#ae34c8bd9d398a4335a1c6f9cc290ebdb", null ], [ "gf_audio_destroy", "gf__audio_8h.html#ab5022a62ecc7ba83ccb5da4a1add398b", null ], [ "gf_audio_load", "gf__audio_8h.html#a7a6428af79e540740776ae0d202c3962", null ], [ "gf_audio_load_file", "gf__audio_8h.html#a644b31417fc839bb2be69a88c2e77fbe", null ] diff --git a/engine/gf__audio_8h_source.html b/engine/gf__audio_8h_source.html index 57411c4..659e35b 100644 --- a/engine/gf__audio_8h_source.html +++ b/engine/gf__audio_8h_source.html @@ -119,21 +119,25 @@ $(document).ready(function(){initNavTree('gf__audio_8h_source.html',''); initRes
    29
    35GF_EXPORT void gf_audio_destroy(gf_audio_t* audio);
    36
    -
    44int gf_audio_load_file(gf_audio_t* audio, const char* path);
    -
    45
    -
    54int gf_audio_load(gf_audio_t* audio, const void* data, size_t size);
    -
    55
    -
    56#endif
    +
    42GF_EXPORT void gf_audio_decoder_destroy(gf_audio_decoder_t* decoder);
    +
    43
    +
    51int gf_audio_load_file(gf_audio_t* audio, const char* path);
    +
    52
    +
    61int gf_audio_load(gf_audio_t* audio, const void* data, size_t size);
    +
    62
    +
    63#endif
    audio.h
    Type definitions related to audio interface.
    core.h
    Type definitions related to core.
    -
    gf_audio_create
    gf_audio_t * gf_audio_create(gf_engine_t *engine)
    Create audio interface.
    Definition gf_audio.c:95
    -
    gf_audio_load_file
    int gf_audio_load_file(gf_audio_t *audio, const char *path)
    Load and play file.
    Definition gf_audio.c:76
    -
    gf_audio_load
    int gf_audio_load(gf_audio_t *audio, const void *data, size_t size)
    Load and play data.
    Definition gf_audio.c:59
    -
    gf_audio_destroy
    void gf_audio_destroy(gf_audio_t *audio)
    Destroy audio interface.
    Definition gf_audio.c:135
    +
    gf_audio_create
    gf_audio_t * gf_audio_create(gf_engine_t *engine)
    Create audio interface.
    Definition gf_audio.c:155
    +
    gf_audio_load_file
    int gf_audio_load_file(gf_audio_t *audio, const char *path)
    Load and play file.
    Definition gf_audio.c:136
    +
    gf_audio_load
    int gf_audio_load(gf_audio_t *audio, const void *data, size_t size)
    Load and play data.
    Definition gf_audio.c:88
    +
    gf_audio_destroy
    void gf_audio_destroy(gf_audio_t *audio)
    Destroy audio interface.
    Definition gf_audio.c:217
    +
    gf_audio_decoder_destroy
    void gf_audio_decoder_destroy(gf_audio_decoder_t *decoder)
    Destroy audio decoder.
    Definition gf_audio.c:199
    gf_macro.h
    Macro.
    GF_EXPORT
    #define GF_EXPORT
    Macro for platform-dependent symbol export/import.
    Definition gf_macro.h:190
    gf_pre.h
    Required headers before anything.
    -
    gf_audio_t
    Audio interface.
    Definition audio.h:73
    +
    gf_audio_decoder_t
    Audio decoder.
    Definition audio.h:63
    +
    gf_audio_t
    Audio interface.
    Definition audio.h:87
    gf_engine_t
    Engine instance.
    Definition core.h:46
    diff --git a/engine/globals.html b/engine/globals.html index e2a2268..70e5640 100644 --- a/engine/globals.html +++ b/engine/globals.html @@ -100,6 +100,7 @@ $(document).ready(function(){initNavTree('globals.html',''); initResizable(); })

    - g -