musikinformatik / SuperDirt

Tidal Audio Engine

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

startup code works with 1.7.2, fails with 1.7.3

ahihi opened this issue · comments

i'm using supercollider 3.12.2 on macos 10.14. the following is a simplified version of my startup code:

(
s = Server.local;
s.options.sampleRate_(44100);
s.options.memSize = 1024 * 1024;
s.options.numBuffers = 1024 * 256;
s.options.numWireBufs = 128;
s.options.maxNodes = 1024 * 32;
s.latency_(0.205);
s.newBusAllocators;

~makeDirt = {
	var dirt;
	dirt = SuperDirt(2, s);
	dirt.loadSoundFiles;
	dirt.loadSoundFiles(Platform.userHomeDir +/+ "SyncBig/sc/dirt/samples/*");
	[1, dirt].postln;
	dirt;
};

s.waitForBoot {
	~dirt = ~makeDirt.();
	[2, ~dirt].postln;

	s.sync;
	
	~dirt.start(outBusses: 0 ! 12);
};
)

this works fine with SuperDirt 1.7.2, but fails with 1.7.3:

compiling class library...
	Found 855 primitives.
	Compiling directory '/Applications/SuperCollider/SuperCollider.app/Contents/Resources/SCClassLibrary'
AVDCreateGPUAccelerator: Error loading GPU renderer
	Compiling directory '/Users/ahihi/Library/Application Support/SuperCollider/Extensions'
	Compiling directory '/Users/ahihi/Library/Application Support/SuperCollider/downloaded-quarks/Vowel'
	Compiling directory '/Users/ahihi/Library/Application Support/SuperCollider/downloaded-quarks/Dirt-Samples'
	Compiling directory '/Users/ahihi/Library/Application Support/SuperCollider/downloaded-quarks/SuperDirt'
	numentries = 1369963 / 24021700 = 0.057
	6725 method selectors, 3572 classes
	method table size 23519544 bytes, big table size 192173600
	Number of Symbols 17061
	Byte Code Size 527730
	compiled 649 files in 2.22 seconds

Info: 3 methods are currently overwritten by extensions. To see which, execute:
MethodOverride.printAll

compile done
localhost : setting clientID to 0.
internal : setting clientID to 0.
Emacs: Initializing lisp interface.
Class tree inited in 0.03 seconds


*** Welcome to SuperCollider 3.12.2. *** For help type C-c C-y.
Emacs: Index help topics in 1.08 seconds
Emacs: Built symbol table in 0.0421 seconds
server 'localhost' unresponsive, rebooting ...
'/quit' message sent to server 'localhost'.
-> localhost
Booting server 'localhost' on address 127.0.0.1:57110.
VSTPlugin 0.4.2
Found 0 LADSPA plugins
Number of Devices: 13
   0 : "Scarlett 6i6 USB"
   1 : "BlackHole 32ch"
   2 : "Digital-out (HDMI)"
   3 : "Digital-out (HDMI)"
   4 : "Digital-out (HDMI)"
   5 : "Digital-out (HDMI)"
   6 : "Line-in (Blue Rear)"
   7 : "SPDIF-in (White Rear)"
   8 : "Speaker (Unknown)"
   9 : "Headphones (Green Front)"
   10 : "Line-out (Green Rear)"
   11 : "SPDIF-out (White Rear)"
   12 : "Scarlett+BlackHole"

"Scarlett 6i6 USB" Input Device
   Streams: 1
      0  channels 6

"Scarlett 6i6 USB" Output Device
   Streams: 1
      0  channels 12

SC_AudioDriver: sample rate = 44100.000000, driver's block size = 512
SuperCollider 3 server ready.
Requested notification messages from server 'localhost'
localhost: server process's maxLogins (1) matches with my options.
localhost: keeping clientID (0) as confirmed by server process.
Shared memory server interface initialized
loading synthdefs in /Users/ahihi/Library/Application Support/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/core-modules.scd
---- core synth defs loaded ----
loading synthdefs in /Users/ahihi/Library/Application Support/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/core-synths-global.scd
loading synthdefs in /Users/ahihi/Library/Application Support/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/core-synths.scd
loading synthdefs in /Users/ahihi/Library/Application Support/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/default-synths.scd
loading synthdefs in /Users/ahihi/Library/Application Support/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/try-load-extra-synths.scd
loading synthdefs in /Users/ahihi/Library/Application Support/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/tutorial-synths.scd
loading synthdefs in /Users/ahihi/Library/Application Support/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/zzzzz-core-modules-that-come-last.scd


