mirror of
https://github.com/N64Recomp/N64ModernRuntime.git
synced 2025-10-30 08:02:29 +00:00
audio namespace
This commit is contained in:
parent
5960c5625b
commit
01230969c4
7 changed files with 51 additions and 34 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
31
ultramodern/include/ultramodern/audio.hpp
Normal file
31
ultramodern/include/ultramodern/audio.hpp
Normal 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
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue