introduce audio_model = "push" to twn.toml
This commit is contained in:
		@@ -259,9 +259,8 @@ void audio_play(const char *path,
 | 
			
		||||
        request.format = AUDIO_F32;
 | 
			
		||||
        request.channels = 2;
 | 
			
		||||
        request.samples = 4096;
 | 
			
		||||
        #ifndef TWN_FEATURE_PUSH_AUDIO
 | 
			
		||||
        request.callback = audio_callback;
 | 
			
		||||
        #endif
 | 
			
		||||
        if (!ctx.push_audio_model)
 | 
			
		||||
            request.callback = audio_callback;
 | 
			
		||||
        /* TODO: check for errors */
 | 
			
		||||
        ctx.audio_device = SDL_OpenAudioDevice(NULL, 0, &request, &got, 0);
 | 
			
		||||
        ctx.audio_stream_format = got.format;
 | 
			
		||||
@@ -279,6 +278,8 @@ void audio_play(const char *path,
 | 
			
		||||
        ctx.audio_initialized = true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    SDL_LockAudioDevice(ctx.audio_device);
 | 
			
		||||
 | 
			
		||||
    if (channel) {
 | 
			
		||||
        AudioChannelItem *pair = shgetp_null(ctx.audio_channels, channel);
 | 
			
		||||
 | 
			
		||||
@@ -331,6 +332,8 @@ void audio_play(const char *path,
 | 
			
		||||
 | 
			
		||||
        arrpush(ctx.unnamed_audio_channels, new_channel);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    SDL_UnlockAudioDevice(ctx.audio_device);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -83,6 +83,7 @@ typedef struct EngineContext {
 | 
			
		||||
    /* signals mouse focus, used to disable mouse capture */
 | 
			
		||||
    bool window_mouse_resident;
 | 
			
		||||
    bool audio_initialized;
 | 
			
		||||
    bool push_audio_model;
 | 
			
		||||
    bool cull_faces;
 | 
			
		||||
} EngineContext;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -226,17 +226,18 @@ static void main_loop(void) {
 | 
			
		||||
        input_state_update_postframe(&ctx.input);
 | 
			
		||||
 | 
			
		||||
        /* TODO: make it works when ctx.ticks_per_second != 60 */
 | 
			
		||||
        #ifdef TWN_FEATURE_PUSH_AUDIO
 | 
			
		||||
        uint64_t const queued_frames = SDL_GetQueuedAudioSize(ctx.audio_device) / sizeof (float) / 2;
 | 
			
		||||
        if (queued_frames >= 4096 * 2)
 | 
			
		||||
            SDL_ClearQueuedAudio(ctx.audio_device);
 | 
			
		||||
        static uint8_t audio_buffer[(AUDIO_FREQUENCY / 60) * sizeof (float) * 2];
 | 
			
		||||
        if (ctx.audio_initialized) {
 | 
			
		||||
            audio_callback(NULL, audio_buffer, sizeof audio_buffer);
 | 
			
		||||
            if (SDL_QueueAudio(ctx.audio_device, audio_buffer, sizeof audio_buffer))
 | 
			
		||||
                CRY_SDL("Error queueing audio: ");
 | 
			
		||||
        if (ctx.push_audio_model) {
 | 
			
		||||
            uint64_t const queued_frames = SDL_GetQueuedAudioSize(ctx.audio_device) / sizeof (float) / 2;
 | 
			
		||||
            /* note: this is here to reduce drift which sometimes appears */
 | 
			
		||||
            if (queued_frames >= 4096 * 2)
 | 
			
		||||
                SDL_ClearQueuedAudio(ctx.audio_device);
 | 
			
		||||
            static uint8_t audio_buffer[(AUDIO_FREQUENCY / 60) * sizeof (float) * 2];
 | 
			
		||||
            if (ctx.audio_initialized) {
 | 
			
		||||
                audio_callback(NULL, audio_buffer, sizeof audio_buffer);
 | 
			
		||||
                if (SDL_QueueAudio(ctx.audio_device, audio_buffer, sizeof audio_buffer))
 | 
			
		||||
                    CRY_SDL("Error queueing audio: ");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        #endif
 | 
			
		||||
 | 
			
		||||
        /* TODO: ctx.game_copy = ctx.game should be placed after it, but it messes with state used in render() */
 | 
			
		||||
        preserve_persistent_ctx_fields();
 | 
			
		||||
@@ -639,23 +640,24 @@ static bool initialize(void) {
 | 
			
		||||
        } else {
 | 
			
		||||
            ctx.cull_faces = datum_cull_faces.u.b;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* these are dynamic arrays and will be allocated lazily by stb_ds */
 | 
			
		||||
    ctx.render_queue_2d = NULL;
 | 
			
		||||
    ctx.uncolored_mesh_batches = NULL;
 | 
			
		||||
        toml_datum_t datum_audio_model = toml_string_in(engine, "audio_model");
 | 
			
		||||
        ctx.push_audio_model = datum_audio_model.ok ? SDL_strncmp(datum_audio_model.u.s, "push", sizeof "push" - 1) == 0 : false;
 | 
			
		||||
        SDL_free(datum_audio_model.u.s);
 | 
			
		||||
 | 
			
		||||
    /* input */
 | 
			
		||||
    toml_datum_t datum_keybind_slots = toml_int_in(engine, "keybind_slots");
 | 
			
		||||
    if (!datum_keybind_slots.ok) {
 | 
			
		||||
        ctx.keybind_slots = KEYBIND_SLOTS_DEFAULT;
 | 
			
		||||
    } else {
 | 
			
		||||
        if (datum_keybind_slots.u.i < 1) {
 | 
			
		||||
        /* input */
 | 
			
		||||
        toml_datum_t datum_keybind_slots = toml_int_in(engine, "keybind_slots");
 | 
			
		||||
        if (!datum_keybind_slots.ok) {
 | 
			
		||||
            ctx.keybind_slots = KEYBIND_SLOTS_DEFAULT;
 | 
			
		||||
        } else {
 | 
			
		||||
            ctx.keybind_slots = datum_keybind_slots.u.i;
 | 
			
		||||
            if (datum_keybind_slots.u.i < 1) {
 | 
			
		||||
                ctx.keybind_slots = KEYBIND_SLOTS_DEFAULT;
 | 
			
		||||
            } else {
 | 
			
		||||
                ctx.keybind_slots = datum_keybind_slots.u.i;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    input_state_init(&ctx.input);
 | 
			
		||||
 | 
			
		||||
    ctx.render_double_buffered = true;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user