mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	audio: Improving audio timing for multicore/single core
Fixes the issue with needing the timestretcher for multicore.
This commit is contained in:
		
							parent
							
								
									15a04fb704
								
							
						
					
					
						commit
						24c2930012
					
				| @ -38,7 +38,7 @@ Stream::Stream(Core::Timing::CoreTiming& core_timing, u32 sample_rate, Format fo | |||||||
|       sink_stream{sink_stream}, core_timing{core_timing}, name{std::move(name_)} { |       sink_stream{sink_stream}, core_timing{core_timing}, name{std::move(name_)} { | ||||||
| 
 | 
 | ||||||
|     release_event = Core::Timing::CreateEvent( |     release_event = Core::Timing::CreateEvent( | ||||||
|         name, [this](u64 userdata, s64 cycles_late) { ReleaseActiveBuffer(); }); |         name, [this](u64 userdata, s64 cycles_late) { ReleaseActiveBuffer(cycles_late); }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Stream::Play() { | void Stream::Play() { | ||||||
| @ -66,15 +66,6 @@ s64 Stream::GetBufferReleaseNS(const Buffer& buffer) const { | |||||||
|     return ns.count(); |     return ns.count(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| s64 Stream::GetBufferReleaseNSHostTiming(const Buffer& buffer) const { |  | ||||||
|     const std::size_t num_samples{buffer.GetSamples().size() / GetNumChannels()}; |  | ||||||
|     /// DSP signals before playing the last sample, in HLE we emulate this in this way
 |  | ||||||
|     s64 base_samples = std::max<s64>(static_cast<s64>(num_samples) - 1, 0); |  | ||||||
|     const auto ns = |  | ||||||
|         std::chrono::nanoseconds((static_cast<u64>(base_samples) * 1000000000ULL) / sample_rate); |  | ||||||
|     return ns.count(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void VolumeAdjustSamples(std::vector<s16>& samples, float game_volume) { | static void VolumeAdjustSamples(std::vector<s16>& samples, float game_volume) { | ||||||
|     const float volume{std::clamp(Settings::Volume() - (1.0f - game_volume), 0.0f, 1.0f)}; |     const float volume{std::clamp(Settings::Volume() - (1.0f - game_volume), 0.0f, 1.0f)}; | ||||||
| 
 | 
 | ||||||
| @ -89,7 +80,7 @@ static void VolumeAdjustSamples(std::vector<s16>& samples, float game_volume) { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Stream::PlayNextBuffer() { | void Stream::PlayNextBuffer(s64 cycles_late) { | ||||||
|     if (!IsPlaying()) { |     if (!IsPlaying()) { | ||||||
|         // Ensure we are in playing state before playing the next buffer
 |         // Ensure we are in playing state before playing the next buffer
 | ||||||
|         sink_stream.Flush(); |         sink_stream.Flush(); | ||||||
| @ -114,18 +105,14 @@ void Stream::PlayNextBuffer() { | |||||||
| 
 | 
 | ||||||
|     sink_stream.EnqueueSamples(GetNumChannels(), active_buffer->GetSamples()); |     sink_stream.EnqueueSamples(GetNumChannels(), active_buffer->GetSamples()); | ||||||
| 
 | 
 | ||||||
|     if (core_timing.IsHostTiming()) { |     core_timing.ScheduleEvent(GetBufferReleaseNS(*active_buffer) - cycles_late, release_event, {}); | ||||||
|         core_timing.ScheduleEvent(GetBufferReleaseNSHostTiming(*active_buffer), release_event, {}); |  | ||||||
|     } else { |  | ||||||
|         core_timing.ScheduleEvent(GetBufferReleaseNS(*active_buffer), release_event, {}); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Stream::ReleaseActiveBuffer() { | void Stream::ReleaseActiveBuffer(s64 cycles_late) { | ||||||
|     ASSERT(active_buffer); |     ASSERT(active_buffer); | ||||||
|     released_buffers.push(std::move(active_buffer)); |     released_buffers.push(std::move(active_buffer)); | ||||||
|     release_callback(); |     release_callback(); | ||||||
|     PlayNextBuffer(); |     PlayNextBuffer(cycles_late); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool Stream::QueueBuffer(BufferPtr&& buffer) { | bool Stream::QueueBuffer(BufferPtr&& buffer) { | ||||||
|  | |||||||
| @ -90,10 +90,10 @@ public: | |||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     /// Plays the next queued buffer in the audio stream, starting playback if necessary
 |     /// Plays the next queued buffer in the audio stream, starting playback if necessary
 | ||||||
|     void PlayNextBuffer(); |     void PlayNextBuffer(s64 cycles_late = 0); | ||||||
| 
 | 
 | ||||||
|     /// Releases the actively playing buffer, signalling that it has been completed
 |     /// Releases the actively playing buffer, signalling that it has been completed
 | ||||||
|     void ReleaseActiveBuffer(); |     void ReleaseActiveBuffer(s64 cycles_late = 0); | ||||||
| 
 | 
 | ||||||
|     /// Gets the number of core cycles when the specified buffer will be released
 |     /// Gets the number of core cycles when the specified buffer will be released
 | ||||||
|     s64 GetBufferReleaseNS(const Buffer& buffer) const; |     s64 GetBufferReleaseNS(const Buffer& buffer) const; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 David Marcec
						David Marcec