audio namespace

This commit is contained in:
Angie 2024-06-19 23:53:56 -04:00
parent 5960c5625b
commit 01230969c4
7 changed files with 51 additions and 34 deletions

View file

@ -54,7 +54,7 @@ namespace recomp {
ultramodern::renderer::WindowHandle window_handle, ultramodern::renderer::WindowHandle window_handle,
const recomp::rsp::callbacks_t& rsp_callbacks, const recomp::rsp::callbacks_t& rsp_callbacks,
const ultramodern::renderer::callbacks_t& renderer_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 ultramodern::input::callbacks_t& input_callbacks,
const recomp::gfx::callbacks_t& gfx_callbacks, const recomp::gfx::callbacks_t& gfx_callbacks,
const ultramodern::events::callbacks_t& events_callbacks, const ultramodern::events::callbacks_t& events_callbacks,

View file

@ -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); //uint32_t dacRate = (uint32_t)(((float)VI_NTSC_CLOCK / freq) + 0.5f);
//freq = VI_NTSC_CLOCK / dacRate; //freq = VI_NTSC_CLOCK / dacRate;
ctx->r2 = freq; ctx->r2 = freq;
ultramodern::set_audio_frequency(freq); ultramodern::audio::set_frequency(freq);
} }
extern "C" void osAiSetNextBuffer_recomp(uint8_t* rdram, recomp_context* ctx) { 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; ctx->r2 = 0;
} }
extern "C" void osAiGetLength_recomp(uint8_t* rdram, recomp_context* ctx) { 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) { extern "C" void osAiGetStatus_recomp(uint8_t* rdram, recomp_context* ctx) {

View file

@ -377,7 +377,7 @@ void recomp::start(
ultramodern::renderer::WindowHandle window_handle, ultramodern::renderer::WindowHandle window_handle,
const recomp::rsp::callbacks_t& rsp_callbacks, const recomp::rsp::callbacks_t& rsp_callbacks,
const ultramodern::renderer::callbacks_t& renderer_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 ultramodern::input::callbacks_t& input_callbacks,
const recomp::gfx::callbacks_t& gfx_callbacks_, const recomp::gfx::callbacks_t& gfx_callbacks_,
const ultramodern::events::callbacks_t& events_callbacks, const ultramodern::events::callbacks_t& events_callbacks,

View file

@ -0,0 +1,31 @@
#ifndef __ULTRAMODERN_AUDIO_HPP__
#define __ULTRAMODERN_AUDIO_HPP__
#include <cstddef>
#include <cstdint>
#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

View file

@ -12,6 +12,7 @@
#include "ultra64.h" #include "ultra64.h"
#include "ultramodern/audio.hpp"
#include "ultramodern/error_handling.hpp" #include "ultramodern/error_handling.hpp"
#include "ultramodern/events.hpp" #include "ultramodern/events.hpp"
#include "ultramodern/input.hpp" #include "ultramodern/input.hpp"
@ -93,29 +94,12 @@ float get_resolution_scale();
void load_shader_cache(std::span<const char> cache_data); void load_shader_cache(std::span<const char> cache_data);
void trigger_config_action(); 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(); bool is_game_started();
void quit(); void quit();
void join_event_threads(); void join_event_threads();
void join_thread_cleaner_thread(); void join_thread_cleaner_thread();
void join_saving_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. * 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( void set_callbacks(
const rsp::callbacks_t& rsp_callbacks, const rsp::callbacks_t& rsp_callbacks,
const renderer::callbacks_t& renderer_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 input::callbacks_t& input_callbacks,
const events::callbacks_t& events_callbacks, const events::callbacks_t& events_callbacks,
const error_handling::callbacks_t& error_handling_callbacks, const error_handling::callbacks_t& error_handling_callbacks,

View file

@ -1,28 +1,30 @@
#include <cassert>
#include "ultramodern/audio.hpp"
#include "ultramodern/ultra64.h" #include "ultramodern/ultra64.h"
#include "ultramodern/ultramodern.hpp" #include "ultramodern/ultramodern.hpp"
#include <cassert>
static uint32_t sample_rate = 48000; 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; 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. // 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) { if (audio_callbacks.set_frequency) {
audio_callbacks.set_frequency(freq); audio_callbacks.set_frequency(freq);
} }
sample_rate = 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. // Ensure that the byte count is an integer multiple of samples.
assert((byte_count & 1) == 0); 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 // 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. // 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. // 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. // Get the number of remaining buffered audio bytes.
uint32_t buffered_byte_count; uint32_t buffered_byte_count;
if (audio_callbacks.get_frames_remaining != nullptr) { if (audio_callbacks.get_frames_remaining != nullptr) {

View file

@ -4,7 +4,7 @@
void ultramodern::set_callbacks( void ultramodern::set_callbacks(
const rsp::callbacks_t& rsp_callbacks, const rsp::callbacks_t& rsp_callbacks,
const renderer::callbacks_t& renderer_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 input::callbacks_t& input_callbacks,
const events::callbacks_t& events_callbacks, const events::callbacks_t& events_callbacks,
const error_handling::callbacks_t& error_handling_callbacks, const error_handling::callbacks_t& error_handling_callbacks,
@ -12,7 +12,7 @@ void ultramodern::set_callbacks(
) { ) {
ultramodern::rsp::set_callbacks(rsp_callbacks); ultramodern::rsp::set_callbacks(rsp_callbacks);
ultramodern::renderer::set_callbacks(renderer_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::input::set_callbacks(input_callbacks);
ultramodern::events::set_callbacks(events_callbacks); ultramodern::events::set_callbacks(events_callbacks);
ultramodern::error_handling::set_callbacks(error_handling_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::set_main_thread();
ultramodern::init_events(PASS_RDRAM window_handle); ultramodern::init_events(PASS_RDRAM window_handle);
ultramodern::init_timers(PASS_RDRAM1); ultramodern::init_timers(PASS_RDRAM1);
ultramodern::init_audio(); ultramodern::audio::init();
ultramodern::init_thread_cleanup(); ultramodern::init_thread_cleanup();
} }