private unsafe Result Read(DspState *state, float *inBuffer, float *outBuffer, uint length, int inChannels, ref int outChannels) { Debug.Assert(inChannels == outChannels); int lengthInFloats = (int)length * inChannels; AdjustVolumeAllSamples(inBuffer, outBuffer, lengthInFloats, this.volumeLinear); if (inChannels <= 8 && this.DspLock.TryEnterWriteLock(0)) { try { var outSpan = new Span <float>(outBuffer, lengthInFloats); outSpan.CopyTo(this.buffer); this.channels = inChannels; this.lengthSamples = (int)length; } catch { return(Result.Err_Internal); } finally { this.DspLock.ExitWriteLock(); } } return(Result.Ok); }
private static MyCustomDSP?GetManagedState(DspState *state) { if (state->plugindata != default) { return(GCHandle.FromIntPtr(state->plugindata).Target as MyCustomDSP); } return(null); }
private static Result _myRead(DspState *state, float *inBuffer, float *outBuffer, uint length, int inChannels, int *outChannels) { var managedState = GetManagedState(state); if (managedState is null) { return(Result.Err_Internal); } return(managedState.Read(state, inBuffer, outBuffer, length, inChannels, ref *outChannels)); }
private static Result _myRelease(DspState *state) { var gchandle = GCHandle.FromIntPtr(state->plugindata); if (gchandle.IsAllocated && gchandle.Target is MyCustomDSP managedState) { managedState.Dispose(); gchandle.Free(); } return(Result.Ok); }
private static Result _myGetParameterFloat(DspState *state, int index, float *value, byte *valueStr) { if (index != 1) { return(Result.Err_Invalid_Param); } var managedState = GetManagedState(state); *value = managedState.volumeLinear; return(Result.Ok); }
private static Result _myGetParameterInt(DspState *state, int index, int *value, byte *valueStr) { if (index != 2) { return(Result.Err_Invalid_Param); } var managedState = GetManagedState(state); *value = managedState.channels; return(Result.Ok); }
private static Result _mySetParameterFloat(DspState *state, int index, float value) { if (index != 1) { return(Result.Err_Invalid_Param); } var managedState = GetManagedState(state); managedState.volumeLinear = Math.Clamp(value, 0, 1); return(Result.Ok); }
private static Result _myReset(DspState *state) { var managedState = GetManagedState(state); if (managedState is null) { return(Result.Err_Internal); } managedState.buffer.AsSpan().Clear(); managedState.volumeLinear = 1.0f; return(Result.Ok); }
private static Result _myCreate(DspState *state) { var res = state->GetBlockSize(out uint size); if (res != Result.Ok) { return(res); } var managedState = new MyCustomDSP((int)size); var gchandle = GCHandle.Alloc(managedState, GCHandleType.Normal); state->plugindata = GCHandle.ToIntPtr(gchandle); return(Result.Ok); }
private static Result _myGetParameterData(DspState *state, int index, void **data, uint *length, byte *valueStr) { if (index != 0) { return(Result.Err_Invalid_Param); } var managedState = GetManagedState(state); if (managedState is null) { return(Result.Err_Internal); } *data = Unsafe.AsPointer(ref MemoryMarshal.GetArrayDataReference(managedState.buffer)); //Safe because the array is already pinned *length = (uint)(managedState.channels * managedState.lengthSamples); return(Result.Ok); }
private static Result _myShouldIProcess(DspState *state, int inputsIdle, uint length, ChannelMask inMask, int inChannels, SpeakerMode speakerMode) { return(Result.Ok); }