217 existing sample banks:
808 (6) 808bd (25) 808cy (25) 808hc (5) 808ht (5) 808lc (5) 808lt (5) 808mc (5) 808mt (5) 808oh (5) 808sd (25) 909 (1) ab (12) ade (10) ades2 (9) ades3 (7) ades4 (6) alex (2) alphabet (26) amencutup (32) armora (7) arp (2) arpy (11) auto (11) baa (7) baa2 (7) bass (4) bass0 (3) bass1 (30) bass2 (5) bass3 (11) bassdm (24) bassfoo (3) battles (2) bd (24) bend (4) bev (2) bin (2) birds (10) birds3 (19) bleep (13) blip (2) blue (2) bottle (13) breaks125 (2) breaks152 (1) breaks157 (1) breaks165 (1) breath (1) bubble (8) can (14) casio (3) cb (1) cc (6) chin (4) circus (3) clak (2) click (4) clubkick (5) co (4) coins (1) control (2) cosmicg (15) cp (2) cr (6) crow (4) d (4) db (13) diphone (38) diphone2 (12) dist (16) dork2 (4) dorkbot (2) dr (42) dr2 (6) dr55 (4) dr_few (8) drum (6) drumtraks (13) e (8) east (9) electro1 (13) em2 (6) erk (1) f (1) feel (7) feelfx (8) fest (1) fire (1) flick (17) fm (17) foo (27) future (17) gab (10) gabba (4) gabbaloud (4) gabbalouder (4) glasstap (3) glitch (8) glitch2 (8) gretsch (24) gtr (3) h (7) hand (17) hardcore (12) hardkick (6) haw (6) hc (6) hh (13) hh27 (13) hit (6) hmm (1) ho (6) hoover (6) house (8) ht (16) if (5) ifdrums (3) incoming (8) industrial (32) insect (3) invaders (18) jazz (8) jungbass (20) jungle (13) juno (12) jvbass (13) kicklinn (1) koy (2) kurt (7) latibro (8) led (1) less (4) lighter (33) linnhats (6) lt (16) made (7) made2 (1) mash (2) mash2 (4) metal (10) miniyeah (4) monsterb (6) moog (7) mouth (15) mp3 (4) msg (9) mt (16) mute (28) newnotes (15) noise (1) noise2 (8) notes (15) numbers (9) oc (4) odx (15) off (1) outdoor (6) pad (3) padlong (1) pebbles (1) perc (6) peri (15) pluck (17) popkick (10) print (11) proc (2) procshort (8) psr (30) rave (8) rave2 (4) ravemono (2) realclaps (4) reverbkick (1) rm (2) rs (1) sax (22) sd (2) seawolf (3) sequential (8) sf (18) sheffield (1) short (5) sid (12) sine (6) sitar (8) sn (52) space (18) speakspell (12) speech (7) speechless (10) speedupdown (9) stab (23) stomp (10) subroc3d (11) sugar (2) sundance (6) tabla (26) tabla2 (46) tablex (3) tacscan (22) tech (13) techno (7) tink (5) tok (4) toys (13) trump (11) ul (10) ulgab (5) uxay (3) v (6) voodoo (5) wind (10) wobble (1) world (3) xmas (1) yeah (31) 
... file reading complete. Required 444 MB of memory.



16 existing sample banks:
em (1) flbass (9) haly (1) henki (1) kapysym (41) lelclap (14) 
WARNING: File reading failed for path: '/Users/ahihi/SyncBig/sc/dirt/samples/nab/narayanbreikki-129.wav'


