diff --git a/react/CMakeLists.txt b/react/CMakeLists.txt index 70e3992..84e076d 100644 --- a/react/CMakeLists.txt +++ b/react/CMakeLists.txt @@ -21,73 +21,89 @@ add_custom_command( WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/react DEPENDS - src/SearchControl.tsx - src/WifiChannel.tsx - src/JackServerSettingsDialog.tsx - src/JackServerSettings.tsx - src/DialogEx.tsx - src/AlsaDeviceInfo.tsx - - src/AboutDialog.tsx - src/App.test.tsx - src/App.tsx - src/Banks.tsx - src/ControlViewFactory.tsx - src/DraggableGrid.tsx - src/Draggable.tsx - src/FullScreenIME.tsx - src/GxTunerControl.tsx - src/IControlViewFactory.tsx - src/index.tsx - src/JackHostStatus.tsx - src/JackStatusView.tsx - src/Jack.tsx - src/LoadPluginDialogBackup.tsx - src/LoadPluginDialog.tsx - src/Lv2Plugin.tsx - src/MainPage.tsx - src/ObservableProperty.tsx - src/PedalBoard.tsx - src/PedalBoardView.tsx - src/Pedal.tsx - src/PiPedalError.tsx - src/PiPedalModel.tsx - src/PiPedalSocket.tsx - src/PluginClass.tsx - src/PluginControl.tsx - src/PluginControlView.tsx - src/PluginIcon.tsx - src/PluginInfoDialog.tsx - src/PresetDialog.tsx - src/PresetSelector.tsx - src/Rect.tsx + src/NumericInput.tsx src/RenameDialog.tsx - src/ResizeResponsiveComponent.tsx - src/SelectChannelsDialog.tsx - src/SelectHoverBackground.tsx - src/SelectMidiChannelsDialog.tsx - src/SettingsDialog.tsx - src/SplitControlView.tsx - src/SplitUiControls.tsx - src/StringBuilder.tsx - src/SvgPathBuilder.tsx - src/TemporaryDrawer.tsx - src/ToobCabSimView.tsx - src/ToobFrequencyResponseView.tsx - src/ToobPowerStage2View.tsx src/ToobInputStageView.tsx - src/ToobToneStackView.tsx - src/Units.tsx - src/Utility.tsx - src/VuMeter.tsx - src/PluginPreset.tsx - src/XxxSnippet.tsx - src/WifiConfigSettings.tsx - src/WifiConfigDialog.tsx - src/NoChangePassword.tsx - src/XxxSnippet.tsx + src/ToobCabSimView.tsx + src/SearchFilter.tsx + src/Draggable.tsx + src/SelectHoverBackground.tsx + src/JackStatusView.tsx + src/SplitControlView.tsx + src/MidiBindingsDialog.tsx + src/WifiChannel.tsx + src/PluginControlView.tsx + src/TemporaryDrawer.tsx + src/LoadPluginDialogBackup.tsx + src/logo.svg + src/AlsaDeviceInfo.tsx + src/JackServerSettingsDialog.tsx src/ZoomedUiControl.tsx - + src/PedalBoardView.tsx + src/MainPage.tsx + src/App.tsx + src/PresetDialog.tsx + src/PluginPreset.tsx + src/react-app-env.d.ts + src/ToobSpectrumResponseView.tsx + src/SettingsDialog.tsx + src/SelectChannelsDialog.tsx + src/StringBuilder.tsx + src/ToobPowerStage2View.tsx + src/SearchControl.tsx + src/XxxSnippet.tsx + src/Units.tsx + src/Jack.tsx + src/PluginControl.tsx + src/ResizeResponsiveComponent.tsx + src/Lv2Plugin.tsx + src/index.tsx + src/NoChangePassword.tsx + src/VuMeter.tsx + src/ControlViewFactory.tsx + src/JackServerSettings.tsx + src/MidiBinding.tsx + src/UploadDialog.tsx + src/PiPedalSocket.tsx + src/PedalBoard.tsx + src/JackHostStatus.tsx + src/ZoomedDial.tsx + src/Rect.tsx + src/SvgPathBuilder.tsx + src/IControlViewFactory.tsx + src/PiPedalModel.tsx + src/PluginInfoDialog.tsx + src/reportWebVitals.ts + src/PiPedalError.tsx + src/BankDialog.tsx + src/PluginIcon.tsx + src/WifiConfigDialog.tsx + src/PresetSelector.tsx + src/LoadPluginDialog.tsx + src/ToobFrequencyResponseView.tsx + src/WifiConfigSettings.tsx + src/setupTests.ts + src/AboutDialog.tsx + src/index.css + src/Banks.tsx + src/DialogEx.tsx + src/ToobWaveShapeView.tsx + src/FullScreenIME.tsx + src/App.css + src/PluginPresetSelector.tsx + src/Utility.tsx + src/SelectMidiChannelsDialog.tsx + src/App.test.tsx + src/MidiBindingView.tsx + src/SplitUiControls.tsx + src/PluginClass.tsx + src/ObservableProperty.tsx + src/Pedal.tsx + src/GxTunerControl.tsx + src/DraggableGrid.tsx + src/ToobToneStackView.tsx + src/ToobSpectrumAnalyzerView.tsx + public/css/roboto.css public/fonts/Roboto-BlackItalic.woff2 public/fonts/Roboto-Black.woff2 diff --git a/react/src/ControlViewFactory.tsx b/react/src/ControlViewFactory.tsx index 9545070..07870f8 100644 --- a/react/src/ControlViewFactory.tsx +++ b/react/src/ControlViewFactory.tsx @@ -30,13 +30,15 @@ import ToobInputStageViewFactory from './ToobInputStageView'; import ToobToneStackViewFactory from './ToobToneStackView'; import ToobCabSimViewFactory from './ToobCabSimView'; import ToobPowerStage2Factory from './ToobPowerStage2View'; +import ToobSpectrumAnalyzerViewFactory from './ToobSpectrumAnalyzerView'; let pluginFactories: IControlViewFactory[] = [ new ToobInputStageViewFactory(), new ToobToneStackViewFactory(), new ToobCabSimViewFactory(), - new ToobPowerStage2Factory() + new ToobPowerStage2Factory(), + new ToobSpectrumAnalyzerViewFactory() ]; diff --git a/react/src/JackServerSettingsDialog.tsx b/react/src/JackServerSettingsDialog.tsx index 6ab9065..4186f36 100644 --- a/react/src/JackServerSettingsDialog.tsx +++ b/react/src/JackServerSettingsDialog.tsx @@ -288,7 +288,7 @@ const JackServerSettingsDialog = withStyles(styles)( {((!noDevices) && !waitingForDevices) && ( this.state.alsaDevices!.map((device) => ( - {device.name} + {device.name} ) ) diff --git a/react/src/MidiBindingView.tsx b/react/src/MidiBindingView.tsx index cd4aafd..eb3d470 100644 --- a/react/src/MidiBindingView.tsx +++ b/react/src/MidiBindingView.tsx @@ -127,7 +127,7 @@ const MidiBindingView = generateControlSelects(): React.ReactNode[] { return Utility.validMidiControllers.map((control) => ( - {control.displayName} + {control.displayName} ) ); } diff --git a/react/src/PluginControl.tsx b/react/src/PluginControl.tsx index 97c3bfe..740d704 100644 --- a/react/src/PluginControl.tsx +++ b/react/src/PluginControl.tsx @@ -556,7 +556,7 @@ const PluginControl = style={{ marginLeft: 4, marginRight: 4, width: 140 }} > {control.scale_points.map((scale_point: ScalePoint) => ( - {scale_point.label} + {scale_point.label} ))} diff --git a/react/src/PluginControlView.tsx b/react/src/PluginControlView.tsx index 32e9855..20bdce0 100644 --- a/react/src/PluginControlView.tsx +++ b/react/src/PluginControlView.tsx @@ -365,6 +365,7 @@ const PluginControlView = for (let i = 0; i < controls.length; ++i) { + controls[i].key = 'k'+i; result.push(controls[i]); } diff --git a/react/src/PresetSelector.tsx b/react/src/PresetSelector.tsx index 5f9ab41..c39cee8 100644 --- a/react/src/PresetSelector.tsx +++ b/react/src/PresetSelector.tsx @@ -298,7 +298,7 @@ const PresetSelector = { presets.presets.map((preset) => { return ( - + {(presets.presetChanged && preset.instanceId === presets.selectedInstanceId) ? (preset.name + "*") : (preset.name) diff --git a/react/src/ToobSpectrumAnalyzerView.tsx b/react/src/ToobSpectrumAnalyzerView.tsx new file mode 100644 index 0000000..0f282cd --- /dev/null +++ b/react/src/ToobSpectrumAnalyzerView.tsx @@ -0,0 +1,89 @@ +// Copyright (c) 2021 Robin Davies +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import React from 'react'; +import { createStyles, withStyles, WithStyles, Theme } from '@material-ui/core/styles'; + +import IControlViewFactory from './IControlViewFactory'; +import { PiPedalModelFactory, PiPedalModel } from "./PiPedalModel"; +import { PedalBoardItem } from './PedalBoard'; +import PluginControlView, { ControlGroup,ControlViewCustomization } from './PluginControlView'; +import ToobSpectrumResponseView from './ToobSpectrumResponseView'; + + + + +const styles = (theme: Theme) => createStyles({ +}); + +interface ToobSpectrumAnalyzerProps extends WithStyles { + instanceId: number; + item: PedalBoardItem; + +}; +interface ToobSpectrumAnalyzerState { + +}; + +const ToobSpectrumAnalyzerView = + withStyles(styles, { withTheme: true })( + class extends React.Component + implements ControlViewCustomization + { + model: PiPedalModel; + + customizationId: number = 1; + + constructor(props: ToobSpectrumAnalyzerProps) { + super(props); + this.model = PiPedalModelFactory.getInstance(); + this.state = { + } + } + + ModifyControls(controls: (React.ReactNode| ControlGroup)[]): (React.ReactNode| ControlGroup)[] + { + controls.splice(0,0, + ( ) + ); + return controls; + } + render() { + return (); + } + } + ); + + + +class ToobSpectrumAnalyzerViewFactory implements IControlViewFactory { + uri: string = "http://two-play.com/plugins/toob-spectrum"; + + Create(model: PiPedalModel, pedalBoardItem: PedalBoardItem): React.ReactNode { + return (); + } + + +}; +export default ToobSpectrumAnalyzerViewFactory; \ No newline at end of file diff --git a/react/src/ToobSpectrumResponseView.tsx b/react/src/ToobSpectrumResponseView.tsx new file mode 100644 index 0000000..94f2fe9 --- /dev/null +++ b/react/src/ToobSpectrumResponseView.tsx @@ -0,0 +1,307 @@ +// Copyright (c) 2021 Robin Davies +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import React from 'react'; +import { createStyles, withStyles, WithStyles, Theme } from '@material-ui/core/styles'; + +import { PiPedalModelFactory, PiPedalModel, State,ListenHandle } from "./PiPedalModel"; +import { StandardItemSize } from './PluginControlView'; +import Utility from './Utility'; +import { setInterval,clearInterval } from 'timers'; + + +const SPECTRUM_RESPONSE_VECTOR_URI = "http://two-play.com/plugins/toob#spectrumResponse"; + +const PLOT_WIDTH = StandardItemSize.width*3-16; +const PLOT_HEIGHT = StandardItemSize.height-12; + +const styles = (theme: Theme) => createStyles({ + frame: { + width: PLOT_WIDTH, height: PLOT_HEIGHT, background: "#444", + borderRadius: 6, + marginTop: 12, marginLeft: 8, marginRight: 8, + boxShadow: "1px 4px 8px #000 inset" + }, +}); + +interface ToobSpectrumResponseProps extends WithStyles { + instanceId: number; + +}; +interface ToobSpectrumResponseState { + path: string; + minF: number; + maxF: number; +}; + +const ToobSpectrumResponseView = + withStyles(styles, { withTheme: true })( + class extends React.Component + { + model: PiPedalModel; + + customizationId: number = 1; + + constructor(props: ToobSpectrumResponseProps) { + super(props); + + + this.model = PiPedalModelFactory.getInstance(); + + let minF = 60; + let maxF = 18000; + + let plugin = this.model.pedalBoard.get()?.maybeGetItem(this.props.instanceId); + if (plugin) + { + minF = plugin.getControlValue("minF"); + maxF = plugin.getControlValue("maxF"); + } + + + this.state = { + path: "", + minF: minF, + maxF: maxF + }; + + this.onPedalBoardChanged = this.onPedalBoardChanged.bind(this); + this.onStateChanged = this.onStateChanged.bind(this); + } + + onStateChanged() + { + if (this.model.state.get() === State.Ready) + { + this.requestDeferred = false; + this.requestOutstanding = false; + + let plugin = this.model.pedalBoard.get()?.maybeGetItem(this.props.instanceId); + if (plugin) + { + let minF = plugin.getControlValue("minF"); + let maxF = plugin.getControlValue("maxF"); + this.setState({minF: minF, maxF: maxF}); + } + + } + this.isReady = this.model.state.get() === State.Ready; + + this.maybeStartClock(); // after a reconnect. + } + onPedalBoardChanged() + { + this.maybeStartClock(); + let plugin = this.model.pedalBoard.get()?.maybeGetItem(this.props.instanceId); + if (plugin) + { + let minF = plugin.getControlValue("minF"); + let maxF = plugin.getControlValue("maxF"); + this.setState({minF: minF, maxF: maxF}); + } + } + + mounted: boolean = false; + isReady: boolean = false; + componentDidMount() + { + this.model.state.addOnChangedHandler(this.onStateChanged); + this.model.pedalBoard.addOnChangedHandler(this.onPedalBoardChanged); + this.mounted = true; + this.isReady = this.model.state.get() === State.Ready; + this.maybeStartClock(); + } + componentWillUnmount() + { + this.mounted = false; + this.maybeStartClock(); + this.model.state.removeOnChangedHandler(this.onStateChanged); + this.model.pedalBoard.removeOnChangedHandler(this.onPedalBoardChanged); + } + + componentDidUpdate() { + } + requestOutstanding: boolean = false; + requestDeferred: boolean = false; + + // Size of the SVG element. + xMin: number = 0; + xMax: number = PLOT_WIDTH+4; + yMin: number = 0; + yMax: number = PLOT_HEIGHT; + + onSpectrumResponseUpdated(svgPath: string) { + this.setState({path: svgPath}); + + } + + isTicking : boolean = false; + hClock?: NodeJS.Timeout; + hAtomOutput?: ListenHandle; + + maybeStartClock() { + let shouldTick = this.isReady && this.mounted; + + if (shouldTick !== this.isTicking) + { + this.isTicking = shouldTick; + if (shouldTick) + { + this.hAtomOutput = this.model.listenForAtomOutput(this.props.instanceId, + (instanceId,atomOutput)=> { + this.onSpectrumResponseUpdated(atomOutput.value as string); + if (this.requestDeferred) { + Utility.delay(30) // take breath + .then( + () => { + this.requestOutstanding = false; + this.requestDeferred = false; + this.requestSpectrum(); + } + + ); + } else { + this.requestOutstanding = false; + } + + + }); + this.hClock = setInterval(()=> { + this.requestSpectrum(); + }, + 1000/15); + } else { + if (this.hAtomOutput) + { + this.model.cancelListenForAtomOutput(this.hAtomOutput); + this.hAtomOutput = undefined; + } + if (this.hClock) + { + clearInterval(this.hClock); + this.hClock = undefined; + } + } + } + + + } + requestSpectrum() { + if (this.requestOutstanding) { // throttling. + this.requestDeferred = true; + return; + } + this.requestOutstanding = true; + this.model.getLv2Parameter(this.props.instanceId, SPECTRUM_RESPONSE_VECTOR_URI) + .then((data) => { + }).catch(error => { + // assume the connection was lost. We'll get saved by a reconnect. + }); + } + + numPoints = 200; + + minF = 60; + maxF = 18000; + logMinF = Math.log(this.minF); + logMaxF = Math.log(this.maxF); + + toX(f: number): number { + let width = PLOT_WIDTH-8; + return (Math.log(f)-this.logMinF)*width/(this.logMaxF-this.logMinF); + } + grid(): React.ReactNode[] { + let result: React.ReactNode[] = []; + let width = PLOT_WIDTH-8; + let height = PLOT_HEIGHT-8; + + for (let db = -20; db >= -100; db -= 20) + { + let y = height*db/-100; + result.push( + ( + + ) + ); + } + + let minF = this.state.minF; + let maxF = this.state.maxF; + this.minF = minF; + this.maxF = maxF; + this.logMinF = Math.log(this.minF); + this.logMaxF = Math.log(this.maxF); + + for (let decade = 10; decade < 100000; decade *= 10) + { + for (let minorTick = 1; minorTick <= 5; ++ minorTick) + { + let f = decade*minorTick; + if (f > minF && f < maxF) + { + let x = this.toX(f); + if (minorTick === 1) + { + result.push( + ( + + ) + ); + } else { + result.push( + ( + + ) + ); + } + + } + + } + } + + return result; + } + + render() { + let classes = this.props.classes; + return ( +
+
+ + {this.grid()} + +
+
+ + + +
+ +
); + } + } + ); + + + +export default ToobSpectrumResponseView; \ No newline at end of file diff --git a/react/src/ToobWaveShapeView.tsx b/react/src/ToobWaveShapeView.tsx index aae497a..6196378 100644 --- a/react/src/ToobWaveShapeView.tsx +++ b/react/src/ToobWaveShapeView.tsx @@ -40,16 +40,6 @@ const styles = (theme: Theme) => createStyles({ }, }); -interface SvgRect -{ - x: number; - y: number; - width: number; - height: number; - color: string; - -} - interface ToobWaveShapeProps extends WithStyles { instanceId: number; controlNumber: number; diff --git a/react/src/VuMeter.tsx b/react/src/VuMeter.tsx index e0da61b..243b45f 100644 --- a/react/src/VuMeter.tsx +++ b/react/src/VuMeter.tsx @@ -345,10 +345,14 @@ export const VuMeter = addVuSubscription() { this.removeVuSubscription(); - if (this.props.instanceId !== -1) { - this.subscribedInstanceId = this.props.instanceId; - this.subscriptionHandle = this.model.addVuSubscription(this.props.instanceId, this.onVuChanged); - this.resetTelltales(); + + if (this.model.state.get() === State.Ready) + { + if (this.props.instanceId !== -1) { + this.subscribedInstanceId = this.props.instanceId; + this.subscriptionHandle = this.model.addVuSubscription(this.props.instanceId, this.onVuChanged); + this.resetTelltales(); + } } } removeVuSubscription() { @@ -407,6 +411,8 @@ export const VuMeter = if (state === State.Ready) { this.addVuSubscription(); // re-subscribe. + } else { + this.removeVuSubscription(); } } diff --git a/react/tmp.txt b/react/tmp.txt new file mode 100644 index 0000000..f04cd76 --- /dev/null +++ b/react/tmp.txt @@ -0,0 +1,83 @@ +src +src/NumericInput.tsx +src/RenameDialog.tsx +src/ToobInputStageView.tsx +src/ToobCabSimView.tsx +src/SearchFilter.tsx +src/Draggable.tsx +src/SelectHoverBackground.tsx +src/JackStatusView.tsx +src/SplitControlView.tsx +src/MidiBindingsDialog.tsx +src/WifiChannel.tsx +src/PluginControlView.tsx +src/TemporaryDrawer.tsx +src/LoadPluginDialogBackup.tsx +src/logo.svg +src/AlsaDeviceInfo.tsx +src/JackServerSettingsDialog.tsx +src/ZoomedUiControl.tsx +src/PedalBoardView.tsx +src/MainPage.tsx +src/App.tsx +src/PresetDialog.tsx +src/PluginPreset.tsx +src/react-app-env.d.ts +src/ToobSpectrumResponseView.tsx +src/SettingsDialog.tsx +src/SelectChannelsDialog.tsx +src/StringBuilder.tsx +src/ToobPowerStage2View.tsx +src/SearchControl.tsx +src/XxxSnippet.tsx +src/Units.tsx +src/Jack.tsx +src/PluginControl.tsx +src/ResizeResponsiveComponent.tsx +src/Lv2Plugin.tsx +src/index.tsx +src/NoChangePassword.tsx +src/VuMeter.tsx +src/ControlViewFactory.tsx +src/JackServerSettings.tsx +src/MidiBinding.tsx +src/UploadDialog.tsx +src/PiPedalSocket.tsx +src/PedalBoard.tsx +src/JackHostStatus.tsx +src/ZoomedDial.tsx +src/Rect.tsx +src/SvgPathBuilder.tsx +src/IControlViewFactory.tsx +src/PiPedalModel.tsx +src/PluginInfoDialog.tsx +src/reportWebVitals.ts +src/PiPedalError.tsx +src/BankDialog.tsx +src/PluginIcon.tsx +src/WifiConfigDialog.tsx +src/PresetSelector.tsx +src/LoadPluginDialog.tsx +src/ToobFrequencyResponseView.tsx +src/WifiConfigSettings.tsx +src/setupTests.ts +src/AboutDialog.tsx +src/index.css +src/Banks.tsx +src/DialogEx.tsx +src/ToobWaveShapeView.tsx +src/FullScreenIME.tsx +src/App.css +src/PluginPresetSelector.tsx +src/Utility.tsx +src/SelectMidiChannelsDialog.tsx +src/App.test.tsx +src/MidiBindingView.tsx +src/SplitUiControls.tsx +src/PluginClass.tsx +src/ObservableProperty.tsx +src/Pedal.tsx +src/GxTunerControl.tsx +src/DraggableGrid.tsx +src/ToobToneStackView.tsx +src/ToobSpectrumAnalyzerView.tsx diff --git a/src/Lv2Effect.cpp b/src/Lv2Effect.cpp index e8c90fd..1e944eb 100644 --- a/src/Lv2Effect.cpp +++ b/src/Lv2Effect.cpp @@ -658,7 +658,7 @@ void Lv2Effect::WriteAtom(json_writer &writer, LV2_Atom*pAtom) ); } else if (pAtom->type == uris.atom_String) { - const char *p = (const char*) (((char*) pAtom) + sizeof(LV2_Atom_String)); + const char *p = (((const char*) pAtom) + sizeof(LV2_Atom_String)); writer.write( p ); diff --git a/src/Worker.cpp b/src/Worker.cpp index c7a4c5e..94a5819 100644 --- a/src/Worker.cpp +++ b/src/Worker.cpp @@ -71,7 +71,11 @@ LV2_Worker_Status Worker::worker_respond_fn(LV2_Worker_Respond_Handle handle, ui LV2_Worker_Status Worker::WorkerResponse(uint32_t size, const void *data) { - if (responseRingBuffer.write(sizeof(size), (uint8_t *)&size)) + if (responseRingBuffer.writeSpace() < sizeof(size)+size) + { + return LV2_WORKER_ERR_NO_SPACE; + } + if (!responseRingBuffer.write(sizeof(size), (uint8_t *)&size)) { return LV2_WORKER_ERR_NO_SPACE; } @@ -107,7 +111,7 @@ void Worker::ThreadProc() { return; } - size_t size; + uint32_t size; while (requestRingBuffer.readSpace() > sizeof(size)) { if (!requestRingBuffer.read(sizeof(size), (uint8_t *)&size))