Start file list for audiofile module
This commit is contained in:
parent
1a2c64309b
commit
e0d6d59ce9
3 changed files with 156 additions and 4 deletions
9
.github/workflows/build.yml
vendored
9
.github/workflows/build.yml
vendored
|
@ -323,6 +323,9 @@ jobs:
|
||||||
- name: Build for modduo
|
- name: Build for modduo
|
||||||
run: |
|
run: |
|
||||||
make modduo HEADLESS=true WITH_LTO=true -j $(nproc)
|
make modduo HEADLESS=true WITH_LTO=true -j $(nproc)
|
||||||
|
- name: Set sha8
|
||||||
|
id: slug
|
||||||
|
run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)"
|
||||||
- name: Pack binaries
|
- name: Pack binaries
|
||||||
run: |
|
run: |
|
||||||
tar -c -h --hard-dereference -z -f ${{ github.event.repository.name }}-modduo-${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}.tar.gz -C bin $(ls bin | grep lv2)
|
tar -c -h --hard-dereference -z -f ${{ github.event.repository.name }}-modduo-${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}.tar.gz -C bin $(ls bin | grep lv2)
|
||||||
|
@ -358,6 +361,9 @@ jobs:
|
||||||
- name: Build for modduox
|
- name: Build for modduox
|
||||||
run: |
|
run: |
|
||||||
make modduox HEADLESS=true WITH_LTO=true -j $(nproc)
|
make modduox HEADLESS=true WITH_LTO=true -j $(nproc)
|
||||||
|
- name: Set sha8
|
||||||
|
id: slug
|
||||||
|
run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)"
|
||||||
- name: Pack binaries
|
- name: Pack binaries
|
||||||
run: |
|
run: |
|
||||||
tar -c -h --hard-dereference -z -f ${{ github.event.repository.name }}-modduox-${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}.tar.gz -C bin $(ls bin | grep lv2)
|
tar -c -h --hard-dereference -z -f ${{ github.event.repository.name }}-modduox-${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}.tar.gz -C bin $(ls bin | grep lv2)
|
||||||
|
@ -393,6 +399,9 @@ jobs:
|
||||||
- name: Build for moddwarf
|
- name: Build for moddwarf
|
||||||
run: |
|
run: |
|
||||||
make moddwarf HEADLESS=true WITH_LTO=true -j $(nproc)
|
make moddwarf HEADLESS=true WITH_LTO=true -j $(nproc)
|
||||||
|
- name: Set sha8
|
||||||
|
id: slug
|
||||||
|
run: echo "::set-output name=sha8::$(echo ${{ github.sha }} | cut -c1-8)"
|
||||||
- name: Pack binaries
|
- name: Pack binaries
|
||||||
run: |
|
run: |
|
||||||
tar -c -h --hard-dereference -z -f ${{ github.event.repository.name }}-moddwarf-${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}.tar.gz -C bin $(ls bin | grep lv2)
|
tar -c -h --hard-dereference -z -f ${{ github.event.repository.name }}-moddwarf-${{ github.event.pull_request.number || steps.slug.outputs.sha8 }}.tar.gz -C bin $(ls bin | grep lv2)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* DISTRHO Cardinal Plugin
|
* DISTRHO Cardinal Plugin
|
||||||
* Copyright (C) 2021 Filipe Coelho <falktx@falktx.com>
|
* Copyright (C) 2021-2022 Filipe Coelho <falktx@falktx.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License as
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
@ -22,6 +22,11 @@
|
||||||
|
|
||||||
#include "CarlaNativePlugin.h"
|
#include "CarlaNativePlugin.h"
|
||||||
|
|
||||||
|
#ifndef HEADLESS
|
||||||
|
# include "ImGuiWidget.hpp"
|
||||||
|
# include "ghc/filesystem.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define BUFFER_SIZE 128
|
#define BUFFER_SIZE 128
|
||||||
|
|
||||||
// generates a warning if this is defined as anything else
|
// generates a warning if this is defined as anything else
|
||||||
|
@ -81,6 +86,8 @@ struct CarlaInternalPluginModule : Module, Thread {
|
||||||
float* dataOutPtr[NUM_OUTPUTS];
|
float* dataOutPtr[NUM_OUTPUTS];
|
||||||
unsigned audioDataFill = 0;
|
unsigned audioDataFill = 0;
|
||||||
int64_t lastBlockFrame = -1;
|
int64_t lastBlockFrame = -1;
|
||||||
|
bool fileChanged = false;
|
||||||
|
std::string currentFile;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
float preview[108];
|
float preview[108];
|
||||||
|
@ -316,6 +323,126 @@ static intptr_t host_dispatcher(const NativeHostHandle handle, const NativeHostD
|
||||||
// --------------------------------------------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
#ifndef HEADLESS
|
#ifndef HEADLESS
|
||||||
|
struct AudioFileListWidget : ImGuiWidget {
|
||||||
|
CarlaInternalPluginModule* const module;
|
||||||
|
|
||||||
|
bool showError = false;
|
||||||
|
String errorMessage;
|
||||||
|
|
||||||
|
struct ghcFile { std::string full, base; };
|
||||||
|
std::string currentDirectory;
|
||||||
|
std::vector<ghcFile> currentFiles;
|
||||||
|
size_t selectedFile = (size_t)-1;
|
||||||
|
|
||||||
|
AudioFileListWidget(CarlaInternalPluginModule* const m)
|
||||||
|
: ImGuiWidget(),
|
||||||
|
module(m)
|
||||||
|
{
|
||||||
|
if (module->fileChanged)
|
||||||
|
reloadDir();
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawImGui() override
|
||||||
|
{
|
||||||
|
const float scaleFactor = getScaleFactor();
|
||||||
|
|
||||||
|
const int flags = ImGuiWindowFlags_NoSavedSettings
|
||||||
|
| ImGuiWindowFlags_NoTitleBar
|
||||||
|
| ImGuiWindowFlags_NoResize
|
||||||
|
| ImGuiWindowFlags_NoCollapse
|
||||||
|
| ImGuiWindowFlags_NoScrollbar
|
||||||
|
| ImGuiWindowFlags_NoScrollWithMouse;
|
||||||
|
|
||||||
|
ImGui::SetNextWindowPos(ImVec2(0, 0));
|
||||||
|
ImGui::SetNextWindowSize(ImVec2(box.size.x * scaleFactor, box.size.y * scaleFactor));
|
||||||
|
|
||||||
|
if (ImGui::Begin("Plugin List", nullptr, ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoResize))
|
||||||
|
{
|
||||||
|
if (showError)
|
||||||
|
{
|
||||||
|
showError = false;
|
||||||
|
ImGui::OpenPopup("Audio File Error");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::BeginPopupModal("Audio File Error", nullptr, flags))
|
||||||
|
{
|
||||||
|
ImGui::TextWrapped("Failed to load audio file, error was:\n%s", errorMessage.buffer());
|
||||||
|
|
||||||
|
ImGui::Separator();
|
||||||
|
|
||||||
|
if (ImGui::Button("Ok"))
|
||||||
|
ImGui::CloseCurrentPopup();
|
||||||
|
|
||||||
|
ImGui::EndPopup();
|
||||||
|
}
|
||||||
|
else if (ImGui::BeginTable("pluginlist", 1, ImGuiTableFlags_NoSavedSettings))
|
||||||
|
{
|
||||||
|
for (size_t i=0, count=currentFiles.size(); i < count; ++i)
|
||||||
|
{
|
||||||
|
bool wasSelected = selectedFile == i;
|
||||||
|
bool selected = wasSelected;
|
||||||
|
ImGui::TableNextRow();
|
||||||
|
ImGui::TableSetColumnIndex(0);
|
||||||
|
ImGui::Selectable(currentFiles[i].base.c_str(), &selected);
|
||||||
|
|
||||||
|
if (selected && ! wasSelected)
|
||||||
|
{
|
||||||
|
selectedFile = i;
|
||||||
|
module->currentFile = currentFiles[i].full;
|
||||||
|
module->fCarlaPluginDescriptor->set_custom_data(module->fCarlaPluginHandle, "file", currentFiles[i].full.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::EndTable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
|
void step() override
|
||||||
|
{
|
||||||
|
if (module->fileChanged)
|
||||||
|
reloadDir();
|
||||||
|
|
||||||
|
ImGuiWidget::step();
|
||||||
|
}
|
||||||
|
|
||||||
|
void reloadDir()
|
||||||
|
{
|
||||||
|
module->fileChanged = false;
|
||||||
|
|
||||||
|
static constexpr const char* const supportedExtensions[] = {
|
||||||
|
#ifdef HAVE_SNDFILE
|
||||||
|
".aif",".aifc",".aiff",".au",".bwf",".flac",".htk",".iff",".mat4",".mat5",".oga",".ogg;"
|
||||||
|
".paf",".pvf",".pvf5",".sd2",".sf",".snd",".svx",".vcc",".w64",".wav",".xi",
|
||||||
|
#endif
|
||||||
|
".mp3"
|
||||||
|
};
|
||||||
|
|
||||||
|
using namespace ghc::filesystem;
|
||||||
|
currentDirectory = path(module->currentFile).parent_path().string();
|
||||||
|
currentFiles.clear();
|
||||||
|
|
||||||
|
directory_iterator it(currentDirectory);
|
||||||
|
for (directory_iterator itb = begin(it), ite=end(it); itb != ite; ++itb)
|
||||||
|
{
|
||||||
|
if (! itb->is_regular_file())
|
||||||
|
continue;
|
||||||
|
const path filepath = itb->path();
|
||||||
|
const path extension = filepath.extension();
|
||||||
|
for (size_t i=0; i<ARRAY_SIZE(supportedExtensions); ++i)
|
||||||
|
{
|
||||||
|
if (extension.compare(supportedExtensions[i]) == 0)
|
||||||
|
{
|
||||||
|
currentFiles.push_back({ filepath.string(), filepath.filename().string() });
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct AudioFileWidget : ModuleWidget {
|
struct AudioFileWidget : ModuleWidget {
|
||||||
static constexpr const float startX_In = 14.0f;
|
static constexpr const float startX_In = 14.0f;
|
||||||
static constexpr const float startX_Out = 96.0f;
|
static constexpr const float startX_Out = 96.0f;
|
||||||
|
@ -339,12 +466,22 @@ struct AudioFileWidget : ModuleWidget {
|
||||||
addChild(createWidget<ScrewBlack>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
|
addChild(createWidget<ScrewBlack>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, RACK_GRID_HEIGHT - RACK_GRID_WIDTH)));
|
||||||
|
|
||||||
addOutput(createOutput<PJ301MPort>(Vec(box.size.x - RACK_GRID_WIDTH * 5/2,
|
addOutput(createOutput<PJ301MPort>(Vec(box.size.x - RACK_GRID_WIDTH * 5/2,
|
||||||
RACK_GRID_HEIGHT - RACK_GRID_WIDTH - padding * 1),
|
RACK_GRID_HEIGHT - RACK_GRID_WIDTH - padding * 2),
|
||||||
module, 0));
|
module, 0));
|
||||||
|
|
||||||
addOutput(createOutput<PJ301MPort>(Vec(box.size.x - RACK_GRID_WIDTH * 5/2,
|
addOutput(createOutput<PJ301MPort>(Vec(box.size.x - RACK_GRID_WIDTH * 5/2,
|
||||||
RACK_GRID_HEIGHT - RACK_GRID_WIDTH - padding * 2),
|
RACK_GRID_HEIGHT - RACK_GRID_WIDTH - padding * 1),
|
||||||
module, 1));
|
module, 1));
|
||||||
|
|
||||||
|
if (m != nullptr)
|
||||||
|
{
|
||||||
|
AudioFileListWidget* const listw = new AudioFileListWidget(m);
|
||||||
|
listw->box.pos.x = 0;
|
||||||
|
listw->box.pos.y = 36;
|
||||||
|
listw->box.size.x = box.size.x;
|
||||||
|
listw->box.size.y = box.size.y / 2 - 20;
|
||||||
|
addChild(listw);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw(const DrawArgs& args) override
|
void draw(const DrawArgs& args) override
|
||||||
|
@ -457,6 +594,8 @@ struct AudioFileWidget : ModuleWidget {
|
||||||
if (path == nullptr)
|
if (path == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
module->currentFile = path;
|
||||||
|
module->fileChanged = true;
|
||||||
module->fCarlaPluginDescriptor->set_custom_data(module->fCarlaPluginHandle, "file", path);
|
module->fCarlaPluginDescriptor->set_custom_data(module->fCarlaPluginHandle, "file", path);
|
||||||
std::free(path);
|
std::free(path);
|
||||||
});
|
});
|
||||||
|
|
|
@ -734,7 +734,7 @@ BASE_FLAGS += -I../src
|
||||||
BASE_FLAGS += -I../src/Rack/include
|
BASE_FLAGS += -I../src/Rack/include
|
||||||
BASE_FLAGS += -I../src/Rack/include/dsp
|
BASE_FLAGS += -I../src/Rack/include/dsp
|
||||||
BASE_FLAGS += -I../src/Rack/dep/include
|
BASE_FLAGS += -I../src/Rack/dep/include
|
||||||
# # BASE_FLAGS += -I../src/Rack/dep/filesystem/include
|
BASE_FLAGS += -I../src/Rack/dep/filesystem/include
|
||||||
# # BASE_FLAGS += -I../src/Rack/dep/fuzzysearchdatabase/src
|
# # BASE_FLAGS += -I../src/Rack/dep/fuzzysearchdatabase/src
|
||||||
BASE_FLAGS += -I../src/Rack/dep/glfw/include
|
BASE_FLAGS += -I../src/Rack/dep/glfw/include
|
||||||
BASE_FLAGS += -I../src/Rack/dep/nanosvg/src
|
BASE_FLAGS += -I../src/Rack/dep/nanosvg/src
|
||||||
|
@ -771,6 +771,10 @@ ifeq ($(NOPLUGINS),true)
|
||||||
BASE_FLAGS += -DNOPLUGINS
|
BASE_FLAGS += -DNOPLUGINS
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(shell $(PKG_CONFIG) --exists sndfile && echo true),true)
|
||||||
|
BASE_FLAGS += -DHAVE_SNDFILE
|
||||||
|
endif
|
||||||
|
|
||||||
BUILD_C_FLAGS += -std=gnu11
|
BUILD_C_FLAGS += -std=gnu11
|
||||||
BUILD_C_FLAGS += -fno-finite-math-only
|
BUILD_C_FLAGS += -fno-finite-math-only
|
||||||
BUILD_CXX_FLAGS += -fno-finite-math-only
|
BUILD_CXX_FLAGS += -fno-finite-math-only
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue