diff --git a/librecomp/include/librecomp/game.hpp b/librecomp/include/librecomp/game.hpp index 01d753f..57bdcc1 100644 --- a/librecomp/include/librecomp/game.hpp +++ b/librecomp/include/librecomp/game.hpp @@ -54,7 +54,7 @@ namespace recomp { ultramodern::renderer::WindowHandle window_handle, const recomp::rsp::callbacks_t& rsp_callbacks, const ultramodern::renderer::callbacks_t& renderer_callbacks, - const ultramodern::audio_callbacks_t& audio_callbacks, + const ultramodern::audio::callbacks_t& audio_callbacks, const ultramodern::input::callbacks_t& input_callbacks, const recomp::gfx::callbacks_t& gfx_callbacks, const ultramodern::events::callbacks_t& events_callbacks, diff --git a/librecomp/src/ai.cpp b/librecomp/src/ai.cpp index 0195f2b..f9d41d9 100644 --- a/librecomp/src/ai.cpp +++ b/librecomp/src/ai.cpp @@ -12,16 +12,16 @@ extern "C" void osAiSetFrequency_recomp(uint8_t* rdram, recomp_context* ctx) { //uint32_t dacRate = (uint32_t)(((float)VI_NTSC_CLOCK / freq) + 0.5f); //freq = VI_NTSC_CLOCK / dacRate; ctx->r2 = freq; - ultramodern::set_audio_frequency(freq); + ultramodern::audio::set_frequency(freq); } extern "C" void osAiSetNextBuffer_recomp(uint8_t* rdram, recomp_context* ctx) { - ultramodern::queue_audio_buffer(rdram, ctx->r4, ctx->r5); + ultramodern::audio::queue_buffer(rdram, ctx->r4, ctx->r5); ctx->r2 = 0; } extern "C" void osAiGetLength_recomp(uint8_t* rdram, recomp_context* ctx) { - ctx->r2 = ultramodern::get_remaining_audio_bytes(); + ctx->r2 = ultramodern::audio::get_remaining_bytes(); } extern "C" void osAiGetStatus_recomp(uint8_t* rdram, recomp_context* ctx) { diff --git a/librecomp/src/recomp.cpp b/librecomp/src/recomp.cpp index 40f1dfe..118e927 100644 --- a/librecomp/src/recomp.cpp +++ b/librecomp/src/recomp.cpp @@ -377,7 +377,7 @@ void recomp::start( ultramodern::renderer::WindowHandle window_handle, const recomp::rsp::callbacks_t& rsp_callbacks, const ultramodern::renderer::callbacks_t& renderer_callbacks, - const ultramodern::audio_callbacks_t& audio_callbacks, + const ultramodern::audio::callbacks_t& audio_callbacks, const ultramodern::input::callbacks_t& input_callbacks, const recomp::gfx::callbacks_t& gfx_callbacks_, const ultramodern::events::callbacks_t& events_callbacks, diff --git a/ultramodern/include/ultramodern/audio.hpp b/ultramodern/include/ultramodern/audio.hpp new file mode 100644 index 0000000..ec91414 --- /dev/null +++ b/ultramodern/include/ultramodern/audio.hpp @@ -0,0 +1,31 @@ +#ifndef __ULTRAMODERN_AUDIO_HPP__ +#define __ULTRAMODERN_AUDIO_HPP__ + +#include +#include + +#include "ultra64.h" + +namespace ultramodern { + namespace audio { + struct callbacks_t { + using queue_samples_t = void(int16_t*, size_t); + using get_samples_remaining_t = size_t(); + using set_frequency_t = void(uint32_t); + + queue_samples_t* queue_samples; + get_samples_remaining_t* get_frames_remaining; + set_frequency_t* set_frequency; + }; + + void set_callbacks(const callbacks_t& callbacks); + + void init(); + + void set_frequency(uint32_t freq); + void queue_buffer(RDRAM_ARG PTR(s16) audio_data, uint32_t byte_count); + uint32_t get_remaining_bytes(); + } +} + +#endif diff --git a/ultramodern/include/ultramodern/ultramodern.hpp b/ultramodern/include/ultramodern/ultramodern.hpp index 0c9ebbd..820d59d 100644 --- a/ultramodern/include/ultramodern/ultramodern.hpp +++ b/ultramodern/include/ultramodern/ultramodern.hpp @@ -12,6 +12,7 @@ #include "ultra64.h" +#include "ultramodern/audio.hpp" #include "ultramodern/error_handling.hpp" #include "ultramodern/events.hpp" #include "ultramodern/input.hpp" @@ -93,29 +94,12 @@ float get_resolution_scale(); void load_shader_cache(std::span cache_data); void trigger_config_action(); -// Audio -void init_audio(); -void set_audio_frequency(uint32_t freq); -void queue_audio_buffer(RDRAM_ARG PTR(s16) audio_data, uint32_t byte_count); -uint32_t get_remaining_audio_bytes(); - -struct audio_callbacks_t { - using queue_samples_t = void(int16_t*, size_t); - using get_samples_remaining_t = size_t(); - using set_frequency_t = void(uint32_t); - queue_samples_t* queue_samples; - get_samples_remaining_t* get_frames_remaining; - set_frequency_t* set_frequency; -}; - bool is_game_started(); void quit(); void join_event_threads(); void join_thread_cleaner_thread(); void join_saving_thread(); -void set_audio_callbacks(const audio_callbacks_t& callbacks); - /** * Register all the callbacks used by `ultramodern`, most of them being optional. * @@ -128,7 +112,7 @@ void set_audio_callbacks(const audio_callbacks_t& callbacks); void set_callbacks( const rsp::callbacks_t& rsp_callbacks, const renderer::callbacks_t& renderer_callbacks, - const audio_callbacks_t& audio_callbacks, + const audio::callbacks_t& audio_callbacks, const input::callbacks_t& input_callbacks, const events::callbacks_t& events_callbacks, const error_handling::callbacks_t& error_handling_callbacks, diff --git a/ultramodern/src/audio.cpp b/ultramodern/src/audio.cpp index 82c4206..2dbe956 100644 --- a/ultramodern/src/audio.cpp +++ b/ultramodern/src/audio.cpp @@ -1,28 +1,30 @@ +#include + +#include "ultramodern/audio.hpp" #include "ultramodern/ultra64.h" #include "ultramodern/ultramodern.hpp" -#include static uint32_t sample_rate = 48000; -static ultramodern::audio_callbacks_t audio_callbacks; +static ultramodern::audio::callbacks_t audio_callbacks; -void ultramodern::set_audio_callbacks(const ultramodern::audio_callbacks_t& callbacks) { +void ultramodern::audio::set_callbacks(const ultramodern::audio::callbacks_t& callbacks) { audio_callbacks = callbacks; } -void ultramodern::init_audio() { +void ultramodern::audio::init() { // Pick an initial dummy sample rate; this will be set by the game later to the true sample rate. - set_audio_frequency(48000); + set_frequency(48000); } -void ultramodern::set_audio_frequency(uint32_t freq) { +void ultramodern::audio::set_frequency(uint32_t freq) { if (audio_callbacks.set_frequency) { audio_callbacks.set_frequency(freq); } sample_rate = freq; } -void ultramodern::queue_audio_buffer(RDRAM_ARG PTR(int16_t) audio_data_, uint32_t byte_count) { +void ultramodern::audio::queue_buffer(RDRAM_ARG PTR(int16_t) audio_data_, uint32_t byte_count) { // Ensure that the byte count is an integer multiple of samples. assert((byte_count & 1) == 0); @@ -43,7 +45,7 @@ float buffer_offset_frames = 0.5f; // If there's ever any audio popping, check here first. Some games are very sensitive to // the remaining sample count and reporting a number that's too high here can lead to issues. // Reporting a number that's too low can lead to audio lag in some games. -uint32_t ultramodern::get_remaining_audio_bytes() { +uint32_t ultramodern::audio::get_remaining_bytes() { // Get the number of remaining buffered audio bytes. uint32_t buffered_byte_count; if (audio_callbacks.get_frames_remaining != nullptr) { diff --git a/ultramodern/src/ultrainit.cpp b/ultramodern/src/ultrainit.cpp index f092e42..d73d66a 100644 --- a/ultramodern/src/ultrainit.cpp +++ b/ultramodern/src/ultrainit.cpp @@ -4,7 +4,7 @@ void ultramodern::set_callbacks( const rsp::callbacks_t& rsp_callbacks, const renderer::callbacks_t& renderer_callbacks, - const audio_callbacks_t& audio_callbacks, + const audio::callbacks_t& audio_callbacks, const input::callbacks_t& input_callbacks, const events::callbacks_t& events_callbacks, const error_handling::callbacks_t& error_handling_callbacks, @@ -12,7 +12,7 @@ void ultramodern::set_callbacks( ) { ultramodern::rsp::set_callbacks(rsp_callbacks); ultramodern::renderer::set_callbacks(renderer_callbacks); - ultramodern::set_audio_callbacks(audio_callbacks); + ultramodern::audio::set_callbacks(audio_callbacks); ultramodern::input::set_callbacks(input_callbacks); ultramodern::events::set_callbacks(events_callbacks); ultramodern::error_handling::set_callbacks(error_handling_callbacks); @@ -23,7 +23,7 @@ void ultramodern::preinit(RDRAM_ARG ultramodern::renderer::WindowHandle window_h ultramodern::set_main_thread(); ultramodern::init_events(PASS_RDRAM window_handle); ultramodern::init_timers(PASS_RDRAM1); - ultramodern::init_audio(); + ultramodern::audio::init(); ultramodern::init_thread_cleanup(); }