mirror of
https://git.ryujinx.app/kenji-nx/ryujinx.git
synced 2025-12-14 16:37:07 +00:00
* Fixed an issue where games would boot loop because of an incorrect HID state.
* Turns out the SamplingNumber of the atomic input storage doesn't match the SamplingNumber of the input state held by the atomic storage, instead it is exactly double the value in the input state.
* Added new Condition struct to the HID Shared memory and populate it with dummy data to fix the no-controller crash (already merged).
* The audio renderer has been mostly updated to rev15, allowing rev15 games to launch.
* Biquad filters now use floats.
* Several structures have been renamed to match the SDK names, making it easier to compare functionality. A few names are still missing and will be changed at a later date.
* The new commands from rev15 have been added to the CommandType enum, but they are still missing from the code itself.
* Due to changes in the SDK layout, the time estimation functions are either missing or very well hidden (or Ghidra search functionality is useless). We can't fully implement the new commands until the timing data has been located.
* A few minor tweaks to the code have been made to more accurately match the SDK.
149 lines
5.3 KiB
C#
149 lines
5.3 KiB
C#
using Ryujinx.Audio.Renderer.Common;
|
|
using Ryujinx.Audio.Renderer.Utils;
|
|
using System;
|
|
using System.Diagnostics;
|
|
|
|
namespace Ryujinx.Audio.Renderer.Server.Voice
|
|
{
|
|
/// <summary>
|
|
/// Voice context.
|
|
/// </summary>
|
|
public class VoiceContext
|
|
{
|
|
/// <summary>
|
|
/// Storage of the sorted indices to <see cref="VoiceInfo"/>.
|
|
/// </summary>
|
|
private Memory<int> _sortedVoices;
|
|
|
|
/// <summary>
|
|
/// Storage for <see cref="VoiceInfo"/>.
|
|
/// </summary>
|
|
private Memory<VoiceInfo> _voices;
|
|
|
|
/// <summary>
|
|
/// Storage for <see cref="VoiceChannelResource"/>.
|
|
/// </summary>
|
|
private Memory<VoiceChannelResource> _voiceChannelResources;
|
|
|
|
/// <summary>
|
|
/// Storage for <see cref="VoiceState"/> that are used during audio renderer server updates.
|
|
/// </summary>
|
|
private Memory<VoiceState> _voiceStatesCpu;
|
|
|
|
/// <summary>
|
|
/// Storage for <see cref="VoiceState"/> for the <see cref="Dsp.AudioProcessor"/>.
|
|
/// </summary>
|
|
private Memory<VoiceState> _voiceStatesDsp;
|
|
|
|
/// <summary>
|
|
/// The total voice count.
|
|
/// </summary>
|
|
private uint _voiceCount;
|
|
|
|
public void Initialize(Memory<int> sortedVoices, Memory<VoiceInfo> voices, Memory<VoiceChannelResource> voiceChannelResources, Memory<VoiceState> voiceStatesCpu, Memory<VoiceState> voiceStatesDsp, uint voiceCount)
|
|
{
|
|
_sortedVoices = sortedVoices;
|
|
_voices = voices;
|
|
_voiceChannelResources = voiceChannelResources;
|
|
_voiceStatesCpu = voiceStatesCpu;
|
|
_voiceStatesDsp = voiceStatesDsp;
|
|
_voiceCount = voiceCount;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get the total voice count.
|
|
/// </summary>
|
|
/// <returns>The total voice count.</returns>
|
|
public uint GetCount()
|
|
{
|
|
return _voiceCount;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get a reference to a <see cref="VoiceChannelResource"/> at the given <paramref name="id"/>.
|
|
/// </summary>
|
|
/// <param name="id">The index to use.</param>
|
|
/// <returns>A reference to a <see cref="VoiceChannelResource"/> at the given <paramref name="id"/>.</returns>
|
|
public ref VoiceChannelResource GetChannelResource(int id)
|
|
{
|
|
return ref SpanIOHelper.GetFromMemory(_voiceChannelResources, id, _voiceCount);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get a <see cref="Memory{VoiceState}"/> at the given <paramref name="id"/>.
|
|
/// </summary>
|
|
/// <param name="id">The index to use.</param>
|
|
/// <returns>A <see cref="Memory{VoiceState}"/> at the given <paramref name="id"/>.</returns>
|
|
/// <remarks>The returned <see cref="Memory{VoiceState}"/> should only be used when updating the server state.</remarks>
|
|
public Memory<VoiceState> GetUpdateStateForCpu(int id)
|
|
{
|
|
return SpanIOHelper.GetMemory(_voiceStatesCpu, id, _voiceCount);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get a <see cref="Memory{VoiceState}"/> at the given <paramref name="id"/>.
|
|
/// </summary>
|
|
/// <param name="id">The index to use.</param>
|
|
/// <returns>A <see cref="Memory{VoiceState}"/> at the given <paramref name="id"/>.</returns>
|
|
/// <remarks>The returned <see cref="Memory{VoiceState}"/> should only be used in the context of processing on the <see cref="Dsp.AudioProcessor"/>.</remarks>
|
|
public Memory<VoiceState> GetUpdateStateForDsp(int id)
|
|
{
|
|
return SpanIOHelper.GetMemory(_voiceStatesDsp, id, _voiceCount);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get a reference to a <see cref="VoiceInfo"/> at the given <paramref name="id"/>.
|
|
/// </summary>
|
|
/// <param name="id">The index to use.</param>
|
|
/// <returns>A reference to a <see cref="VoiceInfo"/> at the given <paramref name="id"/>.</returns>
|
|
public ref VoiceInfo GetState(int id)
|
|
{
|
|
return ref SpanIOHelper.GetFromMemory(_voices, id, _voiceCount);
|
|
}
|
|
|
|
public ref VoiceInfo GetSortedState(int id)
|
|
{
|
|
Debug.Assert(id >= 0 && id < _voiceCount);
|
|
|
|
return ref GetState(_sortedVoices.Span[id]);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Update internal state during command generation.
|
|
/// </summary>
|
|
public void UpdateForCommandGeneration()
|
|
{
|
|
_voiceStatesDsp.CopyTo(_voiceStatesCpu);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sort the internal voices by priority and sorting order (if the priorities match).
|
|
/// </summary>
|
|
public void Sort()
|
|
{
|
|
for (int i = 0; i < _voiceCount; i++)
|
|
{
|
|
_sortedVoices.Span[i] = i;
|
|
}
|
|
|
|
Span<int> sortedVoicesTemp = _sortedVoices[..(int)_voiceCount].Span;
|
|
|
|
sortedVoicesTemp.Sort((a, b) =>
|
|
{
|
|
ref VoiceInfo aInfo = ref GetState(a);
|
|
ref VoiceInfo bInfo = ref GetState(b);
|
|
|
|
int result = aInfo.Priority.CompareTo(bInfo.Priority);
|
|
|
|
if (result == 0)
|
|
{
|
|
return aInfo.SortingOrder.CompareTo(bInfo.SortingOrder);
|
|
}
|
|
|
|
return result;
|
|
});
|
|
|
|
// sortedVoicesTemp.CopyTo(_sortedVoices.Span);
|
|
}
|
|
}
|
|
}
|