/* * DAZ - Digital Audio with Zero dependencies * Copyright (C) 2013 Filipe Coelho * Copyright (C) 2013 Harry van Haaren * Copyright (C) 2013 Jonathan Moore Liles * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this * permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef DAZ_UI_H_INCLUDED #define DAZ_UI_H_INCLUDED #include "daz-common.h" #ifdef __cplusplus extern "C" { #endif /*! * @defgroup DAZPluginAPI * @{ */ /*! * @defgroup UiFeatures UI Features * * A list of UI features or hints. * * Custom features are allowed, as long as they are lowercase and contain ASCII characters only. * The host can decide if it can load the UI or not based on this information. * * Multiple features can be set by using ":" in between them. * @{ */ /*! * Supports sample rate changes on-the-fly. * * If unset, the host will re-initiate the UI when the sample rate changes. */ #define UI_FEATURE_SAMPLE_RATE_CHANGES ":sample_rate_changes" /*! * Uses open_file() and/or save_file() functions. */ #define UI_FEATURE_OPEN_SAVE ":open_save" /*! * Uses send_plugin_msg() function. */ #define UI_FEATURE_SEND_MSG ":send_msg" /** @} */ /*! * @defgroup HostDispatcherOpcodes Host Dispatcher Opcodes * * Opcodes dispatched by the UI to report and request information from the host. * * The opcodes are mapped into MappedValue by the host. * @see HostDescriptor::dispatcher() * @{ */ /*! * Tell the host the UI can't be shown, uses nothing. */ #define HOST_OPCODE_UI_UNAVAILABLE "ui_unavailable" /** @} */ /*! * @defgroup UiDispatcherOpcodes UI Dispatcher Opcodes * * Opcodes dispatched by the host to report changes to the UI. * * The opcodes are mapped into MappedValue by the host. * @see UiDescriptor::dispatcher() * @{ */ /*! * Message received, uses value as size, ptr for contents. */ #define UI_OPCODE_MSG_RECEIVED "msg_received" /*! * Audio sample rate changed, uses opt, returns 1 if supported. * * @see UiHostDescriptor::sample_rate */ #define UI_OPCODE_SAMPLE_RATE_CHANGED "sample_rate_changed" /*! * Offline mode changed, uses value (0=off, 1=on). * * @see UiHostDescriptor::is_offline */ #define UI_OPCODE_OFFLINE_CHANGED "offline_changed" /*! * UI title changed, uses ptr. * * @see UiHostDescriptor::ui_title */ #define UI_OPCODE_TITLE_CHANGED "ui_title_thanged" /** @} */ /*! * Opaque UI handle. */ typedef void* UiHandle; /*! * Opaque UI host handle. */ typedef void* UiHostHandle; /*! * UiHostDescriptor */ typedef struct { /*! * Opaque UI host handle. */ UiHostHandle handle; /*! * Full filepath to the UI *.daz bundle. */ const char* bundle_dir; /*! * Host desired UI title. */ const char* ui_title; /*! * Current audio sample rate. */ double sample_rate; /*! * Wherever the host is currently processing offline. */ bool is_offline; /* probably better if only allowed during instantiate() */ mapped_value_t (*map_value)(UiHostHandle handle, const char* valueStr); const char* (*unmap_value)(UiHostHandle handle, mapped_value_t value); /*! * Inform the host about a parameter change. */ void (*parameter_changed)(UiHostHandle handle, uint32_t index, float value); /*! * Inform the host about a/the MIDI program change. * * @note: Only synths make use the of @a channel argument. */ void (*midi_program_changed)(UiHostHandle handle, uint8_t channel, uint32_t bank, uint32_t program); /*! * Inform the host the UI has been closed. * * After calling this the UI should not do any operation and simply wait * until the host calls UiDescriptor::cleanup(). */ void (*closed)(UiHostHandle handle); /* TODO: add some msgbox call */ /* ui must set "opensave" feature to use these */ const char* (*open_file)(UiHostHandle handle, bool isDir, const char* title, const char* filter); const char* (*save_file)(UiHostHandle handle, bool isDir, const char* title, const char* filter); /* ui must set "sendmsg" feature to use this */ bool (*send_plugin_msg)(UiHostHandle handle, const void* data, size_t size); /* uses HostDispatcherOpcodes */ intptr_t (*dispatcher)(UiHostHandle handle, mapped_value_t opcode, int32_t index, intptr_t value, void* ptr, float opt); } UiHostDescriptor; /*! * UiDescriptor */ typedef struct { const int api; /*!< Must be set to DAZ_API_VERSION. */ const char* const features; /*!< Features. @see UiFeatures */ const char* const author; /*!< Author this UI applies to. */ const char* const label; /*!< Label this UI applies to, can only contain letters, numbers and "_". May be null, in which case represents all UIs for @a maker. */ UiHandle (*instantiate)(const UiHostDescriptor* host); void (*cleanup)(UiHandle handle); void (*show)(UiHandle handle, bool show); void (*idle)(UiHandle handle); void (*set_parameter)(UiHandle handle, uint32_t index, float value); void (*set_midi_program)(UiHandle handle, uint8_t channel, uint32_t bank, uint32_t program); void (*set_state)(UiHandle handle, const char* state); /* uses UiDispatcherOpcodes */ intptr_t (*dispatcher)(UiHandle handle, mapped_value_t opcode, int32_t index, intptr_t value, void* ptr, float opt); } UiDescriptor; /*! * UI entry point function used by the UI. */ DAZ_SYMBOL_EXPORT const UiDescriptor* daz_get_ui_descriptor(uint32_t index); /*! * UI entry point function used by the host. */ typedef const UiDescriptor* (*daz_get_ui_descriptor_fn)(uint32_t index); /** @} */ #ifdef __cplusplus } /* extern "C" */ #endif #endif /* DAZ_UI_H_INCLUDED */