libcm is a C development framework with an emphasis on audio signal processing applications.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cmDspStore.c 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. //| Copyright: (C) 2009-2020 Kevin Larke <contact AT larke DOT org>
  2. //| License: GNU GPL version 3.0 or above. See the accompanying LICENSE file.
  3. #include "cmPrefix.h"
  4. #include "cmGlobal.h"
  5. #include "cmFloatTypes.h"
  6. #include "cmRpt.h"
  7. #include "cmErr.h"
  8. #include "cmCtx.h"
  9. #include "cmMem.h"
  10. #include "cmMallocDebug.h"
  11. #include "cmLinkedHeap.h"
  12. #include "cmSymTbl.h"
  13. #include "cmJson.h"
  14. #include "cmDspValue.h"
  15. #include "cmDspCtx.h"
  16. #include "cmDspClass.h"
  17. #include "cmDspStore.h"
  18. typedef struct
  19. {
  20. unsigned symId;
  21. cmDspValue_t value;
  22. } cmDspStoreVar_t;
  23. typedef struct
  24. {
  25. cmErr_t err;
  26. cmDspStoreVar_t* array;
  27. unsigned allocCnt;
  28. unsigned growCnt;
  29. unsigned curCnt;
  30. } cmDspStore_t;
  31. cmDspStoreH_t cmDspStoreNullHandle = cmSTATIC_NULL_HANDLE;
  32. cmDspStore_t* _cmDspStoreHandleToPtr( cmDspStoreH_t h )
  33. {
  34. cmDspStore_t* p = (cmDspStore_t*)h.h;
  35. assert( p != NULL );
  36. return p;
  37. }
  38. cmDspRC_t _cmDspStoreFree( cmDspStore_t* p )
  39. {
  40. cmMemFree(p->array);
  41. cmMemFree(p);
  42. return kOkDspRC;
  43. }
  44. cmDspRC_t cmDspStoreAlloc( cmCtx_t* ctx, cmDspStoreH_t* hp, unsigned initStoreCnt, unsigned growStoreCnt )
  45. {
  46. cmDspRC_t rc;
  47. if((rc = cmDspStoreFree(hp)) != kOkDspRC )
  48. return rc;
  49. cmDspStore_t* p = cmMemAllocZ(cmDspStore_t,1);
  50. cmErrSetup(&p->err,&ctx->rpt,"cmDspStore");
  51. p->array = cmMemAllocZ(cmDspStoreVar_t,initStoreCnt);
  52. p->allocCnt = initStoreCnt;
  53. p->curCnt = 0;
  54. p->growCnt = growStoreCnt;
  55. hp->h = p;
  56. return rc;
  57. }
  58. cmDspRC_t cmDspStoreFree( cmDspStoreH_t *hp )
  59. {
  60. cmDspRC_t rc = kOkDspRC;
  61. if(hp==NULL || cmDspStoreIsValid(*hp)==false )
  62. return rc;
  63. cmDspStore_t* p = _cmDspStoreHandleToPtr(*hp);
  64. if((rc = _cmDspStoreFree(p)) != kOkDspRC )
  65. return rc;
  66. hp->h = NULL;
  67. return rc;
  68. }
  69. bool cmDspStoreIsValid( cmDspStoreH_t h )
  70. { return h.h; }
  71. cmDspStoreVar_t* _cmDspStoreSymToPtr( cmDspStore_t* p, unsigned symId )
  72. {
  73. cmDspStoreVar_t* vp = p->array;
  74. cmDspStoreVar_t* ep = p->array + p->curCnt;
  75. for(; vp<ep; ++vp)
  76. if( vp->symId == symId )
  77. return vp;
  78. return NULL;
  79. }
  80. cmDspStoreVar_t* _cmDspStoreIdToPtr( cmDspStore_t* p, unsigned id )
  81. {
  82. if( id < p->curCnt )
  83. return p->array + id;
  84. return NULL;
  85. }
  86. cmDspStoreVar_t* _cmDspStoreAppend( cmDspStore_t* p )
  87. {
  88. cmDspStoreVar_t* vp = NULL;
  89. if( p->curCnt >= p->allocCnt )
  90. {
  91. p->allocCnt += p->growCnt;
  92. p->array = cmMemResizePZ(cmDspStoreVar_t,p->array,p->allocCnt);
  93. }
  94. vp = p->array + p->curCnt;
  95. p->curCnt += 1;
  96. return vp;
  97. }
  98. unsigned cmDspStoreSymToId( cmDspStoreH_t h, unsigned symId )
  99. {
  100. cmDspStore_t* p = _cmDspStoreHandleToPtr(h);
  101. const cmDspStoreVar_t* vp;
  102. if((vp = _cmDspStoreSymToPtr(p,symId)) == NULL )
  103. return cmInvalidId;
  104. return vp - p->array;
  105. }
  106. unsigned cmDspStoreIdToSym( cmDspStoreH_t h, unsigned id )
  107. {
  108. cmDspStore_t* p = _cmDspStoreHandleToPtr(h);
  109. const cmDspStoreVar_t* vp;
  110. if((vp = _cmDspStoreIdToPtr(p,id)) == NULL )
  111. return cmInvalidId;
  112. return vp->symId;
  113. }
  114. const cmDspValue_t* cmDspStoreIdToValue( cmDspStoreH_t h, unsigned id )
  115. {
  116. cmDspStore_t* p = _cmDspStoreHandleToPtr(h);
  117. const cmDspStoreVar_t* vp;
  118. if((vp = _cmDspStoreIdToPtr(p,id)) == NULL )
  119. return NULL;
  120. return &vp->value;
  121. }
  122. cmDspRC_t cmDspStoreSetValueViaId( cmDspStoreH_t h, unsigned id, const cmDspValue_t* val )
  123. {
  124. cmDspRC_t rc = kOkDspRC;
  125. cmDspStore_t* p = _cmDspStoreHandleToPtr(h);
  126. cmDspStoreVar_t* vp = NULL;
  127. if((vp = _cmDspStoreIdToPtr(p,id)) == NULL )
  128. return cmErrMsg(&p->err,kVarNotFoundDspRC,"There is not global variable at with id:%i\n",id);
  129. cmDsvCopy(&vp->value,val);
  130. return rc;
  131. }
  132. unsigned cmDspStoreSetValueViaSym( cmDspStoreH_t h, unsigned symId, const cmDspValue_t* val )
  133. {
  134. cmDspStore_t* p = _cmDspStoreHandleToPtr(h);
  135. cmDspStoreVar_t* vp = NULL;
  136. if((vp = _cmDspStoreSymToPtr(p,symId)) == NULL )
  137. vp = _cmDspStoreAppend(p);
  138. assert(vp != NULL );
  139. cmDsvCopy(&vp->value,val);
  140. vp->symId = symId;
  141. return vp - p->array;
  142. }