nab (128) ride (15) sncl (232) sw (50) thesupremekaiya (8) turkuloop (1) tvo (164) uela (1) volcakicks (22) weirdbox (4) 
... file reading complete. Required 194 MB of memory.

[ 1, a SuperDirt ]
[ 2, nil ]
WARNING: keyword arg 'outBusses' not found in call to Object:doesNotUnderstand
ERROR: Message 'start' not understood.
RECEIVER:
   nil
ARGS:
PATH: /Users/ahihi/SyncBig/pulu/uforave/dirttest.scd

PROTECTED CALL STACK:
	Meta_MethodError:new	0x118f9eec0
		arg this = DoesNotUnderstandError
		arg what = nil
		arg receiver = nil
	Meta_DoesNotUnderstandError:new	0x118fa1200
		arg this = DoesNotUnderstandError
		arg receiver = nil
		arg selector = start
		arg args = [  ]
	Object:doesNotUnderstand	0x11859c840
		arg this = nil
		arg selector = start
		arg args = nil
	Routine:prStart	0x1199a8000
		arg this = a Routine
		arg inval = 11.015196905

CALL STACK:
	DoesNotUnderstandError:reportError
		arg this = <instance of DoesNotUnderstandError>
	< closed FunctionDef >
		arg error = <instance of DoesNotUnderstandError>
	Integer:forBy
		arg this = 0
		arg endval = 0
		arg stepval = 2
		arg function = <instance of Function>
		var i = 0
		var j = 0
	SequenceableCollection:pairsDo
		arg this = [*2]
		arg function = <instance of Function>
	Scheduler:seconds_
		arg this = <instance of Scheduler>
		arg newSeconds = 17.298521093
	Meta_AppClock:tick
		arg this = <instance of Meta_AppClock>
		var saveClock = <instance of Meta_SystemClock>
	Process:tick
		arg this = <instance of Main>
^^ ERROR: Message 'start' not understood.
RECEIVER: nil

i'm very confused by the debug print output

[ 1, a SuperDirt ]
[ 2, nil ]

which suggests that i have a valid SuperDirt object up until the ~makeDirt function returns, but the return value then somehow becomes nil?

i notice that if i remove the second loadSoundFiles call, the code again works correctly and i get the expected debug output

[ 1, a SuperDirt ]
[ 2, a SuperDirt ]

any idea what's going on?

ok, i got a little suspicious about the single broken WAV i have in my library, pointed out in the message:

WARNING: File reading failed for path: '/Users/ahihi/SyncBig/sc/dirt/samples/nab/narayanbreikki-129.wav'

i removed it, and sure enough, the code now works as expected... i still don't understand why or how it fails completely on what should be just a warning though. maybe memory corruption?

in case anyone wants to experiment with this, the broken file is available here: https://owo.uwu.fi/narayanbreikki-129.wav

The error message is really strange indeed, I also don't understand how ~dirt could become nil as a buffer loading fails.
I wonder if it would be better to really throw errors when something like file reading goes wrong, instead of just warning. @yaxu what do you think?

i am trying to add some of my own WAV metadata parsing to latest develop and seeing this weird behavior again - SuperDirt object looks fine inside the function that sets it up, but becomes nil when returned to the caller. im at a complete loss on how to debug this..

SuperDirt object looks fine inside the function that sets it up, but becomes nil when returned to the caller.

You mean after your set up, ~dirt == nil?

yes, very similar situation to the original post. in fact i noticed i had a new invalid wav file in my library and that was again causing the problem.

so i looked into the error handling a bit and after a lot of confusing experimentation i noticed that this line in readWithInfo probably should be prefixed with a ^? it seems the intention is to return nil on failure, but the current code returns a Buffer with nil members which has just been freed. this sus buffer passes the notNil check and i guess something breaks down the line.

i added that ^ and now the ~dirt returned by my function looks fine even with the invalid file causing a read fail warning! (i prefer this behavior over throwing)

also, this try seems wrong (no catch function, tryed function takes an error arg?) but im not sure whether it affects any of the above.

anyway, yay progress! :) i can test a bit more and make a PR later this week.