essej 8bbddf66e9 git subrepo clone (merge) https://github.com/free-audio/clap deps/clap-juce-extensions/clap-libs/clap
subrepo:
  subdir:   "deps/clap-juce-extensions/clap-libs/clap"
  merged:   "3189bdfaf"
upstream:
  origin:   "https://github.com/free-audio/clap"
  branch:   "main"
  commit:   "3189bdfaf"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo.git"
  commit:   "2f68596"
2022-06-14 21:34:50 -04:00

86 lines
2.9 KiB
C

#pragma once
#include "../../plugin.h"
#include "../../string-sizes.h"
static CLAP_CONSTEXPR const char CLAP_EXT_FILE_REFERENCE[] = "clap.file-reference.draft/0";
#ifdef __cplusplus
extern "C" {
#endif
/// @page File Reference
///
/// This extension provides a way for the host to know about files which are used
/// by the plugin, like a wavetable, a sample, ...
///
/// The host can then:
/// - collect and save
/// - search for missing files by using:
/// - filename
/// - hash
/// - file size
/// - be aware that some external file references are marked as dirty and needs to be saved.
///
/// Regarding the hashing algorithm, as of 2022 BLAKE3 seems to be the best choice in regards to
/// performances and robustness while also providing a very small pure C library with permissive
/// licensing. For more info see https://github.com/BLAKE3-team/BLAKE3
///
/// This extension only expose one hashing algorithm on purpose.
// This describes a file currently used by the plugin
typedef struct clap_file_reference {
clap_id resource_id;
bool belongs_to_plugin_collection;
size_t path_capacity; // [in] the number of bytes reserved in path
size_t path_size; // [out] the actual length of the path, can be bigger than path_capacity
char *path; // [in,out] path to the file on the disk, must be null terminated, and maybe
// truncated if the capacity is less than the size
} clap_file_reference_t;
typedef struct clap_plugin_file_reference {
// returns the number of file reference this plugin has
// [main-thread]
uint32_t (*count)(const clap_plugin_t *plugin);
// gets the file reference at index
// returns true on success
// [main-thread]
bool (*get)(const clap_plugin_t *plugin, uint32_t index, clap_file_reference_t *file_reference);
// This method can be called even if the file is missing.
// So the plugin is encouraged to store the digest in its state.
//
// digest is an array of 32 bytes.
//
// [main-thread]
bool (*get_blake3_digest)(const clap_plugin_t *plugin, clap_id resource_id, uint8_t *digest);
// This method can be called even if the file is missing.
// So the plugin is encouraged to store the file's size in its state.
//
// [main-thread]
bool (*get_file_size)(const clap_plugin_t *plugin, clap_id resource_id, uint64_t *size);
// updates the path to a file reference
// [main-thread]
bool (*update_path)(const clap_plugin_t *plugin, clap_id resource_id, const char *path);
// [main-thread]
bool (*save_resources)(const clap_plugin_t *plugin);
} clap_plugin_file_reference_t;
typedef struct clap_host_file_reference {
// informs the host that the file references have changed, the host should schedule a full rescan
// [main-thread]
void (*changed)(const clap_host_t *host);
// [main-thread]
void (*set_dirty)(const clap_host_t *host, clap_id resource_id);
} clap_host_file_reference;
#ifdef __cplusplus
}
#endif