*** HarryHaaren has quit IRC | 00:09 | |
*** Magnus_RM has quit IRC | 02:53 | |
*** tytel has joined #lv2 | 03:59 | |
*** tytel has quit IRC | 05:29 | |
*** tytel has joined #lv2 | 05:29 | |
*** falktx has joined #lv2 | 06:25 | |
*** tytel_ has joined #lv2 | 07:19 | |
*** tytel_ has quit IRC | 07:20 | |
*** tytel has quit IRC | 07:22 | |
*** ricardocrudo has joined #lv2 | 07:39 | |
*** tytel has joined #lv2 | 07:47 | |
*** edogawa has joined #lv2 | 07:55 | |
*** ventosus has joined #lv2 | 08:08 | |
*** edogawa has quit IRC | 08:08 | |
*** edogawa has joined #lv2 | 08:18 | |
*** tytel has quit IRC | 09:25 | |
*** tytel has joined #lv2 | 09:26 | |
*** tytel has quit IRC | 09:31 | |
*** tytel has joined #lv2 | 10:26 | |
*** ricardocrudo has quit IRC | 11:15 | |
*** ricardocrudo has joined #lv2 | 11:50 | |
falktx | someone did lv2 UIs using elementary | 13:18 |
---|---|---|
falktx | http://openmusickontrollers.github.io/lv2/about/ | 13:18 |
*** tytel has quit IRC | 13:26 | |
*** tytel has joined #lv2 | 13:26 | |
*** gianMOD has joined #lv2 | 13:27 | |
*** tytel has quit IRC | 13:30 | |
ventosus | falktx: s/someone/ventosus | 13:31 |
falktx | nice | 13:32 |
falktx | ventosus: does elementary support embedding ? | 13:32 |
ventosus | for emedding as X11UI you need libelementary >= 1.13.0, so yes | 13:33 |
ventosus | I use a wrapper header | 13:34 |
ventosus | https://github.com/OpenMusicKontrollers/eo_ui.lv2 | 13:34 |
ventosus | And you can embed a X11UI plugin into an elemetary host | 13:37 |
ventosus | Gtk embedding should be possible, too, not yet tried though | 13:39 |
falktx | I meant having elementary UIs embeded in other stuff. via X11 handle | 13:40 |
falktx | I see that you did all the work already, nice | 13:41 |
ventosus | falktx: yes, with the wrapper ^^, tested in jalv.gtkmm, ingen, ardour4, works nicely | 13:41 |
falktx | got a screenshot of the embed working? | 13:41 |
* ventosus will take a screenshot | 13:42 | |
*** ddom has joined #lv2 | 13:44 | |
ventosus | http://ibin.co/233tsfsDf2E3 | 13:47 |
falktx | nice | 13:53 |
falktx | so now we need a lv2 ui elementary type :) | 13:53 |
falktx | ventosus: your synthpod.lv2 link on page http://openmusickontrollers.github.io/lv2/synthpod/ gives 404 | 14:00 |
falktx | there's an extra ".lv2" suffix that is not correct | 14:00 |
ventosus | arg, thanks. | 14:02 |
falktx | ventosus: trying to build it now, I don't have libuv >= 1.0 in the latest debian... | 14:11 |
falktx | so probably neither would ubuntu | 14:11 |
*** edogawa_ has joined #lv2 | 14:24 | |
*** edogawa has quit IRC | 14:27 | |
ventosus | falktx: libuv <1.0 is not API-compatible with >= 1.0, iirc | 14:30 |
ventosus | I'm at 1.5.0 (ArchLinux) | 14:31 |
ventosus | I will eventually get rid of it (libuv) and base everything on libecore (elementary's main loop) | 14:32 |
*** sigma6 has joined #lv2 | 15:03 | |
*** gianMOD has quit IRC | 15:31 | |
*** edogawa_ is now known as edogawa | 15:31 | |
*** gianMOD has joined #lv2 | 15:31 | |
*** gianMOD has quit IRC | 15:36 | |
*** sigma6 has quit IRC | 16:09 | |
*** ddom has quit IRC | 16:22 | |
*** gianMOD has joined #lv2 | 16:32 | |
*** gianMOD has quit IRC | 16:38 | |
*** ricardocrudo has quit IRC | 16:59 | |
*** gianMOD has joined #lv2 | 17:35 | |
falktx | ventosus: got an error when trying to build your code | 17:38 |
falktx | error: ‘for’ loop initial declarations are only allowed in C99 mode | 17:38 |
*** gianMOD has quit IRC | 17:41 | |
ventosus | falktx: cmake -DCMAKE_C_FLAGS="-std=gnu99" or "-std=gnu11" | 17:49 |
falktx | yes, but you should have those on the cmakefile | 17:49 |
drobilla | Shiny atom debugger, cool | 17:51 |
ventosus | ah, building with clang 3.6 which doesn't complain, will add it to the script though, thanks | 17:52 |
drobilla | Ah, EFL. I was wondering what that was... | 17:52 |
falktx | the first few lines in sp_ui_new() seem to require an extra include | 17:54 |
falktx | also, I'm not able to show any UIs | 17:54 |
falktx | ventosus: I get these errors http://kxstudio.sourceforge.net/Paste/repo/CnuaS | 17:54 |
ventosus | falktx: is "elementary_test" running? | 17:57 |
falktx | of course not | 17:57 |
falktx | I don't have that in my system | 17:57 |
ventosus | have you configured elementary with "elementary_config" (software x11 vs opengl) | 17:57 |
falktx | I have done nothing regarding elementary | 17:58 |
falktx | I just installed some basic libs now to build your plugin | 17:58 |
ventosus | you may need to configure it first (e.g. which graphics engine it should use, etc.) | 17:59 |
falktx | thats... not good | 18:00 |
falktx | I have no idea how to do that. I don't have any elem* binaries here | 18:01 |
falktx | I just want to run the app or plugin | 18:01 |
falktx | a toolkit that doesn't work without some configuration first sounds really really bad. why can't it have sane defaults? | 18:02 |
falktx | gtk has an ugly default theme, but it will still work | 18:02 |
falktx | ventosus: trying to run the jack app results in this http://kxstudio.sourceforge.net/Paste/repo/IUIdX | 18:02 |
falktx | ah, damn debian | 18:04 |
ventosus | "Software X11 engine creation failed", that doesn't sound good | 18:05 |
falktx | need to install libevas1-engines-x | 18:05 |
falktx | ventosus: probably something for the readme. on debian/ubuntu make sure libevas1-engines-x is installed | 18:05 |
ventosus | ah yes, debian tends to split everything | 18:06 |
falktx | ventosus: you have /usr/local/share/synthpod/synthpod.edj hardcoded. not very nice, but can be fixed in packaging | 18:06 |
ventosus | there's probably other things in there that's hardcoded, too ;-) | 18:07 |
falktx | crashes when trying to load it | 18:07 |
falktx | #0 __strcasestr_sse2 (haystack_start=0x0, needle_start=0x7ffff6f2b723 "") at ../string/strcasestr.c:76 | 18:07 |
falktx | #1 0x00007ffff6f017c8 in _pluglist_populate () from /home/falktx/FOSS/GIT-other/synthpod/lib/libsynthpod_ui.so | 18:07 |
falktx | simple thing | 18:08 |
falktx | const char *name_str = lilv_node_as_string(name_node); | 18:09 |
falktx | name_str can be null, you need to check for that | 18:09 |
*** ricardocrudo has joined #lv2 | 18:14 | |
drobilla | name_node can be null. All nodes should have a string, though. | 18:18 |
drobilla | (it's the one universal lilv_node_as_*) | 18:19 |
falktx | ventosus: how stable do you consider these plugins right now? I'm thinking of packaging them... | 18:22 |
falktx | (on kxstudio) | 18:22 |
ventosus | I'd consider 'midi_matrix.lv2' stable, but it's of no big use, it was just my first test plugin | 18:24 |
ventosus | i've put 'moony.lv2' in beta, needs some more testing, I guess | 18:25 |
ventosus | I'm not yet happy with 'sherlock.lv2', needs some more tweeking | 18:25 |
ventosus | ... and synthpod is in early stage of course | 18:26 |
*** gianMOD has joined #lv2 | 18:37 | |
*** gianMOD_ has joined #lv2 | 18:40 | |
*** gianMOD has quit IRC | 18:40 | |
*** curlymorphic has joined #lv2 | 18:47 | |
*** rncbc has joined #lv2 | 18:55 | |
*** artfwo has quit IRC | 19:04 | |
ssj71 | sanity check: the worker thread create an object, then the response saves the object handle, and puts the handle of the old object in another pointer then schedules the worker. the worker always check this pointer and deletes it and sets to null if its not already null. Threadsafe or not? | 19:08 |
*** ricardocrudo has quit IRC | 19:16 | |
rgareus | ssj71: work response is called in the same thread as run. you can swap pointer to handles there. | 19:21 |
rgareus | ssj71: the worker itself is decoupled by ringbuffers. pass non-pod data (ie pointers) at your own risk | 19:21 |
falktx | ssj71: don't use allocated pointers in worker. use data from stack | 19:23 |
ssj71 | falktx: so don't call malloc? | 19:23 |
falktx | you don't need to | 19:24 |
falktx | the data passed into worker is copied, not referenced | 19:24 |
falktx | if you call malloc, you'll have to call free after calling worker stuff | 19:24 |
falktx | (in the same function) | 19:24 |
ssj71 | right, thats why the worker response shceduled more work | 19:25 |
ssj71 | to free the old struct | 19:25 |
ssj71 | but, I suppose its doable using static instances, then just copy the data | 19:25 |
falktx | you don't one or the other | 19:26 |
falktx | use variables on the stack | 19:26 |
falktx | something like: | 19:26 |
ssj71 | ah, so just use pointers to stack stuff, I | 19:26 |
falktx | yeah | 19:26 |
falktx | the size param is there so the host safely copies the full thing | 19:27 |
ssj71 | but you still have to copy the data then | 19:27 |
falktx | the host does that. it copies the data you provide it into a local ringbuffer (or similar) | 19:27 |
ssj71 | ok, so the worker response already has the copy and its ok to just save a pointer to it? | 19:28 |
falktx | why do you want a pointer? | 19:28 |
ssj71 | so I don't have to copy every member of the stuct manually to the plugin instance. Maybe I'm still not getting it | 19:29 |
falktx | you have some data. you call worker to get that data to some other context | 19:30 |
falktx | your data only needs to be valid when calling worker stuff | 19:30 |
falktx | the host will handle everything else | 19:30 |
ssj71 | worker generates the data, and yes, I want to get that data to the plugin for the audio thread, I pass it to the worker response which executes in the audio thread | 19:31 |
falktx | worker is just usually a ring buffer + thread implemented by the host | 19:31 |
ssj71 | so I should do a deep copy of the struct in the worker response. | 19:33 |
*** gianMOD_ has quit IRC | 19:33 | |
*** gianMOD has joined #lv2 | 19:34 | |
falktx | data must be POD | 19:34 |
falktx | no classes or functions | 19:34 |
ssj71 | It is | 19:34 |
falktx | then just pass that struct into worker | 19:34 |
falktx | and on the response cast the data into your struct type | 19:34 |
falktx | you don't need to do any copying | 19:35 |
ssj71 | the struct is in constant use in the audio thread. So I have to make a second struct, pass it to the worker. Worker loads it up, the the response casts it back to the struct and swaps the old and new struct | 19:36 |
ssj71 | sound right? | 19:36 |
ssj71 | second strucy will still be on stack, not malloc'd | 19:37 |
falktx | not sure why you need a 2nd struct there | 19:37 |
rgareus | ssj71: convo.lv2 is doing pretty much what you describe. | 19:37 |
ssj71 | falktx: because the worker and audio thread would both be manipulating the same data | 19:37 |
rgareus | ssj71: using the worker to re-init a background instance then swap instances on the fly (and scheduling another work request to free the old instance) | 19:37 |
falktx | ssj71: NO, the worker does NOT manipulate your data | 19:38 |
*** gianMOD has quit IRC | 19:38 | |
falktx | ssj71: it copies it, that's it | 19:38 |
ssj71 | ok, then when you say "pass that struct into the worker" its confusing | 19:39 |
falktx | I said *cast* | 19:39 |
falktx | well, errm, sorry | 19:39 |
falktx | you pass the structure data, not the structure itself | 19:39 |
ssj71 | no worries, I just want to make sure I'm doing it right | 19:39 |
falktx | internally the host will just copy that data to a temp place, and give it back to you later | 19:40 |
ssj71 | falktx: but the host's copy is still temporary | 19:40 |
falktx | "temporary" in the same way all ringbuffer data is | 19:41 |
ssj71 | rgareus: I've been looking at convolv2 and eg_sampler, but was trying to make it simpler through the whole "garbage" pointer thing | 19:41 |
falktx | there's no "garbage" here | 19:42 |
ssj71 | falktx: so theres the secret I need to review the details of ringbuffers | 19:42 |
rgareus | ssj71: I suggest to keep all data (objects and state) inside the /real/ lv2 handle and only pass simple commands to the worker. | 19:42 |
*** gianMOD has joined #lv2 | 19:42 | |
falktx | ssj71: the simplest example possible is passing a string into worker | 19:42 |
rgareus | an integer | 19:43 |
rgareus | or char | 19:43 |
falktx | strings are nicer to print and test it's really working :) | 19:43 |
falktx | METACODE: const char* mystr = "hello"; worker.run(mystr, strlen(mystr)); | 19:43 |
falktx | the plugin will get that data later. there is no allocation or garbage collection here | 19:44 |
rgareus | falktx: I like switch() . with strings you have to strcmp() | 19:45 |
falktx | switch doesn't work with variables in the case X: fields | 19:45 |
ssj71 | falktx: the issue is not how to pass something to the worker, but from. if I malloc each time a new file is loaded, then I have to delete. Both should be done in the worker thread. I recognize I don't have to malloc, but it was my first approach | 19:46 |
falktx | you can do anything in the worker thread afaik | 19:46 |
ssj71 | sure, but when you are using the data generated there you need to be able to safely switch from old and new data | 19:47 |
ssj71 | basically I'm loading impulse responses in an alternative format | 19:47 |
falktx | then maybe pointers are needed :P | 19:48 |
falktx | pass a pointer to run, make run pass the pointer back to worker when swap is over | 19:48 |
falktx | or something like that | 19:48 |
ssj71 | ah, that would be a better approach | 19:50 |
falktx | you can do a pointer swap in run, and give the old pointer to delete later on the worker thread | 19:50 |
ssj71 | yes, if I pass the pointer to the worker its safer than having an old pointer member in the plugin instance | 19:51 |
ssj71 | I'll do that | 19:51 |
*** curlymorphic has quit IRC | 19:52 | |
ssj71 | erm... well, I'll do a bit more homework to make sure I know what I'm doing. Thanks falktx and rgareus too | 19:52 |
falktx | I hope I didn't confuse you more than before... :S | 19:53 |
*** gianMOD has quit IRC | 19:58 | |
ssj71 | no, if nothing else, you helped me find a design I liked better. | 20:00 |
*** ricardocrudo has joined #lv2 | 20:04 | |
ssj71 | rgareus: in convolv2 would it be possible for 2 files to be loaded in rapid succession such that the second is allocated before the old clv_offline gets freed? | 20:08 |
rgareus | ssj71: no. | 20:08 |
ssj71 | thats the tree that ends in LV2_ERR_NO_SPACE? | 20:09 |
rgareus | ssj71: the first requests sets self->clv_offline | 20:09 |
rgareus | ssj71: and as long as that's not NULL. all further requests are ignored | 20:10 |
ssj71 | ok. I'm trying to get the gist without a full code tracethrough :\ | 20:11 |
rgareus | ssj71: the code is a bit messy. It was my first lv2 plugin. | 20:11 |
ssj71 | lol. That was your first?! you used most of the extensions. I have to approach them 1 by 1 and it still is taking forever to get it | 20:12 |
ssj71 | I like your approach of passing ints to the worker as well | 20:13 |
rgareus | ssj71: well, I wanted to learn to use them all :) the convolution code itself was there earlier (which adds to the mess). | 20:15 |
ssj71 | rgareus: not really. It keeps everything lv2 in lv2.c I'm doing a similar thing since the rakarrack modules are relatively self contained | 20:16 |
rgareus | ssj71: the mess here is mainly about state save/load. convolution.cc has its own serializer. not very LV2ey. | 20:17 |
ssj71 | ok. State is the next hurdle. Maybe I'll use eg_sampler more for that | 20:20 |
*** tytel has joined #lv2 | 20:35 | |
*** Magnus_RM has joined #lv2 | 20:50 | |
*** edogawa has quit IRC | 20:58 | |
*** ventosus has left #lv2 | 21:13 | |
*** aombk3 has joined #lv2 | 21:41 | |
*** aombk2 has quit IRC | 21:44 | |
*** rncbc has quit IRC | 21:50 | |
*** ricardocrudo has quit IRC | 22:09 | |
ssj71 | state is necessary for having presets with files, right? the host can't just serialize the patch:value? | 22:16 |
*** falktx has quit IRC | 22:58 | |
*** gianMOD has joined #lv2 | 23:27 | |
*** tytel has quit IRC | 23:47 | |
*** NickSB has quit IRC | 23:59 |
Generated by irclog2html.py 2.13.0 by Marius Gedminas - find it at mg.pov.lt!