예제 #1
0
            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);
            }
예제 #2
0
            private static MyCustomDSP?GetManagedState(DspState *state)
            {
                if (state->plugindata != default)
                {
                    return(GCHandle.FromIntPtr(state->plugindata).Target as MyCustomDSP);
                }

                return(null);
            }
예제 #3
0
            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));
            }
예제 #4
0
            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);
            }
예제 #5
0
            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);
            }
예제 #6
0
            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);
            }
예제 #7
0
            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);
            }
예제 #8
0
            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);
            }
예제 #9
0
            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);
            }
예제 #10
0
            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);
            }
예제 #11
0
 private static Result _myShouldIProcess(DspState *state, int inputsIdle, uint length, ChannelMask inMask, int inChannels, SpeakerMode speakerMode)
 {
     return(Result.Ok);
 }