diff options
| author | Ac_K <Acoustik666@gmail.com> | 2020-11-20 21:59:01 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-20 21:59:01 +0100 |
| commit | 57c4e6ef21d1f281b172aedcfd993a2ac43456ef (patch) | |
| tree | 8ee5e5b42ab14bd8df52e823f3fcb4027e5ed873 /Ryujinx.Audio/Renderers/OpenAL/OpenALAudioOut.cs | |
| parent | 9493cdfe553d77d8f37927ef2acf87cfbab1c467 (diff) | |
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
Diffstat (limited to 'Ryujinx.Audio/Renderers/OpenAL/OpenALAudioOut.cs')
| -rw-r--r-- | Ryujinx.Audio/Renderers/OpenAL/OpenALAudioOut.cs | 101 |
1 files changed, 76 insertions, 25 deletions
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 @@ -38,16 +38,6 @@ namespace Ryujinx.Audio private Thread _audioPollerThread; /// <summary> - /// The volume of audio renderer - /// </summary> - private float _volume = 1.0f; - - /// <summary> - /// True if the volume of audio renderer have changed - /// </summary> - private bool _volumeChanged; - - /// <summary> /// True if OpenAL is supported on the device /// </summary> public static bool IsSupported @@ -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 } /// <summary> - /// Get playback volume + /// Get track buffer count /// </summary> - public float GetVolume() => _volume; + /// <param name="trackId">The ID of the track to get buffer count</param> + public uint GetBufferCount(int trackId) + { + if (_tracks.TryGetValue(trackId, out OpenALAudioTrack track)) + { + lock (track) + { + return track.BufferCount; + } + } + + return 0; + } /// <summary> - /// Set playback volume + /// Get track played sample count /// </summary> - /// <param name="volume">The volume of the playback</param> - public void SetVolume(float volume) + /// <param name="trackId">The ID of the track to get played sample count</param> + 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; + } + + /// <summary> + /// Flush all track buffers + /// </summary> + /// <param name="trackId">The ID of the track to flush</param> + public bool FlushBuffers(int trackId) + { + if (_tracks.TryGetValue(trackId, out OpenALAudioTrack track)) + { + lock (track) + { + track.FlushBuffers(); + } + } + + return false; + } + + /// <summary> + /// Set track volume + /// </summary> + /// <param name="trackId">The ID of the track to set volume</param> + /// <param name="volume">The volume of the track</param> + public void SetVolume(int trackId, float volume) + { + if (_tracks.TryGetValue(trackId, out OpenALAudioTrack track)) + { + lock (track) + { + track.SetVolume(volume); + } + } + } + + /// <summary> + /// Get track volume + /// </summary> + /// <param name="trackId">The ID of the track to get volume</param> + public float GetVolume(int trackId) + { + if (_tracks.TryGetValue(trackId, out OpenALAudioTrack track)) + { + lock (track) + { + return track.Volume; + } + } + + return 1.0f; } /// <summary> |
