forked from Mirror/Ryujinx
5b26e4ef94
Changes: Implement software surround downmixing (fix #796). Fix a crash when no audio renderer were created when stopping emulation. NOTE: This PR also disable support of 5.1 surround on the OpenAL backend as we cannot detect if the hardware directly support it. (the downmixing applied by OpenAL on Windows is terribly slow)
54 lines
No EOL
1.6 KiB
C#
54 lines
No EOL
1.6 KiB
C#
using System;
|
|
|
|
namespace Ryujinx.Audio
|
|
{
|
|
public interface IAalOutput : IDisposable
|
|
{
|
|
bool SupportsChannelCount(int channels);
|
|
|
|
private int SelectHardwareChannelCount(int targetChannelCount)
|
|
{
|
|
if (SupportsChannelCount(targetChannelCount))
|
|
{
|
|
return targetChannelCount;
|
|
}
|
|
|
|
switch (targetChannelCount)
|
|
{
|
|
case 6:
|
|
return SelectHardwareChannelCount(2);
|
|
case 2:
|
|
return SelectHardwareChannelCount(1);
|
|
case 1:
|
|
throw new ArgumentException("No valid channel configuration found!");
|
|
default:
|
|
throw new ArgumentException($"Invalid targetChannelCount {targetChannelCount}");
|
|
}
|
|
}
|
|
|
|
int OpenTrack(int sampleRate, int channels, ReleaseCallback callback)
|
|
{
|
|
return OpenHardwareTrack(sampleRate, SelectHardwareChannelCount(channels), channels, callback);
|
|
}
|
|
|
|
int OpenHardwareTrack(int sampleRate, int hardwareChannels, int virtualChannels, ReleaseCallback callback);
|
|
|
|
void CloseTrack(int trackId);
|
|
|
|
bool ContainsBuffer(int trackId, long bufferTag);
|
|
|
|
long[] GetReleasedBuffers(int trackId, int maxCount);
|
|
|
|
void AppendBuffer<T>(int trackId, long bufferTag, T[] buffer) where T : struct;
|
|
|
|
void Start(int trackId);
|
|
|
|
void Stop(int trackId);
|
|
|
|
float GetVolume();
|
|
|
|
void SetVolume(float volume);
|
|
|
|
PlaybackState GetState(int trackId);
|
|
}
|
|
} |