|
@@ -317,6 +317,87 @@ cmDspRC_t cmDspSysLastRC( cmDspSysH_t h )
|
317
|
317
|
return cmErrLastRC(&p->err);
|
318
|
318
|
}
|
319
|
319
|
|
|
320
|
+
|
|
321
|
+// This function is assigns a unique symbol id (cmDspInst_t.symId)
|
|
322
|
+// to all DSP instances whose symId is set to cmInvalidId.
|
|
323
|
+cmDspRC_t _cmDspSysAssignUniqueInstSymId( cmDsp_t* p )
|
|
324
|
+{
|
|
325
|
+ typedef struct class_str
|
|
326
|
+ {
|
|
327
|
+ const cmChar_t* label;
|
|
328
|
+ unsigned cnt;
|
|
329
|
+ struct class_str* link;
|
|
330
|
+ } class_t;
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+ cmDspRC_t rc = kOkDspRC;
|
|
334
|
+ class_t* map = NULL;
|
|
335
|
+
|
|
336
|
+ _cmDspInst_t* dip = p->instList;
|
|
337
|
+
|
|
338
|
+ for(; dip!=NULL; dip=dip->linkPtr)
|
|
339
|
+ {
|
|
340
|
+ cmDspInst_t* ip = dip->instPtr;
|
|
341
|
+
|
|
342
|
+ // if this instance does not have a valid symbol id then create one
|
|
343
|
+ if( ip->symId == cmInvalidId )
|
|
344
|
+ {
|
|
345
|
+ // look for the instance class in map[]
|
|
346
|
+ class_t* mp = map;
|
|
347
|
+ for(; mp!=NULL; mp=mp->link)
|
|
348
|
+ if( strcmp(ip->classPtr->labelStr,mp->label) == 0 )
|
|
349
|
+ break;
|
|
350
|
+
|
|
351
|
+ // if map[] does not yet have a recd for this class ....
|
|
352
|
+ if( mp == NULL )
|
|
353
|
+ {
|
|
354
|
+ mp = cmMemAllocZ(class_t,1); // ... then make one
|
|
355
|
+ mp->label = ip->classPtr->labelStr;
|
|
356
|
+ mp->link = map;
|
|
357
|
+ map = mp;
|
|
358
|
+ }
|
|
359
|
+
|
|
360
|
+ // generate a new unique symbol
|
|
361
|
+ while( ip->symId==cmInvalidId && mp->cnt != cmInvalidId )
|
|
362
|
+ {
|
|
363
|
+ // increment the instance count for this class
|
|
364
|
+ mp->cnt += 1;
|
|
365
|
+
|
|
366
|
+ // form a symbol label
|
|
367
|
+ cmChar_t* idStr = cmTsPrintfP(NULL,"%s-%i",ip->classPtr->labelStr,mp->cnt);
|
|
368
|
+
|
|
369
|
+ // register the new symbol
|
|
370
|
+ unsigned symId = cmSymTblRegisterSymbol(p->ctx.stH,idStr);
|
|
371
|
+
|
|
372
|
+ cmMemFree(idStr); // the symbol label is no longer need
|
|
373
|
+
|
|
374
|
+ // if the symbol has not yet been used then it must be unique
|
|
375
|
+ if( _cmDspSysInstSymIdToPtr(p,symId) == NULL )
|
|
376
|
+ ip->symId = symId;
|
|
377
|
+ else
|
|
378
|
+ cmSymTblRemove(p->ctx.stH,symId); // ... otherwise remove the symbol and try again
|
|
379
|
+
|
|
380
|
+ }
|
|
381
|
+
|
|
382
|
+ // check for the very unlikely case that no unique symbol could be generated
|
|
383
|
+ if(mp->cnt == cmInvalidId )
|
|
384
|
+ rc = cmErrMsg(&p->err,kSymNotFoundDspRC,"All DSP instances were not assigned a unique symbol id.");
|
|
385
|
+
|
|
386
|
+ }
|
|
387
|
+ }
|
|
388
|
+
|
|
389
|
+ // free the class list
|
|
390
|
+ class_t* mp = map;
|
|
391
|
+ while( mp != NULL )
|
|
392
|
+ {
|
|
393
|
+ class_t* np = mp->link;
|
|
394
|
+ cmMemFree(mp);
|
|
395
|
+ mp = np;
|
|
396
|
+ }
|
|
397
|
+
|
|
398
|
+ return rc;
|
|
399
|
+}
|
|
400
|
+
|
320
|
401
|
cmDspRC_t cmDspSysLoad( cmDspSysH_t h, cmAudioSysCtx_t* asCtx, unsigned pgmIdx )
|
321
|
402
|
{
|
322
|
403
|
cmDspRC_t rc;
|
|
@@ -428,6 +509,8 @@ cmDspRC_t cmDspSysLoad( cmDspSysH_t h, cmAudioSysCtx_t* asCtx, unsigned pgmIdx
|
428
|
509
|
goto errLabel;
|
429
|
510
|
}
|
430
|
511
|
|
|
512
|
+ rc = _cmDspSysAssignUniqueInstSymId(p);
|
|
513
|
+
|
431
|
514
|
errLabel:
|
432
|
515
|
if( rc != kOkDspRC )
|
433
|
516
|
cmDspSysUnload(h);
|
|
@@ -673,6 +756,90 @@ unsigned cmDspSysSyncState( cmDspSysH_t h )
|
673
|
756
|
return p->syncState;
|
674
|
757
|
}
|
675
|
758
|
|
|
759
|
+cmDspRC_t cmDspSysPrintPgm( cmDspSysH_t h, const cmChar_t* outFn )
|
|
760
|
+{
|
|
761
|
+ cmDsp_t* p = _cmDspHandleToPtr(h);
|
|
762
|
+ cmDspRC_t rc = kOkDspRC;
|
|
763
|
+ cmJsonH_t jsH = cmJsonNullHandle;
|
|
764
|
+
|
|
765
|
+ if( cmJsonInitialize(&jsH, &p->cmCtx ) != kOkJsRC )
|
|
766
|
+ return cmErrMsg(&p->err,kJsonFailDspRC,"JSON output object create failed.");
|
|
767
|
+
|
|
768
|
+
|
|
769
|
+ // create the root object
|
|
770
|
+ cmJsonNode_t* onp = cmJsonCreateObject(jsH,NULL);
|
|
771
|
+ assert( onp != NULL );
|
|
772
|
+
|
|
773
|
+ // create the instance array
|
|
774
|
+ cmJsonNode_t* iap = cmJsonInsertPairArray(jsH, cmJsonRoot(jsH), "inst_array" );
|
|
775
|
+ assert( iap != NULL );
|
|
776
|
+
|
|
777
|
+ // create the connection array
|
|
778
|
+ cmJsonNode_t* cap = cmJsonInsertPairArray(jsH, cmJsonRoot(jsH), "conn_array" );
|
|
779
|
+ assert( cap != NULL );
|
|
780
|
+
|
|
781
|
+ _cmDspInst_t* dip = p->instList;
|
|
782
|
+
|
|
783
|
+ for(; dip!=NULL; dip=dip->linkPtr)
|
|
784
|
+ {
|
|
785
|
+ cmDspInst_t* ip = dip->instPtr;
|
|
786
|
+
|
|
787
|
+ onp = cmJsonCreateObject(jsH,iap);
|
|
788
|
+
|
|
789
|
+ if( cmJsonInsertPairs(jsH, onp,
|
|
790
|
+ "class", kStringTId, ip->classPtr->labelStr,
|
|
791
|
+ "label", kStringTId, cmSymTblLabel(p->ctx.stH,ip->symId),
|
|
792
|
+ "id", kIntTId, ip->symId,
|
|
793
|
+ NULL ) != kOkJsRC )
|
|
794
|
+ {
|
|
795
|
+ rc = cmErrMsg(&p->err,kJsonFailDspRC,"JSON DSP instance create failed.");
|
|
796
|
+ goto errLabel;
|
|
797
|
+ }
|
|
798
|
+
|
|
799
|
+ unsigned i;
|
|
800
|
+ for(i=0; i<ip->varCnt; ++i)
|
|
801
|
+ {
|
|
802
|
+ const cmDspVar_t* v = ip->varArray + i;
|
|
803
|
+
|
|
804
|
+ cmDspCb_t* cp = v->cbList;
|
|
805
|
+
|
|
806
|
+ for(; cp!=NULL; cp=cp->linkPtr)
|
|
807
|
+ {
|
|
808
|
+ const cmDspVar_t* dvar = cmDspVarIdToCPtr(cp->dstInstPtr, cp->dstVarId );
|
|
809
|
+
|
|
810
|
+ onp = cmJsonCreateObject(jsH,cap);
|
|
811
|
+
|
|
812
|
+ assert(dvar != NULL);
|
|
813
|
+
|
|
814
|
+ if(cmJsonInsertPairs(jsH,onp,
|
|
815
|
+ "sid", kStringTId, cmSymTblLabel(p->ctx.stH,ip->symId),
|
|
816
|
+ "svar", kStringTId, cmSymTblLabel(p->ctx.stH,v->symId),
|
|
817
|
+ "did", kStringTId, cmSymTblLabel(p->ctx.stH,cp->dstInstPtr->symId),
|
|
818
|
+ "dvar", kStringTId, cmSymTblLabel(p->ctx.stH,dvar->symId),
|
|
819
|
+ NULL ) != kOkJsRC )
|
|
820
|
+ {
|
|
821
|
+ rc = cmErrMsg(&p->err,kJsonFailDspRC,"JSON DSP connect create failed.");
|
|
822
|
+ goto errLabel;
|
|
823
|
+ }
|
|
824
|
+ }
|
|
825
|
+ }
|
|
826
|
+ }
|
|
827
|
+
|
|
828
|
+ if( cmJsonWrite(jsH,NULL,outFn) != kOkJsRC )
|
|
829
|
+ {
|
|
830
|
+ rc = cmErrMsg(&p->err,kJsonFailDspRC,"JSON file write failed on '%s.",cmStringNullGuard(outFn));
|
|
831
|
+ goto errLabel;
|
|
832
|
+ }
|
|
833
|
+
|
|
834
|
+ if( cmJsonFinalize(&jsH) != kOkJsRC )
|
|
835
|
+ rc = cmErrMsg(&p->err,kJsonFailDspRC,"JSON tree release failed.");
|
|
836
|
+
|
|
837
|
+ errLabel:
|
|
838
|
+
|
|
839
|
+ return rc;
|
|
840
|
+}
|
|
841
|
+
|
|
842
|
+
|
676
|
843
|
unsigned cmDspSysPresetGroupCount( cmDspSysH_t h )
|
677
|
844
|
{
|
678
|
845
|
cmDsp_t* p = _cmDspHandleToPtr(h);
|
|
@@ -1567,12 +1734,25 @@ cmDspInst_t* cmDspSysAllocScalar( cmDspSysH_t h, const cmChar_t* label, cmRe
|
1567
|
1734
|
{ return _cmDspSysAllocScalar(h,cmInvalidId,label,min,max,step,val,label); }
|
1568
|
1735
|
|
1569
|
1736
|
|
1570
|
|
-cmChar_t* _cmDspSysFormLabel( cmDspSysH_t h, const cmChar_t* prefixLabel, const cmChar_t* label )
|
1571
|
|
-{ return cmTsPrintfH(cmDspSysLHeap(h),"%s-%s",prefixLabel,label); }
|
|
1737
|
+cmChar_t* _cmDspSysFormLabel( cmDspSysH_t h, unsigned presetGrpSymId, const cmChar_t* prefixLabel, const cmChar_t* label )
|
|
1738
|
+{
|
|
1739
|
+ cmDsp_t* p = _cmDspHandleToPtr(h);
|
|
1740
|
+
|
|
1741
|
+ if( prefixLabel == NULL )
|
|
1742
|
+ {
|
|
1743
|
+ if(( prefixLabel = cmSymTblLabel(p->ctx.stH,presetGrpSymId)) == NULL )
|
|
1744
|
+ cmErrMsg(&p->err,kInvalidArgDspRC,"The prefix label was not given for the DSP instance '%s'.",cmStringNullGuard(label));
|
|
1745
|
+ }
|
|
1746
|
+
|
|
1747
|
+ if( label == NULL )
|
|
1748
|
+ cmErrMsg(&p->err,kInvalidArgDspRC,"NULL was passed where a DSP instance label was expected.");
|
|
1749
|
+
|
|
1750
|
+ return cmTsPrintfH(cmDspSysLHeap(h),"%s-%s",cmStringNullGuard(prefixLabel),cmStringNullGuard(label));
|
|
1751
|
+}
|
1572
|
1752
|
|
1573
|
1753
|
cmDspInst_t* cmDspSysAllocScalarP( cmDspSysH_t h, unsigned presetGrpSymId, const cmChar_t* prefixLabel, const cmChar_t* label, cmReal_t min, cmReal_t max, cmReal_t step, cmReal_t val )
|
1574
|
1754
|
{
|
1575
|
|
- return _cmDspSysAllocScalar(h,presetGrpSymId,_cmDspSysFormLabel(h,prefixLabel,label),min,max,step,val,label);
|
|
1755
|
+ return _cmDspSysAllocScalar(h,presetGrpSymId,_cmDspSysFormLabel(h,presetGrpSymId,prefixLabel,label),min,max,step,val,label);
|
1576
|
1756
|
}
|
1577
|
1757
|
|
1578
|
1758
|
cmDspInst_t* cmDspSysAllocScalarRsrc( cmDspSysH_t h, const cmChar_t* label, cmReal_t min, cmReal_t max, cmReal_t step, const cmChar_t* rsrcPath )
|
|
@@ -1604,7 +1784,7 @@ cmDspInst_t* _cmDspSysAllocButton( cmDspSysH_t h, unsigned btnTypeId, unsign
|
1604
|
1784
|
|
1605
|
1785
|
cmDspInst_t* cmDspSysAllocButtonP( cmDspSysH_t h, const cmChar_t* prefixLabel, const cmChar_t* label, cmReal_t val )
|
1606
|
1786
|
{
|
1607
|
|
- return cmDspSysAllocButton(h,_cmDspSysFormLabel(h,prefixLabel,label),val);
|
|
1787
|
+ return cmDspSysAllocButton(h,_cmDspSysFormLabel(h,cmInvalidId,prefixLabel,label),val);
|
1608
|
1788
|
}
|
1609
|
1789
|
|
1610
|
1790
|
cmDspInst_t* _cmDspSysAllocButtonRsrc( cmDspSysH_t h, unsigned typeId, unsigned presetGroupSymId, const cmChar_t* label, const cmChar_t* rsrcPath )
|
|
@@ -1630,7 +1810,7 @@ cmDspInst_t* cmDspSysAllocCheck( cmDspSysH_t h, const cmChar_t* label, cmRea
|
1630
|
1810
|
{ return _cmDspSysAllocCheck(h,cmInvalidId,label,label,val); }
|
1631
|
1811
|
|
1632
|
1812
|
cmDspInst_t* cmDspSysAllocCheckP( cmDspSysH_t h, unsigned presetGroupSymId, const cmChar_t* prefixLabel, const cmChar_t* label, cmReal_t val )
|
1633
|
|
-{ return _cmDspSysAllocCheck(h,presetGroupSymId,_cmDspSysFormLabel(h,prefixLabel,label),label,val); }
|
|
1813
|
+{ return _cmDspSysAllocCheck(h,presetGroupSymId,_cmDspSysFormLabel(h,presetGroupSymId,prefixLabel,label),label,val); }
|
1634
|
1814
|
|
1635
|
1815
|
cmDspInst_t* cmDspSysAllocCheckRsrc( cmDspSysH_t h, const cmChar_t* label, const cmChar_t* rsrcPath )
|
1636
|
1816
|
{ return _cmDspSysAllocButtonRsrc( h,kCheckDuiId, cmInvalidId, label,rsrcPath); }
|
|
@@ -1642,7 +1822,7 @@ cmDspInst_t* cmDspSysAllocMsgListP( cmDspSysH_t h, unsigned presetGroupSymId, co
|
1642
|
1822
|
{
|
1643
|
1823
|
cmDspInst_t* inst;
|
1644
|
1824
|
cmChar_t* lbl;
|
1645
|
|
- if((inst = cmDspSysAllocInstS( h, "MsgList", presetGroupSymId, lbl = _cmDspSysFormLabel(h,preLabel,label), 3, rsrcLabel, fn, initSelIdx)) == NULL )
|
|
1825
|
+ if((inst = cmDspSysAllocInstS( h, "MsgList", presetGroupSymId, lbl = _cmDspSysFormLabel(h,presetGroupSymId,preLabel,label), 3, rsrcLabel, fn, initSelIdx)) == NULL )
|
1646
|
1826
|
{
|
1647
|
1827
|
cmDsp_t* p = _cmDspHandleToPtr(h);
|
1648
|
1828
|
cmErrMsg(&p->err,kAllocInstFailDspRC,"Msg List UI control allocation failed for '%s'.", cmStringNullGuard(lbl));
|