-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAVAudioUnitComponentManager.lcb
executable file
·530 lines (492 loc) · 31.8 KB
/
AVAudioUnitComponentManager.lcb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
library community.appleavaucomponentmanager.paulmcclernan
use com.livecode.engine
use com.livecode.foreign
use com.livecode.objc
use com.livecode.array
use com.livecode.list
use com.livecode.byte
use com.livecode.date
use com.livecode.binary
use com.livecode.bitwise
use com.livecode.math
use com.livecode.string
metadata version is "0.5"
metadata author is "Paul McClernan"
metadata title is "Apple AVAudioUnitComponentManager library"
metadata svgicon is "M66.43,52.07c-0.71,0.32-1.48,0.56-2.31,0.78c-2.35,0.65-5.44,0.04-5.44,0.04l-8.52,9.56c0,0,11.03,11.58,13.36,13.92 s4.02,6.19,4.02,6.19l8.77-19.76C76.31,62.8,67.18,58.92,66.43,52.07z M56.35,86.86c-2.83-2.4-16.4-15.09-16.4-15.09L21.22,90.12c0,0,3.25,1.93,5.41,1.86c5.6-0.17,10.48-3.77,15.46-3.77 c4.58,0,8.99,3.52,15.56,3.77c1.55,0.06,2.88-0.35,4.41-1.24c0.7-0.41,2.02-1.54,2.02-1.54S59.18,89.26,56.35,86.86z M52.45,18.42c5.85-5.85,5.42-15.63,5.42-15.63s-8.65,0.97-13.34,6.82c-5.22,6.51-5.07,13.39-4.94,14.51 C44.49,24.13,48.71,22.16,52.45,18.42z M18.38,48.03c-3.59,0.27-3.23,4.28-3.21,4.45l0.03,0.32l-0.23,0.23l-5.54,5.89l-5.85-5.95l8.91,24.95l18.58-18.16l-8.8-9.83 C22.28,49.93,19.79,47.92,18.38,48.03z M9.98,39.65c0,0,1.4-2.6,5.19-5.27c2.15-1.51,4.69-2.88,7.45-3.52c1.75-0.41,3.72-0.62,5.86-0.62 c3.63,0,9.12,1.35,9.12,1.35l-10.85,4.24c-1.77,0.8-2.58,2.62-2.85,3.38l14.4,13.75c3.71-3.62,6.78-6.15,9.99-9.57 c-0.51-4.23,0.89-8.11,3.22-10.81c4.73-5.48,13.47-2.78,13.47-2.78l-3.55,3.05c0,0-4.13,3.16-3.01,6.79 c0.27,0.87,0.84,2.34,2.44,3.17c0.93,0.48,4.09,0.37,5.6-0.95C68.48,40.1,70.45,38,70.45,38s0.88-1.54,1.8-2.43 c1.11-1.08,3.56-2.91,3.56-2.91s-4.82-5.38-8.14-6.83c-2.91-1.27-6.15-1.89-9.71-1.91c-7.4-0.03-12.83,4.65-16.7,4.35 c-3.19-0.25-9.47-4.38-14.6-4.35c-7.22,0.05-13.04,2.44-17.47,7.33C5.44,35.37,4,45.11,4,45.11l1.89-1.93c0,0,2.98-0.11,3.34-0.41 c1.48-1.24,1.31-2.33,1.31-2.33L9.98,39.65z M18.15,46.11c1.68-0.19,4.88,2.09,4.88,2.09l9.22,10.03l4.11-3.86L21.75,39.42l0.13-0.52c0.03-0.14,0.88-3.49,3.9-4.84 l5.18-2.02c-1.95-0.07-5.6-0.11-7.97,0.42c-3.26,0.74-8.73,4.32-10.78,7.04c0.06,0.17,0.09,0.34,0.1,0.53 c0.08,1.49-1.41,3.45-2.02,3.98c-0.73,0.63-2.55,1.03-3.63,1.21l-3.94,3.94l6.59,6.6l3.85-3.86c-0.04-1.6,0.45-3.4,1.78-4.57 C15.67,46.71,16.48,46.3,18.15,46.11z M70.95,39.93c-0.62,0.44-4.18,6.07-9.58,4.98c-2.9-0.58-4.65-3.5-4.92-5.3c-0.6-4.07,1.8-6.16,3.56-7.69 c0.59-0.52,1.6-1.31,1.6-1.31s-6.16-0.73-9.16,3.5c-3.98,5.61-1.98,9.83-1.98,9.83S13.22,80.66,12.03,81.82 c-0.09,0.56-0.5,3.71,0.93,5.31c1.56,1.74,3.06,2.79,5.34,2.24c1.3-0.32,39.44-38.44,39.44-38.44s3.65,0.56,5.67,0.07 C68.3,49.8,70.71,46.32,70.95,39.93z M65.52,84.81c-0.14,0.85-0.52,1.48-1.2,1.99c-0.5,0.41-1.12,0.62-1.88,0.62c-2.8,0-6.23-3.51-6.24-3.52L41.82,70.25 l6.44-6.55c0,0,13.44,13.7,14.11,14.36C63.03,78.73,65.79,83.22,65.52,84.81z"
---------------------------------------------------------------------------------------------------------------------------
public foreign type AudioComponentDescriptionReturn binds to "MCAggregateTypeInfo:bbbbbbbbbbbbjj" -- 3x 4CharOSTypes & 2X UInt32s
public foreign type AudioComponentDescription binds to "MCAggregateTypeInfo:jjjjj" -- 5x OSType/UInt32s
private foreign handler objC_NSURLURLWithString(in pURLString as ObjcId) returns ObjcId binds to "objc:NSURL.+URLWithString:"
private foreign handler objC_NSURLGetAbsoluteString(in pURLString as ObjcId) returns ObjcId binds to "objc:NSURL.absoluteString"
private foreign handler objC_NSURLGetPath(in pURLString as ObjcId) returns ObjcId binds to "objc:NSURL.path"
private foreign handler objC_NSURLfileOrDirURLWithPath(in pPathString as ObjcId, in pIsDir as CBool) returns ObjcId binds to "objc:.NSURL.+fileURLWithPath:isDirectory:"
private foreign handler objC_NSURLfileURLWithPath(in pPathString as ObjcId) returns ObjcId binds to "objc:NSURL.+fileURLWithPath:"
private foreign handler objC_NSErrorAlloc() returns ObjcId binds to "objc:NSError.+alloc"
private foreign handler objC_NSObjectRetain(in pNSObj as ObjcId) returns ObjcId binds to "objc:NSObject.-retain"
private foreign handler objC_NSObjectAutoRealease(in pNSObj as ObjcId) returns ObjcId binds to "objc:NSObject.-autorelease"
private foreign handler objC_NSObjectRelease(in pNSObj as ObjcId) returns nothing binds to "objc:NSObject.-release"
private foreign handler objC_NSMutableArrayAlloc() returns ObjcRetainedId binds to "objc:NSMutableArray.+alloc"
private foreign handler objC_NSMutableArrayInitWithCapacity(in pNSMutableArray as ObjcId, in pCapacity as NaturalFloat) returns ObjcId binds to "objc:NSMutableArray.-initWithCapacity:"
private foreign handler objC_NSMutableArrayInitWithNSArray(in pNSMutableArray as ObjcId, in pNSArray as ObjcId) returns ObjcId binds to "objc:NSMutableArray.-initWithArray:"
public foreign handler ObjC_NSArrayAlloc() returns ObjcRetainedId binds to "objc:NSArray.+alloc"
public foreign handler ObjC_NSArrayComponentsJoinedByString(in pObj as ObjcId, in pSeperator as ObjcId) returns ObjcId binds to "objc:NSArray.-componentsJoinedByString:"
private foreign handler c_CFErrorCopyDescription(in pCFErrorRef as ObjcId) returns ObjcId binds to "c:CFErrorCopyDescription"
public foreign handler ObjC_NSPredicateWithFormat(in pFormatNSString as ObjcId) returns ObjcId binds to "objc:NSPredicate.+predicateWithFormat:"
public foreign handler ObjC_NSPredicateFromMetadataQueryString(in pFormatNSString as ObjcId) returns ObjcId binds to "objc:NSPredicate.+predicateFromMetadataQueryString:"
private foreign handler objC_AVAudioUnitAUComponentManager() returns ObjcId binds to "objc:AVAudioUnitComponentManager.+sharedAudioUnitComponentManager"
private foreign handler objC_AVAudioUnitAUComponentManagerTagNames(in pSharedAudioUnitComponentManager as ObjcId) returns ObjcId binds to "objc:AVAudioUnitComponentManager.tagNames"
private foreign handler objC_AVAudioUnitGetAudioUnitsFromACDesc(in pSharedAudioUnitComponentManager as ObjcId, in pAudioComponentDescription as AudioComponentDescription) returns ObjcId \
binds to "objc:AVAudioUnitComponentManager.-componentsMatchingDescription:"
private foreign handler objC_AVAudioUnitGetAudioUnitsFromNSPredicate(in pSharedAudioUnitComponentManager as ObjcId, in pNSPredicate as ObjcId) returns ObjcId \
binds to "objc:AVAudioUnitComponentManager.-componentsMatchingPredicate:"
private foreign handler objC_AVAudioUnitGetACDescription(in pAVAudioUnit as ObjcId) returns AudioComponentDescriptionReturn binds to "objc:AVAudioUnitComponent.audioComponentDescription"
private foreign handler objC_AVAudioUnitGetName(in pAVAudioUnit as ObjcId) returns ObjcId binds to "objc:AVAudioUnitComponent.name"
private foreign handler objC_AVAudioUnitGetHasMIDIInput(in pAVAudioUnit as ObjcId) returns CBool binds to "objc:AVAudioUnitComponent.hasMIDIInput"
private foreign handler objC_AVAudioUnitGetHasMIDIOutput(in pAVAudioUnit as ObjcId) returns CBool binds to "objc:AVAudioUnitComponent.hasMIDIOutput"
private foreign handler objC_AVAudioUnitGetIconURL(in pAVAudioUnit as ObjcId) returns ObjcId binds to "objc:AVAudioUnitComponent.iconURL"
private foreign handler objC_AVAudioUnitGetComponentURL(in pAVAudioUnit as ObjcId) returns ObjcId binds to "objc:AVAudioUnitComponent.componentURL"
private foreign handler objC_AVAudioUnitGetArchitectures(in pAVAudioUnit as ObjcId) returns ObjcId binds to "objc:AVAudioUnitComponent.availableArchitectures"
private foreign handler objC_AVAudioUnitGetVersionNSStr(in pAVAudioUnit as ObjcId) returns ObjcId binds to "objc:AVAudioUnitComponent.versionString"
private foreign handler objC_AVAudioUnitGetManufacturer(in pAVAudioUnit as ObjcId) returns ObjcId binds to "objc:AVAudioUnitComponent.manufacturerName"
private foreign handler objC_AVAudioUnitGetTypeName(in pAVAudioUnit as ObjcId) returns ObjcId binds to "objc:AVAudioUnitComponent.typeName"
private foreign handler objC_AVAudioUnitGetVersion(in pAVAudioUnit as ObjcId) returns UInt64 binds to "objc:AVAudioUnitComponent.version"
private foreign handler objC_AVAudioUnitGetAudioUnit(in pAVAudioUnit as ObjcId) returns ObjcId binds to "objc:AVAudioUnitComponent.audioUnit" -- macOS 10.11+ only
private foreign handler objC_AVAudioUnitGetConfignDict(in pAVAudioUnit as ObjcId) returns optional any binds to "objc:AVAudioUnitComponent.configurationDictionary"
private foreign handler objC_AVAudioUnitGetIsSandboxSafe(in pAVAudioUnit as ObjcId) returns CBool binds to "objc:AVAudioUnitComponent.isSandboxSafe"
private foreign handler objC_AVAudioUnitComponentHasCustomView(in pAVAudioUnit as ObjcId) returns CBool binds to "objc:AVAudioUnitComponent.hasCustomView"
private foreign handler objC_AVAudioUnitComponentGetAllTagNames(in pAVAudioUnit as ObjcId) returns ObjcId binds to "objc:AVAudioUnitComponent.allTagNames"
private foreign handler objC_AVAudioUnitComponentGetComponent(in pAVAudioUnit as ObjcId) returns optional any binds to "objc:AVAudioUnitComponent.audioComponent"
private foreign handler objC_AVAudioUnitComponentPassesValidation(in pAVAudioUnit as ObjcId) returns CBool binds to "objc:AVAudioUnitComponent.passesAUVal"
private foreign handler objC_AVAudioEngineAlloc() returns ObjcRetainedId binds to "objc:AVAudioEngine.+alloc" -- must be ObjcRetainedId
private foreign handler objC_AVAudioEngineInit(in pAVAudioEngine as ObjcId) returns ObjcId binds to "objc:AVAudioEngine.-init"
private foreign handler objC_AVAudioEnginePrepareToStart(in pAVAudioEngine as ObjcId) returns nothing binds to "objc:AVAudioEngine.-prepare"
private foreign handler objC_AVAudioEngineStart(in pAVAudioEngine as ObjcId, out rError as optional ObjcId) returns CBool binds to "objc:AVAudioEngine.-startAndReturnError:"
private foreign handler objC_AVAudioUnitAlloc() returns ObjcId binds to "objc:AVAudioUnit.+alloc"
private foreign handler objC_AVAudioUnitInstanceWithComponentDescription(in pAudioComponentDescription as AudioComponentDescription, pAudioComponentInstantiationOptions as UInt32, in pAUInistanceCompletionHandler as optional any) \
returns ObjcId binds to "objc:AVAudioUnit.+instantiateWithComponentDescription:options:completionHandler:"
private variable sAUInstanceCompletionHandler as optional ObjcBlockPointer
private variable sAVAudioEngine as optional ObjcObject
private variable sAVAudioUnit as optional ObjcObject
private foreign handler c_AudioUnitUninitialize(in pAVAUSampler as ObjcId) returns CSInt binds to "c:AudioUnit.framework>AudioUnitUninitialize"
private foreign handler c_AudioUnitInitialize(in pAVAUSampler as ObjcId) returns CSInt binds to "c:AudioUnit.framework>AudioUnitInitialize"
private foreign handler c_AudioUnitGetProperty(in pAudioUnit as ObjcId,in pPropertyID as UInt32,in pScope as UInt32, in pElement as UInt32, \
out rData as Data, out rDataSize as UInt32) returns CSInt binds to "c:AudioUnit.framework>AudioUnitGetProperty"
private foreign handler c_AudioComponentCopyConfigurationInfo(in pAudioUnit as ObjcId, out rCFDictRef as optional ObjcId) returns CSInt binds to "c:AudioUnit.framework>AudioComponentCopyConfigurationInfo"
-- OSStatus AudioComponentCopyConfigurationInfo(AudioComponent inComponent, CFDictionaryRef _Nullable *outConfigurationInfo);
public handler AUInstanceCompletionHandler( in pContext as optional ObjcBlockPointer, in pAVAudioUnit as optional any, in pNSError as optional any, in pSomething as optional any)
log pAVAudioUnit
log pNSError
end handler
public handler AVAudioUnitInitWithDescr(in pAUType as optional String, in pAUSubType as optional String, in pAUManufacturer as optional String) returns optional any
variable tSoundFontNSURL as ObjcObject
variable tAVAudioEngineDidStart as Boolean
variable tNSError as optional ObjcObject
variable tNSErrorDescriptionRef as ObjcObject
variable tErrorDescription as optional String
variable tAudioComponentDescription as AudioComponentDescription
variable tNSObj as optional ObjcId
variable tNumber as optional Number -- Integer
variable tComponentType as UInt32
variable tComponentSubType as UInt32
variable tComponentManufacturer as UInt32
variable tComponentFlags as UInt32
variable tComponentFlagsMask as UInt32
variable tAVAudioUnit as optional ObjcObject
variable tAVAudioUnitInitOptions as UInt32
-- if sAVAudioEngine is nothing then
unsafe
------------------- Get Shared AUComponentManager -------------------------
-- put objC_AVAudioUnitAUComponentManager() into tAVAudioUnitsManagerInstance
----------------------------- ComponentType ------------------------------
if pAUType is not "" then
put getIntegerFromFourCharCodeBigEndian(pAUType) into tComponentType
else
put 1635085685 into tComponentType -- Music Device
end if
------------------------------- AUSubType --------------------------
if pAUSubType is not "" then
put getIntegerFromFourCharCodeBigEndian(pAUSubType) into tComponentSubType
else
put getIntegerFromFourCharCodeBigEndian("msyn") into tComponentSubType
end if
----------------------------- Manufacturers -------------------------
if pAUManufacturer is not "" then
if pAUManufacturer is "Apple" then
put 1634758764 into tComponentManufacturer
else if pAUManufacturer is "Native Instruments" then
put 760105261 into tComponentManufacturer
else
put getIntegerFromFourCharCodeBigEndian(pAUManufacturer) into tComponentManufacturer
end if
else
put 1634758764 into tComponentManufacturer -- Apple
end if
put [tComponentType,tComponentSubType,tComponentManufacturer,0,0] into tAudioComponentDescription
-- put objC_AVAudioEngineAlloc() into sAVAudioEngine
-- put objC_AVAudioEngineInit(sAVAudioEngine) into sAVAudioEngine
-- log sAVAudioEngine
-- objC_AVAudioEnginePrepareToStart(sAVAudioEngine)
-- put objC_AVAudioEngineStart(sAVAudioEngine,tNSError) into tAVAudioEngineDidStart
if not CreateObjcBlockPointerFromHandler(AUInstanceCompletionHandler,sAUInstanceCompletionHandler) then
log sAUInstanceCompletionHandler
log "fail"
-- put nothing into sAUInstanceCompletionHandler
else
log sAUInstanceCompletionHandler
put 1 into tAVAudioUnitInitOptions -- InProcess 2 -- OutOfProcess 1
put objC_AVAudioUnitAlloc() into sAVAudioUnit -- no need to pre-allocate?
objC_AVAudioUnitInstanceWithComponentDescription(tAudioComponentDescription,tAVAudioUnitInitOptions, sAUInstanceCompletionHandler)
log sAVAudioUnit
end if
-- objC_AVAudioEngineAttachNode(sAVAudioEngine,sAVAudioUnitMIDIInstrument)
-- check engine to see if it attached the instrument node sucessfully:
-- put objC_AVAudioNodeGetEngine(sAVAudioUnitMIDIInstrument) into tNSObj -- Null if Node is not attached to an AVAudioEngine
-- put objC_AVAudioEngineGetOutputNode(sAVAudioEngine) into tNSObj
-- put objC_AVAudioEngineGetInputNode(sAVAudioEngine) into tNSObj
-- put objC_AVAudioEngineGetMainMixerNode(sAVAudioEngine) into tNSObj
-- engine.connect(sampler, to: engine.mainMixerNode, format: nil)
-- objC_AVAudioEngineConnectSourceToDest(sAVAudioEngine,sAVAudioUnitMIDIInstrument,tNSObj,nothing)
-- objC_AVAudioEnginePrepareToStart(sAVAudioEngine)
-- put objC_AVAudioEngineStart(sAVAudioEngine,tNSError) into tAVAudioEngineDidStart
-- if tAVAudioEngineDidStart is true then
-- return true
--- else
-- if tNSError is not nothing then
-- put c_CFErrorCopyDescription(tNSError) into tNSErrorDescriptionRef
-- put StringFromNSString(tNSErrorDescriptionRef) into tErrorDescription
-- return tErrorDescription
-- else
-- return false
-- end if
-- end if
end unsafe
-- else
-- return "AVEngine is already running."
-- end if
end handler
public handler NSArrayToString(in pNSArray as ObjcObject) returns String
variable tNSArray as ObjcObject
variable tNSString as ObjcObject
variable tStr as String
put "\n" into tStr
unsafe
put ObjC_NSArrayComponentsJoinedByString(pNSArray, StringToNSString(tStr)) into tNSString
end unsafe
return StringFromNSString(tNSString)
end handler
public handler getIntegerFromFourCharCodeLittleEndian(in pStr as String) returns optional Uint32
variable tUint32 as Uint32
put (the code of char 4 of pStr) * 16777216 into tUint32 --- 256 * 256 * 256
put tUint32 + ((the code of char 3 of pStr) * 65536 ) into tUint32 -- 256 * 256
put tUint32 + ((the code of char 2 of pStr) * 256 ) into tUint32
put tUint32 + (the code of char 1 of pStr) into tUint32
return tUint32
end handler
public handler getIntegerFromFourCharCodeBigEndian(in pStr as String) returns optional Uint32
variable tUint32 as Uint32
put (the code of char 1 of pStr) * 16777216 into tUint32
put tUint32 + ((the code of char 2 of pStr) * 65536 ) into tUint32
put tUint32 + ((the code of char 3 of pStr) * 256 ) into tUint32
put tUint32 + (the code of char 4 of pStr) into tUint32
return tUint32
end handler
-- foreign handler MCDataGetBytePtr(in pData as Data) returns Pointer binds to "<builtin>"
public handler getFourCharCodeFromUint32( in pNum as optional any) returns optional String
-- 1383023468 = appl
variable tStr as String
variable tTempStr as String
variable tNum as Number
variable tBinsStr as String
log pNum
if pNum is not nothing then
if pNum is a number then
put pNum formatted as string into pNum
end if
put pNum converted from base 10 to base 16 into tBinsStr
if (the number of chars in tBinsStr) < 8 then
put 8 - (the number of chars in tBinsStr) into tNum
repeat tNum times
put "0" before tBinsStr
end repeat
-- log tBinsStr
end if
put ( (char 1 to 2 of tBinsStr) converted from base 16 to base 10 ) into tTempStr
put the char with code (tTempStr parsed as number) into tStr
put ( (char 3 to 4 of tBinsStr) converted from base 16 to base 10 ) into tTempStr
put the char with code (tTempStr parsed as number) after tStr
put ( (char 5 to 6 of tBinsStr) converted from base 16 to base 10 ) into tTempStr
put the char with code (tTempStr parsed as number) after tStr
put ( (char 7 to 8 of tBinsStr) converted from base 16 to base 10 ) into tTempStr
put the char with code (tTempStr parsed as number) after tStr
return tStr
else
return the empty string
end if
end handler
public handler getBitFeild( in pNum as optional any) returns optional String
if pNum is not nothing then
variable tStr as String
variable tNum as Number
put pNum converted to base 2 into tStr
if (the number of chars in tStr) < 32 then
put 32 - (the number of chars in tStr) into tNum
repeat tNum times
put "0" before tStr
end repeat
end if
return tStr
else
return "0"
end if
end handler
public handler getAudioComponentManagerTagNames() returns optional any
variable tAVAudioUnitsManagerInstance as optional ObjcObject
variable tNSArray as ObjcObject
variable tList as optional List
variable tString as String
unsafe
put objC_AVAudioUnitAUComponentManager() into tAVAudioUnitsManagerInstance
put objC_AVAudioUnitAUComponentManagerTagNames(tAVAudioUnitsManagerInstance) into tNSArray
put ListFromNSArray(tNSArray) into tList
end unsafe
combine tList with "\n" into tString
return tString
end handler
public handler AVAudioUnitCMGetUnits(in pAUType as optional String, in pAUSubType as optional String, in pAUManufacturer as optional String) returns optional any
variable tCBool as Boolean
variable tArray as Array
variable tList as optional List
variable tElement as optional any
variable tNSNumber as optional ObjcObject
variable tNumber as optional Number
variable tTempNSObj as optional ObjcObject
variable rTempStr as optional String
variable tTempStr as optional String
variable tOSStatus as optional CSInt
variable tAVAudioUnitsManagerInstance as optional ObjcObject
variable tAudioComponentDescription as optional AudioComponentDescription
variable tAudioComponentDescrParse as optional AudioComponentDescriptionReturn
variable tMatchingtAudioComponentsNSArray as optional ObjcObject
variable tAVAUAudioComponent as optional ObjcObject
variable tAudioComponent as optional ObjcObject
variable tAudioComponentsList as optional List
variable tComponentType as UInt32
variable tComponentSubType as UInt32
variable tComponentManufacturer as UInt32
variable tComponentFlags as UInt32
variable tComponentFlagsMask as UInt32
unsafe
------------------- Get Shared AUComponentManager -------------------------
put objC_AVAudioUnitAUComponentManager() into tAVAudioUnitsManagerInstance
----------------------------- ComponentType ------------------------------
if pAUType is not "" then
if pAUType is "Music Devices" then
put 1635085685 into tComponentType
else if pAUType is "Audio FX" then
put 1635083896 into tComponentType
else
put getIntegerFromFourCharCodeLittleEndian(pAUType) into tComponentType
end if
else
put 0 into tComponentType
end if
------------------------------- AUSubType --------------------------
if pAUSubType is not "" then
put getIntegerFromFourCharCodeBigEndian(pAUSubType) into tComponentSubType
else
put 0 into tComponentSubType
end if
----------------------------- Manufacturers -------------------------
if pAUManufacturer is not "" then
-- log pAUManufacturer
if pAUManufacturer is "Apple" then
put 1634758764 into tComponentManufacturer
else if pAUManufacturer is "Native Instruments" then
put 760105261 into tComponentManufacturer
else
put getIntegerFromFourCharCodeBigEndian(pAUManufacturer) into tComponentManufacturer
end if
else
put 0 into tComponentManufacturer
end if
put [tComponentType,tComponentSubType,tComponentManufacturer,0,0] into tAudioComponentDescription
put objC_AVAudioUnitGetAudioUnitsFromACDesc(tAVAudioUnitsManagerInstance,tAudioComponentDescription) into tMatchingtAudioComponentsNSArray
-- AudioComponentDescription feilds are componentType,componentSubType,componentManufacturer,componentFlags = 0,componentFlagsMask = 0
-- For searching for AudioUnits, any feilds with 0 are wildcards
-- put getAudioComponentDescriptionCharCodeNum("aumu") into tAudioComponentDescription[1] -- componentType
-- put tComponentSubType into tAudioComponentDescription[2] -- componentSubType
-- put getAudioComponentDescriptionCharCodeNum("appl") into tAudioComponentDescription[3] -- componentManufacturer
-- put 0 into tAudioComponentDescription[4] -- ComponentFlags
-- put 0 into tAudioComponentDescription[5] -- ComponentFlagsMask
--
--put ObjC_NSPredicateFromMetadataQueryString(StringToNSString(pSearchString)) into tTempNSObj
--put objC_AVAudioUnitGetAudioUnitsFromNSPredicate(tAVAudioUnitsManagerInstance,tTempNSObj) into tMatchingtAudioComponentsNSArray
------------------------------------------------------------------------------------------
if tMatchingtAudioComponentsNSArray is not nothing then
put ListFromNSArray(tMatchingtAudioComponentsNSArray) into tAudioComponentsList
put "" into rTempStr
repeat for each element tAVAUAudioComponent in tAudioComponentsList
put objC_AVAudioUnitGetName(tAVAUAudioComponent) into tTempNSObj
if tTempNSObj is not nothing then
put StringFromNSString(tTempNSObj) after rTempStr
else
put "Unnammed" after rTempStr
end if
put "\t" after rTempStr
put objC_AVAudioUnitGetManufacturer(tAVAUAudioComponent) into tTempNSObj
if tTempNSObj is not nothing then
put StringFromNSString(tTempNSObj) after rTempStr
else
put "Unknown" after rTempStr
end if
put "\t" after rTempStr
-- put objC_AVAudioUnitGetVersion(tAVAUAudioComponent) into tNumber -- NaturalUInt
-- put tNumber formatted as string & newline after rTempStr
put objC_AVAudioUnitGetVersionNSStr(tAVAUAudioComponent) into tTempNSObj
if tTempNSObj is not nothing then
put "v." & StringFromNSString(tTempNSObj) after rTempStr
else
put "Unknown" after rTempStr
end if
put "\t" after rTempStr
put objC_AVAudioUnitGetTypeName(tAVAUAudioComponent) into tTempNSObj
if tTempNSObj is not nothing then
put StringFromNSString(tTempNSObj) after rTempStr
else
put objC_AVAudioUnitGetACDescription(tAVAUAudioComponent) into tAudioComponentDescrParse
put the char with code (element 4 of tAudioComponentDescrParse) & the char with code (element 3 of tAudioComponentDescrParse) & \
the char with code (element 2 of tAudioComponentDescrParse) & the char with code (element 1 of tAudioComponentDescrParse) into tTempStr
-- log tTempStr
if tTempStr is "auvw" then
put "UI View" after rTempStr
else if tTempStr is "aunt" then
put "System Out Unit" after rTempStr
else
put "Unknown" after rTempStr
log "Unknown ComponentType = " & tTempStr
end if
end if
put "\t" after rTempStr
if objC_AVAudioUnitGetHasMIDIInput(tAVAUAudioComponent) then
put "MIDI In," after rTempStr
else
put "No MIDI In," after rTempStr
end if
if objC_AVAudioUnitGetHasMIDIOutput(tAVAUAudioComponent) then
put "MIDI Out," after rTempStr
else
put "No MIDI Out," after rTempStr
end if
if the last char of rTempStr is "," then
delete the last char of rTempStr
end if
put "\t" after rTempStr
----------------------- Architectures ---------------------
put objC_AVAudioUnitGetArchitectures(tAVAUAudioComponent) into tTempNSObj -- an NS Array of Constants that corespond to CPU Architectures
put ListFromNSArray(tTempNSObj) into tList
if tList is the empty list then
put "Unknown" after rTempStr
else
repeat for each element tNumber in tList
-- ArchitecturePPC=0x00000012= 18 --- ArchitecturePPC64=0x01000012= 16777234 --- ArchitectureI386=0x00000007= 7 --- ArchitectureX86_64=0x01000007= 16777223
if tNumber = 18 then
put "PPC," after rTempStr
else if tNumber = 16777234 then
put "PPC64," after rTempStr
else if tNumber = 7 then
put "x86," after rTempStr
else if tNumber = 16777223 then
put "x86_64," after rTempStr
else if tNumber = 16777228 then
put "ARM64," after rTempStr
end if
end repeat
if the last char of rTempStr is "," then
delete the last char of rTempStr
end if
end if
put "\t" after rTempStr
--put objC_AVAudioNodeGetNumberOfInputs(tAVAUAudioComponent) into tTempNSObj
--put NumberFromNSNumber(tTempobjC_AVAudioNodeGetNumberOfInputsNSObj) & "," into tNumber
--put tNumber formatted as string & "," after rTempStr
--put objC_AVAudioNodeGetNumberOfOutputs(tAVAUAudioComponent) into tTempNSObj
--put NumberFromNSNumber(tTempNSObj) & "," into tNumber
--put tNumber formatted as string & "," after rTempStr
-- log tAudioComponentDescrParse
put objC_AVAudioUnitGetACDescription(tAVAUAudioComponent) into tAudioComponentDescrParse
--- Type OStype ---
put the char with code (element 4 of tAudioComponentDescrParse) & the char with code (element 3 of tAudioComponentDescrParse) & \
the char with code (element 2 of tAudioComponentDescrParse) & the char with code (element 1 of tAudioComponentDescrParse) & "\t" after rTempStr
--- SubType OStype ---
put the char with code (element 8 of tAudioComponentDescrParse) & the char with code (element 7 of tAudioComponentDescrParse) & \
the char with code (element 6 of tAudioComponentDescrParse) & the char with code (element 5 of tAudioComponentDescrParse) & "\t" after rTempStr
--- Manufacturer OStype ---
put the char with code (element 12 of tAudioComponentDescrParse) & the char with code (element 11 of tAudioComponentDescrParse) & \
the char with code (element 10 of tAudioComponentDescrParse) & the char with code (element 9 of tAudioComponentDescrParse) & "\t" after rTempStr
------- Flags ------
--put getBitFeild( element 13 of tAudioComponentDescrParse ) & "," after rTempStr -- ComponentFlags
--put getBitFeild( element 14 of tAudioComponentDescrParse ) & "," after rTempStr -- ComponentFlagsMask
-- put element 13 of tAudioComponentDescrParse formatted as string & "," after rTempStr
-- put element 14 of tAudioComponentDescrParse formatted as string after rTempStr
put objC_AVAudioUnitGetIsSandboxSafe( tAVAUAudioComponent ) into tCBool
if tCBool is true then
put "true \t" after rTempStr
else
put "false \t" after rTempStr
end if
put objC_AVAudioUnitComponentHasCustomView( tAVAUAudioComponent ) into tCBool
-- log "Has custom UI ", tCBool
if tCBool is true then
put "true \t" after rTempStr
else
put "false \t" after rTempStr
end if
put objC_AVAudioUnitComponentGetAllTagNames( tAVAUAudioComponent ) into tTempNSObj
put ListFromNSArray(tTempNSObj) into tList
if tList is the empty list then
put "No Tags" into tTempStr
else
put the empty string into tTempStr
repeat for each element tElement in tList
put tElement & "," after tTempStr
end repeat
if the last char of tTempStr is "," then
delete the last char of tTempStr
end if
end if
put tTempStr & "\t" after rTempStr
----- userTagNames [String] -- get & set property can be used to add tags by users
--------- component URL -----------------
--put objC_AVAudioUnitGetComponentURL( tAVAUAudioComponent ) into tTempNSObj
--put objC_NSURLGetAbsoluteString(tTempNSObj) into tTempNSObj
--if tTempNSObj is not nothing then
--put StringFromNSString(tTempNSObj) & "\t" after rTempStr
--end if
--------- component Icon URL -----------------
--put nothing into tTempNSObj
--put objC_AVAudioUnitGetIconURL( tAVAUAudioComponent ) into tTempNSObj
-- put objC_NSURLGetPath(tTempNSObj) into tTempNSObj
--if tTempNSObj is not nothing then
--- put StringFromNSString(tTempNSObj) & "\t" after rTempStr
--end if
-----------------------------------------------------------
---------- CRASHES LC ENGINE:
-- put objC_AVAudioUnitComponentGetComponent( tAVAUAudioComponent ) into tTempNSObj -- Use to get underlying Audio Component for use with lower level Core Audio API
-- log tElement
-- configurationDictionary
-- put objC_AVAudioUnitGetConfignDict(tAVAUAudioComponent) into tElement-- this seems to be unused -- returns <null>
-- log tElement
put objC_AVAudioUnitComponentPassesValidation( tAVAUAudioComponent ) into tCBool
if tCBool is true then
put "true \t" after rTempStr
else
put "false \t" after rTempStr
end if
put "\n" after rTempStr
end repeat
end if
end unsafe
return rTempStr
end handler
end library