diff options
Diffstat (limited to 'plugins/eg-sampler.lv2')
-rw-r--r-- | plugins/eg-sampler.lv2/atom_sink.h | 23 | ||||
-rw-r--r-- | plugins/eg-sampler.lv2/manifest.ttl.in | 2 | ||||
-rw-r--r-- | plugins/eg-sampler.lv2/meson.build | 82 | ||||
-rw-r--r-- | plugins/eg-sampler.lv2/peaks.h | 34 | ||||
-rw-r--r-- | plugins/eg-sampler.lv2/sampler.c | 182 | ||||
-rw-r--r-- | plugins/eg-sampler.lv2/sampler_ui.c | 55 | ||||
-rw-r--r-- | plugins/eg-sampler.lv2/uris.h | 34 | ||||
l--------- | plugins/eg-sampler.lv2/waf | 1 | ||||
-rw-r--r-- | plugins/eg-sampler.lv2/wscript | 64 |
9 files changed, 249 insertions, 228 deletions
diff --git a/plugins/eg-sampler.lv2/atom_sink.h b/plugins/eg-sampler.lv2/atom_sink.h index 57035e1..3319767 100644 --- a/plugins/eg-sampler.lv2/atom_sink.h +++ b/plugins/eg-sampler.lv2/atom_sink.h @@ -1,22 +1,9 @@ -/* - Copyright 2016 David Robillard <d@drobilla.net> +// Copyright 2016 David Robillard <d@drobilla.net> +// SPDX-License-Identifier: ISC - 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. - - THIS 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. -*/ - -#include "lv2/atom/atom.h" -#include "lv2/atom/forge.h" -#include "lv2/atom/util.h" +#include <lv2/atom/atom.h> +#include <lv2/atom/forge.h> +#include <lv2/atom/util.h> #include <stdint.h> #include <string.h> diff --git a/plugins/eg-sampler.lv2/manifest.ttl.in b/plugins/eg-sampler.lv2/manifest.ttl.in index 8a01428..e688256 100644 --- a/plugins/eg-sampler.lv2/manifest.ttl.in +++ b/plugins/eg-sampler.lv2/manifest.ttl.in @@ -15,5 +15,5 @@ <http://lv2plug.in/plugins/eg-sampler#ui> a ui:GtkUI ; - ui:binary <sampler_ui@LIB_EXT@> ; + lv2:binary <sampler_ui@LIB_EXT@> ; rdfs:seeAlso <sampler.ttl> . diff --git a/plugins/eg-sampler.lv2/meson.build b/plugins/eg-sampler.lv2/meson.build new file mode 100644 index 0000000..a0f8799 --- /dev/null +++ b/plugins/eg-sampler.lv2/meson.build @@ -0,0 +1,82 @@ +# Copyright 2022 David Robillard <d@drobilla.net> +# SPDX-License-Identifier: 0BSD OR ISC + +plugin_sources = files('sampler.c') +ui_sources = files('sampler_ui.c') +bundle_name = 'eg-sampler.lv2' +data_filenames = ['manifest.ttl.in', 'sampler.ttl', 'click.wav'] + +samplerate_dep = dependency( + 'samplerate', + include_type: 'system', + required: get_option('plugins'), + version: '>= 0.1.0', +) + +sndfile_dep = dependency( + 'sndfile', + include_type: 'system', + required: get_option('plugins'), + version: '>= 1.0.0', +) + +gtk2_dep = dependency( + 'gtk+-2.0', + include_type: 'system', + required: get_option('plugins'), + version: '>= 2.18.0', +) + +if samplerate_dep.found() and sndfile_dep.found() + module = shared_library( + 'sampler', + plugin_sources, + c_args: c_suppressions, + dependencies: [lv2_dep, m_dep, samplerate_dep, sndfile_dep], + gnu_symbol_visibility: 'hidden', + implicit_include_directories: false, + install: true, + install_dir: lv2dir / bundle_name, + name_prefix: '', + ) + + extension = '.' + module.full_path().split('.')[-1] + config = configuration_data({'LIB_EXT': extension}) + + foreach filename : data_filenames + if filename.endswith('.in') + configure_file( + configuration: config, + input: files(filename), + install_dir: lv2dir / bundle_name, + output: filename.substring(0, -3), + ) + else + configure_file( + copy: true, + input: files(filename), + install_dir: lv2dir / bundle_name, + output: filename, + ) + endif + endforeach + + if gtk2_dep.found() + ui_suppressions = c_suppressions + if cc.get_id() == 'gcc' + ui_suppressions += ['-Wno-strict-overflow'] + endif + + shared_library( + 'sampler_ui', + ui_sources, + c_args: ui_suppressions, + dependencies: [lv2_dep, gtk2_dep], + gnu_symbol_visibility: 'hidden', + implicit_include_directories: false, + install: true, + install_dir: lv2dir / bundle_name, + name_prefix: '', + ) + endif +endif diff --git a/plugins/eg-sampler.lv2/peaks.h b/plugins/eg-sampler.lv2/peaks.h index ca5328d..ff91546 100644 --- a/plugins/eg-sampler.lv2/peaks.h +++ b/plugins/eg-sampler.lv2/peaks.h @@ -1,19 +1,5 @@ -/* - LV2 audio peaks utilities - Copyright 2016 David Robillard <d@drobilla.net> - - 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. - - THIS 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. -*/ +// Copyright 2016 David Robillard <d@drobilla.net> +// SPDX-License-Identifier: ISC #ifndef PEAKS_H_INCLUDED #define PEAKS_H_INCLUDED @@ -28,10 +14,10 @@ requested, with reasonably sized incremental updates sent over plugin ports. */ -#include "lv2/atom/atom.h" -#include "lv2/atom/forge.h" -#include "lv2/atom/util.h" -#include "lv2/urid/urid.h" +#include <lv2/atom/atom.h> +#include <lv2/atom/forge.h> +#include <lv2/atom/util.h> +#include <lv2/urid/urid.h> #include <math.h> #include <stdbool.h> @@ -153,11 +139,11 @@ peaks_sender_send(PeaksSender* sender, // eg:offset = OFFSET lv2_atom_forge_key(forge, uris->peaks_offset); - lv2_atom_forge_int(forge, sender->current_offset); + lv2_atom_forge_int(forge, (int32_t)sender->current_offset); // eg:total = TOTAL lv2_atom_forge_key(forge, uris->peaks_total); - lv2_atom_forge_int(forge, sender->n_peaks); + lv2_atom_forge_int(forge, (int32_t)sender->n_peaks); // eg:magnitudes = Vector<Float>(PEAK, PEAK, ...) lv2_atom_forge_key(forge, uris->peaks_magnitudes); @@ -166,11 +152,11 @@ peaks_sender_send(PeaksSender* sender, forge, &vec_frame, sizeof(float), uris->atom_Float); // Calculate how many peaks to send this update - const uint32_t chunk_size = MAX(1u, sender->n_samples / sender->n_peaks); + const uint32_t chunk_size = MAX(1U, sender->n_samples / sender->n_peaks); const uint32_t space = forge->size - forge->offset; const uint32_t remaining = sender->n_peaks - sender->current_offset; const uint32_t n_update = - MIN(remaining, MIN(n_frames / 4u, space / sizeof(float))); + MIN(remaining, MIN(n_frames / 4U, space / sizeof(float))); // Calculate peak (maximum magnitude) for each chunk for (uint32_t i = 0; i < n_update; ++i) { diff --git a/plugins/eg-sampler.lv2/sampler.c b/plugins/eg-sampler.lv2/sampler.c index 1efad3c..6fc04c5 100644 --- a/plugins/eg-sampler.lv2/sampler.c +++ b/plugins/eg-sampler.lv2/sampler.c @@ -1,38 +1,25 @@ -/* - LV2 Sampler Example Plugin - Copyright 2011-2016 David Robillard <d@drobilla.net> - Copyright 2011 Gabriel M. Beddingfield <gabriel@teuton.org> - Copyright 2011 James Morris <jwm.art.net@gmail.com> - - 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. - - THIS 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. -*/ +// Copyright 2011-2016 David Robillard <d@drobilla.net> +// Copyright 2011 Gabriel M. Beddingfield <gabriel@teuton.org> +// Copyright 2011 James Morris <jwm.art.net@gmail.com> +// SPDX-License-Identifier: ISC #include "atom_sink.h" #include "peaks.h" #include "uris.h" -#include "lv2/atom/atom.h" -#include "lv2/atom/forge.h" -#include "lv2/atom/util.h" -#include "lv2/core/lv2.h" -#include "lv2/core/lv2_util.h" -#include "lv2/log/log.h" -#include "lv2/log/logger.h" -#include "lv2/midi/midi.h" -#include "lv2/state/state.h" -#include "lv2/urid/urid.h" -#include "lv2/worker/worker.h" - +#include <lv2/atom/atom.h> +#include <lv2/atom/forge.h> +#include <lv2/atom/util.h> +#include <lv2/core/lv2.h> +#include <lv2/core/lv2_util.h> +#include <lv2/log/log.h> +#include <lv2/log/logger.h> +#include <lv2/midi/midi.h> +#include <lv2/state/state.h> +#include <lv2/urid/urid.h> +#include <lv2/worker/worker.h> + +#include <samplerate.h> #include <sndfile.h> #include <math.h> @@ -80,6 +67,7 @@ typedef struct { bool activated; bool gain_changed; bool sample_changed; + int sample_rate; } Sampler; /** @@ -96,6 +84,23 @@ typedef struct { } SampleMessage; /** + Convert an interleaved audio buffer to mono. + + This simply ignores the data on all channels but the first. +*/ +static sf_count_t +convert_to_mono(float* data, sf_count_t num_input_frames, uint32_t channels) +{ + sf_count_t num_output_frames = 0; + + for (sf_count_t i = 0; i < num_input_frames * channels; i += channels) { + data[num_output_frames++] = data[i]; + } + + return num_output_frames; +} + +/** Load a new sample and return it. Since this is of course not a real-time safe action, this is called in the @@ -103,7 +108,7 @@ typedef struct { not modified. */ static Sample* -load_sample(LV2_Log_Logger* logger, const char* path) +load_sample(LV2_Log_Logger* logger, const char* path, const int sample_rate) { lv2_log_trace(logger, "Loading %s\n", path); @@ -115,9 +120,8 @@ load_sample(LV2_Log_Logger* logger, const char* path) bool error = true; if (!sndfile || !info->frames) { lv2_log_error(logger, "Failed to open %s\n", path); - } else if (info->channels != 1) { - lv2_log_error(logger, "%s has %d channels\n", path, info->channels); - } else if (!(data = (float*)malloc(sizeof(float) * info->frames))) { + } else if (!(data = (float*)malloc(sizeof(float) * info->frames * + info->channels))) { lv2_log_error(logger, "Failed to allocate memory for sample\n"); } else { error = false; @@ -130,10 +134,51 @@ load_sample(LV2_Log_Logger* logger, const char* path) return NULL; } - sf_seek(sndfile, 0ul, SEEK_SET); - sf_read_float(sndfile, data, info->frames); + sf_seek(sndfile, 0UL, SEEK_SET); + sf_read_float(sndfile, data, info->frames * info->channels); sf_close(sndfile); + if (info->channels != 1) { + info->frames = convert_to_mono(data, info->frames, info->channels); + info->channels = 1; + } + + if (info->samplerate != sample_rate) { + lv2_log_trace(logger, + "Converting from %d Hz to %d Hz\n", + info->samplerate, + sample_rate); + + const double src_ratio = (double)sample_rate / (double)info->samplerate; + const double output_length = ceil((double)info->frames * src_ratio); + const long output_frames = (long)output_length; + float* const output_buffer = (float*)malloc(sizeof(float) * output_frames); + + SRC_DATA src_data = { + data, + output_buffer, + info->frames, + output_frames, + 0, + 0, + 0, + src_ratio, + }; + + if (src_simple(&src_data, SRC_SINC_BEST_QUALITY, 1) != 0) { + lv2_log_error(logger, "Sample rate conversion failed\n"); + free(output_buffer); + } else { + // Replace original data with converted buffer + free(data); + data = output_buffer; + info->frames = src_data.output_frames_gen; + } + } else { + lv2_log_trace( + logger, "Sample matches the current rate of %d Hz\n", sample_rate); + } + // Fill sample struct and return it sample->data = data; sample->path = (char*)malloc(path_len + 1); @@ -184,7 +229,7 @@ work(LV2_Handle instance, } // Load sample. - Sample* sample = load_sample(&self->logger, path); + Sample* sample = load_sample(&self->logger, path, self->sample_rate); if (sample) { // Send new sample to run() to be applied respond(handle, sizeof(Sample*), &sample); @@ -204,9 +249,9 @@ work(LV2_Handle instance, static LV2_Worker_Status work_response(LV2_Handle instance, uint32_t size, const void* data) { - Sampler* self = (Sampler*)instance; - Sample* old_sample = self->sample; - Sample* new_sample = *(Sample* const*)data; + Sampler* self = (Sampler*)instance; + Sample* old_sample = self->sample; + const Sample* new_sample = *(Sample* const*)data; // Install the new sample self->sample = *(Sample* const*)data; @@ -280,8 +325,9 @@ instantiate(const LV2_Descriptor* descriptor, lv2_atom_forge_init(&self->forge, self->map); peaks_sender_init(&self->psend, self->map); - self->gain = 1.0f; - self->gain_dB = 0.0f; + self->gain = 1.0f; + self->gain_dB = 0.0f; + self->sample_rate = (int)rate; return (LV2_Handle)self; } @@ -307,7 +353,7 @@ deactivate(LV2_Handle instance) } /** Define a macro for converting a gain in dB to a coefficient. */ -#define DB_CO(g) ((g) > -90.0f ? powf(10.0f, (g)*0.05f) : 0.0f) +#define DB_CO(g) ((g) > -90.0f ? powf(10.0f, (g) * 0.05f) : 0.0f) /** Handle an incoming event in the audio thread. @@ -348,7 +394,9 @@ handle_event(Sampler* self, LV2_Atom_Event* ev) if (!property) { lv2_log_error(&self->logger, "Set message with no property\n"); return; - } else if (property->type != uris->atom_URID) { + } + + if (property->type != uris->atom_URID) { lv2_log_error(&self->logger, "Set property is not a URID\n"); return; } @@ -438,20 +486,19 @@ run(LV2_Handle instance, uint32_t sample_count) // Start a sequence in the notify output port. lv2_atom_forge_sequence_head(&self->forge, &self->notify_frame, 0); - // Send update to UI if gain or sample has changed due to state restore - if (self->gain_changed || self->sample_changed) { + // Send update to UI if gain has changed due to state restore + if (self->gain_changed) { lv2_atom_forge_frame_time(&self->forge, 0); + write_set_gain(&self->forge, &self->uris, self->gain_dB); + self->gain_changed = false; + } - if (self->gain_changed) { - write_set_gain(&self->forge, &self->uris, self->gain_dB); - self->gain_changed = false; - } - - if (self->sample_changed) { - write_set_file( - &self->forge, &self->uris, self->sample->path, self->sample->path_len); - self->sample_changed = false; - } + // Send update to UI if sample has changed due to state restore + if (self->sample_changed) { + lv2_atom_forge_frame_time(&self->forge, 0); + write_set_file( + &self->forge, &self->uris, self->sample->path, self->sample->path_len); + self->sample_changed = false; } // Iterate over incoming events, emitting audio along the way @@ -461,7 +508,7 @@ run(LV2_Handle instance, uint32_t sample_count) render(self, self->frame_offset, ev->time.frames); /* Update current frame offset to this event's time. This is stored in - the instance because it is used for sychronous worker event + the instance because it is used for synchronous worker event execution. This allows a sample load event to be executed with sample accuracy when running in a non-realtime context (such as exporting a session). */ @@ -553,10 +600,13 @@ restore(LV2_Handle instance, uint32_t valflags = 0; const void* value = retrieve(handle, self->uris.eg_sample, &size, &type, &valflags); + if (!value) { lv2_log_error(&self->logger, "Missing eg:sample\n"); return LV2_STATE_ERR_NO_PROPERTY; - } else if (type != self->uris.atom_Path) { + } + + if (type != self->uris.atom_Path) { lv2_log_error(&self->logger, "Non-path eg:sample\n"); return LV2_STATE_ERR_BAD_TYPE; } @@ -569,7 +619,7 @@ restore(LV2_Handle instance, if (!self->activated || !schedule) { // No scheduling available, load sample immediately lv2_log_trace(&self->logger, "Synchronous restore\n"); - Sample* sample = load_sample(&self->logger, path); + Sample* sample = load_sample(&self->logger, path, self->sample_rate); if (sample) { free_sample(self, self->sample); self->sample = sample; @@ -593,11 +643,14 @@ restore(LV2_Handle instance, // Get param:gain from state value = retrieve(handle, self->uris.param_gain, &size, &type, &valflags); + if (!value) { // Not an error, since older versions did not save this property lv2_log_note(&self->logger, "Missing param:gain\n"); return LV2_STATE_SUCCESS; - } else if (type != self->uris.atom_Float) { + } + + if (type != self->uris.atom_Float) { lv2_log_error(&self->logger, "Non-float param:gain\n"); return LV2_STATE_ERR_BAD_TYPE; } @@ -614,11 +667,15 @@ extension_data(const char* uri) { static const LV2_State_Interface state = {save, restore}; static const LV2_Worker_Interface worker = {work, work_response, NULL}; + if (!strcmp(uri, LV2_STATE__interface)) { return &state; - } else if (!strcmp(uri, LV2_WORKER__interface)) { + } + + if (!strcmp(uri, LV2_WORKER__interface)) { return &worker; } + return NULL; } @@ -631,8 +688,7 @@ static const LV2_Descriptor descriptor = {EG_SAMPLER_URI, cleanup, extension_data}; -LV2_SYMBOL_EXPORT -const LV2_Descriptor* +LV2_SYMBOL_EXPORT const LV2_Descriptor* lv2_descriptor(uint32_t index) { return index == 0 ? &descriptor : NULL; diff --git a/plugins/eg-sampler.lv2/sampler_ui.c b/plugins/eg-sampler.lv2/sampler_ui.c index 533e720..769dde0 100644 --- a/plugins/eg-sampler.lv2/sampler_ui.c +++ b/plugins/eg-sampler.lv2/sampler_ui.c @@ -1,33 +1,19 @@ -/* - LV2 Sampler Example Plugin UI - Copyright 2011-2016 David Robillard <d@drobilla.net> - - 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. - - THIS 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. -*/ +// Copyright 2011-2016 David Robillard <d@drobilla.net> +// SPDX-License-Identifier: ISC #include "peaks.h" #include "uris.h" -#include "lv2/atom/atom.h" -#include "lv2/atom/forge.h" -#include "lv2/atom/util.h" -#include "lv2/core/lv2.h" -#include "lv2/core/lv2_util.h" -#include "lv2/log/log.h" -#include "lv2/log/logger.h" -#include "lv2/midi/midi.h" -#include "lv2/ui/ui.h" -#include "lv2/urid/urid.h" +#include <lv2/atom/atom.h> +#include <lv2/atom/forge.h> +#include <lv2/atom/util.h> +#include <lv2/core/lv2.h> +#include <lv2/core/lv2_util.h> +#include <lv2/log/log.h> +#include <lv2/log/logger.h> +#include <lv2/midi/midi.h> +#include <lv2/ui/ui.h> +#include <lv2/urid/urid.h> #include <cairo.h> #include <gdk/gdk.h> @@ -197,13 +183,13 @@ on_canvas_expose(GtkWidget* widget, GdkEventExpose* event, gpointer data) // Draw line through top peaks for (int i = 0; i < n_peaks; ++i) { const float peak = peaks[i]; - cairo_line_to(cr, i * scale, mid_y + (peak / 2.0f) * size.height); + cairo_line_to(cr, i * scale, mid_y + ((peak / 2.0f) * size.height)); } // Continue through bottom peaks for (int i = n_peaks - 1; i >= 0; --i) { const float peak = peaks[i]; - cairo_line_to(cr, i * scale, mid_y - (peak / 2.0f) * size.height); + cairo_line_to(cr, i * scale, mid_y - ((peak / 2.0f) * size.height)); } // Close shape @@ -365,7 +351,7 @@ port_event(LV2UI_Handle handle, const LV2_Atom_Object* obj = (const LV2_Atom_Object*)atom; if (obj->body.otype == ui->uris.patch_Set) { const char* path = read_set_file(&ui->uris, obj); - if (path && (!ui->filename || strcmp(path, ui->filename))) { + if (path && (!ui->filename || !!strcmp(path, ui->filename))) { g_free(ui->filename); ui->filename = g_strdup(path); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(ui->file_button), @@ -435,7 +421,7 @@ ui_hide(LV2UI_Handle handle) static int ui_idle(LV2UI_Handle handle) { - SamplerUI* ui = (SamplerUI*)handle; + const SamplerUI* ui = (const SamplerUI*)handle; if (ui->window) { gtk_main_iteration_do(false); } @@ -447,11 +433,15 @@ extension_data(const char* uri) { static const LV2UI_Show_Interface show = {ui_show, ui_hide}; static const LV2UI_Idle_Interface idle = {ui_idle}; + if (!strcmp(uri, LV2_UI__showInterface)) { return &show; - } else if (!strcmp(uri, LV2_UI__idleInterface)) { + } + + if (!strcmp(uri, LV2_UI__idleInterface)) { return &idle; } + return NULL; } @@ -461,8 +451,7 @@ static const LV2UI_Descriptor descriptor = {SAMPLER_UI_URI, port_event, extension_data}; -LV2_SYMBOL_EXPORT -const LV2UI_Descriptor* +LV2_SYMBOL_EXPORT const LV2UI_Descriptor* lv2ui_descriptor(uint32_t index) { return index == 0 ? &descriptor : NULL; diff --git a/plugins/eg-sampler.lv2/uris.h b/plugins/eg-sampler.lv2/uris.h index d7201fa..9922f51 100644 --- a/plugins/eg-sampler.lv2/uris.h +++ b/plugins/eg-sampler.lv2/uris.h @@ -1,30 +1,16 @@ -/* - LV2 Sampler Example Plugin - Copyright 2011-2016 David Robillard <d@drobilla.net> - - 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. - - THIS 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. -*/ +// Copyright 2011-2016 David Robillard <d@drobilla.net> +// SPDX-License-Identifier: ISC #ifndef SAMPLER_URIS_H #define SAMPLER_URIS_H -#include "lv2/atom/atom.h" -#include "lv2/atom/forge.h" -#include "lv2/atom/util.h" -#include "lv2/midi/midi.h" -#include "lv2/parameters/parameters.h" -#include "lv2/patch/patch.h" -#include "lv2/urid/urid.h" +#include <lv2/atom/atom.h> +#include <lv2/atom/forge.h> +#include <lv2/atom/util.h> +#include <lv2/midi/midi.h> +#include <lv2/parameters/parameters.h> +#include <lv2/patch/patch.h> +#include <lv2/urid/urid.h> #include <stdint.h> #include <stdio.h> @@ -178,7 +164,7 @@ read_set_file(const SamplerURIs* uris, const LV2_Atom_Object* obj) return NULL; } - return (const char*)LV2_ATOM_BODY_CONST(value); + return (const char*)&value[1]; } #endif /* SAMPLER_URIS_H */ diff --git a/plugins/eg-sampler.lv2/waf b/plugins/eg-sampler.lv2/waf deleted file mode 120000 index 59a1ac9..0000000 --- a/plugins/eg-sampler.lv2/waf +++ /dev/null @@ -1 +0,0 @@ -../../waf
\ No newline at end of file diff --git a/plugins/eg-sampler.lv2/wscript b/plugins/eg-sampler.lv2/wscript deleted file mode 100644 index 8c640c1..0000000 --- a/plugins/eg-sampler.lv2/wscript +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python -from waflib.extras import autowaf as autowaf -import re - -# Variables for 'waf dist' -APPNAME = 'eg-sampler.lv2' -VERSION = '1.0.0' - -# Mandatory variables -top = '.' -out = 'build' - -def options(opt): - opt.load('compiler_c') - opt.load('lv2') - autowaf.set_options(opt) - -def configure(conf): - conf.load('compiler_c', cache=True) - conf.load('lv2', cache=True) - conf.load('autowaf', cache=True) - - conf.check_pkg('lv2 >= 1.2.1', uselib_store='LV2') - conf.check_pkg('sndfile >= 1.0.0', uselib_store='SNDFILE') - conf.check_pkg('gtk+-2.0 >= 2.18.0', - uselib_store='GTK2', - system=True, - mandatory=False) - conf.check(features='c cshlib', lib='m', uselib_store='M', mandatory=False) - -def build(bld): - bundle = 'eg-sampler.lv2' - - # Build manifest.ttl by substitution (for portable lib extension) - bld(features = 'subst', - source = 'manifest.ttl.in', - target = 'lv2/%s/%s' % (bundle, 'manifest.ttl'), - install_path = '${LV2DIR}/%s' % bundle, - LIB_EXT = bld.env.LV2_LIB_EXT) - - # Copy other data files to build bundle (build/eg-sampler.lv2) - for i in ['sampler.ttl', 'click.wav']: - bld(features = 'subst', - is_copy = True, - source = i, - target = 'lv2/%s/%s' % (bundle, i), - install_path = '${LV2DIR}/%s' % bundle) - - # Build plugin library - obj = bld(features = 'c cshlib lv2lib', - source = 'sampler.c', - name = 'sampler', - target = 'lv2/%s/sampler' % bundle, - install_path = '${LV2DIR}/%s' % bundle, - use = ['M', 'SNDFILE', 'LV2']) - - # Build UI library - if bld.env.HAVE_GTK2: - obj = bld(features = 'c cshlib lv2lib', - source = 'sampler_ui.c', - name = 'sampler_ui', - target = 'lv2/%s/sampler_ui' % bundle, - install_path = '${LV2DIR}/%s' % bundle, - use = ['GTK2', 'LV2']) |