libcm is a C development framework with an emphasis on audio signal processing applications.
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

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. }