Monday, 2015-02-23

SocapexI have to say guys, your website is really really nice :)00:01
falktxhmm, there's an issue...00:01
falktxgtk2 widgets don't have x11 win Ids until they are realized00:01
falktxI guess now I need jalv.qt5 to test it00:05
* falktx can't make waf find moc-qt500:12
Socapexanyone uses a mac with macports? how would I add my lv2 install to macports pkg-config (in /opt/local)?00:17
Socapexps. Decided to build with waf, as I wish to keep the last remaining shadows of sanity I have ^_^00:17
falktxerrrm....00:18
falktx/usr/include/x86_64-linux-gnu/qt5/QtCore/qglobal.h:1034:4: error: #error "You must build your code with position independent code if Qt was built with -reduce-relocations. " "Compile your code with -fPIC or -fPIE."00:18
falktx #  error "You must build your code with position independent code if Qt was built with -reduce-relocations. "\00:18
drobillafalktx: No.  reparenting is far more flakey00:19
Socapexwaf: error: no such option: --lv2-dir00:23
Socapexsigh -.-00:23
drobillaSocapex: --prefix00:27
drobilla(Like roughly every other configure/build thing ever)00:27
drobillafalktx: AFAIK gtk plug/socket only works on X11 anyway00:27
Socapexdrobilla: ty, I rtfmed a bit and got it ^_^00:28
Socapexdrobilla: Did I miss the sratom dependency, or is it actually missing from docs?00:31
SocapexWould be nice to add it to the lilv page. Not a big deal though.00:33
falktxdrobilla: this qt5 thing is going to be complicated...00:34
falktxbut now I have to update lilv first, which I guess requires the whole thing too... :S00:36
*** gianMOD has joined #lv200:37
SocapexDoes anyone have a good lilv example to start me off?00:41
*** rncbc|AFK has quit IRC00:42
*** gianMOD has quit IRC00:42
badosuSocapex: that jalv.qt example that I passed to you should use lilb00:59
badosu*lilv00:59
badosuSocapex: I need to host lv2 plugins on qt as well, though Im on qt400:59
Socapexbadosu: ah perfect! Right now I'm just going through doc. Once everything is setup, Qt Creator actually auto-completes lilv_, which will help alleviate the initial pain.01:00
badosuSocapex: if you ever publish this code let me know, every reference is useful01:04
Socapexbadosu: Of course! Right now I'm just going to protoype, play around with lib, bang head on keyboard etc. But if I get a prototype working I'll push to my github.01:05
Socapexbadosu: Adding plugin support for the actual project I'm working on is probably at least .5 year away I would believe.01:06
falktxdrobilla: I got everything to build, but there's an issue. gtk2 widgets don't have win ids until they are about to being shown01:07
falktxdrobilla: but I need to know that winId to do embed in qt501:07
badosuSocapex: I know how you feel, I want lv2 support on lmms01:08
badosuSocapex: grejppi's already done some work, but it seems hard01:08
Socapexbadosu: oh that *has* to be a priority on lmms!01:09
badosufalktx: I can't believe you're going to add qt5 support on suil in such a little period of time01:09
badosufalktx: great productivity01:09
Socapexbadosu: especially for the instruments, I think your audience would really appreciate it :)01:10
badosuSocapex: yeah, I know. But surprisingly we have many other requests with more priority01:10
badosuSocapex: I guess the power users already discard lmms due to lack of lv2 support in a snap01:11
badosuSocapex: so the users that remain do not care very much01:11
Socapexbadosu: really? Well its been a while I haven't used lmms so I don't know what state it is now. But yeah, the VST issue eventually dragged me away from linux for audio :(01:11
badosuSocapex: actually VST support on lmms works surprisingly well01:12
badosuSocapex: it's not perfect, but lots of complicated VSTs work01:12
Socapexbadosu: oh wow, you have that!? that is awesome!01:12
Socapexbadosu: Its been a long long time (I was using a fedora 3 audio build buy a dude... can't remember the name)01:12
badosuSocapex: 32 bits VST dll should work on LMMS01:13
badosuSocapex: *ahem* most of the time01:13
Socapexbadosu: lol01:13
badosualso, there's a DSSI wrapper for VST, maybe you could check that for other applications01:15
drobillafalktx: Why can't you just do it the way gtk2_in_qt4 does it?01:16
falktxdrobilla: qt5 doesn't work like that01:16
falktxit also seems wrong. the host is the one that has to do reparenting, not the ui01:17
falktxcalling gtk_widget_show_all doesn't work :(01:18
drobillaThe host passes the parent widget into which the UI should create itself01:18
drobillaThe "create a UI, then we can reparent it or embed it or show it or whateer" was the initial plan.  It was wrong.01:19
drobillaWhich is why the parent thing is a feature01:19
falktxthe ui is created first, and send to the host01:19
falktxthe host gets the UI and reparents or adds as subwidget01:19
falktxthe qt4 code is letting the UI controlling the host reparenting01:20
drobillaUh, okay.01:20
drobillaYou are contradicting yourself for starters, and what is the "UI"?01:20
drobillaThe LV2 UI is not reparenting anything.01:20
falktxthe qt4 code has this:01:21
falktxGtkWidget* const            plug   = gtk_plug_new(wrap->winId());01:21
falktxwrap is the (future) host widget01:21
falktxthe gtk UI creates a bridge between the host window and ui widget01:22
falktxinstead it should be something like01:22
drobillaYou aren't listening.01:22
drobillaYes, you think it should just create a widget with no parent then the host can reparent or whatever.01:22
drobillaI though this 4 years ago, too.01:22
drobillaIt doesn't work (well, at least).01:23
drobillaSo, as I've said twice now, the host passes a parent widget and the UI (and/or suil) uses this as parent.01:23
drobillaIt was changed to be this way deliberately.01:23
falktxheh01:23
falktxso the QX11EmbedContainer use is wrong01:24
falktxit's not containing anything01:24
drobilla... ?01:24
drobillaIt contains the UI01:24
falktxwell it is, yeah, but qt doesn't really know it01:25
drobillaThat's what QX11EmbedContainer is for.  It implement XEMBED01:25
falktxthe embedClient() function that QX11EmbedContainer was created for is never called01:25
drobillaThe Gtk things are created with its child ID01:25
drobillaYes, that's weird.  I don't know if this circumvents XEMBED or not.01:28
drobillaAFAIK events work...01:28
drobillaIf not it's a pretty severely flawed design01:29
falktxI though we're going for something like:01:29
drobillaReparenting is the devil.  I'm not sure why you seem to actively want to do it.01:29
SocapexDoes lilv send errors to perror or something of the likes to debug world creation being NULL?01:29
falktx1. host gets ui widget01:30
falktx2. host does embedThisWinId()01:30
drobillaSocapex: It prints to stderr01:30
Socapexdrobilla: ok, ty01:30
falktxdrobilla: anyway, qt5 does not have a special class to handle xembed, and I don't think it ever will01:31
falktxdrobilla: it does have however a QWidget::createWindowContainer() which can embed external windows01:32
falktxdrobilla: but since we can't know the gtk2 win id before it's shown (and flushed), it can't work on qt501:32
falktxit *needs* the win Id before creating the widget01:32
drobillafalktx: Is there no winId anymore?01:33
falktxthere is01:33
falktxbut there won't be xembed support like tha qt4 class01:33
falktxx11-on-qt5 can work at least01:34
drobillaWell, I knew we were only going to get so far until somebody had to actually implement XEMBED01:34
drobillaLeave it to Qt to force that hand01:34
drobillaDoesn't what this createWindowContainer thing does kind of inherently imply there's an embed implementation in there?01:36
falktxthere is, sorta01:36
falktxbut with x11 vs wayland vs mir. it would get very tricky to implement xembed01:36
falktxqt5 might be running on wayland, so xembed wouldn't work01:36
falktxcreateWindowContainer assumes the winId matches the qt window backend01:37
drobillaSo do we until we have a real reason to otherwise.  Non-issue01:38
*** gianMOD has joined #lv201:38
drobillaWell, you can maybe create an unplugged gtkplug then add it with the Qt thing01:39
drobillaI am not sure if an unplugged gtkplug has a window ID at all though01:39
drobillaor use a socket embedded in some normal Qt thing and use the Gtk XEMBED implementation on both sides01:41
drobillaWelcome to why these nightmares are isolated in a library :)01:42
*** gianMOD has quit IRC01:43
badosuI noticed you two talking about xembed and I got worried, suilv's x-platform compatibility is good for Windows and OSX?01:45
badosuThis is very important for LMMS01:46
falktxno01:47
drobillabadosu: Gtk<=>Qt does not work on Windows or Quartz (without X11)01:47
falktxonly gtk2 has something about cross platform01:47
badosuSo it will not be so easy as I imagined01:48
falktxyou'll have to do the cocoa-in-qt4 and win-in-qt4 modules01:48
drobillaDistributing binary plugins that use Qt or Gtk is essentially impossible anyway01:48
drobillaThe native window types on each platform work.01:48
* falktx is finding suil code a bit hard to understand01:48
badosuOk, so this will have to be linux-first and then try to implement it for windows01:49
Socapexdrobilla: Wow, this is *really* promising! https://www.dropbox.com/s/82pgvuom1xynioc/Screenshot%202015-02-22%2020.48.42.png?dl=001:49
Socapexpractically 30 minutes with doc01:49
SocapexxD01:49
drobillabadosu: All the libraries, including suil, work fine on Windows/OSX01:49
badosuI really thought that I wouldnt have problems with QT plugins though01:49
drobillabadosu: That situation itself is inherently problematic.01:49
drobillabadosu: How do you know the plugin uses exactly the same version of Gtk/Qt that you do?01:50
Socapexoh oops, meant to ping badosu. Oh well01:50
falktxdrobilla: I'm going to give up on this :(01:50
drobillaand, for the eleventy billionth time, suil doesn't get in the way if the host and UI type are the same01:51
drobillaseriously people01:51
drobillaQt in Qt (etc) it just passes the damned widget handle.  Obviously.01:51
drobillaPlease for the love of all that is holy let me stop having to say this :P01:51
badosuwow, nice work Socapex :-)01:51
drobillafalktx: *shrug* okay.01:52
falktxdrobilla: but maybe I can get jalv.qt5 working, even if without any cross-ui type support01:52
falktxthe issue right now is moc...01:52
badosudrobilla: hahaha, I got it sorry01:52
Socapexbadosu: Well its not much, but its a really simple & nice API :D01:52
drobillaThe issue is always moc01:52
badosuyeah, I lost some hours trying to figure out how to use moc with make01:53
badosufalktx: I know you don't use Make, but if this helps you: https://github.com/badosu/BadAmp/blob/master/Makefile#L22-3001:53
badosuit's for qt-401:53
drobillaI don't really get it.  They hardly seem to give much of a crap about compatibility of numerous other things.  It's 2015, drop your horrible 90's preprocessor designed to work around garbage C++ implementations from decades ago already...01:54
falktxit's not an issue in PyQt btw01:56
falktxpython hides all that moc madness01:56
falktxdrobilla: jalv-qt4 and qt5 code is the same, except for Qt4UI and include jalv_qt4_meta.hpp01:58
falktxdrobilla: so maybe the file should renamed jalv_qt.cpp and some macros added01:59
badosudrobilla: this widget-passing suilv implementation is really cool01:59
badosudrobilla: I am just worried that I'll have to individually treat each case individually02:00
falktxdrobilla: oh there's one "TRUE" undefined var. It should be lowecase "true" anyway.02:00
badosudrobilla: for example, is it possible to use a X11UI widget on Windows?02:00
falktxdrobilla: patch http://kxstudio.sourceforge.net/Paste/repo/toDCa02:00
badosus/widget/plugin02:00
drobillabadosu: Theoretically, probably.02:01
drobillabadosu: Is X11 present on 99.9999999999999% of normal Windows machines?  No.02:01
badosudrobilla: hahaha, I meant practically02:02
badosudrobilla: like if there was some kind of fake X11 server to make it work02:03
drobillafalktx: OK, thanks.  Yes, copy pasting the whole thing is crazy if it's nearly identical anyway.  Same thing with gtk2/302:03
SocapexSo from a high-level, if I understand correctly, LV2 plugins simply have ports and other classes. I want to connect these ports with lilv world ports. Then do I fill them up using a callback?02:03
drobillabadosu: That'd be the 0.00000000000000001%02:03
badosudrobilla: so this implies that it's impossible to distribute openAv plugins to a Windows audience?02:03
badosudrobilla: since they use X11UI02:04
drobillabadosu: OpenAV uses a thin abstraction layer (pugl) and can provide native windows on X11/OSX/Windows02:04
drobillaSocapex: Who is "I"?  host or plugin?02:04
drobillaSocapex: Ports are connected to buffers.  Those buffers are processed in run()02:05
badosudrobilla: oh, wait a minute, so the problem is not really the type of UI, but if the plugin uses non supported code?02:05
Socapexdrobilla: the host.02:05
drobillaSocapex: Well, they're your buffers, then.  Why would you need a callback to fill your own buffers, and who would be calling it? :)02:05
badosuby non-supported-code I mean, drawing expecting X for example02:05
badosuok, I'll give it a try this week, Ill bother with Windows and OSX later02:06
Socapexdrobilla: hmmm, I meant filling the buffers of the file... I have limited knowledge with this (did work with AUs though).02:06
drobillabadosu: I don't understand your question.  The type of the UI is the relevant thing.02:06
Socapexdrobilla: buffers of the plugin, sorry02:06
drobillaSocapex: What file?02:06
drobillaSocapex: The buffers are owned by the host02:06
drobillaSocapex: You fill them, well... however.02:06
badosudrobilla: openAv uses ui:X11UI last time I checked, this means that it should pass a X window id02:07
drobillae.g. memset will fill them with silence easily enough02:07
drobillabadosu: Yes, but on Windows, it would not.02:07
drobillabadosu: As I said, it uses a thin compatibility layer.  They are not implemented in raw X1102:07
badosudrobilla: ok, so you answered my question. Using pugl should not matter in this case02:07
drobillabadosu: That layer works with the native window type on whatever platform.02:07
Socapexdrobilla: allright, so what I thought. Sorry if I don't explain very well. I fill up the port buffers (callback or whatever is available). Thats how I transfer audio to the plugin. Does the plugin provide a callback to get audio back from it?02:07
badosudrobilla: unless you extend a new ui type02:07
drobillabadosu: Well, it matters because that's the thing that makes it work on all three platforms02:07
badosudrobilla: I understand this, but this is also true for QT02:08
drobillaSocapex: You seem to have some kind of fundamental misunderstanding02:08
badosudrobilla: with the exception that QT requires a QT-aware host02:08
drobillaSocapex: The host points the plugin to buffers02:08
drobillaSocapex: You then run() the plugin and it does stuff, reading the input ones and writing the output ones02:08
drobillaSocapex: They are your buffers.  You own them, passed them to the plugin, and still own them.  There is no funny buffer callback business necessary.02:09
badosudrobilla: don't worry, I'll discover these details when I implement it02:09
drobillabadosu: Yes, a Qt UI could probably provide native UI types too in a similar way.02:09
Socapexdrobilla: It looks much more simple than I thought, but if I'm doing realtime, don't I need a way to get lets 512 processed frames when they are ready? So I can feed my soundcard?02:10
drobillaWell, maybe.  main loops and multiple toolkits and all that...02:10
drobillaSocapex: Yeah.  run().02:10
Socapexdrobilla: oh, so you specify a number of frames to run!02:11
drobillaSocapex: ... do at least look at the header, first. :P02:11
Socapexdrobilla: ^_^ sowwy. Quick question that just popped up in my head, I'm sure you have a solution, but what about the delay induced in multiple instances of plugins chained together. If each has to wait 512 frames before getting the data, wouldn't that cause ginormous delay?02:12
drobillaSocapex: no.02:13
Socapexdrobilla: I guess I could run it for less samples. I'm just not used to this way of doing audio. Allways used callbacks. Mind blown02:13
drobillaframe 0 in that 512 frame block is the same frame 0 for every plugin in the chain.02:14
drobillaSocapex: ?  this is how basically every plugin interface ever works02:14
Socapexnot AU02:14
Socapexbut frame 0 isn't the same if the plugins are chained02:14
Socapexgate -> eq -> compressor -> reverb02:15
Socapexframe 0 gets processed sequentially02:15
drobillayes it is, unless they are latent.02:15
drobillaaudio time != real time.02:16
drobillaif frame 0 is "now", then if I process it through 999999999999999 non-latent plugins, it's still frame 0, "now"02:16
Socapexhmmm02:16
Socapexbasically processing is faster than realtime? Is that what you are trying to say?02:17
drobillaIt may or may not be.02:17
drobillaIf you can't do it fast enough you'll get a dropout, sure02:17
Socapexunless I use latency inducing plugins (lookahead etc)02:17
drobillaMy point is "each has to wait 512 frames before getting the data" is wrong thinking02:18
Socapexbtw thank you for taking the time to explain all this02:18
drobillaIt's the same 512 frames of data02:18
drobillai.e. represents the same chunk of time02:18
drobillay/w02:18
Socapexthats really interesting. I come from a tech background, so I think in a very "practical" or "end-user" way02:19
Socapex*audio tech02:19
drobillaAll that callback loopiness has confused you.  It's not that complicated :)02:20
drobillaThink of plugins as glorified functions.02:20
Socapexmind == loopy02:20
SocapexxD02:20
badosuhahaha02:21
drobillaIt's easy to see if you consider 1 frame blocks, I suppose.02:21
drobillaEvery frame in must be a frame out02:21
drobillaSo if I take frame 0 and do a bunch of stuff to it and somehow it's become frame 27, well... what about this huge gap?02:22
Socapexyes02:22
Socapexno gap02:23
drobilla('course some plugins *are* latent, so things like that can actually happen, but simple hosts can just blissfully pretend it doesn't)02:23
Socapexhehe, well running with as little samples as possible will help. In my specific application, it will matter. But we will provide some basic plugins that are as non-latent as possible. If users want to add latency then they are welcome to do it of course02:25
SocapexI'm super excited about LV2 anyways, so far the doc is minimal but effective and clear. Also it was much easier to setup than I imagined!02:26
drobillaWhat environment are you running in?02:26
SocapexI'll be working on integrating plugins to obs-studio (broadcasting software), so as live as it gets02:27
drobillaGood to hear, particularly considering how often I hear people piss and moan about how atrocious the documentation/everything is.  Thanks :)02:27
drobillaWell, I just mean often your latency/block size is determined outside your application anyway02:27
drobillaBut it's a tradeoff.  Lower latency = higher overhead02:28
drobillaOtherwise we'd all be running everything at 1 frame02:28
Socapexhaha, well its pretty logical! create a world, get plugins, iterate through them... :)02:28
Socapexyeah02:28
SocapexWe'll have to expose the parameter (as all DAWs do anyways)02:28
SocapexI guess your doc could use examples, but the jalv and lv2file are clear02:29
Socapexand your website is sexy :)02:29
drobillaThis is complicated by lilv not being an "official" LV2 project02:31
drobillaThey'll probably be integrated into a sort of SDK thing soon02:31
drobillabut yes, those two serve as the usual simple host examples02:32
drobillaGenerally spend more time on plugin documentation, since hosts are few and far between and new host authors hardly pop up every day02:32
*** falktx has quit IRC02:33
drobillaand thanks, redid the whole site recently02:34
drobillaThat screenshot thingie could certainly use some work but it's way better than it was before02:34
Socapexwell hopefully I wont be bugging *too* much, but I am still a student with limited experience in general.02:34
drobillaThe spec docs are much better and more integrated with the site design in git now too, but not uploaded until the next LV2 release02:34
SocapexThe slideshow is really nice :D02:34
SocapexIt looks super pro, not what I was expecting, especially when you look at LADSPA website before lol02:35
drobillaI'm technically still a student.  No excuse! :P02:36
Socapexhaha, damn it!02:39
*** gianMOD has joined #lv202:39
Socapexallright, time for bed now. I wont sleep all night if I continue working on this :)02:41
Socapexthx all for the help, I'll see you later with updates on my host prototype02:41
drobillattyl02:42
*** gianMOD has quit IRC02:44
*** gianMOD has joined #lv203:40
*** gianMOD has quit IRC03:45
*** NickSB2 has quit IRC03:53
*** gianMOD has joined #lv204:40
*** gianMOD has quit IRC04:46
*** Socapex has quit IRC05:22
*** gianMOD has joined #lv205:41
*** gianMOD has quit IRC05:46
*** edogawa has joined #lv206:07
*** gianMOD has joined #lv206:42
*** gianMOD has quit IRC06:47
*** gianMOD has joined #lv207:43
*** gianMOD has quit IRC07:48
*** ricardocrudo has joined #lv209:18
*** gianMOD has joined #lv209:21
*** gianMOD has quit IRC09:22
*** gianMOD has joined #lv209:22
*** EntropyS1nk is now known as EntropySink10:17
*** curlymorphic has quit IRC10:24
*** NickSB2 has joined #lv210:28
*** EntropySink has quit IRC10:29
*** EntropyS1nk has joined #lv210:29
*** EntropyS1nk has quit IRC10:38
*** EntropySink has joined #lv210:38
*** gianMOD has quit IRC10:56
*** gianMOD has joined #lv210:56
*** HarryHaaren has joined #lv211:16
*** gianMOD has quit IRC11:24
*** gianMOD has joined #lv211:41
*** sigma6 has joined #lv211:50
*** edogawa_ has joined #lv212:13
*** falktx has joined #lv212:13
*** edogawa has quit IRC12:17
*** gianMOD has quit IRC12:59
*** gianMOD has joined #lv213:00
*** ricardocrudo has quit IRC13:04
*** gianMOD has quit IRC13:04
*** gianMOD has joined #lv213:46
*** gianMOD has quit IRC13:46
*** gianMOD has joined #lv213:48
*** NickSB2 has quit IRC13:51
*** ricardocrudo has joined #lv214:22
*** curlymorphic has joined #lv214:51
*** gianMOD has quit IRC15:13
*** gianMOD has joined #lv215:15
*** edogawa_ has quit IRC15:23
bgoladrobilla: the waf file in the lilv repository doesn't contain the swig module, so it can't build the python bindings.15:26
bgolacreating a new one with --tools=autowaf.py,swig works fine15:27
*** gianMOD has quit IRC15:31
*** gianMOD has joined #lv215:42
*** edogawa has joined #lv215:43
falktxbgola: I'm pretty sure it does, I used it for building the bindings15:56
falktxincluding py3 ones with some small modifications15:56
bgolafalktx: i just cloned the svn repo, did ./waf and checked .waf*/extras/ , no swig.py there15:58
bgolafalktx: http://pastebin.com/FvutHM6S not sure if im doing something wrong15:58
falktxbgola: I see it on 0.20 release in bindings/lilv.i15:59
falktxbgola: it's there on your list too, as lilv/bindings/lilv.i16:00
falktxbbl16:01
bgolafalktx: i mean the waflib/extras/swig.py16:04
bgolawhen i run ./waf configure --bindings it says it can't find the waflib swig module16:05
*** falktx has quit IRC16:06
drobillabgola: oops.16:39
*** falktx has joined #lv216:44
drobillabgola: fixed16:45
*** Socapex has joined #lv216:50
SocapexHello, I have a quick question. Using lilv, are all features supported, or only core, or is that my job to add the necessary features? If I have to add them, is it simply a case of including the correct extension headers, or is there more to supporting features?16:51
drobillaSocapex: It Depends™.  Generally the whole point of a feature is to allow hosts to provide extended functionality, so yes, generally you have to implement something16:54
falktxyou need to support the features yourself16:54
bgoladrobilla: :)16:55
bgoladrobilla: im testing now my mod/python stuff with the latest ingen revision16:55
*** rncbc has joined #lv216:55
bgoladrobilla: btw, any plans on changing to git ? :P16:56
SocapexSo if a plugin requires urid:map, Ill have to implement that. Are there at least headers to see what the plugin expects?16:56
falktxbgola: hehe, we keep asking him that16:56
bgolafalktx: :P16:56
falktxSocapex: the plugin has requiredFeatures in its ttl to let hosts know what it needs in order to work16:56
falktxSocapex: it will also have optionalFeatures, which has the name implies are optional :)16:57
Socapexfalktx: Yes exactly, but I have to implement its required features16:57
falktxyes16:57
falktxstart with urid-map, that's the most common one16:57
SocapexSo what is urid:map?16:57
falktxsee its header file16:57
Socapexthe required_features link work? lets see...16:58
Socapexok. much impress!16:58
SocapexMaybe I should read the spec, because its a bit hazy how this whole thing works.17:01
falktxyou should yes17:02
falktxSocapex: are you able to load eg-amp?17:02
falktxafaik that plugin has no dependencies17:02
Socapexfalktx: It doesnt return NULL but crashes17:02
Socapexfalktx: When I run() it17:03
falktxmaybe you forgot to call activate or connect_port ?17:03
Socapexah, connect_port? >.>17:03
drobillabgola: Yes, but there'd be a million submodules and it would be absolute hell17:03
* Socapex hides17:03
drobillabgola: Most of the libs are going to move to lv2, so after that17:03
drobillaNeed to decide how to do that part, too.  Submodules are probably more trouble than they're worth, since the libs are not useful outside an LV2 context anyway (unless serd and sord make it in there)17:05
bgoladrobilla: ah yeah, moving the ibs to LV2 would help already :)17:06
bgolabut why submodules?17:06
bgola(i just spent a few hours organizing my environment to have everything running with the latest revision, also updated the aur package lv2-svn to lv2-git ... )17:07
bgolathats why im asking about svn x git :)17:07
Socapexfalktx: So, I have a uri-map.lv2 in my libs folder when I installed LV2. That is the header, and I simply implement that? Do I have to implement all that is inside my lib folder except core?17:07
drobillabgola: Well, in the case of my lad repo they are really totally separate projects17:07
falktxSocapex: you implement whatever you want17:07
falktxSocapex: but you should go as its needed by plugins17:08
falktxone thing at a time17:08
Socapexfalktx: But to be compatible with all plugins, your theoretically need to implement everythiing17:08
drobillaI am still not sure what various distro policies are on single upstream packages that install a bunch of libraries17:08
falktxin theory yes17:08
Socapexwait a minute, lv2core doesnt provide implementation either?17:09
drobilla... implementation of what?17:09
falktxlv2 is the sdk, it only tells you how things work17:09
bgoladrobilla: yeah, each project under the lad svn repo would work if it was in a separeted git repo i think17:10
falktxhosts implement the sdk, and plugins too17:10
drobillaAside from some utility things like atom/forge.h, the LV2 headers are just API definitions.  The plugin is the implementation.17:10
bgola(i tried using git-svn to adjust it to my workflow but it didnt work... some kind of bug that i wasn17:10
bgola't feeling like looking into)17:10
drobillabgola: Yes, but then I'd have to manually build all of them individually which would be a huge PITA for me17:10
Socapexdrobilla: I dont understand17:11
falktxSocapex: think of lv2 as a protocol, like html17:11
Socapexsimple question, is LV2core provided as a lib, or do I have to implement it??17:11
* drobilla cringes17:11
drobillaHTML is a protocol now, is it? :P17:11
falktxSocapex: webpages are made in html, and web browsers implement the spec17:11
falktxsorta17:11
drobillaNot sorta.  At all. :P17:11
falktxit's the shortest example I can think of17:12
drobillaSocapex: A plugin is a binary that implements an interface.17:12
falktxs/protocol/spec, done17:12
drobillaSocapex: lv2.h is the interface that LV2 plugins implement17:12
Socapexis lilv your SDK? Do you provide an SDK?17:12
drobillayes, no, mu, sort of.17:13
Socapexlol please, dont mix me up even more17:13
SocapexI thought that LV2 was a lib17:14
drobillaIt isn't.17:14
Socapexthe amount of work required to support it has just exploded17:14
drobillaThat depends on what you want to support.17:14
drobillaIt is not intended that every potential plugin in the universe work in every host.17:14
Socapexwhat plugins need17:14
SocapexI dont want instrument features17:15
Socapexbut lets just talk of core17:15
drobillaSome plugins simply do not make sense in certain hosts at all.17:15
SocapexI need to code LV2core17:15
Socapexwhich, I would imagine is like shoving a pine-tree somewhere :)17:15
drobillaWell, you need to use that interface to do things with plugins...17:15
drobillaThat's what a plugin is.17:15
drobillaSounds like you already have, anyway, except for that whole running plugins on garbage buffers thing.17:16
drobillaSocapex: What is the programming environment you're most familiar with?17:16
Socapexdrobilla: Qt or plain c++17:16
*** gianMOD has quit IRC17:16
Socapexdrobilla: lilv provides lv2core?17:16
drobillaSocapex: lv2.h (LV2_Descriptor) is the class interface.  plugins are instances of this class.17:16
drobillaThat's it.  There is no "implementing" or "providing" lv2core (except by plugins), there is nothing for a library to do.17:17
drobillaplugins have a run() (etc) method.  that's it.17:18
*** ricardocrudo has quit IRC17:19
Socapexdrobilla: but they require for example urid:map17:19
Socapexdrobilla: I need to implement that...17:19
drobillaYou just went on and on about how we're only talking about lv2core :P17:20
Socapexlol17:20
drobillaFeatures, yes, you need to implement if you want to support them.  That's the whole point of them.17:20
Socapexok I gotta go, class is over. I'll connect back later to continue this conversation :)17:20
drobillaIf you don't care about instruments, you probably don't need to implement almost any.17:20
Socapexallright, that is a good base. I'll came back to ask more of these questions17:21
Socapexty for the time and help17:21
Socapexo/17:21
*** Socapex has quit IRC17:21
*** HarryHaaren has quit IRC17:21
*** Socapex has joined #lv217:36
Socapexdrobilla: its me again :O So, lv2core is just a spec and the plugin is in charge of being compatible. Extensions have to be coded by the host.17:37
Socapexdrobilla: urid:map is basically a hashing function17:37
drobillaWell, "extensions" is a catch-all term for anything that extends the LV2 spec17:39
drobilla"features" are specifically things passed by the host17:39
drobillalilv probably could/should implement urid among others, but in any case doesn't ATM17:39
Socapexyes. I can deal with that. So a simple hashing function, and I pass the function pointer to the plugin?17:41
drobillaIt has to be collision-free, so not quite a general hashing function17:42
Socapexoh, collision free hash17:42
Socapexuhm, that exists?17:43
Socapex:P17:43
drobillaWell, you can implement it with a std::map or simple array with binary search or whatever17:43
Socapexyes I was going to do a map, though technically its not collision free. But would resolve collisions correctly I believe17:45
drobillastd::map is not a hash table, there is no such thing as collision17:45
badosufalktx: I tried ui:Qt5UI and was not very successful17:48
badosuI ran through the git log of lv2 and did not find the part where a Qt5 compatible widget is passed and glued with the ns specification17:49
falktxSocapex: you can just have a string-list which works fine17:49
drobillabadosu: You seem confused.  It's just a URI to identify the type.17:50
badosudrobilla: I am :-)17:50
falktxSocapex: to get an urid you look for the string that matches, and add a new one if it's not there yet17:50
drobillabadosu: Nothing whatsoever is different API wise17:50
falktxSocapex: to get a uri you just do "return stringlist[urid]" or similar17:50
badosudrobilla: oh, so let me see if I understand this properly. Actually LV2 is a really, really thin wrapper17:51
*** NickSB2 has joined #lv217:51
drobillabadosu: The UIs are just void* at the end of the day17:51
drobillabadosu: The type URI tells the host what that void* actually is17:51
badosudrobilla: It is just a glue between rdf specifications and specification of the interface17:51
badosudrobilla: oh... ugh17:51
badosudrobilla: So I actually need to fix jalv.gtk to support QT5, I got it17:52
Socapexfalktx: ty for that. I'm not to sure what the urid is, but I believe its just a map? And I return the URI once given urid?17:52
drobillaugh?  You have a better way? :P17:52
badosudrobilla: no, I am sorry for the word. It's just that I understood now my confusion17:52
badosudrobilla: we had somewhat discussed this yesterday, so it should already been obvious to me17:53
drobillabadosu: Well, suil deals with that stuff17:53
falktxSocapex: uri is a string, urid is a number.17:53
Socapexfalktx: ok, so I provide unique numbers for strings17:53
falktxyes17:53
Socapexfalktx: sounds fair enough. tyvm :)17:53
falktxas I said, a string list should do just fine17:53
badosudrobilla: yeah, thanks for the answers and sorry for the annoyance17:53
Socapexfalktx: I dont know the stringlist container17:54
falktx"string list" as a generic term. use whatever your current code provides17:54
Socapexfalktx: oh... just a list of strings ^_^17:54
falktxaka string list :P17:54
Socapexlol17:55
badosudrobilla: where do I submit a patch for the projects hosted at dev.drobilla? LV2-dev mailing list?17:55
drobillabadosu: ticket or email me17:55
badosudrobilla: okay, if I find and implement any improvement I'll let you know17:56
*** falktx has quit IRC18:02
*** falktx has joined #lv218:02
*** Socapex has quit IRC18:08
*** gianMOD has joined #lv218:18
*** sigma6 has quit IRC18:21
*** gianMOD has quit IRC18:24
*** ricardocrudo has joined #lv218:30
*** gianMOD has joined #lv218:31
*** gianMOD has quit IRC18:34
*** ricardocrudo has quit IRC18:39
*** Socapex has joined #lv218:41
*** Socapex has quit IRC18:47
*** rncbc is now known as rncbc|AFK19:42
*** Socapex has joined #lv220:13
*** Socapex has joined #lv220:13
SocapexI don't think its in there but I'll ask anyways. Is there port iterator functions in lilv? If not, I guess it would be nice to have :)20:29
drobillayou get them by index, so...20:29
Socapexdrobilla: but i'm not finding the getter by index...20:30
SocapexAm I blind today? most probably20:30
drobillaApparently. ;)20:30
Socapexlol. help? pretty please? ^_^20:31
drobillaSeriously?20:32
drobillaI literally can not imagine a reasonable search term that wouldn't lead you to the appropriate functions in lilv.h20:32
SocapexI can't find the accessor function by index... Seriously20:32
Socapexcurrently I'm getting how many ports with lilv_plugin_get_num_port20:33
SocapexI can loop through that20:33
SocapexBut I don't see how I can access a port by index20:33
Socapexoh shit20:33
drobillaLet's play a game.20:33
Socapex*lilv_plugin_get_port_by_index20:34
drobillaInvent a function name that you think might be an appropriate one for a  lilv function that gets a port by index.20:34
Socapexit was in PLUGINS, not PORTS :P20:34
drobillammhmm.. :P20:34
SocapexI would name it, lilv_port_get_by_index20:34
Socapex:P20:34
drobillaYou'd be naming it pretty terribly, since you can't get a port from nothing.20:35
SocapexAnyways, I still think a LilvPorts itarotor collection would be nice. It would fit with all the rest of the lib. This is of course the thought of a 2 day user... So take it for what it is :)20:36
Socapexyeah I was just trying to save face...20:36
drobillaIt'd be more tedious to use than a for loop by index anyway20:36
drobillaI suppose it would be more consistent, but I'm not all that keen on adding even more collection boilerplate to pretend C is typesafe (probably shouldn't have bothered in the first place)20:37
Socapexwell what I mean is everything else I;ve used is iterators. So I don't know why that particular case is a standrad loop20:37
Socapexyes, consistent was the word I was looking for. I am not native english, sorry20:37
drobillaSocapex: Mainly because ports have a meaningful index, and the other things don't20:43
Socapexdrobilla: I'll settle for that. I'm not really trying to defend the idea, but I guess it's just something to note. New users may be searching for port iterators cause they are used to that. Personally I don't mind one or the other. I expect much more challenging things than for loops to be coming my way20:44
drobillaSocapex: You're the first.  But, yes.20:45
Socapexdrobilla: I'm the first? O_o I feel special right now! (Queue Madonna song which I shall not name)20:46
SocapexxD20:46
*** drobilla has quit IRC20:55
*** rncbc|AFK is now known as rncbc21:13
*** gianMOD has joined #lv221:54
*** rncbc has quit IRC22:01
*** gianMOD has quit IRC22:43
*** drobilla has joined #lv222:53

Generated by irclog2html.py 2.13.0 by Marius Gedminas - find it at mg.pov.lt!