Skip to content

Commit

Permalink
deep in api refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
mikeoliphant committed Feb 13, 2025
1 parent 0c1c9cf commit 3a6cd30
Show file tree
Hide file tree
Showing 12 changed files with 1,585 additions and 1 deletion.
185 changes: 185 additions & 0 deletions StompboxAPI/APIClient.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace StompboxAPI
{
public class APIClient : StompboxClient
{
StompboxProcessor processor;
bool needPresetLoad = false;

public override bool NeedUIReload
{
get
{
if (needPresetLoad && !processor.IsPresetLoading())
{
UpdateProgram();

needPresetLoad = false;

return true;
}

return base.NeedUIReload;
}

set => base.NeedUIReload = value;
}

public override int CurrentPresetIndex
{
get => base.CurrentPresetIndex;

set
{
base.CurrentPresetIndex = value;

needPresetLoad = true;
}
}

public APIClient()
: base()
{
if (!Directory.Exists(PluginPath))
{
Directory.CreateDirectory(PluginPath);
}

processor = new StompboxProcessor(PluginPath, dawMode: true);

InClientMode = false;

//processorWrapper.SetMidiCallback(HandleMidi);

UpdateProgram();
}

public void StartServer()
{
processor.StartServer();
}

public override void UpdatePresets()
{
needPresetLoad = false;

base.UpdatePresets();

//SetPresetNames(new List<String>(processorWrapper.GetPresets().Trim().Split(' ')));

//SuppressCommandUpdates = true;
//SetSelectedPreset(processorWrapper.GetCurrentPreset());
//SuppressCommandUpdates = false;
}

public override void UpdateProgram()
{
base.UpdateProgram();

UpdateUI();
}

public override IEnumerable<string> GetAllPluginNames()
{
return processor.GetAllPlugins();
}

public override IAudioPlugin GetPluginDefinition(string pluginName)
{
return PluginFactory.GetPluginDefinition(pluginName);
}

public override IAudioPlugin CreatePlugin(string pluginName, string pluginID)
{
return processor.CreatePlugin(pluginID);
}

public override void UpdateUI()
{
LoadChainEffects(InputPlugins, processor.GetInputChainPlugins());
LoadChainEffects(FxLoopPlugins, processor.GetFxLoopPlugins());
LoadChainEffects(OutputPlugins, processor.GetOutputChainPlugins());

base.UpdateUI();
}

void LoadChainEffects(List<IAudioPlugin> chain, IEnumerable<String> plugins)
{
chain.Clear();

foreach (string pluginName in plugins)
{
chain.Add(PluginFactory.CreatePlugin(pluginName));
}
}

protected override IAudioPlugin CreateSlotPlugin(string slotName, string defaultPlugin)
{
string pluginID = processor.GetPluginSlot(slotName);

return PluginFactory.CreatePlugin(pluginID);
}

public override void Init(double sampleRate)
{
processor.Init(sampleRate);
}

// public String GetProgramState()
// {
//#if !STOMPBOXREMOTE
// String settingsString = processorWrapper.DumpSettings();
// String programString = processorWrapper.DumpProgram();

// return settingsString + programString;
//#else
// return null;
//#endif
// }

public unsafe void Process(double* input, double* output, uint bufferSize)
{
processor.Process(input, output, bufferSize);
}

long samplePos = 0;

public unsafe void SimulateAudio()
{
int bufferSize = 1024;
int sampleRate = 44100;

int sleepMS = sampleRate / 1000;

Init(sampleRate);

double* inBuf = (double*)Marshal.AllocHGlobal(bufferSize * sizeof(double));
double* outBuf = (double*)Marshal.AllocHGlobal(bufferSize * sizeof(double));

while (true)
{
if (StopSimulateAudio)
break;

for (int i = 0; i < bufferSize; i++)
{
inBuf[i] = 0;

inBuf[i] += Math.Sin(((double)samplePos / (double)sampleRate) * 440 * Math.PI * 2) * 0.25f;

samplePos++;
}

processor.Process(inBuf, outBuf, (uint)bufferSize);

Thread.Sleep(sleepMS);
}
}
}
}
11 changes: 10 additions & 1 deletion StompboxAPI/NativeAPI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,27 @@ class NativeApi
public static extern void DeleteProcessor(IntPtr processor);

