aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Audio.Backends.SoundIo/Native/SoundIo.cs
blob: 7fdb1fc04c3c45a0f0e902143714151d25d624aa (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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
using Ryujinx.Common.Memory;
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

namespace Ryujinx.Audio.Backends.SoundIo.Native
{
    public static partial class SoundIo
    {
        private const string LibraryName = "libsoundio";

        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate void OnDeviceChangeNativeDelegate(IntPtr ctx);

        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate void OnBackendDisconnectedDelegate(IntPtr ctx, SoundIoError err);

        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate void OnEventsSignalDelegate(IntPtr ctx);

        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate void EmitRtPrioWarningDelegate();

        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate void JackCallbackDelegate(IntPtr msg);

        [StructLayout(LayoutKind.Sequential)]
        public struct SoundIoStruct
        {
            public IntPtr UserData;
            public IntPtr OnDeviceChange;
            public IntPtr OnBackendDisconnected;
            public IntPtr OnEventsSignal;
            public SoundIoBackend CurrentBackend;
            public IntPtr ApplicationName;
            public IntPtr EmitRtPrioWarning;
            public IntPtr JackInfoCallback;
            public IntPtr JackErrorCallback;
        }

        public struct SoundIoChannelLayout
        {
            public IntPtr Name;
            public int ChannelCount;
            public Array24<SoundIoChannelId> Channels;

            public static IntPtr GetDefault(int channelCount)
            {
                return soundio_channel_layout_get_default(channelCount);
            }

            public static unsafe SoundIoChannelLayout GetDefaultValue(int channelCount)
            {
                return Unsafe.AsRef<SoundIoChannelLayout>((SoundIoChannelLayout*)GetDefault(channelCount));
            }
        }

        public struct SoundIoSampleRateRange
        {
            public int Min;
            public int Max;
        }

        public struct SoundIoDevice
        {
            public IntPtr SoundIo;
            public IntPtr Id;
            public IntPtr Name;
            public SoundIoDeviceAim Aim;
            public IntPtr Layouts;
            public int LayoutCount;
            public SoundIoChannelLayout CurrentLayout;
            public IntPtr Formats;
            public int FormatCount;
            public SoundIoFormat CurrentFormat;
            public IntPtr SampleRates;
            public int SampleRateCount;
            public int SampleRateCurrent;
            public double SoftwareLatencyMin;
            public double SoftwareLatencyMax;
            public double SoftwareLatencyCurrent;
            public bool IsRaw;
            public int RefCount;
            public SoundIoError ProbeError;
        }

        public struct SoundIoOutStream
        {
            public IntPtr Device;
            public SoundIoFormat Format;
            public int SampleRate;
            public SoundIoChannelLayout Layout;
            public double SoftwareLatency;
            public float Volume;
            public IntPtr UserData;
            public IntPtr WriteCallback;
            public IntPtr UnderflowCallback;
            public IntPtr ErrorCallback;
            public IntPtr Name;
            public bool NonTerminalHint;
            public int BytesPerFrame;
            public int BytesPerSample;
            public SoundIoError LayoutError;
        }

        public struct SoundIoChannelArea
        {
            public IntPtr Pointer;
            public int Step;
        }

        [LibraryImport(LibraryName)]
        internal static partial IntPtr soundio_create();

        [LibraryImport(LibraryName)]
        internal static partial SoundIoError soundio_connect(IntPtr ctx);

        [LibraryImport(LibraryName)]
        internal static partial void soundio_disconnect(IntPtr ctx);

        [LibraryImport(LibraryName)]
        internal static partial void soundio_flush_events(IntPtr ctx);

        [LibraryImport(LibraryName)]
        internal static partial int soundio_output_device_count(IntPtr ctx);

        [LibraryImport(LibraryName)]
        internal static partial int soundio_default_output_device_index(IntPtr ctx);

        [LibraryImport(LibraryName)]
        internal static partial IntPtr soundio_get_output_device(IntPtr ctx, int index);

        [LibraryImport(LibraryName)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static partial bool soundio_device_supports_format(IntPtr devCtx, SoundIoFormat format);

        [LibraryImport(LibraryName)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static partial bool soundio_device_supports_layout(IntPtr devCtx, IntPtr layout);

        [LibraryImport(LibraryName)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static partial bool soundio_device_supports_sample_rate(IntPtr devCtx, int sampleRate);

        [LibraryImport(LibraryName)]
        internal static partial IntPtr soundio_outstream_create(IntPtr devCtx);

        [LibraryImport(LibraryName)]
        internal static partial SoundIoError soundio_outstream_open(IntPtr outStreamCtx);

        [LibraryImport(LibraryName)]
        internal static partial SoundIoError soundio_outstream_start(IntPtr outStreamCtx);

        [LibraryImport(LibraryName)]
        internal static partial SoundIoError soundio_outstream_begin_write(IntPtr outStreamCtx, IntPtr areas, IntPtr frameCount);

        [LibraryImport(LibraryName)]
        internal static partial SoundIoError soundio_outstream_end_write(IntPtr outStreamCtx);

        [LibraryImport(LibraryName)]
        internal static partial SoundIoError soundio_outstream_pause(IntPtr devCtx, [MarshalAs(UnmanagedType.Bool)] bool pause);

        [LibraryImport(LibraryName)]
        internal static partial SoundIoError soundio_outstream_set_volume(IntPtr devCtx, double volume);

        [LibraryImport(LibraryName)]
        internal static partial void soundio_outstream_destroy(IntPtr streamCtx);

        [LibraryImport(LibraryName)]
        internal static partial void soundio_destroy(IntPtr ctx);

        [LibraryImport(LibraryName)]
        internal static partial IntPtr soundio_channel_layout_get_default(int channelCount);

        [LibraryImport(LibraryName)]
        internal static partial IntPtr soundio_strerror(SoundIoError err);
    }
}