From 57c4e6ef21d1f281b172aedcfd993a2ac43456ef Mon Sep 17 00:00:00 2001 From: Ac_K Date: Fri, 20 Nov 2020 21:59:01 +0100 Subject: audout: Implement and fix some calls (#1725) * audout: Implement GetAudioOutBufferCount, GetAudioOutPlayedSampleCount and FlushAudioOutBuffers This PR implement audout service calls: - GetAudioOutBufferCount - GetAudioOutPlayedSampleCount - FlushAudioOutBuffers The RE calls just give some hints about no extra checks. Since we use a totally different implementation because of our backend, I can't do something better for now. SetAudioOutVolume and GetAudioOutVolume are fixed too by set/get the volume of the current opened track, previous implementation was wrong. This fix #1133, fix #1258 and fix #1519. Thanks to @jduncanator for this help during the implementation and all his precious advices. * Fix some debug leftovers * Address jD feedback --- Ryujinx.Audio/Renderers/OpenAL/OpenALAudioOut.cs | 101 +++++++++++++++++------ 1 file changed, 76 insertions(+), 25 deletions(-) (limited to 'Ryujinx.Audio/Renderers/OpenAL/OpenALAudioOut.cs') diff --git a/Ryujinx.Audio/Renderers/OpenAL/OpenALAudioOut.cs b/Ryujinx.Audio/Renderers/OpenAL/OpenALAudioOut.cs index fe82fced..abad0f17 100644 --- a/Ryujinx.Audio/Renderers/OpenAL/OpenALAudioOut.cs +++ b/Ryujinx.Audio/Renderers/OpenAL/OpenALAudioOut.cs @@ -37,16 +37,6 @@ namespace Ryujinx.Audio /// private Thread _audioPollerThread; - /// - /// The volume of audio renderer - /// - private float _volume = 1.0f; - - /// - /// True if the volume of audio renderer have changed - /// - private bool _volumeChanged; - /// /// True if OpenAL is supported on the device /// @@ -248,6 +238,8 @@ namespace Ryujinx.Audio AL.SourceQueueBuffer(track.SourceId, bufferId); StartPlaybackIfNeeded(track); + + track.PlayedSampleCount += (ulong)buffer.Length; } } } @@ -277,13 +269,6 @@ namespace Ryujinx.Audio if (State != ALSourceState.Playing && track.State == PlaybackState.Playing) { - if (_volumeChanged) - { - AL.Source(track.SourceId, ALSourcef.Gain, _volume); - - _volumeChanged = false; - } - AL.SourcePlay(track.SourceId); } } @@ -306,21 +291,87 @@ namespace Ryujinx.Audio } /// - /// Get playback volume + /// Get track buffer count /// - public float GetVolume() => _volume; + /// The ID of the track to get buffer count + public uint GetBufferCount(int trackId) + { + if (_tracks.TryGetValue(trackId, out OpenALAudioTrack track)) + { + lock (track) + { + return track.BufferCount; + } + } + + return 0; + } /// - /// Set playback volume + /// Get track played sample count /// - /// The volume of the playback - public void SetVolume(float volume) + /// The ID of the track to get played sample count + public ulong GetPlayedSampleCount(int trackId) { - if (!_volumeChanged) + if (_tracks.TryGetValue(trackId, out OpenALAudioTrack track)) { - _volume = volume; - _volumeChanged = true; + lock (track) + { + return track.PlayedSampleCount; + } } + + return 0; + } + + /// + /// Flush all track buffers + /// + /// The ID of the track to flush + public bool FlushBuffers(int trackId) + { + if (_tracks.TryGetValue(trackId, out OpenALAudioTrack track)) + { + lock (track) + { + track.FlushBuffers(); + } + } + + return false; + } + + /// + /// Set track volume + /// + /// The ID of the track to set volume + /// The volume of the track + public void SetVolume(int trackId, float volume) + { + if (_tracks.TryGetValue(trackId, out OpenALAudioTrack track)) + { + lock (track) + { + track.SetVolume(volume); + } + } + } + + /// + /// Get track volume + /// + /// The ID of the track to get volume + public float GetVolume(int trackId) + { + if (_tracks.TryGetValue(trackId, out OpenALAudioTrack track)) + { + lock (track) + { + return track.Volume; + } + } + + return 1.0f; } /// -- cgit v1.2.3