File ports
Supported bindings: ossia
File ports are currently only supported with the ossia binding.
They allow to specify that we want the content of a file. The host will take care of loading, mmaping, converting, etc... the file in the relevant format - as far as possible outside of DSP / processing threads.
Every file port should at least conform to the very basic following concept:
template <typename T>
concept file = requires(T t) {
t.filename;
};
template <typename T>
concept file_port = requires(T t) {
{ t.file } -> file;
};
Here is for instance a valid basic file port ; hosts will open a relevant file chooser:
struct my_file_port {
struct {
std::string filename;
} file;
};
Features
File watch
By adding a file_watch
flag to the class, the host environment will reload the file's data whenever a change is detected on disk.
Note that this has an obvious performance cost as the host must check regularly for changes: do not overdo it!
File filters
File ports should prompt the host to open a file chooser. One is generally only interested in a specific file type. This can be specified in the following ways:
General file filters
Here, the filter is a string of either of the following formats:
"*.jpg *.jpeg"
"JPEG Images (*.jpg *.jpeg)"
struct my_file_port : ... {
// Currently implemented:
// Any audio file that can be loaded by the host
static consteval auto filters() { return "CSV files (*.csv)"; }
};
Domain-specific file filters
This is for the case where you want a general kind of media and don't care specifically about the extension: for instance, for audio files you could have .wav, .aiff, .mp3, etc etc ; it is pointless to try to specify a whole list. Instead, the host knows which audio file formats it is able to load and should just be able to show its own audio-specific file chooser.
struct my_file_port : ... {
// Currently implemented:
// Any audio file that can be loaded by the host
static consteval auto filters() { enum { audio }; return audio; }
// Any midi file that can be loaded by the host
static consteval auto filters() { enum { midi }; return midi; }
// In the future:
static consteval auto filters() { enum { image }; return image; }
static consteval auto filters() { enum { video }; return video; }
};