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