Wednesday, 2015-02-18

badosuIs there any Qt lv2 plugin that uses ui:Qt4UI?00:02
drobillasynthv2 and friends, I think00:14
*** falktx has quit IRC00:35
badosuThanks, I managed to create the QT port01:24
*** NickSB2 has joined #lv201:53
*** gianMOD has joined #lv202:02
*** gianMOD has quit IRC02:36
badosuWow, using a raw Makefile to compile a QT application is hard03:53
badosuI finished it, now I just need to sort out the ttl issue with multiple GUIs: https://github.com/badosu/BadAmp05:44
drobillabadosu: Currently they must be different UIs (i.e. have a different URI)07:17
drobillabadosu: Been some talk of providing a way for the same UI to provide several implementations dynamically, so the UI is more semantic (full, tiny, mixer strip, etc) and the widget type is more of an implementation detail for hosts to choose appropriately, but no API for that yet07:18
*** zth_studiocomp has quit IRC08:43
*** zth_studiocomp has joined #lv208:45
*** edogawa has joined #lv208:46
*** edogawa has quit IRC09:20
*** gianMOD has joined #lv209:56
*** ricardocrudo has joined #lv210:14
*** gianMOD has quit IRC11:03
*** gianMOD has joined #lv211:03
*** gianMOD has quit IRC11:04
*** ricardocrudo has quit IRC11:09
*** falktx has joined #lv211:12
*** gianMOD has joined #lv211:28
*** ricardocrudo has joined #lv211:44
*** gianMOD has quit IRC12:41
*** ricardocrudo has quit IRC12:45
*** rncbc_jolla has joined #lv213:28
*** gianMOD has joined #lv213:42
*** gianMOD has quit IRC13:47
*** gianMOD has joined #lv213:50
*** NickSB2 has quit IRC13:56
*** ricardocrudo has joined #lv214:06
*** gianMOD has quit IRC14:12
*** sigma6 has joined #lv214:23
*** gianMOD has joined #lv214:24
*** gianMOD has quit IRC15:39
*** gianMOD has joined #lv215:40
*** gianMOD has quit IRC15:41
*** gianMOD has joined #lv215:42
*** gianMOD has quit IRC15:43
*** gianMOD has joined #lv215:44
*** gianMOD has quit IRC16:12
*** gianMOD has joined #lv216:17
*** gianMOD has quit IRC16:37
*** ricardocrudo has quit IRC16:42
*** gianMOD has joined #lv216:55
*** ricardocrudo has joined #lv216:56
*** rncbc_jolla has quit IRC16:58
*** rncbc_jolla has joined #lv216:59
*** gianMOD has quit IRC17:12
*** gianMOD has joined #lv217:13
*** ricardocrudo has quit IRC17:14
*** gianMOD has quit IRC17:17
*** sigma6 has quit IRC17:26
*** rncbc has joined #lv217:39
*** gianMOD has joined #lv217:50
*** greenkobold has joined #lv218:37
*** gianMOD has quit IRC18:42
* drobilla idly wonders how much less hated LV2 would be if it was JSON-LD instead of Turtle18:53
drobillaOdd one, that.  On the one hand a naive RDF serialization to JSON looks like utter crap18:53
drobillaBut it is clever how you can define a context to make things look like 'dumb' key value (string keys) but map to something meaningful18:53
*** gianMOD has joined #lv219:10
*** gianMOD has quit IRC19:27
* drobilla tinkers with lv2/Plugin.hpp19:51
drobillaI'm half tempted to just make a monolithic one with stubs for all extensions.  There, there's your damned single file class for dummies19:52
drobillaThat makes optional/required feature stuff tricky though, the mixin thing ala lvtk can deal with that nicely19:52
falktxdrobilla: please don't use all those template trickery lvtk does19:53
falktxit looks awful19:54
falktxand also very hard to understand19:54
drobillafalktx: I agree, though it can be better with C++1119:54
drobillaThe trouble is, I don't think you can get an 'override this method' sort of thing without mixins19:54
drobillae.g. worker callback19:54
falktxyou can make virtual classes19:55
drobillaoverhead.19:55
falktxwhich take Plugin as a constructor19:55
falktxplugin devs will then subclass Plugin, Worker, State etc19:55
drobillaI had considered that, but then they would have to be templates anyway if you want access to your plugin fields19:55
falktxhm?19:55
falktxas long as you pass Plugin* in those classes  constructor, there's no need for templates19:56
falktxtemplates might be useful for atom types though, and forge19:56
drobillaPlugin* is a base class with nothing in it19:56
falktxyes19:56
drobillaYou can cast it every time, sure19:56
drobillaBut this is starting to get not a heck of a lot prettier than the mixin thing19:56
falktxWorker and State can be virtual classes that take Plugin* var in contructor19:56
falktxdrobilla: have you started this?19:57
drobillafalktx: vaguely19:57
falktxI'm super bored today so I might try this19:57
drobillaIf it's going to be C++, having a bunch of nasty upcasting in there seems pretty brutal19:57
* drobilla wonders if some kind of C++ slot thingie can make callbacks decent19:58
falktxheh19:59
drobillaMaybe the things like workers can be templates that take a class sort of like you say, but instead of dealing with the 'crossing a bunch of object' boundaries, they require their template type (the plugin) to adhere to some API19:59
falktxI'd prefer to have it work without any possible std:: stuff19:59
drobillae.g. having a worker() method with a given signature20:00
drobillafalktx: Me too, though I think maybe I just don't give a shit about pre-C++11 if something there turns out to be handy20:00
falktxnew names should be used though20:00
falktxoverride, nullptr, etc20:00
* falktx hates NULL macro20:02
drobillatemplate<typename Plugin> class Worker { Worker(Plugin* plug) {...} response(...) { plug->response(..); } }; ?20:03
falktxwhy is template needed?20:03
drobillabecause response is defined in the user's derived plugin class20:03
falktxthe plugin will call it, so it will need a point to a Worker class instance right?20:04
drobillaSo you get the same illusion that your plugin is just a class that needs to implement this and that method20:04
drobillafalktx: That's a case where the host calls it, so in your plugin you just know whatever method gets called20:05
drobillafalktx: In the case where plugin calls it, just walling m_worker.whatever() should do20:05
drobillacalling*20:05
falktxI need to start coding this to perfetly understand what it needs20:05
drobillaNo need to override those, so worker.schedule() is fine20:06
drobillaI think it's basically a requirement that additional methods just look like additional methods, though.  Otherwise things get ugly.20:06
drobillaIf we can achieve that without mixin hell, that would be lovely20:06
*** edogawa has joined #lv220:06
drobillaUnfortunately no solution other than a monolithic class will give us one big class documentation thing with all the possible methods20:07
drobillafalktx: I can send you my stub Plugin if you want20:07
falktxsure20:07
falktxfor me the solution is to make the basic extensions in the base plugin class20:07
falktxsay state, atom and urid-map20:07
drobillaYeah, but what's "basic"...20:08
falktxthen other things have their own virtual class20:08
drobillaI'm tempted to do so anyway, even though it's horribly unmodular20:08
falktxwell, worker is not basic20:08
drobillaBut the plugin needs to deal with setup for them anyway, since the feature array needs to be processed somehow and whether it succeded checked and so on20:08
drobillaHm, I suppose instead of magic template duck typing, the plugin could be required to inherit from worker::Interface20:09
drobillaIf that was virtual, the worker, uh, not-mixin could not be a template20:10
drobillaI'm not sure if using virtual at all is the best idea20:10
falktxa good test for this class will be  implementing one of the examples with it20:11
drobillafalktx: Yes.  I've been wondering what kind of example20:12
drobillaI also plan to do a nicer forge and atom iterators20:12
falktxeg-sampler?20:12
drobillafor (const atom::Event* ev : input) { ... }20:12
falktxfor (auto ev : input) { ... }20:13
falktx:)20:13
drobillafalktx: Maybe I should just make a C++ branch?20:13
drobillaatoms are a bit tricky.  you can't really make ideal C++ wrappers that work nicely with nesting but are still just normal atoms in memory20:14
falktxlet me do a design first and show it20:14
drobillaI've been tinkering with some variadict template hackery that would allow it syntactically though, for forge(dict(lv2.label, "whatever", lv2.index 5)) and so on20:14
drobillafalktx: I figured it be easier that way, but okay.  Cleaning up header20:15
falktxwhat's the simplest lv2 example?20:15
drobillaamp20:17
falktxI'll do whatever that requires first, and show it to you20:17
drobillaOne problem with not using mixins is that overriding default methods like connect_port isn't possible20:18
drobillameaning e.g. Plugin needs to have a vector of void* for port buffers, no choice for the dev on how to do this20:19
*** gianMOD has joined #lv220:19
drobillaactually, I guess not, the descriptor maker thing can take a template20:19
falktxdrobilla: can we assume buf-size, urid-map and options as being required?20:21
drobillafalktx: no.20:21
falktx:(20:21
drobillaWell, why?20:21
falktxurid-map is obvious20:22
falktxbuf-size for actually knowing the values20:22
drobillaWell, ideally we have a clean design for these things, so there should be little cost20:22
falktxbuf-size requires options to work20:22
drobillaI think an official wrapper shouldn't assume anything.  That's one of the differences between an official one and a "whatever I need" header full of assumptions20:22
drobillaIt also makes it much easier for us to be sure it's done/good/solid.  Wraps precisely what's there, done.20:23
falktxdrobilla: should this be a header devs will subclass, or one devs will copy and adjust?20:23
drobillaI'll get sloppy if we unfortunately really have to be for some good reason, but ideally not.20:23
drobillafalktx: subclass.  Though people can copy it if they like.20:24
drobillaIt will be installed like any other LV2 header, though probably not with a binary compatibility guarantee since it's not a host:plugin interface20:24
falktxok20:25
falktxbrb20:25
*** falktx has quit IRC20:25
*** gianMOD has quit IRC20:28
*** falktx has joined #lv220:30
drobillaThis adds a few restrictions that prevent some of the things lvtk does.  I think maybe Plugin should just have zero state whatsoever, and also be RT instantiable20:30
*** rncbc has quit IRC20:31
falktxI think I missed something20:32
falktxI logged off after my "brb"20:33
*** rncbc has joined #lv220:33
*** rncbc_jolla has quit IRC20:34
drobillafalktx: Nope.  By "this" I just meant the requirement that the interface not impose any restrictions beyond what LV2 itself does20:34
drobillafalktx: I think we can still make things quite nice this way, though20:34
* drobilla wishes so hard we just made the damned descriptor struct extensible20:35
drobillaLittle too much wooo decentralized extensions kool-aid back in the day20:36
*** gianMOD has joined #lv220:38
drobillaNot sure if we can make implementing lv2_descriptor go away, though it is probably better we just use the new Lib discovery API anyway20:38
falktxbut it needs to handle implementing the descriptor for several plugins in the same binary20:40
falktxso perhaps it can be a separate cpp file20:40
drobillaMaybe.  Including code is definitely questionable.20:41
drobillaNot sure how extension_data can be nice without mixins20:41
drobillaI think a derived class mixin is necessary to make the static callbacks work20:44
drobillae.g. class MyPlugin : public Plugin<MyPlugin>20:44
drobillaEither that or virtual everything20:44
falktxyou need virtual stuff so you can reimplement20:48
*** gianMOD has quit IRC20:49
falktxdrobilla: can we assume ports are static?20:49
falktxit would allow to hide connect_port implementation20:49
drobillaThe answer to "can we assume *" is no :)20:49
drobillafalktx: I plan to add a run_on extension to eliminate that blasted thing entirely soon20:50
drobillaI think this guideline is the only way to actually get this done and ensure we don't shoot ourselves in the foot20:50
drobillaclass MyPlugin : public lv2::Plugin { void run_on(void** bufs) { ((float*)bufs[1]) = ((const float*)bufs[0]) * 2.0f; } };20:52
drobillaWhich I wish we could do with const-correctness :/20:52
drobillanon-mixin option is make the status wrappers template functions, I suppose20:55
falktxeg-amp is a bit too simple :P20:55
drobillayep.20:55
drobillaSomething like fifths is probably better20:55
drobillaMIDI-only though20:56
drobillaTrying the template functions (non-mixin) approach21:01
drobillafalktx: I'll send you a stub that works shortly21:01
drobillaand by "send" I mean push a C++ branch.  Might as well just get this ball rolling properly21:01
falktxlet me show you eg-amp in c++21:02
drobillamaybe a MIDI gate21:02
drobillafalktx: ok21:02
*** NickSB2 has joined #lv221:02
falktxdrobilla: https://gist.github.com/falkTX/45f8c2f441bc3784858321:03
falktxthose PortIndexes should not be uppercase, those are usually for macros21:04
* falktx adjusts21:04
falktxdrobilla: updated21:06
drobillabetter before :P21:06
falktxI disagree, but whatever, it's not the api21:07
falktxI'll do midigate next21:07
drobillaVST hath rotted thy mind21:08
falktxnot vst, it's the common c++ practice in some apis21:08
falktxwell, which includes vst21:08
* drobilla tries to think of the simplest possible thing with a worker method21:11
drobillamaybe something dumb and synthetic that "calculates" a parameter there just because21:11
*** ricardocrudo has joined #lv221:20
drobillaSpeaking of naming conventions, I know _ prefix is "bad", but everything else is so awful.21:25
drobillaI reluctantly am doing the m_ thing21:25
drobillaImplicit "this" is one of the dumbest ideas to come out of the 90's quasi-OO nonsense21:25
drobillaNow everything's fucked and the C++ standard is considering working around it by definining foo.bar(x) as syntactic sugar for bar(foo, x) to make anything higher-order not horribly painful21:26
drobillaGood work, guys21:26
falktxI need a good name for the C feature structs as c++21:26
falktxmaybe using non-lv2 prefixed names in a LV2 namespace21:29
falktxso it becomes LV2::Plugin and LV2::URID_Map21:29
drobillalv2::Plugin etc21:32
falktxlv2 or LV2 ?21:32
drobilla(namespaces lowercase)21:32
falktxwhy is that?21:34
drobillaGot a working plugin21:41
drobillafalktx: Just the most common convention21:41
drobillaacronyms are maybe a weird case21:41
drobillaSomething clever to make connect_port go away would be nice, but you can't have a polymorphic vector...21:43
drobillaor we could just add run_on and ignore that problem21:44
* drobilla needs to consider if/how lilv could isolate hosts from this entirely21:44
drobillaaaaaaaaaaaaaaand I pushed to master21:45
drobillamother.21:45
drobillafucker.21:45
drobillaHooray for sloppy commit logs21:47
drobillafalktx: there is a c++ branch now21:47
drobillaMaybe we can make a fancy descriptor wrapper that delegates to the next in the list to achieve an automatic lv2_descriptor() without code21:48
drobillaBut I think I'll try to wrap the Library API and see how that goes anyway, maybe just don't care21:48
falktxdrobilla: midigate https://gist.github.com/falkTX/2da8087fd8dc3dd1380b21:49
drobillafalktx: Thanks.  I don't just want to port all the existing examples to c++ though21:53
drobillafalktx: extension implementation like that needs some way to deal with requiredness21:53
falktxdrobilla: on your code the plugin class actually does nothing21:55
falktxcode-wise it's not needed21:55
falktxit also makes that the devs need to implement all functions (called by template)21:56
drobillacorrect on the first.  not the second21:59
falktxdrobilla: here's my current c++ class https://gist.github.com/falkTX/31b0b6955a60bff9501c21:59
drobillaIt is essentially documentation.21:59
falktxmy idea as you see was to make the plugins subclass the needed features22:01
drobillaNot much point with URIMap and the like22:01
drobillaWorker, yes22:01
drobillaI guess it means you can call a method on self which is a bit shorter22:02
drobillaMaybe they should all take a pointer to plugin in their constructor, and set valid = false on it if they're mandatory but the feature is not present22:03
drobillaand instantiate() wrapper can detect this and fail automatically (delete and return NULL)22:03
drobillaAdds state to Plugin, but oh well.22:05
drobillaNo way to fancily delegate to super without mixins22:05
*** rncbc has quit IRC22:07
*** gianMOD has joined #lv222:10
drobillaI can't think of any way other than the flag thing22:18
*** ricardocrudo has quit IRC22:21
drobillafalktx: I think extensions should go in their dirs, namespace lv2::ext22:24
drobillafalktx: Not sure if headers should be split up into classes or just ext.hpp22:24
falktxI'm still trying to get something to look decent22:26
drobillaI'm working on Lib22:27
* drobilla debates using std::vector22:27
falktxthe core plugin class is too simple22:27
drobillatoo simple how?22:27
falktxsome basic features really need to be there22:27
drobillaWell, that's LV222:28
falktxuridMap() and uridUnmap() should be provided by the plugin class22:28
drobillaWhat's "basic" to you is completely unnecessary for others22:28
drobillaThis is the difference between a sloppy convenience header and standard ones22:28
drobillaI don't want to have long pointless arguments about what counts as "basic" or "official" or whatever22:28
drobillaPeople forming committees to define LV2 "profiles" and all that nonsense.22:28
falktxhmm, maybe we can have the base stuff in separate classes, then a plugin+features all-in-one22:29
drobillaIs inheriting from the features you need really all that burdensome?22:29
falktxno, but gets extensive pretty quick22:30
drobillaIf we ever have a dyn-data thing some day, those things can automatically emit feature optional/required data and so on.  it's nice.22:30
drobillafalktx: Well, yes, we have way too many damned extensions, but that's a problem itself22:30
falktxbeginners will have to go through all features to know how to do something22:30
drobillaThough most don't actually correspond to any such class22:30
drobillaI don't think veneering over the spec in some weird hybrid thing that includes some things but not others because someone arbitrarily chose so at the moment is a very solid path forward22:31
drobilla(Plus it'll probably just let us fuck up how we do extensions and not notice)22:31
drobillaLack of one big ol' header and/or class doc with all the methods anyone will ever care about is mildly unfortunate, granted22:32
drobillaI wish LV2 was less like this, but it is22:34
falktxstill, having the features in the plugin... it's just a small update away when a new official lv2 api comes22:34
drobillaExamples are the ultimate docs anyway.  As long as the actual plugin code looks nice, it's fine.22:34
drobillaI don't see what you mean.22:34
falktxI expect the c++ header to be updated together with the c headers22:35
drobillaThey will be.22:35
drobillaWell, let's entertain the idea of a monolithic header, then22:36
drobillaHow to deal with features?  optional and required, and failing22:36
drobillaOne downside is that some features are usable on the UI side too.  Code duplication.22:36
falktxwe just get whatever the host provides22:36
falktxand return safely if it's not available22:37
drobillaYes, but if you require one and the host doesn't provide it, just crashing is hardly a great solution22:37
drobillaReturn safely how?22:37
falktxthe ttl should include the requirement22:37
falktxreturn nullptr etc22:37
drobillaYes, but how?22:37
drobillaYou want one class with everything baked in, so... how?22:37
drobillaSeems to me any possible solution is at least as verbose as inheriting from a feature22:37
falktxI mean I want to have stuff like "makePath()", "uridMap()" etc in the plugin class22:39
falktxit will make documentation much easier22:39
drobillaWhich means monolithic class with everything LV2 in it.22:39
falktxyes22:39
falktxif the dev calls something, it must list that as required in the ttl22:39
falktxthe function documentation must say that22:40
drobillaThey do, but welcome to the real world.  People fuck it up.22:40
drobillaPresumably most feature implementations will not be overhead-free, too22:40
drobillaDeprecation of anything becomes a mess22:40
drobillaThe only real downside is lack of a doxygen page that describes all possible methods in a flat class22:41
drobillaDoesn't really seem to weigh out very well22:41
drobillaand an example plugin that implements a stub of everything is as good if not better anyway22:41
falktxit's only a few extra pointers22:42
falktxvs using 3-4 more subclasses22:42
falktxwell, a few pointers and a few functions22:42
drobillaI suppose a hybrid solution is possible22:44
drobillaPlugin defined empty stubs for all the functions as it does currently22:44
drobillaBut the actual implementations that do all the C wrapping crap are in thingies you need to inherit22:44
drobillaand those thingies can deal with the magic feature getting and so on22:45
drobillaSo the whole thing isn't crammed into a massive nasty header, yet there's still a single class doc that documents all methods22:45
drobillaand still overhead/state free22:45
drobilla(well, maybe a valid bool)22:45
drobillaDoc-wise this would actually be pretty nice, since the method docs can describe what you need to do for that method to actually work22:47
falktxdrobilla: is this any good? https://gist.github.com/falkTX/31b0b6955a60bff9501c22:57
drobillafalktx: lv2::Plugin can't have the overhead of every extension22:58
drobillafalktx: The features themselves are approaching the right thing22:59
drobillafalktx: But *instantiation* needs to fail if a required feature is not given22:59
drobillafalktx: Having them set a flag on Plugin is the only way I can think of doing this22:59
falktxwe have lv2_instantiate to check for features23:00
falktxand then only create the plugin class if they are all present23:00
drobillaHow can it do so?23:01
drobilladynamic_cast I guess, but ick23:01
*** edogawa has quit IRC23:03
falktxI don't see why this is such a big issue23:05
falktxthe plugin lists the *required* features in the ttl23:05
drobillaWell, it is a simple fact that I have seen this happen all the time23:05
falktxif a non-supported host still load it, it's broken23:05
drobillaA decent wrapper can easily gracefully deal with this situation23:05
falktxyes23:06
drobillaThat attitude just results in shitty flaky code23:06
drobillaSo unless there's some good reason it can't deal with it nicely, it should23:06
drobillaIn making standard wrappers I'm shooting for something solid we can rely on as, well, solid, and jive with extension in the future, and overhead-free23:07
drobillaIt requires a bit more thought than a whatever-the-fuck-I-want header utility for local projects, but c'est la vie23:07
drobillaWe're at, what, the 2 hour mark now?  It's not quite rabbit hole territory yet :)23:07
drobillaOne of the main benefits of C++ is the smarter compiler makes enforcing things easy, so it's harder (or ideally impossible) to screw things up23:08
falktxnow you get me thinking23:08
drobillaIf we inherit from feature classes, it should be easy to ensure that a plugin not passed the required features is not instantiated whatsoever23:09
falktxthis header file should play nice with external extensions23:09
drobillaWell, yes, that is one case where completely monolithic obviously falls apart23:09
falktxbut typing all the feature[i].URI == "that-uri" is tiresome23:10
falktxmaybe the features can be a simple template23:10
drobillaI think avtk gets it mostly right23:10
falktxyou mean lvtk23:11
drobillaer, right23:11
drobillaFeature implementation classes can take a required parameter, and the features list23:11
drobillathey'll scan the features themselves23:11
drobilla(which is a bit more expensive than doing it once, but oh well)23:11
drobillaSo all plugin authors have to do is MyPlug(features) : URIMap(true, features) {}23:12
drobillaThe mixins let you not even have to do that, but other things get uglier23:12
falktxwhat is the first "true" for ?23:14
falktxrequired vs optional?23:14
drobillayeah23:14
drobillatemplate parameter in lvtk, but I don't think there's a point to that, this way23:14
falktxso it throws if not found?23:15
drobillaWell, that's the question23:15
drobillaThe only non-exception solution I can think of is pass them a pointer to MyPlugin as well23:15
drobillaThey can do plug->set_valid(false) if things go pear shaped23:15
drobillaWhich kills the "overhead free" thing, but only by a bool...23:15
falktxbut for that you can simply pass a bool reference23:15
drobillaah-hah, so you can23:16
drobillathough then the Plugin constructor interface would need to as well, which is a tad weird23:16
drobillabetter'n state, though23:16
falktxI think the constructor needs an 'uri' parameter too23:19
drobillaWell, instantiate probably should too, but it doesn't23:20
falktxI mean for the feature class23:21
drobillaWhich means it's inherently static anyway23:22
falktxI'll show you in 2mins23:22
drobillaOK23:22
* drobilla wonders why the hell he made lib access via a function in the first place23:24
falktxdrobilla: https://gist.github.com/falkTX/31b0b6955a60bff9501c23:28
falktxdrobilla: the c++ features get simple enough I think23:29
drobillaI suppose that works23:30
drobillaI don't think virtual is needed, though.  Nothing will ever be freeing the plugin from a base class pointer23:30
falktxit gets a compiler warning with -Wextra if it's not there23:31
drobillaWhat warning?23:32
drobillaProbably because you inherited from it with something virtual23:33
falktxah wait, it was -Weffc++23:34
drobillaThat warns about everything ever23:34
falktxI use it on my own code23:34
falktxlv2.hpp:67:8: warning: base class ‘struct lv2::Feature<LV2_State_Make_Path>’ has a non-virtual destructor [-Weffc++]23:34
falktxit doesn't hurt to have it there23:34
* drobilla shrugs23:34
drobillaWell, yes it does.  It makes a vtable.23:34
falktxthe constructor already does that afaik23:35
drobillaNope.  Nothing here will have vtables.23:35
drobillaSeems everything can be done cleanly enough without.23:35
drobillaOverhead-free wrapper >>> C++ as second class bloated citizen23:36
drobillaThings like worker are the trickier part23:36
drobillaWell, there's a sort of host-feature and plugin-interface split here23:36
drobilla(The terminology surrounding this stuff is messier than it should be)23:37
falktxfirst the features, then interfaces23:37
drobillaThe latter is going to affect the design, though.  I wouldn't invest too much time before having the base sane23:38
drobillae.g. the 'feature' is probably going to need to be a template that takes a MyPlugin23:38
falktxwell in my case is to make the 2 example actually compile23:39
falktxif it doesn't build it's a bad sign23:39
drobillaSure.  Main goal for today is to get amp compiling with library, then a "feature implementation" and/or "interface implementation" base class in there if one is required23:42
drobillaThen you or whoever can work on the repo to flesh things out23:42
drobillaI wonder if inheriting from a C struct and not adding any virtuals or fields is guaranteed to get you something binary compatible...23:44
drobillaCould make the static wrappers cleaner23:44
falktxthe external ui does that actually23:45
falktxsince it has no "handle"23:45
drobillaThat whole handle thing is an unfortunate mess, too :/23:45
drobillaWhat we should have done is had a standard LV2-wide extensible struct header23:46
drobillasize, maybe version, handle23:46
drobillaHm.  So could/should Plugin/Lib inherit from LV2_Descriptor/LV2_Lib_Descriptor...23:48
falktxhmmm now we need a way to know if a feature is available23:49
falktx(on the plugin constructor)23:49
drobillaThis brings me back to MyPlug : public lv2::Plugin<MyPlug>23:49
drobillai.e. template<class Derived> Plugin;23:50
falktxthat's sorta the same case23:51
drobillaI'm just wondering if it's worth if it the only point is making the static stuff a bit cleaner, which plugin authors don't give a crap about23:52
falktxwhat should the dev do to check if a required feature is not present in the plugin constructor?23:58
falktxwe can itenerate over the features uris, but that won't look very c++-ish23:58

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