Do I not understand the setLoadingCallback?
-
Oops, a bit late to the party but what's the problem with
Panel.setLoadingCallback(function(isPreloading) { if(!isPreloading) doTheStuffWithSampleMaps(); });
no timers or preload message hacks necessary, the
isPreloading
will guarantee that the samples are loaded). That's how I'm using it and it never failed me so far... -
Ah nevermind, I looked at the first post.
The loading callback is being executed every time when the sample loading callback picks up its work and finishes it, but it might be possible that this will happen multiple times if you load many sample maps as each of those is a single job.
It's therefore not 100% precise but I guess that was OK for me because I
- didn't rely on it for doing actual logic
- didn't use it in projects which loaded many samples at once
Now the proper solution for this (and I think that was requested by @gorangrooves last year) is to add a event type to the broadcaster that attaches to the event notifications of individual samplemaps - they get notified when a sample map was loaded, a new sample is added and a sample property is changed. This way you can write that logic in the place where it belongs and not a callback that was supposed to hide a loading progress bar and is working overtime since 2016...
-
@Christoph-Hart https://forum.hise.audio/post/76283
This is the primary issue.
It's returning 0 before the reloading finishes so if you have a percentage bar that you're refreshing, it stops just shy of 100%. The solution is to check the reload message string with a timer for the bar refresh and set it to 100% when it detects an empty string.
-
@aaronventure the primary issue is that this callback does not have a precise execution order.
I've added the
attachToSampleMap()
function here:https://docs.hise.dev/scripting/scripting-api/broadcaster/index.html#attachtosamplemap
Remind me in two days to update the broadcaster wizard...
-
@Christoph-Hart That is fantastic - thank you.
-
@Christoph-Hart Thanks for the docs, too. Some feedback -
I think you meant "The function expects three parameters. The third parameter needs to be a function…"
In the same sentence, you write "either" but the other case is never mentioned. If the two cases are regular and inline functions, consider: "The third parameter needs to be a function (regular or inline) with the exact…".
In line #3, should samplerID and eventType be switched?
By "SampleMapLoaded" do you perhaps mean "SampleMapChanged"?
-
@Christoph-Hart said in Do I not understand the setLoadingCallback?:
Remind me in two days to update the broadcaster wizard...
Tis time.
Also might want to fix this bug while you're at it (if you haven't already) - https://forum.hise.audio/topic/9746/broadcasters-best-practices/30?_=1718707836936
-
@Christoph-Hart How do we use the broadcaster to show a loading bar? It seems to me that the events trigger after they have completed.
Also
SampleMapLoaded
doesn't work, it needs to beSampleMapChanged
. -
Can anyone tell me why this progress/loading bar doesn't work?
HiseSnippet 1429.3ocyXrsaaaCkJNJM1qYXsnOrW1lfwdvYsHvNWZGVQwbhSRQvhSMrSCFPPP.iLsLQkHEHoRa1PA1Gy9.1mP+j1eP2ghx1zxtoNtWVMfMz4F4494H2Rv8IRIWfbJd7UwDjysc6bES0uQeLkgNXWjy23FKHgbbWJK3XhTg14pXrTR5hbbJ7TMWNEWDk94e+0cvgXlOYDJD5DN0mbHMhpFgsU8eiFFtOtK4XZjE2aV+.eNqAOjm.ZTA2pnXr+KvAjivZ1VvE4rzdcoJtniBqHRfmc3cupSe9KYF9OgJoWDRz.0PcfCxfF0nOMraqAVqDgbbaMx1KXr8641j1kNDusOPSvajD19.mEtNUp1MPkbrToEMpzcb63KnwpQTz5yW4d.SQD8vfq1VUL7hVXiBtM3.GL0ZQ3WP1W..CknxCqV8AdvOq93Rk.2sT4cIV30ByHg07dh2.ICHpF7nXNC.pT1PtLHi4o0jD0I3vDRkzyYDxVfSS0lmnnLRkdILeEkypDrZo+rTQ88fgqP0mJ0m+gbeb3N7DVWo4XJFrVOHyX6vvJC3oR4KBLYDkWEXonlGoV0znr3hpHQ17YNo1DeUkSwmV8rG3cZM3G7oqel2OMTCLlvpZ7ab1Yfbudbq4PSheCbX3EPp3HChJaMrrH01n87xgrXwzaQpvBkNOWTYqpSdCoTl77SOSi7Czx8XAfOUq0Y2BjTDHfrhJoFbJyBRr1+Ww3ofPojGRVKVnwcMx6ceuxd+B789dSvUSfCnDrRl2Wamuad7dxS7JW1x14wFSe0GWrn1zGXfdb1QbE4YYVZoWWxKOod8lJMc9ofGFpOzoPN65d2BVgkDcAQ7.HqG7pCYDJ4FuNdoYqN12TtXwHmc.ipdVLICdedXWc8o94Iq5QY0avSO+fcwJrtQPFNfuXhPQ0piytjKgNol1BEc2kHeA3bS4MqHE4rrJk5JCZZnSxPT3pW10jvgd0vls+0I0uZHvatn9KocU8g1hN+sCB0mPC5qzPeOPcPAHv9R.3a0RLpbSi8svGSm8I5fA8N4cSBwpwanpmbjQ.hNi0ES2ohIopqrmrbC5xV8Z6xNqp3cbaQU98mtNtvTzQHt8oPGylMsh6d85AMyFofK5t+uOuChl8q+6LW+cc6nDDbDzXqCNJFJ9R0gRtYP09XrVP7LuVPVamNz+vhs2TemDvGIFG6+TO8p1NBFyL1cko4sIwDrBByVxrb81sepfmDmWpkqmlTbr.5UCtBaa7YLB3qU11XCAWJ6AlS5YIsI0JQDn8UivzlbIQHGG2QIQP7lAUtRcsXAcOBIQGeo9MwJA8U1bmdKUOFmFigckRgqkCd8bvajCdybvakC9g4fezHXiCsINVmY7CtQXAE62md95WR4gTl7bnWVOtHxjJjqa6slstsvom1IyhycnACuYClw6sXw5v.RpRas13TVFaoOU6Gt3rUV9dlZ7kei1wVms3.crCUGp1icIT.CXz53cggY8vIgpAXGuYRSNiG2myn9iWt.o+AADgstOUCZakBpVGg4d0aSBIXoU89OV+PXeFrX7t.2HewMe09oFu9VWi55o6.58gD29rllcsCKKLSCK+nquy+fyOqttuNaDpWG86I7Edb91toM88zyn++RUMuaYvf4eq.CI6.KF3SrGUp2SMCtpFVqPcHrto.5sUyHVSC6jQrVNhqaK454Htgsjaji3l1RtYNhaYK4VCHh7Gn9fkm8b5qC3TfvziqR26LD1RHztLRBq7ncC2x0OjC8zP2bQccif2QXNDbIWAmGMQDwcpQjE9fhHnHrufetu4U3z9nkSw.ZJK8+FpnaSMrWMT5q0Yqtf0QO22e7iZBAWedEbi4UvMmWA2ZdE7gyqfOZdE7me+BpWcZ6DEOxL3.gZ1ZOSRnydCSBKf9O.VLRpn.
-
@d-healey Because my preloadMessage workaround seems to no longer be working, so your timer stops on the very first iteration.
It's time to implement the broadcaster, I think.
-
@aaronventure said in Do I not understand the setLoadingCallback?:
It's time to implement the broadcaster, I think.
See my post one above
I suspect that the loading callback is actually triggered on the UI thread because it seems to block the timer.
I did a test where I did the sample loading on a background task and in this case my loading bar worked, but it caused crashes in certain DAWs when loading lots of samples so I'm not trusting that method.
-
@d-healey here you go, tested with my samplemap. You were nearly there.
HiseSnippet 1543.3oc0X0kaabCDdWKuoVpIEMo4g9RAHL5CxsFNR4ezfzHaY6.iZkHH4ZT.CCC5coVQ3UjaI4ZGkh.zSPOK8HjiTuAoCIWIwUV10UMIs0O33Y3PxO9MCmOtosfGRjRtvyu7dCSId9WOn6Plpey9XJyamM87+7fTAIgiinr38HRk2FCSwRIIxy2uzy0Q4WdQOyO+wy1.mfYgjIt771mSCI6RGPUS71twOPSR1FGQ1iNvI562XmPNqIOgmAHpTPMuTb3I3XxKv5vVHvy+ZaEQUbQWEVQjd9KtAOZX297yX132mJoGmPzF085BKj0817jHMh0d8Z1mlD0dzIW544GzdBOTxxC2NnEMhN1uKenG.MYFt7g+BEgWoBvqtK7p4.uY.IeGHsnER2LnanflplLhFOeZvNLEQzCCztKTrw5svusXPSNDASs1.7IjsEfw3YT8g0psJB90JOoRksXwTFYMa1d8jjt3AoIDY0UdB5N2A0iKPvYRAkAUp.YIoBcJVfZiYjj5nmhFsIwDUS9fTNCLptrc3kgk29WqIIp8wIYjplsbhy1.+p5vyf0mTsWFKTQ4rpwqT4WpTVuOXXKT8oR85uKODmrAOiEIMKiIfTAOV.zxn3hvJ7ZTY6wEunmgxOgvRj6tc9jptB56P0MmyiIg3LIAVDBJuxexZ2CSSjHEGIH3v9n5qUyxKPrIXfQjFJa.NcUzYDTDGQUHnVVRRNkHQb3pQg0kBqHkQk8IQUpTNdsdvsBf3qN5fVc4iis2FVdE84TGiTyuZWNQQUjAtwYWoNjPU0CvGT6vUQGTG9E9f6dH5aFeZzNt2gGBS3MEyE6ZIrl3jjig6eSRGtzoIyjOmyy0OE4ZZHVIWyIgXF5myHhglrDhjHIm0mHH5CGsGZpsnbYygTpvBktUgn5Cpcd7ZF47n0fP67GUzcIE.ZdyDrfjpqEqZIbnrVxSHqkJz9trBnuEsLTDsL7umKpVPDPWrp4IQ847hYtmhpshluB6SBOYb4kNPclKkHTCQT35GAGMge3oV5YkmTtrldFQBPM2K3JxKyYiJuoBZ5g50aliouOK3II5EcFCmucW7DqxxFbLQrJzk.X9wABcyJ1hL3haQ51AOz1dwIPNaGFU8xTB6h5q6k2SB9qebmMABT2WM2WaKUR0PveSxofHksKa4fMIxS.B0DadiLO+kTlQuwndv5zmGE5ztTfMU58pw5X+59MFN13sG23LZjp+XGMdci9DZbeG8vuuwn64fuqANdm16ja0ZuuC9wJddNgAPRhGkkfUE0ozhy4C.YlBhCZA.ljpF5Jd+dS75pBwaFzlpB6OaLtvLvHj+9PfwbI+aDrUudPOyI.bwfs+oOL56ta+WY29aEzUAxJCfl.VkWq9dkfbq5uOd4U5U9kW4sj5ResSXuswFY.GIJ582aX1p0G.RxE1qbj2gjRvJHM6LmkZzoyyE7rzom0xMLEE6Ifd4.U3dFeIi.bsx8L1TvkxdvwwrVR2gZmIh0b0DOcHmRDxh9dQ1.Heyfav5dQ995dERhN+RCagUB5qbi1rK01CaxwvyQM10mx9tSYeuoru+T1OXJ6GNk8ilXaIzV3TckwWDr95G0gDSyjO9nM2okohXptqexUq6JrhltXNQtAMd7tY839H5w7tAaNO.eFOk8Zendc8hWsaeW9i++eP+zBeLP4QXrKUmc1hcJbOE7nw3s.sqd3rD0HuE6Yzhy3o84LZXwaEPUdbLQ3h8YdfVWofKkS7b6FcHIDrz4Z8W2XW3oOXQwK6+s3h5+s+vnYlu9x.KbQ5Fcn+I4sOpkYWplXoqjl36c7N+5ieTotOKWoD0U+4B+GOOe8.SucjVJ9eKnZ+b63QxbAfVXWP+Oj3pHtfVk0ZWSaqATWBKxXneTZ9f0GIepGr9nA8BGsTvYK+uMuD2uDgokNLO0KADlSbKokvqLzPBj79nfxA3PA+nP6Wtnw5RFO.JYl+mmJGzRaip6Y9ZFWnN.zqNJLr3RctId24ch2adm38m2I9f4chObdm3il2I93+5IpeNw5YJ9.ayTOuVs2xV.5u03BvRd+IpqL1KC
Basically:
- store isPreloading into panel data property
- check against that in the timer in order to stop it
- check against that in the paint routine whether to poll PreloadProgress or to straight up draw 1.0
-
@aaronventure Thanks!, It's interesting, because it works. But this doesn't
Panel1.setLoadingCallback(function(isPreloading) { if (isPreloading) this.startTimer(50); else this.stopTimer(); });
-
It doesn't seem to work reliably in my compiled project, maybe something to do with it being an expansion...
@Christoph-Hart Can you make this work reliably, either via a broadcaster or the preload callback?
-
@d-healey said in Do I not understand the setLoadingCallback?:
@Christoph-Hart How do we use the broadcaster to show a loading bar? It seems to me that the events trigger after they have completed.
Also
SampleMapLoaded
doesn't work, it needs to beSampleMapChanged
.Bump
-
@d-healey @aaronventure The new broadcaster works great - I'll post a code sample if anyone needs.
-
@clevername27 For a loading bar?
-
@d-healey Good point. I'm wondering if the callback is good enough for the progress bar, and then use the broadcaster to finish it?
-
@Christoph-Hart Could it be the preloading callback isn't working correctly for me because I'm not loading my sample maps from my deferred UI script, instead I'm using a secondary MIDI processor for this?
-
I just found this in the doc on threads, is this why my loading bar isn't working reliably?
With the exception of the latter, all these multithreaded use cases are not synchronised by default (with the rationale of preferring data race conditions over deadlocks and priority inversions). The exception is the user preset load, which locks the scripting thread by default during the operation.