Skip to content

Commit

Permalink
Fix fiile uploads for Toob ML and Toob Convolution Reversbs.
Browse files Browse the repository at this point in the history
  • Loading branch information
rerdavies committed Nov 22, 2024
1 parent 33dc523 commit 1c071ba
Show file tree
Hide file tree
Showing 13 changed files with 151 additions and 54 deletions.
26 changes: 17 additions & 9 deletions react/src/FilePropertyDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import Button from '@mui/material/Button';
import FileUploadIcon from '@mui/icons-material/FileUpload';
import AudioFileIcon from '@mui/icons-material/AudioFile';
import ArrowBackIcon from '@mui/icons-material/ArrowBack';
import FolderIcon from '@mui/icons-material/Folder';
import FolderOutlinedIcon from '@mui/icons-material/FolderOutlined';
import InsertDriveFileOutlinedIcon from '@mui/icons-material/InsertDriveFileOutlined';
import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile';
import DialogActions from '@mui/material/DialogActions';
Expand Down Expand Up @@ -105,6 +105,7 @@ export interface FilePropertyDialogState {
canDelete: boolean;
fileResult: FileRequestResult;
navDirectory: string;
uploadDirectory: string;
isProtectedDirectory: boolean;
columns: number;
columnWidth: number;
Expand Down Expand Up @@ -187,12 +188,14 @@ export default withStyles(styles, { withTheme: true })(

this.model = PiPedalModelFactory.getInstance();

let selectedFile = props.selectedFile;
this.state = {
fullScreen: this.getFullScreen(),
selectedFile: props.selectedFile,
selectedFile: selectedFile,
selectedFileProtected: true,
selectedFileIsDirectory: false,
navDirectory: this.getNavDirectoryFromFile(props.selectedFile, props.fileProperty),
navDirectory: this.getNavDirectoryFromFile(selectedFile, props.fileProperty),
uploadDirectory: "",
hasSelection: false,
canDelete: false,
columns: 0,
Expand Down Expand Up @@ -256,7 +259,8 @@ export default withStyles(styles, { withTheme: true })(
fileResult: filesResult,
hasSelection: !!fileEntry,
selectedFileProtected: fileEntry ? fileEntry.isProtected: true,
navDirectory: navPath
navDirectory: navPath,
uploadDirectory: filesResult.currentDirectory
});
}
}).catch((error) => {
Expand Down Expand Up @@ -300,6 +304,8 @@ export default withStyles(styles, { withTheme: true })(
componentDidMount() {
super.componentDidMount();
this.mounted = true;
this.requestFiles(this.state.navDirectory)
this.requestScroll = true;
}
componentWillUnmount() {
super.componentWillUnmount();
Expand All @@ -310,14 +316,16 @@ export default withStyles(styles, { withTheme: true })(
super.componentDidUpdate?.(prevProps, prevState, snapshot);
if (prevProps.open !== this.props.open || prevProps.fileProperty !== this.props.fileProperty || prevProps.selectedFile !== this.props.selectedFile) {
if (this.props.open) {
let navDirectory = this.getNavDirectoryFromFile(this.props.selectedFile, this.props.fileProperty);
let selectedFile = this.props.selectedFile;
let navDirectory = this.getNavDirectoryFromFile(selectedFile, this.props.fileProperty);
this.setState({
selectedFile: this.props.selectedFile,
selectedFile: selectedFile,
selectedFileIsDirectory: false,
selectedFileProtected: true,
newFolderDialogOpen: false,
renameDialogOpen: false,
moveDialogOpen: false
moveDialogOpen: false,
navDirectory: navDirectory
});
this.requestFiles(navDirectory)
this.requestScroll = true;
Expand Down Expand Up @@ -549,7 +557,7 @@ export default withStyles(styles, { withTheme: true })(
}
if (fileEntry.isDirectory) {
return (
<FolderIcon style={{ flex: "0 0 auto", opacity: 0.7, marginRight: 8, marginLeft: 8 }} />
<FolderOutlinedIcon style={{ flex: "0 0 auto", opacity: 0.7, marginRight: 8, marginLeft: 8 }} />
);
}
if (isAudioFile(fileEntry.pathname)) {
Expand Down Expand Up @@ -741,7 +749,7 @@ export default withStyles(styles, { withTheme: true })(
}
}
uploadPage={
"uploadUserFile?directory=" + encodeURIComponent(this.state.navDirectory)
"uploadUserFile?directory=" + encodeURIComponent(this.state.uploadDirectory)
+ "&ext="
+ encodeURIComponent(this.getFileExtensionList(this.props.fileProperty))
}
Expand Down
1 change: 1 addition & 0 deletions react/src/PiPedalModel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ export class FileRequestResult {
files: FileEntry[] = [];
isProtected: boolean = false;
breadcrumbs: BreadcrumbEntry[] = [];
currentDirectory: string = "";
};

export type PluginPresetsChangedHandler = (pluginUri: string) => void;
Expand Down
63 changes: 33 additions & 30 deletions react/src/PluginControlView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import { WithStyles } from '@mui/styles';
import createStyles from '@mui/styles/createStyles';
import withStyles from '@mui/styles/withStyles';
import { PiPedalModel, PiPedalModelFactory } from './PiPedalModel';
import { UiPlugin, UiControl, UiFileProperty,UiFrequencyPlot, ScalePoint } from './Lv2Plugin';
import { UiPlugin, UiControl, UiFileProperty, UiFrequencyPlot, ScalePoint } from './Lv2Plugin';
import {
Pedalboard, PedalboardItem, ControlValue
} from './Pedalboard';
Expand Down Expand Up @@ -247,8 +247,7 @@ type PluginControlViewState = {

const PluginControlView =
withStyles(styles, { withTheme: true })(
class extends ResizeResponsiveComponent<PluginControlViewProps, PluginControlViewState>
{
class extends ResizeResponsiveComponent<PluginControlViewProps, PluginControlViewState> {
model: PiPedalModel;

constructor(props: PluginControlViewProps) {
Expand Down Expand Up @@ -526,7 +525,7 @@ const PluginControlView =
return false;
}

controlKeyIndex : number = 0;
controlKeyIndex: number = 0;
controlNodesToNodes(nodes: (ReactNode | ControlGroup)[]): ReactNode[] {
let classes = this.props.classes;
let isLandscapeGrid = this.state.landscapeGrid;
Expand All @@ -543,7 +542,7 @@ const PluginControlView =
let item = controlGroup.controls[j];
controls.push(
(
<div key={"ctl"+(this.controlKeyIndex++)} className={classes.controlPadding}>
<div key={"ctl" + (this.controlKeyIndex++)} className={classes.controlPadding}>
{item}
</div>

Expand All @@ -552,7 +551,7 @@ const PluginControlView =
}

result.push((
<div key={"ctl"+(this.controlKeyIndex++)} className={!isLandscapeGrid ? classes.portGroup : classes.portGroupLandscape}>
<div key={"ctl" + (this.controlKeyIndex++)} className={!isLandscapeGrid ? classes.portGroup : classes.portGroupLandscape}>
<div className={classes.portGroupTitle}>
<Typography noWrap variant="caption" >{controlGroup.name}</Typography>
</div>
Expand All @@ -566,7 +565,7 @@ const PluginControlView =

} else {
result.push((
<div key={"ctl"+(this.controlKeyIndex++)} className={hasGroups ? classes.portgroupControlPadding : classes.controlPadding} >
<div key={"ctl" + (this.controlKeyIndex++)} className={hasGroups ? classes.portgroupControlPadding : classes.controlPadding} >
{node as ReactNode}
</div>
));
Expand All @@ -584,7 +583,7 @@ const PluginControlView =


render(): ReactNode {
this.controlKeyIndex = 0;
this.controlKeyIndex = 0;
let classes = this.props.classes;
let pedalboardItem: PedalboardItem;
let pedalboard = this.model.pedalboard.get();
Expand Down Expand Up @@ -650,29 +649,33 @@ const PluginControlView =
)
}
</div>
<FilePropertyDialog open={this.state.showFileDialog}
fileProperty={this.state.dialogFileProperty}
selectedFile={this.state.dialogFileValue}
onCancel={() => {
this.setState({ showFileDialog: false });
}}
onOk={(fileProperty, selectedFile) => {

this.model.setPatchProperty(
this.props.instanceId,
fileProperty.patchProperty,
JsonAtom.Path(selectedFile)
)
.then(() => {
{this.state.showFileDialog && (

<FilePropertyDialog open={this.state.showFileDialog}
fileProperty={this.state.dialogFileProperty}
selectedFile={this.state.dialogFileValue}
onCancel={() => {
this.setState({ showFileDialog: false });
}}
onOk={(fileProperty, selectedFile) => {

this.model.setPatchProperty(
this.props.instanceId,
fileProperty.patchProperty,
JsonAtom.Path(selectedFile)
)
.then(() => {

})
.catch((error) => {
this.model.showAlert("Unable to complete the operation. Audio is not running." + error);
});
this.setState({ showFileDialog: false });
}
}
/>
)}

})
.catch((error) => {
this.model.showAlert("Unable to complete the operation. Audio is not running." + error);
});
this.setState({ showFileDialog: false });
}
}
/>
<FullScreenIME uiControl={this.state.imeUiControl} value={this.state.imeValue}

onChange={(key, value) => this.onImeValueChange(key, value)}
Expand Down
1 change: 1 addition & 0 deletions src/FileEntry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,5 @@ JSON_MAP_BEGIN(FileRequestResult)
JSON_MAP_REFERENCE(FileRequestResult,files)
JSON_MAP_REFERENCE(FileRequestResult,isProtected)
JSON_MAP_REFERENCE(FileRequestResult,breadcrumbs)
JSON_MAP_REFERENCE(FileRequestResult,currentDirectory)
JSON_MAP_END()
1 change: 1 addition & 0 deletions src/FileEntry.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ namespace pipedal {
std::vector<FileEntry> files_;
bool isProtected_ = false;
std::vector<BreadcrumbEntry> breadcrumbs_;
std::string currentDirectory_;
DECLARE_JSON_MAP(FileRequestResult);

};
Expand Down
38 changes: 37 additions & 1 deletion src/Lv2Effect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,21 @@
#include "RingBufferReader.hpp"

using namespace pipedal;
namespace fs = std::filesystem;

const float BYPASS_TIME_S = 0.1f;


static fs::path makeAbsolutePath(const std::filesystem::path &path, const std::filesystem::path &parentPath)
{
if (path.is_absolute())
{
return path;
}
return parentPath / path;
}


Lv2Effect::Lv2Effect(
IHost *pHost_,
const std::shared_ptr<Lv2PluginInfo> &info_,
Expand All @@ -69,7 +81,6 @@ Lv2Effect::Lv2Effect(
this->pathProperties.push_back(filePropertyUrid);

this->pathPropertyWriters.push_back(PatchPropertyWriter(instanceId, filePropertyUrid));
std::vector<PatchPropertyWriter> pathPropertyWriters;
}
}
for (auto &pathProperty: pedalboardItem.pathProperties_)
Expand All @@ -84,8 +95,10 @@ Lv2Effect::Lv2Effect(

const LilvPlugins *plugins = lilv_world_get_all_plugins(pWorld);

// xxx: could we not stash the pPlugin in the plugin info?
auto uriNode = lilv_new_uri(pWorld, pedalboardItem.uri().c_str());
const LilvPlugin *pPlugin = lilv_plugins_get_by_uri(plugins, uriNode);

lilv_node_free(uriNode);
{
AutoLilvNode bundleUri = lilv_plugin_get_bundle_uri(pPlugin);
Expand All @@ -98,6 +111,25 @@ Lv2Effect::Lv2Effect(
logFeature.GetLog(),
bundleUriString,
storagePath);


mapPathFeature.Prepare(&(pHost_->GetMapFeature()));
mapPathFeature.SetPluginStoragePath(pHost_->GetPluginStoragePath());
if (info->piPedalUI())
{
const auto &fileProperties = info_->piPedalUI()->fileProperties();
for (const auto &fileProperty : fileProperties)
{
if (!fileProperty->resourceDirectory().empty())
{
mapPathFeature.AddResourceFileMapping({
makeAbsolutePath(fileProperty->resourceDirectory(),bundleUriString),
makeAbsolutePath(fileProperty->directory(),pHost_->GetPluginStoragePath())
});
}
}
}

lilv_free(bundleUriString);
}

Expand All @@ -109,6 +141,10 @@ Lv2Effect::Lv2Effect(
{
this->features.push_back(*p);
}
this->features.push_back(mapPathFeature.GetMapPathFeature());
this->features.push_back(mapPathFeature.GetMakePathFeature());
this->features.push_back(mapPathFeature.GetFreePathFeature());


this->features.push_back(this->fileBrowserFilesFeature.GetFeature());

Expand Down
3 changes: 2 additions & 1 deletion src/Lv2Effect.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "FileBrowserFilesFeature.hpp"
#include "PatchPropertyWriter.hpp"
#include <unordered_map>
#include "MapPathFeature.hpp"

#include "IEffect.hpp"
#include "Worker.hpp"
Expand Down Expand Up @@ -90,7 +91,7 @@ namespace pipedal
std::vector<char *> outputAtomBuffers;
std::vector<const LV2_Feature *> features;
LV2_Feature *work_schedule_feature = nullptr;

MapPathFeature mapPathFeature;

uint64_t maxInputControlPort = 0;
std::vector<bool> isInputControlPort;
Expand Down
3 changes: 1 addition & 2 deletions src/MapPathFeature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,7 @@

using namespace pipedal;

MapPathFeature::MapPathFeature(const std::filesystem::path &storagePath)
:storagePath(storagePath)
MapPathFeature::MapPathFeature()
{
lv2_state_map_path.handle = (LV2_State_Map_Path_Handle *)this;
lv2_state_map_path.absolute_path = FnAbsolutePath;
Expand Down
14 changes: 13 additions & 1 deletion src/MapPathFeature.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,23 @@

namespace pipedal
{
struct ResourceFileMapping {
std::string resourcePath; // absolute path of the resource directory.
std::string storagePath; // absolute path of where resource directory files get placed.
};
class MapPathFeature
{
public:
MapPathFeature(const std::filesystem::path &storagePath);
MapPathFeature();
void Prepare(MapFeature* map);
void SetPluginStoragePath(const std::string&path) { storagePath = path;}

void AddResourceFileMapping(const ResourceFileMapping &resourceFileMapping)
{
this->resourceFileMappings.push_back(resourceFileMapping);
}

const std::vector<ResourceFileMapping> &GetResourceFileMappings() const { return resourceFileMappings; }
const std::string&GetPluginStoragePath() const { return storagePath; }
const LV2_Feature*GetMapPathFeature() { return &mapPathFeature;}
const LV2_Feature*GetMakePathFeature() { return &makePathFeature;}
Expand Down Expand Up @@ -60,5 +71,6 @@ namespace pipedal

private:
std::string storagePath;
std::vector<ResourceFileMapping> resourceFileMappings;
};
}
Loading

0 comments on commit 1c071ba

Please sign in to comment.