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,
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,

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);
//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) {

View file

@ -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,

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 "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<const char> 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,

View file

@ -1,28 +1,30 @@
#include <cassert>
#include "ultramodern/audio.hpp"
#include "ultramodern/ultra64.h"
#include "ultramodern/ultramodern.hpp"
#include <cassert>
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) {

View file

@ -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();
}