├── .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 | ![image](https://user-images.githubusercontent.com/6930367/118895016-a4746a80-b905-11eb-806c-7fd3fee4fcd1.png) 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 --------------------------------------------------------------------------------