├── .gitignore
├── FlexASIOGUI.csproj
├── FlexASIOGUI.csproj.user
├── FlexASIOGUI.sln
├── FlexGUIConfig.cs
├── Form1.Designer.cs
├── Form1.cs
├── Form1.resx
├── LICENSE
├── Program.cs
├── README.md
├── installer
├── FlexASIOGUI.iss
└── flexasiogui.ico
└── lib
├── Debug
├── portaudio-sharp.dll
└── portaudio-sharp.pdb
├── Release
├── portaudio-sharp.dll
└── portaudio-sharp.pdb
├── portaudio_x64.dll
└── portaudio_x64.pdb
/.gitignore:
--------------------------------------------------------------------------------
1 | .vs
2 | obj
3 | bin
4 | installer/Output
5 |
--------------------------------------------------------------------------------
/FlexASIOGUI.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | WinExe
5 | net6.0-windows
6 | true
7 | AnyCPU;x64
8 | installer\flexasiogui.ico
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | lib\Debug\portaudio-sharp.dll
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/FlexASIOGUI.csproj.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Form
7 |
8 |
9 |
--------------------------------------------------------------------------------
/FlexASIOGUI.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.30114.105
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FlexASIOGUI", "FlexASIOGUI.csproj", "{3379A106-E2A5-4B28-92D0-D4E37D4ABCCF}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Debug|x64 = Debug|x64
12 | Release|Any CPU = Release|Any CPU
13 | Release|x64 = Release|x64
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {3379A106-E2A5-4B28-92D0-D4E37D4ABCCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17 | {3379A106-E2A5-4B28-92D0-D4E37D4ABCCF}.Debug|Any CPU.Build.0 = Debug|Any CPU
18 | {3379A106-E2A5-4B28-92D0-D4E37D4ABCCF}.Debug|x64.ActiveCfg = Debug|x64
19 | {3379A106-E2A5-4B28-92D0-D4E37D4ABCCF}.Debug|x64.Build.0 = Debug|x64
20 | {3379A106-E2A5-4B28-92D0-D4E37D4ABCCF}.Release|Any CPU.ActiveCfg = Release|Any CPU
21 | {3379A106-E2A5-4B28-92D0-D4E37D4ABCCF}.Release|Any CPU.Build.0 = Release|Any CPU
22 | {3379A106-E2A5-4B28-92D0-D4E37D4ABCCF}.Release|x64.ActiveCfg = Release|x64
23 | {3379A106-E2A5-4B28-92D0-D4E37D4ABCCF}.Release|x64.Build.0 = Release|x64
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | GlobalSection(ExtensibilityGlobals) = postSolution
29 | SolutionGuid = {539BEB5C-0112-411A-9369-271DE771B870}
30 | EndGlobalSection
31 | EndGlobal
32 |
--------------------------------------------------------------------------------
/FlexGUIConfig.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 |
5 | namespace FlexASIOGUI
6 | {
7 | public class FlexGUIConfig
8 | {
9 | public string backend { get; set; } = "Windows WASAPI";
10 | public int? bufferSizeSamples { get; set; } = null;
11 | public FlexGUIConfigDeviceSection input { get; set; }
12 | public FlexGUIConfigDeviceSection output { get; set; }
13 |
14 | public FlexGUIConfig()
15 | {
16 | input = new FlexGUIConfigDeviceSection();
17 | output = new FlexGUIConfigDeviceSection();
18 | }
19 |
20 | }
21 | public class FlexGUIConfigDeviceSection
22 | {
23 | public string device { get; set; }
24 | public double? suggestedLatencySeconds { get; set; } = null;
25 | public bool? wasapiExclusiveMode { get; set; } = null;
26 | public bool? wasapiAutoConvert { get; set; } = null;
27 | public int? channels { get; set; }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/Form1.Designer.cs:
--------------------------------------------------------------------------------
1 | namespace FlexASIOGUI
2 | {
3 | partial class Form1
4 | {
5 | ///
6 | /// Required designer variable.
7 | ///
8 | private System.ComponentModel.IContainer components = null;
9 |
10 | ///
11 | /// Clean up any resources being used.
12 | ///
13 | /// true if managed resources should be disposed; otherwise, false.
14 | protected override void Dispose(bool disposing)
15 | {
16 | if (disposing && (components != null))
17 | {
18 | components.Dispose();
19 | }
20 | base.Dispose(disposing);
21 | }
22 |
23 | #region Windows Form Designer generated code
24 |
25 | ///
26 | /// Required method for Designer support - do not modify
27 | /// the contents of this method with the code editor.
28 | ///
29 | private void InitializeComponent()
30 | {
31 | this.treeDevicesInput = new System.Windows.Forms.TreeView();
32 | this.treeDevicesOutput = new System.Windows.Forms.TreeView();
33 | this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
34 | this.flowLayoutPanel6 = new System.Windows.Forms.FlowLayoutPanel();
35 | this.btSaveAs = new System.Windows.Forms.Button();
36 | this.btLoadFrom = new System.Windows.Forms.Button();
37 | this.btRefreshDevices = new System.Windows.Forms.Button();
38 | this.btClipboard = new System.Windows.Forms.Button();
39 | this.label3 = new System.Windows.Forms.Label();
40 | this.btSaveToProfile = new System.Windows.Forms.Button();
41 | this.comboBackend = new System.Windows.Forms.ComboBox();
42 | this.flowLayoutPanel4 = new System.Windows.Forms.FlowLayoutPanel();
43 | this.checkBoxSetOutputLatency = new System.Windows.Forms.CheckBox();
44 | this.numericLatencyOutput = new System.Windows.Forms.NumericUpDown();
45 | this.label7 = new System.Windows.Forms.Label();
46 | this.flowLayoutPanel2 = new System.Windows.Forms.FlowLayoutPanel();
47 | this.checkBoxWasapiInputSet = new System.Windows.Forms.CheckBox();
48 | this.wasapiExclusiveInput = new System.Windows.Forms.CheckBox();
49 | this.wasapiAutoConvertInput = new System.Windows.Forms.CheckBox();
50 | this.flowLayoutPanel3 = new System.Windows.Forms.FlowLayoutPanel();
51 | this.checkBoxWasapiOutputSet = new System.Windows.Forms.CheckBox();
52 | this.wasapiExclusiveOutput = new System.Windows.Forms.CheckBox();
53 | this.wasapiAutoConvertOutput = new System.Windows.Forms.CheckBox();
54 | this.configOutput = new System.Windows.Forms.TextBox();
55 | this.label1 = new System.Windows.Forms.Label();
56 | this.label2 = new System.Windows.Forms.Label();
57 | this.flowLayoutPanel5 = new System.Windows.Forms.FlowLayoutPanel();
58 | this.checkBoxSetInputLatency = new System.Windows.Forms.CheckBox();
59 | this.numericLatencyInput = new System.Windows.Forms.NumericUpDown();
60 | this.label4 = new System.Windows.Forms.Label();
61 | this.label9 = new System.Windows.Forms.Label();
62 | this.label5 = new System.Windows.Forms.Label();
63 | this.numericChannelsInput = new System.Windows.Forms.NumericUpDown();
64 | this.numericChannelsOutput = new System.Windows.Forms.NumericUpDown();
65 | this.statusStrip1 = new System.Windows.Forms.StatusStrip();
66 | this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
67 | this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel();
68 | this.label6 = new System.Windows.Forms.Label();
69 | this.checkBoxSetBufferSize = new System.Windows.Forms.CheckBox();
70 | this.numericBufferSize = new System.Windows.Forms.NumericUpDown();
71 | this.linkLabelDocs = new System.Windows.Forms.LinkLabel();
72 | this.tableLayoutPanel1.SuspendLayout();
73 | this.flowLayoutPanel6.SuspendLayout();
74 | this.flowLayoutPanel4.SuspendLayout();
75 | ((System.ComponentModel.ISupportInitialize)(this.numericLatencyOutput)).BeginInit();
76 | this.flowLayoutPanel2.SuspendLayout();
77 | this.flowLayoutPanel3.SuspendLayout();
78 | this.flowLayoutPanel5.SuspendLayout();
79 | ((System.ComponentModel.ISupportInitialize)(this.numericLatencyInput)).BeginInit();
80 | ((System.ComponentModel.ISupportInitialize)(this.numericChannelsInput)).BeginInit();
81 | ((System.ComponentModel.ISupportInitialize)(this.numericChannelsOutput)).BeginInit();
82 | this.statusStrip1.SuspendLayout();
83 | this.flowLayoutPanel1.SuspendLayout();
84 | ((System.ComponentModel.ISupportInitialize)(this.numericBufferSize)).BeginInit();
85 | this.SuspendLayout();
86 | //
87 | // treeDevicesInput
88 | //
89 | this.treeDevicesInput.CheckBoxes = true;
90 | this.treeDevicesInput.Dock = System.Windows.Forms.DockStyle.Fill;
91 | this.treeDevicesInput.HideSelection = false;
92 | this.treeDevicesInput.Location = new System.Drawing.Point(93, 58);
93 | this.treeDevicesInput.Name = "treeDevicesInput";
94 | this.treeDevicesInput.Size = new System.Drawing.Size(236, 333);
95 | this.treeDevicesInput.TabIndex = 1;
96 | this.treeDevicesInput.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.treeDevicesInput_AfterCheck);
97 | this.treeDevicesInput.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeDevicesInput_AfterSelect);
98 | //
99 | // treeDevicesOutput
100 | //
101 | this.treeDevicesOutput.CheckBoxes = true;
102 | this.treeDevicesOutput.Dock = System.Windows.Forms.DockStyle.Fill;
103 | this.treeDevicesOutput.HideSelection = false;
104 | this.treeDevicesOutput.Location = new System.Drawing.Point(335, 58);
105 | this.treeDevicesOutput.Name = "treeDevicesOutput";
106 | this.treeDevicesOutput.Size = new System.Drawing.Size(236, 333);
107 | this.treeDevicesOutput.TabIndex = 1;
108 | this.treeDevicesOutput.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.treeDevicesOutput_AfterCheck);
109 | this.treeDevicesOutput.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeDevicesOutput_AfterSelect);
110 | //
111 | // tableLayoutPanel1
112 | //
113 | this.tableLayoutPanel1.AutoSize = true;
114 | this.tableLayoutPanel1.ColumnCount = 4;
115 | this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 90F));
116 | this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
117 | this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
118 | this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 301F));
119 | this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel6, 3, 5);
120 | this.tableLayoutPanel1.Controls.Add(this.btRefreshDevices, 3, 0);
121 | this.tableLayoutPanel1.Controls.Add(this.btClipboard, 3, 3);
122 | this.tableLayoutPanel1.Controls.Add(this.label3, 0, 0);
123 | this.tableLayoutPanel1.Controls.Add(this.treeDevicesOutput, 2, 2);
124 | this.tableLayoutPanel1.Controls.Add(this.btSaveToProfile, 3, 4);
125 | this.tableLayoutPanel1.Controls.Add(this.treeDevicesInput, 1, 2);
126 | this.tableLayoutPanel1.Controls.Add(this.comboBackend, 1, 0);
127 | this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel4, 2, 3);
128 | this.tableLayoutPanel1.Controls.Add(this.label7, 0, 4);
129 | this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel2, 1, 4);
130 | this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel3, 2, 4);
131 | this.tableLayoutPanel1.Controls.Add(this.configOutput, 3, 2);
132 | this.tableLayoutPanel1.Controls.Add(this.label1, 1, 1);
133 | this.tableLayoutPanel1.Controls.Add(this.label2, 2, 1);
134 | this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel5, 1, 3);
135 | this.tableLayoutPanel1.Controls.Add(this.label4, 0, 3);
136 | this.tableLayoutPanel1.Controls.Add(this.label9, 3, 1);
137 | this.tableLayoutPanel1.Controls.Add(this.label5, 0, 5);
138 | this.tableLayoutPanel1.Controls.Add(this.numericChannelsInput, 1, 5);
139 | this.tableLayoutPanel1.Controls.Add(this.numericChannelsOutput, 2, 5);
140 | this.tableLayoutPanel1.Controls.Add(this.statusStrip1, 0, 7);
141 | this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel1, 2, 0);
142 | this.tableLayoutPanel1.Controls.Add(this.linkLabelDocs, 3, 6);
143 | this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
144 | this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
145 | this.tableLayoutPanel1.Name = "tableLayoutPanel1";
146 | this.tableLayoutPanel1.RowCount = 8;
147 | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
148 | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 25F));
149 | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
150 | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
151 | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
152 | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
153 | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
154 | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
155 | this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
156 | this.tableLayoutPanel1.Size = new System.Drawing.Size(875, 534);
157 | this.tableLayoutPanel1.TabIndex = 4;
158 | //
159 | // flowLayoutPanel6
160 | //
161 | this.flowLayoutPanel6.Controls.Add(this.btSaveAs);
162 | this.flowLayoutPanel6.Controls.Add(this.btLoadFrom);
163 | this.flowLayoutPanel6.Dock = System.Windows.Forms.DockStyle.Fill;
164 | this.flowLayoutPanel6.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
165 | this.flowLayoutPanel6.Location = new System.Drawing.Point(577, 457);
166 | this.flowLayoutPanel6.Name = "flowLayoutPanel6";
167 | this.flowLayoutPanel6.Size = new System.Drawing.Size(295, 24);
168 | this.flowLayoutPanel6.TabIndex = 21;
169 | //
170 | // btSaveAs
171 | //
172 | this.btSaveAs.Dock = System.Windows.Forms.DockStyle.Right;
173 | this.btSaveAs.Location = new System.Drawing.Point(220, 0);
174 | this.btSaveAs.Margin = new System.Windows.Forms.Padding(0);
175 | this.btSaveAs.MinimumSize = new System.Drawing.Size(50, 24);
176 | this.btSaveAs.Name = "btSaveAs";
177 | this.btSaveAs.Size = new System.Drawing.Size(75, 24);
178 | this.btSaveAs.TabIndex = 0;
179 | this.btSaveAs.Text = "Save as";
180 | this.btSaveAs.UseVisualStyleBackColor = true;
181 | this.btSaveAs.Click += new System.EventHandler(this.btSaveAs_Click);
182 | //
183 | // btLoadFrom
184 | //
185 | this.btLoadFrom.Dock = System.Windows.Forms.DockStyle.Right;
186 | this.btLoadFrom.Location = new System.Drawing.Point(145, 0);
187 | this.btLoadFrom.Margin = new System.Windows.Forms.Padding(0);
188 | this.btLoadFrom.MinimumSize = new System.Drawing.Size(50, 24);
189 | this.btLoadFrom.Name = "btLoadFrom";
190 | this.btLoadFrom.Size = new System.Drawing.Size(75, 24);
191 | this.btLoadFrom.TabIndex = 1;
192 | this.btLoadFrom.Text = "Load from";
193 | this.btLoadFrom.UseVisualStyleBackColor = true;
194 | this.btLoadFrom.Click += new System.EventHandler(this.btLoadFrom_Click);
195 | //
196 | // btRefreshDevices
197 | //
198 | this.btRefreshDevices.AccessibleName = "Refresh Devices";
199 | this.btRefreshDevices.AutoSize = true;
200 | this.btRefreshDevices.Location = new System.Drawing.Point(577, 3);
201 | this.btRefreshDevices.MinimumSize = new System.Drawing.Size(0, 23);
202 | this.btRefreshDevices.Name = "btRefreshDevices";
203 | this.btRefreshDevices.Size = new System.Drawing.Size(99, 24);
204 | this.btRefreshDevices.TabIndex = 19;
205 | this.btRefreshDevices.Text = "Refresh Devices";
206 | this.btRefreshDevices.UseVisualStyleBackColor = true;
207 | this.btRefreshDevices.Click += new System.EventHandler(this.btRefreshDevices_Click);
208 | //
209 | // btClipboard
210 | //
211 | this.btClipboard.Dock = System.Windows.Forms.DockStyle.Fill;
212 | this.btClipboard.Location = new System.Drawing.Point(577, 397);
213 | this.btClipboard.Name = "btClipboard";
214 | this.btClipboard.Size = new System.Drawing.Size(295, 24);
215 | this.btClipboard.TabIndex = 0;
216 | this.btClipboard.Text = "Copy to Clipboard";
217 | this.btClipboard.UseVisualStyleBackColor = true;
218 | this.btClipboard.Click += new System.EventHandler(this.btClipboard_Click);
219 | //
220 | // label3
221 | //
222 | this.label3.Anchor = System.Windows.Forms.AnchorStyles.Left;
223 | this.label3.AutoSize = true;
224 | this.label3.Location = new System.Drawing.Point(3, 7);
225 | this.label3.Name = "label3";
226 | this.label3.Size = new System.Drawing.Size(52, 15);
227 | this.label3.TabIndex = 0;
228 | this.label3.Text = "Backend";
229 | //
230 | // btSaveToProfile
231 | //
232 | this.btSaveToProfile.Dock = System.Windows.Forms.DockStyle.Fill;
233 | this.btSaveToProfile.Location = new System.Drawing.Point(577, 427);
234 | this.btSaveToProfile.Name = "btSaveToProfile";
235 | this.btSaveToProfile.Size = new System.Drawing.Size(295, 24);
236 | this.btSaveToProfile.TabIndex = 1;
237 | this.btSaveToProfile.Text = "Save to Default FlexASIO.toml";
238 | this.btSaveToProfile.UseVisualStyleBackColor = true;
239 | this.btSaveToProfile.Click += new System.EventHandler(this.btSaveToProfile_Click);
240 | //
241 | // comboBackend
242 | //
243 | this.comboBackend.Dock = System.Windows.Forms.DockStyle.Fill;
244 | this.comboBackend.FormattingEnabled = true;
245 | this.comboBackend.Location = new System.Drawing.Point(93, 3);
246 | this.comboBackend.MinimumSize = new System.Drawing.Size(200, 0);
247 | this.comboBackend.Name = "comboBackend";
248 | this.comboBackend.Size = new System.Drawing.Size(236, 23);
249 | this.comboBackend.TabIndex = 1;
250 | this.comboBackend.SelectedIndexChanged += new System.EventHandler(this.comboBackend_SelectedIndexChanged);
251 | //
252 | // flowLayoutPanel4
253 | //
254 | this.flowLayoutPanel4.Controls.Add(this.checkBoxSetOutputLatency);
255 | this.flowLayoutPanel4.Controls.Add(this.numericLatencyOutput);
256 | this.flowLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill;
257 | this.flowLayoutPanel4.Location = new System.Drawing.Point(335, 397);
258 | this.flowLayoutPanel4.Name = "flowLayoutPanel4";
259 | this.flowLayoutPanel4.Size = new System.Drawing.Size(236, 24);
260 | this.flowLayoutPanel4.TabIndex = 11;
261 | //
262 | // checkBoxSetOutputLatency
263 | //
264 | this.checkBoxSetOutputLatency.AutoSize = true;
265 | this.checkBoxSetOutputLatency.Location = new System.Drawing.Point(3, 3);
266 | this.checkBoxSetOutputLatency.Name = "checkBoxSetOutputLatency";
267 | this.checkBoxSetOutputLatency.Size = new System.Drawing.Size(127, 19);
268 | this.checkBoxSetOutputLatency.TabIndex = 19;
269 | this.checkBoxSetOutputLatency.Text = "Set Output Latency";
270 | this.checkBoxSetOutputLatency.UseVisualStyleBackColor = true;
271 | this.checkBoxSetOutputLatency.CheckedChanged += new System.EventHandler(this.checkBoxSetOutputLatency_CheckedChanged);
272 | //
273 | // numericLatencyOutput
274 | //
275 | this.numericLatencyOutput.DecimalPlaces = 1;
276 | this.numericLatencyOutput.Dock = System.Windows.Forms.DockStyle.Fill;
277 | this.numericLatencyOutput.Location = new System.Drawing.Point(136, 3);
278 | this.numericLatencyOutput.Name = "numericLatencyOutput";
279 | this.numericLatencyOutput.Size = new System.Drawing.Size(90, 23);
280 | this.numericLatencyOutput.TabIndex = 3;
281 | this.numericLatencyOutput.ValueChanged += new System.EventHandler(this.numericLatencyOutput_ValueChanged);
282 | //
283 | // label7
284 | //
285 | this.label7.Anchor = System.Windows.Forms.AnchorStyles.Left;
286 | this.label7.AutoSize = true;
287 | this.label7.Location = new System.Drawing.Point(3, 431);
288 | this.label7.Name = "label7";
289 | this.label7.Size = new System.Drawing.Size(50, 15);
290 | this.label7.TabIndex = 2;
291 | this.label7.Text = "WASAPI";
292 | //
293 | // flowLayoutPanel2
294 | //
295 | this.flowLayoutPanel2.Controls.Add(this.checkBoxWasapiInputSet);
296 | this.flowLayoutPanel2.Controls.Add(this.wasapiExclusiveInput);
297 | this.flowLayoutPanel2.Controls.Add(this.wasapiAutoConvertInput);
298 | this.flowLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
299 | this.flowLayoutPanel2.Location = new System.Drawing.Point(93, 427);
300 | this.flowLayoutPanel2.Name = "flowLayoutPanel2";
301 | this.flowLayoutPanel2.Size = new System.Drawing.Size(236, 24);
302 | this.flowLayoutPanel2.TabIndex = 11;
303 | //
304 | // checkBoxWasapiInputSet
305 | //
306 | this.checkBoxWasapiInputSet.AutoSize = true;
307 | this.checkBoxWasapiInputSet.Location = new System.Drawing.Point(3, 3);
308 | this.checkBoxWasapiInputSet.Name = "checkBoxWasapiInputSet";
309 | this.checkBoxWasapiInputSet.Size = new System.Drawing.Size(45, 19);
310 | this.checkBoxWasapiInputSet.TabIndex = 9;
311 | this.checkBoxWasapiInputSet.Text = "Set:";
312 | this.checkBoxWasapiInputSet.UseVisualStyleBackColor = true;
313 | this.checkBoxWasapiInputSet.CheckedChanged += new System.EventHandler(this.checkBoxWasapiInputSet_CheckedChanged);
314 | //
315 | // wasapiExclusiveInput
316 | //
317 | this.wasapiExclusiveInput.AutoSize = true;
318 | this.wasapiExclusiveInput.Location = new System.Drawing.Point(54, 3);
319 | this.wasapiExclusiveInput.Name = "wasapiExclusiveInput";
320 | this.wasapiExclusiveInput.Size = new System.Drawing.Size(74, 19);
321 | this.wasapiExclusiveInput.TabIndex = 7;
322 | this.wasapiExclusiveInput.Text = "Exclusive";
323 | this.wasapiExclusiveInput.UseVisualStyleBackColor = true;
324 | this.wasapiExclusiveInput.CheckedChanged += new System.EventHandler(this.wasapiExclusiveInput_CheckedChanged);
325 | //
326 | // wasapiAutoConvertInput
327 | //
328 | this.wasapiAutoConvertInput.AutoSize = true;
329 | this.wasapiAutoConvertInput.Checked = true;
330 | this.wasapiAutoConvertInput.CheckState = System.Windows.Forms.CheckState.Checked;
331 | this.wasapiAutoConvertInput.Location = new System.Drawing.Point(134, 3);
332 | this.wasapiAutoConvertInput.Name = "wasapiAutoConvertInput";
333 | this.wasapiAutoConvertInput.Size = new System.Drawing.Size(94, 19);
334 | this.wasapiAutoConvertInput.TabIndex = 8;
335 | this.wasapiAutoConvertInput.Text = "AutoConvert";
336 | this.wasapiAutoConvertInput.UseVisualStyleBackColor = true;
337 | this.wasapiAutoConvertInput.CheckedChanged += new System.EventHandler(this.wasapiAutoConvertInput_CheckedChanged);
338 | //
339 | // flowLayoutPanel3
340 | //
341 | this.flowLayoutPanel3.Controls.Add(this.checkBoxWasapiOutputSet);
342 | this.flowLayoutPanel3.Controls.Add(this.wasapiExclusiveOutput);
343 | this.flowLayoutPanel3.Controls.Add(this.wasapiAutoConvertOutput);
344 | this.flowLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
345 | this.flowLayoutPanel3.Location = new System.Drawing.Point(335, 427);
346 | this.flowLayoutPanel3.Name = "flowLayoutPanel3";
347 | this.flowLayoutPanel3.Size = new System.Drawing.Size(236, 24);
348 | this.flowLayoutPanel3.TabIndex = 12;
349 | //
350 | // checkBoxWasapiOutputSet
351 | //
352 | this.checkBoxWasapiOutputSet.AutoSize = true;
353 | this.checkBoxWasapiOutputSet.Location = new System.Drawing.Point(3, 3);
354 | this.checkBoxWasapiOutputSet.Name = "checkBoxWasapiOutputSet";
355 | this.checkBoxWasapiOutputSet.Size = new System.Drawing.Size(45, 19);
356 | this.checkBoxWasapiOutputSet.TabIndex = 10;
357 | this.checkBoxWasapiOutputSet.Text = "Set:";
358 | this.checkBoxWasapiOutputSet.UseVisualStyleBackColor = true;
359 | this.checkBoxWasapiOutputSet.CheckedChanged += new System.EventHandler(this.checkBoxWasapOutputSet_CheckedChanged);
360 | //
361 | // wasapiExclusiveOutput
362 | //
363 | this.wasapiExclusiveOutput.AutoSize = true;
364 | this.wasapiExclusiveOutput.Location = new System.Drawing.Point(54, 3);
365 | this.wasapiExclusiveOutput.Name = "wasapiExclusiveOutput";
366 | this.wasapiExclusiveOutput.Size = new System.Drawing.Size(74, 19);
367 | this.wasapiExclusiveOutput.TabIndex = 8;
368 | this.wasapiExclusiveOutput.Text = "Exclusive";
369 | this.wasapiExclusiveOutput.UseVisualStyleBackColor = true;
370 | this.wasapiExclusiveOutput.CheckedChanged += new System.EventHandler(this.wasapiExclusiveOutput_CheckedChanged);
371 | //
372 | // wasapiAutoConvertOutput
373 | //
374 | this.wasapiAutoConvertOutput.AutoSize = true;
375 | this.wasapiAutoConvertOutput.Checked = true;
376 | this.wasapiAutoConvertOutput.CheckState = System.Windows.Forms.CheckState.Checked;
377 | this.wasapiAutoConvertOutput.Location = new System.Drawing.Point(134, 3);
378 | this.wasapiAutoConvertOutput.Name = "wasapiAutoConvertOutput";
379 | this.wasapiAutoConvertOutput.Size = new System.Drawing.Size(94, 19);
380 | this.wasapiAutoConvertOutput.TabIndex = 9;
381 | this.wasapiAutoConvertOutput.Text = "AutoConvert";
382 | this.wasapiAutoConvertOutput.UseVisualStyleBackColor = true;
383 | this.wasapiAutoConvertOutput.CheckedChanged += new System.EventHandler(this.wasapiAutoConvertOutput_CheckedChanged);
384 | //
385 | // configOutput
386 | //
387 | this.configOutput.Dock = System.Windows.Forms.DockStyle.Fill;
388 | this.configOutput.Location = new System.Drawing.Point(577, 58);
389 | this.configOutput.Multiline = true;
390 | this.configOutput.Name = "configOutput";
391 | this.configOutput.ScrollBars = System.Windows.Forms.ScrollBars.Both;
392 | this.configOutput.Size = new System.Drawing.Size(295, 333);
393 | this.configOutput.TabIndex = 9;
394 | //
395 | // label1
396 | //
397 | this.label1.Anchor = System.Windows.Forms.AnchorStyles.Left;
398 | this.label1.AutoSize = true;
399 | this.label1.Location = new System.Drawing.Point(93, 35);
400 | this.label1.Name = "label1";
401 | this.label1.Size = new System.Drawing.Size(73, 15);
402 | this.label1.TabIndex = 0;
403 | this.label1.Text = "Input Device";
404 | //
405 | // label2
406 | //
407 | this.label2.Anchor = System.Windows.Forms.AnchorStyles.Left;
408 | this.label2.AutoSize = true;
409 | this.label2.Location = new System.Drawing.Point(335, 35);
410 | this.label2.Name = "label2";
411 | this.label2.Size = new System.Drawing.Size(83, 15);
412 | this.label2.TabIndex = 0;
413 | this.label2.Text = "Output Device";
414 | //
415 | // flowLayoutPanel5
416 | //
417 | this.flowLayoutPanel5.Controls.Add(this.checkBoxSetInputLatency);
418 | this.flowLayoutPanel5.Controls.Add(this.numericLatencyInput);
419 | this.flowLayoutPanel5.Dock = System.Windows.Forms.DockStyle.Fill;
420 | this.flowLayoutPanel5.Location = new System.Drawing.Point(93, 397);
421 | this.flowLayoutPanel5.Name = "flowLayoutPanel5";
422 | this.flowLayoutPanel5.Size = new System.Drawing.Size(236, 24);
423 | this.flowLayoutPanel5.TabIndex = 11;
424 | //
425 | // checkBoxSetInputLatency
426 | //
427 | this.checkBoxSetInputLatency.AutoSize = true;
428 | this.checkBoxSetInputLatency.Location = new System.Drawing.Point(3, 3);
429 | this.checkBoxSetInputLatency.Name = "checkBoxSetInputLatency";
430 | this.checkBoxSetInputLatency.Size = new System.Drawing.Size(117, 19);
431 | this.checkBoxSetInputLatency.TabIndex = 20;
432 | this.checkBoxSetInputLatency.Text = "Set Input Latency";
433 | this.checkBoxSetInputLatency.UseVisualStyleBackColor = true;
434 | this.checkBoxSetInputLatency.CheckedChanged += new System.EventHandler(this.checkBoxSetInputLatency_CheckedChanged);
435 | //
436 | // numericLatencyInput
437 | //
438 | this.numericLatencyInput.DecimalPlaces = 1;
439 | this.numericLatencyInput.Dock = System.Windows.Forms.DockStyle.Fill;
440 | this.numericLatencyInput.Location = new System.Drawing.Point(126, 3);
441 | this.numericLatencyInput.Name = "numericLatencyInput";
442 | this.numericLatencyInput.Size = new System.Drawing.Size(90, 23);
443 | this.numericLatencyInput.TabIndex = 3;
444 | this.numericLatencyInput.ValueChanged += new System.EventHandler(this.numericLatencyInput_ValueChanged);
445 | //
446 | // label4
447 | //
448 | this.label4.Anchor = System.Windows.Forms.AnchorStyles.Left;
449 | this.label4.AutoSize = true;
450 | this.label4.Location = new System.Drawing.Point(3, 401);
451 | this.label4.Name = "label4";
452 | this.label4.Size = new System.Drawing.Size(48, 15);
453 | this.label4.TabIndex = 2;
454 | this.label4.Text = "Latency";
455 | //
456 | // label9
457 | //
458 | this.label9.Anchor = System.Windows.Forms.AnchorStyles.Right;
459 | this.label9.AutoSize = true;
460 | this.label9.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
461 | this.label9.Location = new System.Drawing.Point(783, 35);
462 | this.label9.Name = "label9";
463 | this.label9.Size = new System.Drawing.Size(89, 15);
464 | this.label9.TabIndex = 13;
465 | this.label9.Text = "Output Preview";
466 | //
467 | // label5
468 | //
469 | this.label5.Anchor = System.Windows.Forms.AnchorStyles.Left;
470 | this.label5.AutoSize = true;
471 | this.label5.Location = new System.Drawing.Point(3, 461);
472 | this.label5.Name = "label5";
473 | this.label5.Size = new System.Drawing.Size(56, 15);
474 | this.label5.TabIndex = 14;
475 | this.label5.Text = "Channels";
476 | //
477 | // numericChannelsInput
478 | //
479 | this.numericChannelsInput.Dock = System.Windows.Forms.DockStyle.Fill;
480 | this.numericChannelsInput.Location = new System.Drawing.Point(93, 457);
481 | this.numericChannelsInput.Name = "numericChannelsInput";
482 | this.numericChannelsInput.Size = new System.Drawing.Size(236, 23);
483 | this.numericChannelsInput.TabIndex = 15;
484 | this.numericChannelsInput.ValueChanged += new System.EventHandler(this.numericChannelsInput_ValueChanged);
485 | //
486 | // numericChannelsOutput
487 | //
488 | this.numericChannelsOutput.Dock = System.Windows.Forms.DockStyle.Fill;
489 | this.numericChannelsOutput.Location = new System.Drawing.Point(335, 457);
490 | this.numericChannelsOutput.Name = "numericChannelsOutput";
491 | this.numericChannelsOutput.Size = new System.Drawing.Size(236, 23);
492 | this.numericChannelsOutput.TabIndex = 16;
493 | this.numericChannelsOutput.ValueChanged += new System.EventHandler(this.numericChannelsOutput_ValueChanged);
494 | //
495 | // statusStrip1
496 | //
497 | this.tableLayoutPanel1.SetColumnSpan(this.statusStrip1, 4);
498 | this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
499 | this.toolStripStatusLabel1});
500 | this.statusStrip1.Location = new System.Drawing.Point(0, 514);
501 | this.statusStrip1.Name = "statusStrip1";
502 | this.statusStrip1.Size = new System.Drawing.Size(875, 20);
503 | this.statusStrip1.TabIndex = 17;
504 | this.statusStrip1.Text = "statusStrip1";
505 | //
506 | // toolStripStatusLabel1
507 | //
508 | this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
509 | this.toolStripStatusLabel1.Size = new System.Drawing.Size(118, 15);
510 | this.toolStripStatusLabel1.Text = "toolStripStatusLabel1";
511 | //
512 | // flowLayoutPanel1
513 | //
514 | this.flowLayoutPanel1.Controls.Add(this.label6);
515 | this.flowLayoutPanel1.Controls.Add(this.checkBoxSetBufferSize);
516 | this.flowLayoutPanel1.Controls.Add(this.numericBufferSize);
517 | this.flowLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
518 | this.flowLayoutPanel1.Location = new System.Drawing.Point(335, 3);
519 | this.flowLayoutPanel1.Name = "flowLayoutPanel1";
520 | this.flowLayoutPanel1.Size = new System.Drawing.Size(236, 24);
521 | this.flowLayoutPanel1.TabIndex = 18;
522 | //
523 | // label6
524 | //
525 | this.label6.Anchor = System.Windows.Forms.AnchorStyles.Left;
526 | this.label6.AutoSize = true;
527 | this.label6.Location = new System.Drawing.Point(3, 6);
528 | this.label6.Margin = new System.Windows.Forms.Padding(3, 3, 3, 0);
529 | this.label6.Name = "label6";
530 | this.label6.Size = new System.Drawing.Size(0, 15);
531 | this.label6.TabIndex = 6;
532 | //
533 | // checkBoxSetBufferSize
534 | //
535 | this.checkBoxSetBufferSize.AutoSize = true;
536 | this.checkBoxSetBufferSize.Location = new System.Drawing.Point(9, 3);
537 | this.checkBoxSetBufferSize.Name = "checkBoxSetBufferSize";
538 | this.checkBoxSetBufferSize.Size = new System.Drawing.Size(100, 19);
539 | this.checkBoxSetBufferSize.TabIndex = 7;
540 | this.checkBoxSetBufferSize.Text = "Set Buffer Size";
541 | this.checkBoxSetBufferSize.UseVisualStyleBackColor = true;
542 | this.checkBoxSetBufferSize.CheckedChanged += new System.EventHandler(this.checkBoxSetBufferSize_CheckedChanged);
543 | //
544 | // numericBufferSize
545 | //
546 | this.numericBufferSize.Dock = System.Windows.Forms.DockStyle.Fill;
547 | this.numericBufferSize.Location = new System.Drawing.Point(115, 0);
548 | this.numericBufferSize.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3);
549 | this.numericBufferSize.Name = "numericBufferSize";
550 | this.numericBufferSize.Size = new System.Drawing.Size(90, 23);
551 | this.numericBufferSize.TabIndex = 5;
552 | this.numericBufferSize.ValueChanged += new System.EventHandler(this.numericBufferSize_ValueChanged);
553 | //
554 | // linkLabelDocs
555 | //
556 | this.linkLabelDocs.Anchor = System.Windows.Forms.AnchorStyles.Right;
557 | this.linkLabelDocs.AutoSize = true;
558 | this.linkLabelDocs.Location = new System.Drawing.Point(655, 491);
559 | this.linkLabelDocs.Name = "linkLabelDocs";
560 | this.linkLabelDocs.Size = new System.Drawing.Size(217, 15);
561 | this.linkLabelDocs.TabIndex = 20;
562 | this.linkLabelDocs.TabStop = true;
563 | this.linkLabelDocs.Text = "FlexASIO Configuration Documentation";
564 | this.linkLabelDocs.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
565 | this.linkLabelDocs.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelDocs_LinkClicked);
566 | //
567 | // Form1
568 | //
569 | this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
570 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
571 | this.ClientSize = new System.Drawing.Size(875, 534);
572 | this.Controls.Add(this.tableLayoutPanel1);
573 | this.Name = "Form1";
574 | this.Text = "FlexASIO GUI";
575 | this.Load += new System.EventHandler(this.Form1_Load);
576 | this.tableLayoutPanel1.ResumeLayout(false);
577 | this.tableLayoutPanel1.PerformLayout();
578 | this.flowLayoutPanel6.ResumeLayout(false);
579 | this.flowLayoutPanel4.ResumeLayout(false);
580 | this.flowLayoutPanel4.PerformLayout();
581 | ((System.ComponentModel.ISupportInitialize)(this.numericLatencyOutput)).EndInit();
582 | this.flowLayoutPanel2.ResumeLayout(false);
583 | this.flowLayoutPanel2.PerformLayout();
584 | this.flowLayoutPanel3.ResumeLayout(false);
585 | this.flowLayoutPanel3.PerformLayout();
586 | this.flowLayoutPanel5.ResumeLayout(false);
587 | this.flowLayoutPanel5.PerformLayout();
588 | ((System.ComponentModel.ISupportInitialize)(this.numericLatencyInput)).EndInit();
589 | ((System.ComponentModel.ISupportInitialize)(this.numericChannelsInput)).EndInit();
590 | ((System.ComponentModel.ISupportInitialize)(this.numericChannelsOutput)).EndInit();
591 | this.statusStrip1.ResumeLayout(false);
592 | this.statusStrip1.PerformLayout();
593 | this.flowLayoutPanel1.ResumeLayout(false);
594 | this.flowLayoutPanel1.PerformLayout();
595 | ((System.ComponentModel.ISupportInitialize)(this.numericBufferSize)).EndInit();
596 | this.ResumeLayout(false);
597 | this.PerformLayout();
598 |
599 | }
600 |
601 | #endregion
602 | private System.Windows.Forms.TreeView treeDevicesInput;
603 | private System.Windows.Forms.TreeView treeDevicesOutput;
604 | private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
605 | private System.Windows.Forms.Label label1;
606 | private System.Windows.Forms.Label label2;
607 | private System.Windows.Forms.Label label3;
608 | private System.Windows.Forms.ComboBox comboBackend;
609 | private System.Windows.Forms.Label label4;
610 | private System.Windows.Forms.NumericUpDown numericLatencyInput;
611 | private System.Windows.Forms.NumericUpDown numericLatencyOutput;
612 | private System.Windows.Forms.NumericUpDown numericBufferSize;
613 | private System.Windows.Forms.Label label6;
614 | private System.Windows.Forms.Label label7;
615 | private System.Windows.Forms.CheckBox wasapiExclusiveInput;
616 | private System.Windows.Forms.CheckBox wasapiExclusiveOutput;
617 | private System.Windows.Forms.TextBox configOutput;
618 | private System.Windows.Forms.Button btClipboard;
619 | private System.Windows.Forms.Button btSaveToProfile;
620 | private System.Windows.Forms.Button btSaveAs;
621 | private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel2;
622 | private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel4;
623 | private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel5;
624 | private System.Windows.Forms.CheckBox wasapiAutoConvertInput;
625 | private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel3;
626 | private System.Windows.Forms.CheckBox wasapiAutoConvertOutput;
627 | private System.Windows.Forms.Label label9;
628 | private System.Windows.Forms.Label label5;
629 | private System.Windows.Forms.NumericUpDown numericChannelsInput;
630 | private System.Windows.Forms.NumericUpDown numericChannelsOutput;
631 | private System.Windows.Forms.StatusStrip statusStrip1;
632 | private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
633 | private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel1;
634 | private System.Windows.Forms.CheckBox checkBoxSetOutputLatency;
635 | private System.Windows.Forms.CheckBox checkBoxSetInputLatency;
636 | private System.Windows.Forms.CheckBox checkBoxSetBufferSize;
637 | private System.Windows.Forms.CheckBox checkBoxWasapiInputSet;
638 | private System.Windows.Forms.CheckBox checkBoxWasapiOutputSet;
639 | private System.Windows.Forms.Button btRefreshDevices;
640 | private System.Windows.Forms.LinkLabel linkLabelDocs;
641 | private System.Windows.Forms.FlowLayoutPanel flowLayoutPanel6;
642 | private System.Windows.Forms.Button btLoadFrom;
643 | }
644 | }
645 |
646 |
--------------------------------------------------------------------------------
/Form1.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Data;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Windows.Forms;
7 | using Commons.Media.PortAudio;
8 | using System.Diagnostics;
9 | using System.IO;
10 | using System.Globalization;
11 | using Tomlyn;
12 | using System.Runtime.InteropServices;
13 |
14 | namespace FlexASIOGUI
15 | {
16 | public partial class Form1 : Form
17 | {
18 |
19 | private bool InitDone = false;
20 | private string TOMLPath;
21 | private FlexGUIConfig flexGUIConfig;
22 | private Encoding legacyEncoding;
23 | private readonly string flexasioGuiVersion = "0.35";
24 | private readonly string flexasioVersion = "1.9";
25 | private readonly string tomlName = "FlexASIO.toml";
26 | private readonly string docUrl = "https://github.com/dechamps/FlexASIO/blob/master/CONFIGURATION.md";
27 | TomlModelOptions tomlModelOptions = new();
28 |
29 | [DllImport(@"C:\Program Files\FlexASIO\x64\FlexASIO.dll")]
30 | public static extern int Initialize(string PathName, bool TestMode);
31 | [DllImport(@"kernel32.dll")]
32 | public static extern uint GetACP();
33 |
34 | public Form1()
35 | {
36 | InitializeComponent();
37 |
38 | this.Text = $"FlexASIO GUI v{flexasioGuiVersion}";
39 |
40 | System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
41 | customCulture.NumberFormat.NumberDecimalSeparator = ".";
42 | Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
43 |
44 | // get the value of the "Language for non-Unicode programs" setting (1252 for English)
45 | // note: in Win11 this could be UTF-8 already, since it's natively supported
46 | legacyEncoding = Encoding.GetEncoding((int)GetACP());
47 |
48 | System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;
49 | CultureInfo.DefaultThreadCurrentCulture = customCulture;
50 | CultureInfo.DefaultThreadCurrentUICulture = customCulture;
51 |
52 | TOMLPath = $"{Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)}\\{tomlName}";
53 |
54 | tomlModelOptions.ConvertPropertyName = (string name) => name;
55 | this.LoadFlexASIOConfig(TOMLPath);
56 |
57 | InitDone = true;
58 | SetStatusMessage($"FlexASIO GUI for FlexASIO {flexasioVersion} started ({Configuration.VersionString})");
59 | GenerateOutput();
60 | }
61 |
62 | private FlexGUIConfig LoadFlexASIOConfig(string tomlPath)
63 | {
64 | flexGUIConfig = new FlexGUIConfig();
65 | if (File.Exists(tomlPath))
66 | {
67 | var tomlPathAsText = File.ReadAllText(tomlPath);
68 | flexGUIConfig = Toml.ToModel(tomlPathAsText, options: tomlModelOptions);
69 | }
70 |
71 | numericBufferSize.Maximum = 8192;
72 | numericBufferSize.Increment = 16;
73 |
74 | numericLatencyInput.Increment = 0.1m;
75 | numericLatencyOutput.Increment = 0.1m;
76 |
77 | for (var i = 0; i < Configuration.HostApiCount; i++)
78 | {
79 | comboBackend.Items.Add(Configuration.GetHostApiInfo(i).name);
80 | }
81 |
82 | if (comboBackend.Items.Contains(flexGUIConfig.backend))
83 | {
84 | comboBackend.SelectedIndex = comboBackend.Items.IndexOf(flexGUIConfig.backend);
85 | }
86 | else
87 | {
88 | comboBackend.SelectedIndex = 0;
89 | }
90 |
91 | if (flexGUIConfig.bufferSizeSamples != null)
92 | numericBufferSize.Value = (Int64)flexGUIConfig.bufferSizeSamples;
93 | checkBoxSetBufferSize.Checked = numericBufferSize.Enabled = flexGUIConfig.bufferSizeSamples != null;
94 |
95 | treeDevicesInput.SelectedNode = treeDevicesInput.Nodes.Cast().FirstOrDefault(x => x.Text == (flexGUIConfig.input.device == "" ? "(None)" : flexGUIConfig.input.device));
96 | treeDevicesOutput.SelectedNode = treeDevicesOutput.Nodes.Cast().FirstOrDefault(x => x.Text == (flexGUIConfig.output.device == "" ? "(None)" : flexGUIConfig.output.device));
97 |
98 | checkBoxSetInputLatency.Checked = numericLatencyInput.Enabled = flexGUIConfig.input.suggestedLatencySeconds != null;
99 | checkBoxSetOutputLatency.Checked = numericLatencyOutput.Enabled = flexGUIConfig.output.suggestedLatencySeconds != null;
100 |
101 | if (flexGUIConfig.input.suggestedLatencySeconds != null)
102 | numericLatencyInput.Value = (decimal)(double)flexGUIConfig.input.suggestedLatencySeconds;
103 | if (flexGUIConfig.output.suggestedLatencySeconds != null)
104 | numericLatencyOutput.Value = (decimal)(double)flexGUIConfig.output.suggestedLatencySeconds;
105 |
106 | numericChannelsInput.Value = (decimal)(flexGUIConfig.input.channels ?? 0);
107 | numericChannelsOutput.Value = (decimal)(flexGUIConfig.output.channels ?? 0);
108 |
109 | checkBoxWasapiInputSet.Checked = flexGUIConfig.input.wasapiExclusiveMode != null || flexGUIConfig.input.wasapiAutoConvert != null;
110 | checkBoxWasapiOutputSet.Checked = flexGUIConfig.output.wasapiExclusiveMode != null || flexGUIConfig.output.wasapiAutoConvert != null;
111 |
112 | wasapiExclusiveInput.Enabled = flexGUIConfig.input.wasapiExclusiveMode != null;
113 | wasapiExclusiveInput.Checked = flexGUIConfig.input.wasapiExclusiveMode ?? false;
114 | wasapiExclusiveOutput.Enabled = flexGUIConfig.output.wasapiExclusiveMode != null;
115 | wasapiExclusiveOutput.Checked = flexGUIConfig.output.wasapiExclusiveMode ?? false;
116 |
117 | wasapiAutoConvertInput.Enabled = flexGUIConfig.input.wasapiAutoConvert != null;
118 | wasapiAutoConvertInput.Checked = flexGUIConfig.input.wasapiAutoConvert ?? false;
119 | wasapiAutoConvertOutput.Enabled = flexGUIConfig.output.wasapiAutoConvert != null;
120 | wasapiAutoConvertOutput.Checked = flexGUIConfig.output.wasapiAutoConvert ?? false;
121 | return flexGUIConfig;
122 | }
123 |
124 | private string DescrambleUTF8(string s)
125 | {
126 | // portaudio incorrectly returns UTF-8 strings as if they were ANSI (CP1252 for most Latin systems, CP1251 for Cyrillic, etc...)
127 | // this line fixes the issue by reading the input as CP* and parsing it as UTF-8
128 | var bytes = legacyEncoding.GetBytes(s);
129 | return Encoding.UTF8.GetString(bytes);
130 | }
131 |
132 | private TreeNode[] GetDevicesForBackend(string Backend, bool Input)
133 | {
134 | List treeNodes = new List();
135 | treeNodes.Add(new TreeNode("(None)"));
136 | for (var i = 0; i < Configuration.DeviceCount; i++)
137 | {
138 | var deviceInfo = Configuration.GetDeviceInfo(i);
139 |
140 | var apiInfo = Configuration.GetHostApiInfo(deviceInfo.hostApi);
141 |
142 | if (apiInfo.name != Backend)
143 | continue;
144 |
145 | if (Input == true)
146 | {
147 | if (deviceInfo.maxInputChannels > 0)
148 | {
149 | treeNodes.Add(new TreeNode(DescrambleUTF8(deviceInfo.name)));
150 | }
151 | }
152 | else
153 | {
154 | if (deviceInfo.maxOutputChannels > 0)
155 | {
156 | treeNodes.Add(new TreeNode(DescrambleUTF8(deviceInfo.name)));
157 | }
158 | }
159 | }
160 | return treeNodes.ToArray();
161 | }
162 |
163 | private void Form1_Load(object sender, EventArgs e)
164 | {
165 |
166 | }
167 |
168 | private void comboBackend_SelectedIndexChanged(object sender, EventArgs e)
169 | {
170 | var o = sender as ComboBox;
171 | if (o != null)
172 | {
173 | var selectedBackend = o.SelectedItem as string;
174 | RefreshDevices(selectedBackend);
175 | if (selectedBackend == "(None)") selectedBackend = "";
176 | flexGUIConfig.backend = selectedBackend;
177 | GenerateOutput();
178 | }
179 | }
180 |
181 | private void RefreshDevices(string selectedBackend)
182 | {
183 | var tmpInput = treeDevicesInput.SelectedNode;
184 | var tmpOutput = treeDevicesOutput.SelectedNode;
185 | if (selectedBackend != null)
186 | {
187 | treeDevicesInput.Nodes.Clear();
188 | treeDevicesInput.Nodes.AddRange(GetDevicesForBackend(selectedBackend, true));
189 | for (int i = 0; i < treeDevicesInput.Nodes.Count; i++)
190 | {
191 | if (treeDevicesInput?.Nodes[i].Text == tmpInput?.Text)
192 | {
193 | treeDevicesInput.SelectedNode = treeDevicesInput.Nodes[i];
194 | break;
195 | }
196 | }
197 |
198 | treeDevicesOutput.Nodes.Clear();
199 | treeDevicesOutput.Nodes.AddRange(GetDevicesForBackend(selectedBackend, false));
200 | for (int i = 0; i < treeDevicesOutput.Nodes.Count; i++)
201 | {
202 | if (treeDevicesOutput?.Nodes[i].Text == tmpOutput?.Text)
203 | {
204 | treeDevicesOutput.SelectedNode = treeDevicesOutput.Nodes[i];
205 | break;
206 | }
207 | }
208 | }
209 | }
210 |
211 | private void GenerateOutput()
212 | {
213 | if (!InitDone) return;
214 |
215 | if (!checkBoxSetBufferSize.Checked) flexGUIConfig.bufferSizeSamples = null;
216 | if (!checkBoxSetInputLatency.Checked) flexGUIConfig.input.suggestedLatencySeconds = null;
217 | if (!checkBoxSetOutputLatency.Checked) flexGUIConfig.output.suggestedLatencySeconds = null;
218 | if (!checkBoxWasapiInputSet.Checked)
219 | {
220 | flexGUIConfig.input.wasapiAutoConvert = null;
221 | flexGUIConfig.input.wasapiExclusiveMode = null;
222 | }
223 | if (!checkBoxWasapiOutputSet.Checked)
224 | {
225 | flexGUIConfig.output.wasapiAutoConvert = null;
226 | flexGUIConfig.output.wasapiExclusiveMode = null;
227 | }
228 |
229 | configOutput.Clear();
230 | configOutput.Text = Toml.FromModel(flexGUIConfig, options: tomlModelOptions);
231 | }
232 |
233 |
234 |
235 | private void SetStatusMessage(string msg)
236 | {
237 | toolStripStatusLabel1.Text = $"{DateTime.Now.ToShortDateString()} - {DateTime.Now.ToShortTimeString()}: {msg}";
238 | }
239 |
240 | private void btClipboard_Click(object sender, EventArgs e)
241 | {
242 | Clipboard.SetText(configOutput.Text);
243 | SetStatusMessage("Configuration copied to Clipboard");
244 | }
245 |
246 | private void btSaveToProfile_Click(object sender, EventArgs e)
247 | {
248 | File.WriteAllText(TOMLPath, configOutput.Text);
249 | SetStatusMessage($"Configuration written to {TOMLPath}");
250 | }
251 |
252 | private void btSaveAs_Click(object sender, EventArgs e)
253 | {
254 | SaveFileDialog saveFileDialog = new SaveFileDialog();
255 | saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
256 | saveFileDialog.FileName = tomlName;
257 | var ret = saveFileDialog.ShowDialog();
258 | if (ret == DialogResult.OK)
259 | {
260 | File.WriteAllText(saveFileDialog.FileName, configOutput.Text);
261 | }
262 | SetStatusMessage($"Configuration written to {saveFileDialog.FileName}");
263 | }
264 |
265 | private void treeDevicesInput_AfterSelect(object sender, TreeViewEventArgs e)
266 | {
267 | if (sender == null) return;
268 | else
269 | {
270 | e.Node.Checked = true;
271 | this.onTreeViewSelected(eventArgs: e, forInput: true);
272 | }
273 | }
274 |
275 | private void treeDevicesOutput_AfterSelect(object sender, TreeViewEventArgs e)
276 | {
277 | if (sender == null) return;
278 | else
279 | {
280 | e.Node.Checked = true;
281 | this.onTreeViewSelected(eventArgs: e, forInput: false);
282 | }
283 | }
284 |
285 | private void treeDevicesOutput_AfterCheck(object sender, TreeViewEventArgs e)
286 | {
287 | if (sender == null) return;
288 | else
289 | {
290 | this.onTreeViewSelected(eventArgs: e, forInput: false);
291 | }
292 | }
293 |
294 | private void treeDevicesInput_AfterCheck(object sender, TreeViewEventArgs e)
295 | {
296 | if (sender == null) return;
297 | else
298 | {
299 | this.onTreeViewSelected(eventArgs: e, forInput: true);
300 | }
301 | }
302 |
303 | private void unCheckAllOthers(TreeNode treeNode)
304 | {
305 | foreach (TreeNode node in treeNode.TreeView.Nodes)
306 | {
307 | if (node != treeNode)
308 | {
309 | node.Checked = false;
310 | }
311 | }
312 | }
313 |
314 | private void onTreeViewSelected(TreeViewEventArgs eventArgs, bool forInput)
315 | {
316 | if (eventArgs.Node.Checked == true)
317 | {
318 | if (forInput == true)
319 | flexGUIConfig.input.device = eventArgs.Node.Text == "(None)" ? "" : eventArgs.Node.Text;
320 | else
321 | flexGUIConfig.output.device = eventArgs.Node.Text == "(None)" ? "" : eventArgs.Node.Text;
322 | this.unCheckAllOthers(eventArgs.Node);
323 | GenerateOutput();
324 | }
325 | }
326 |
327 | private void numericChannelsOutput_ValueChanged(object sender, EventArgs e)
328 | {
329 | var o = sender as NumericUpDown;
330 | if (o == null) return;
331 | flexGUIConfig.output.channels = (o.Value > 0 ? (int?)o.Value : null);
332 | GenerateOutput();
333 | }
334 |
335 | private void numericChannelsInput_ValueChanged(object sender, EventArgs e)
336 | {
337 | var o = sender as NumericUpDown;
338 | if (o == null) return;
339 | flexGUIConfig.input.channels = (o.Value > 0 ? (int?)o.Value : null);
340 | GenerateOutput();
341 | }
342 |
343 | private void numericLatencyOutput_ValueChanged(object sender, EventArgs e)
344 | {
345 | var o = sender as NumericUpDown;
346 | if (o == null) return;
347 | if (checkBoxSetOutputLatency.Enabled)
348 | {
349 | flexGUIConfig.output.suggestedLatencySeconds = (o.Value > 0 ? (double)o.Value : 0);
350 | GenerateOutput();
351 | }
352 | }
353 |
354 | private void numericLatencyInput_ValueChanged(object sender, EventArgs e)
355 | {
356 | var o = sender as NumericUpDown;
357 | if (o == null) return;
358 | if (checkBoxSetInputLatency.Enabled)
359 | {
360 | flexGUIConfig.input.suggestedLatencySeconds = (o.Value > 0 ? (double)o.Value : 0);
361 | GenerateOutput();
362 | }
363 | }
364 |
365 | private void wasapiAutoConvertOutput_CheckedChanged(object sender, EventArgs e)
366 | {
367 | var o = sender as CheckBox;
368 | if (o == null) return;
369 | flexGUIConfig.output.wasapiAutoConvert = o.Checked;
370 | GenerateOutput();
371 | }
372 |
373 | private void wasapiExclusiveOutput_CheckedChanged(object sender, EventArgs e)
374 | {
375 | var o = sender as CheckBox;
376 | if (o == null) return;
377 | flexGUIConfig.output.wasapiExclusiveMode = o.Checked;
378 | GenerateOutput();
379 | }
380 |
381 | private void wasapiAutoConvertInput_CheckedChanged(object sender, EventArgs e)
382 | {
383 | var o = sender as CheckBox;
384 | if (o == null) return;
385 | flexGUIConfig.input.wasapiAutoConvert = o.Checked;
386 | GenerateOutput();
387 | }
388 |
389 | private void wasapiExclusiveInput_CheckedChanged(object sender, EventArgs e)
390 | {
391 | var o = sender as CheckBox;
392 | if (o == null) return;
393 | flexGUIConfig.input.wasapiExclusiveMode = o.Checked;
394 | GenerateOutput();
395 | }
396 |
397 | private void numericBufferSize_ValueChanged(object sender, EventArgs e)
398 | {
399 | var o = sender as NumericUpDown;
400 | if (o == null) return;
401 | flexGUIConfig.bufferSizeSamples = (o.Value > 0 ? (int)o.Value : 0);
402 | GenerateOutput();
403 | }
404 |
405 |
406 | private void checkBoxSetInputLatency_CheckedChanged(object sender, EventArgs e)
407 | {
408 | var o = sender as CheckBox;
409 | if (o == null) return;
410 | numericLatencyInput.Enabled = o.Checked;
411 | if (o.Checked == false)
412 | {
413 | flexGUIConfig.input.suggestedLatencySeconds = null;
414 | }
415 | else
416 | {
417 | numericLatencyInput_ValueChanged(numericLatencyInput, null);
418 | }
419 | GenerateOutput();
420 | }
421 |
422 | private void checkBoxSetOutputLatency_CheckedChanged(object sender, EventArgs e)
423 | {
424 | var o = sender as CheckBox;
425 | if (o == null) return;
426 | numericLatencyOutput.Enabled = o.Checked;
427 | if (o.Checked == false) {
428 | flexGUIConfig.output.suggestedLatencySeconds = null;
429 | }
430 | else
431 | {
432 | numericLatencyOutput_ValueChanged(numericLatencyOutput, null);
433 | }
434 | GenerateOutput();
435 | }
436 |
437 |
438 | private void checkBoxSetBufferSize_CheckedChanged(object sender, EventArgs e)
439 | {
440 | var o = sender as CheckBox;
441 | if (o == null) return;
442 | numericBufferSize.Enabled = o.Checked;
443 | if (o.Checked == false) {
444 | flexGUIConfig.bufferSizeSamples = null;
445 | }
446 | else
447 | {
448 | numericBufferSize_ValueChanged(numericBufferSize, null);
449 | }
450 | GenerateOutput();
451 | }
452 |
453 | private void checkBoxWasapiInputSet_CheckedChanged(object sender, EventArgs e)
454 | {
455 | var o = sender as CheckBox;
456 | if (o == null) return;
457 | wasapiAutoConvertInput.Enabled = o.Checked;
458 | wasapiExclusiveInput.Enabled = o.Checked;
459 |
460 | if (o.Checked == false)
461 | {
462 | flexGUIConfig.input.wasapiAutoConvert = null;
463 | flexGUIConfig.input.wasapiExclusiveMode = null;
464 | }
465 | else
466 | {
467 | flexGUIConfig.input.wasapiAutoConvert = wasapiAutoConvertInput.Checked;
468 | flexGUIConfig.input.wasapiExclusiveMode = wasapiExclusiveInput.Checked;
469 | }
470 | GenerateOutput();
471 | }
472 |
473 | private void checkBoxWasapOutputSet_CheckedChanged(object sender, EventArgs e)
474 | {
475 | var o = sender as CheckBox;
476 | if (o == null) return;
477 | wasapiAutoConvertOutput.Enabled = o.Checked;
478 | wasapiExclusiveOutput.Enabled = o.Checked;
479 |
480 | if (o.Checked == false)
481 | {
482 | flexGUIConfig.output.wasapiAutoConvert = null;
483 | flexGUIConfig.output.wasapiExclusiveMode = null;
484 | }
485 | else
486 | {
487 | flexGUIConfig.output.wasapiAutoConvert = wasapiAutoConvertOutput.Checked;
488 | flexGUIConfig.output.wasapiExclusiveMode = wasapiExclusiveOutput.Checked;
489 | }
490 | GenerateOutput();
491 | }
492 |
493 | private void btRefreshDevices_Click(object sender, EventArgs e)
494 | {
495 | var selectedBackend = comboBackend.SelectedItem as string;
496 | RefreshDevices(selectedBackend);
497 | }
498 |
499 | private void linkLabelDocs_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
500 | {
501 | System.Diagnostics.Process.Start(new ProcessStartInfo(docUrl) { UseShellExecute = true });
502 | }
503 |
504 | private void btLoadFrom_Click(object sender, EventArgs e)
505 | {
506 | OpenFileDialog openFileDialog = new OpenFileDialog();
507 |
508 | openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
509 | openFileDialog.FileName = tomlName;
510 | openFileDialog.Filter = "FlexASIO Config (*.toml)|*.toml";
511 | openFileDialog.CheckFileExists = true;
512 | var ret = openFileDialog.ShowDialog();
513 | if (ret == DialogResult.OK)
514 | {
515 | try
516 | {
517 | this.LoadFlexASIOConfig(openFileDialog.FileName);
518 | }
519 | catch (Exception)
520 | {
521 | SetStatusMessage($"Error loading from {openFileDialog.FileName}");
522 | this.LoadFlexASIOConfig(TOMLPath);
523 | return;
524 | }
525 |
526 | }
527 | SetStatusMessage($"Configuration loaded from {openFileDialog.FileName}");
528 | }
529 | }
530 | }
531 |
--------------------------------------------------------------------------------
/Form1.resx:
--------------------------------------------------------------------------------
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 | text/microsoft-resx
50 |
51 |
52 | 2.0
53 |
54 |
55 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
56 |
57 |
58 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
59 |
60 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Michael Auerswald
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 | using System.Windows.Forms;
6 |
7 | namespace FlexASIOGUI
8 | {
9 | static class Program
10 | {
11 | ///
12 | /// The main entry point for the application.
13 | ///
14 | [STAThread]
15 | static void Main()
16 | {
17 | Application.SetHighDpiMode(HighDpiMode.SystemAware);
18 | Application.EnableVisualStyles();
19 | Application.SetCompatibleTextRenderingDefault(false);
20 | Application.Run(new Form1());
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | This is a small GUI to make the configuration of https://github.com/dechamps/FlexASIO a bit quicker.
2 |
3 | It should pick up your existing $Usersprofile/FlexASIO.toml file and read the basic parameters. Not all of them have been implemented yet...
4 |
5 | To run, please make sure you have [.NET Desktop Runtime 6.x](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) installed.
6 |
7 | v0.3 adds a registry key with the install path to HKEY_LOCAL_MACHINE\SOFTWARE\Fabrikat\FlexASIOGUI\Install\Installpath
8 |
9 | It also makes most settings optional so that default settings are not overwritten.
10 |
11 | 
12 |
13 |
--------------------------------------------------------------------------------
/installer/FlexASIOGUI.iss:
--------------------------------------------------------------------------------
1 | #define MyAppName "FlexASIO GUI"
2 | #define MyAppVersion "0.35"
3 | #define MyAppPublisher "https://github.com/flipswitchingmonkey/FlexASIO_GUI"
4 | #define MyAppURL ""
5 | #define MyAppExeName "FlexASIOGUI.exe"
6 |
7 | [Setup]
8 | ; NOTE: The value of AppId uniquely identifies this application.
9 | ; Do not use the same AppId value in installers for other applications.
10 | ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
11 | AppId={{85A2342E-43B3-4527-A533-6F250F1E5765}
12 | AppName={#MyAppName}
13 | AppVersion={#MyAppVersion}
14 | AppVerName={#MyAppName} {#MyAppVersion}
15 | AppPublisher={#MyAppPublisher}
16 | AppPublisherURL={#MyAppURL}
17 | AppSupportURL={#MyAppURL}
18 | AppUpdatesURL={#MyAppURL}
19 | DefaultDirName={commonpf64}\FlexASIOGUI
20 | DisableProgramGroupPage=yes
21 | ;OutputDir=
22 | OutputBaseFilename={#MyAppName}Installer_{#MyAppVersion}
23 | SetupIconFile=flexasiogui.ico
24 | UninstallDisplayIcon={app}\{#MyAppExeName}
25 | Compression=lzma
26 | SolidCompression=yes
27 |
28 | [Languages]
29 | Name: "english"; MessagesFile: "compiler:Default.isl"
30 |
31 | [Tasks]
32 | ;Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
33 |
34 | [Files]
35 | Source: "..\bin\x64\Release\net6.0-windows\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs
36 | ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
37 |
38 | [Icons]
39 | Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
40 | ;Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
41 |
42 | [Registry]
43 | Root: HKLM64; Subkey: "Software\Fabrikat"; Flags: uninsdeletekeyifempty
44 | Root: HKLM64; Subkey: "Software\Fabrikat\FlexASIOGUI"; Flags: uninsdeletekey
45 | Root: HKLM64; Subkey: "Software\Fabrikat\FlexASIOGUI\Install"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"
--------------------------------------------------------------------------------
/installer/flexasiogui.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flipswitchingmonkey/FlexASIO_GUI/1964ef8dcca9f3aacb032c62664c87f83edc196c/installer/flexasiogui.ico
--------------------------------------------------------------------------------
/lib/Debug/portaudio-sharp.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flipswitchingmonkey/FlexASIO_GUI/1964ef8dcca9f3aacb032c62664c87f83edc196c/lib/Debug/portaudio-sharp.dll
--------------------------------------------------------------------------------
/lib/Debug/portaudio-sharp.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flipswitchingmonkey/FlexASIO_GUI/1964ef8dcca9f3aacb032c62664c87f83edc196c/lib/Debug/portaudio-sharp.pdb
--------------------------------------------------------------------------------
/lib/Release/portaudio-sharp.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flipswitchingmonkey/FlexASIO_GUI/1964ef8dcca9f3aacb032c62664c87f83edc196c/lib/Release/portaudio-sharp.dll
--------------------------------------------------------------------------------
/lib/Release/portaudio-sharp.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flipswitchingmonkey/FlexASIO_GUI/1964ef8dcca9f3aacb032c62664c87f83edc196c/lib/Release/portaudio-sharp.pdb
--------------------------------------------------------------------------------
/lib/portaudio_x64.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flipswitchingmonkey/FlexASIO_GUI/1964ef8dcca9f3aacb032c62664c87f83edc196c/lib/portaudio_x64.dll
--------------------------------------------------------------------------------
/lib/portaudio_x64.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flipswitchingmonkey/FlexASIO_GUI/1964ef8dcca9f3aacb032c62664c87f83edc196c/lib/portaudio_x64.pdb
--------------------------------------------------------------------------------