[DllImport(STOMPBOX_LIB_NAME)]
public static extern void Init(IntPtr processor, double sampleRate);
public static extern void InitProcessor(IntPtr processor, double sampleRate);

[DllImport(STOMPBOX_LIB_NAME)]
public static extern void StartServer(IntPtr processor);

[DllImport(STOMPBOX_LIB_NAME)]
public static unsafe extern void Process(IntPtr processor, double* input, double* output, uint bufferSize);

[DllImport(STOMPBOX_LIB_NAME)]
[return: MarshalAs(UnmanagedType.LPWStr)]
public static extern string GetDataPath(IntPtr processor);

[DllImport(STOMPBOX_LIB_NAME)]
public static extern IntPtr GetAllPlugins(IntPtr processor);

[DllImport(STOMPBOX_LIB_NAME)]
public static extern IntPtr GetPluginSlot(IntPtr processor, [MarshalAs(UnmanagedType.LPWStr)] string slotName);

[DllImport(STOMPBOX_LIB_NAME)]
public static extern IntPtr GetChainPlugins(IntPtr processor, [MarshalAs(UnmanagedType.LPStr)] string chainName);

[DllImport(STOMPBOX_LIB_NAME)]
public static extern IntPtr CreatePlugin(IntPtr processor, [MarshalAs(UnmanagedType.LPStr)] string id);

Expand Down
1 change: 1 addition & 0 deletions StompboxAPI/StompboxAPI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
</PropertyGroup>

<ItemGroup>
Expand Down
32 changes: 32 additions & 0 deletions StompboxAPI/StompboxProcessor.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

Expand All @@ -17,6 +19,11 @@ public StompboxProcessor(string dataPath, bool dawMode)
nativeProcessor = NativeApi.CreateProcessor(dataPath, dawMode);
}

public void Init(double sampleRate)
{
NativeApi.InitProcessor(nativeProcessor, sampleRate);
}

public UnmanagedAudioPlugin CreatePlugin(string id)
{
IntPtr nativePlugin = NativeApi.CreatePlugin(nativeProcessor, id);
Expand All @@ -35,5 +42,30 @@ public List<string> GetAllPlugins()
{
return NativeApi.GetListFromStringVector(NativeApi.GetAllPlugins(nativeProcessor));
}

public string GetPluginSlot(string slotName)
{
return Marshal.PtrToStringAnsi(NativeApi.GetPluginSlot(nativeProcessor, slotName));
}

public List<string> GetInputChainPlugins()
{
return NativeApi.GetListFromStringVector(NativeApi.GetChainPlugins(nativeProcessor, "InputChain"));
}

public List<string> GetFxLoopPlugins()
{
return NativeApi.GetListFromStringVector(NativeApi.GetChainPlugins(nativeProcessor, "FxLoop"));
}

public List<string> GetOutputChainPlugins()
{
return NativeApi.GetListFromStringVector(NativeApi.GetChainPlugins(nativeProcessor, "OutputChain"));
}

public unsafe void Process(double* input, double* output, uint bufferSize)
{
NativeApi.Process(nativeProcessor, input, output, bufferSize);
}
}
}
1 change: 1 addition & 0 deletions StompboxAPIBase/StompboxAPIBase.projitems
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,6 @@
</PropertyGroup>
<ItemGroup>
<Compile Include="$(MSBuildThisFileDirectory)AudioPlugin.cs" />
<Compile Include="$(MSBuildThisFileDirectory)StompboxClient.cs" />
</ItemGroup>
</Project>
Loading

0 comments on commit 3a6cd30

Please sign in to comment.