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, |         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, | ||||||
|  |  | ||||||
|  | @ -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) { | ||||||
|  |  | ||||||
|  | @ -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, | ||||||
|  |  | ||||||
							
								
								
									
										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 "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, | ||||||
|  |  | ||||||
|  | @ -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) { | ||||||
|  |  | ||||||
|  | @ -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(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Angie
						Angie