aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.HLE/HOS/Services/Audio/AudioRenderer/AudioRenderer.cs
blob: 5b682bf845d0442d8d68018d7064d414a3e7e980 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using Ryujinx.Audio.Integration;
using Ryujinx.Audio.Renderer.Server;
using Ryujinx.HLE.HOS.Kernel.Threading;
using System;

namespace Ryujinx.HLE.HOS.Services.Audio.AudioRenderer
{
    class AudioRenderer : IAudioRenderer
    {
        private AudioRenderSystem _impl;

        public AudioRenderer(AudioRenderSystem impl)
        {
            _impl = impl;
        }

        public ResultCode ExecuteAudioRendererRendering()
        {
            return (ResultCode)_impl.ExecuteAudioRendererRendering();
        }

        public uint GetMixBufferCount()
        {
            return _impl.GetMixBufferCount();
        }

        public uint GetRenderingTimeLimit()
        {
            return _impl.GetRenderingTimeLimit();
        }

        public uint GetSampleCount()
        {
            return _impl.GetSampleCount();
        }

        public uint GetSampleRate()
        {
            return _impl.GetSampleRate();
        }

        public int GetState()
        {
            if (_impl.IsActive())
            {
                return 0;
            }

            return 1;
        }

        public ResultCode QuerySystemEvent(out KEvent systemEvent)
        {
            ResultCode resultCode = (ResultCode)_impl.QuerySystemEvent(out IWritableEvent outEvent);

            if (resultCode == ResultCode.Success)
            {
                if (outEvent is AudioKernelEvent)
                {
                    systemEvent = ((AudioKernelEvent)outEvent).Event;
                }
                else
                {
                    throw new NotImplementedException();
                }
            }
            else
            {
                systemEvent = null;
            }

            return resultCode;
        }

        public ResultCode RequestUpdate(Memory<byte> output, Memory<byte> performanceOutput, ReadOnlyMemory<byte> input)
        {
            return (ResultCode)_impl.Update(output, performanceOutput, input);
        }

        public void SetRenderingTimeLimit(uint percent)
        {
            _impl.SetRenderingTimeLimitPercent(percent);
        }

        public ResultCode Start()
        {
            _impl.Start();

            return ResultCode.Success;
        }

        public ResultCode Stop()
        {
            _impl.Stop();

            return ResultCode.Success;
        }

        public void Dispose()
        {
            Dispose(true);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                _impl.Dispose();
            }
        }

        public void SetVoiceDropParameter(float voiceDropParameter)
        {
            _impl.SetVoiceDropParameter(voiceDropParameter);
        }

        public float GetVoiceDropParameter()
        {
            return _impl.GetVoiceDropParameter();
        }
    }
}