libcm is a C development framework with an emphasis on audio signal processing applications.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

cmDspKr.c 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. #include "cmPrefix.h"
  2. #include "cmGlobal.h"
  3. #include "cmFloatTypes.h"
  4. #include "cmComplexTypes.h"
  5. #include "cmRpt.h"
  6. #include "cmErr.h"
  7. #include "cmCtx.h"
  8. #include "cmMem.h"
  9. #include "cmMallocDebug.h"
  10. #include "cmLinkedHeap.h"
  11. #include "cmFile.h"
  12. #include "cmSymTbl.h"
  13. #include "cmJson.h"
  14. #include "cmPrefs.h"
  15. #include "cmDspValue.h"
  16. #include "cmMsgProtocol.h"
  17. #include "cmThread.h"
  18. #include "cmUdpPort.h"
  19. #include "cmUdpNet.h"
  20. #include "cmAudioSys.h"
  21. #include "cmDspCtx.h"
  22. #include "cmDspClass.h"
  23. #include "cmDspUi.h"
  24. #include "cmOp.h"
  25. #include "cmMath.h"
  26. #include "cmAudioFile.h"
  27. #include "cmFileSys.h"
  28. #include "cmProcObj.h"
  29. #include "cmProcTemplateMain.h"
  30. #include "cmProc.h"
  31. #include "cmMidi.h"
  32. #include "cmProc2.h"
  33. #include "cmVectOpsTemplateMain.h"
  34. enum
  35. {
  36. kWndSmpCntKrId,
  37. kHopFactKrId,
  38. kModeKrId,
  39. kThreshKrId,
  40. kLwrSlopeKrId,
  41. kUprSlopeKrId,
  42. kOffsetKrId,
  43. kInvertKrId,
  44. kAudioInKrId,
  45. kAudioOutKrId
  46. };
  47. typedef struct
  48. {
  49. cmDspInst_t inst;
  50. cmCtx* ctx;
  51. cmSpecDist_t* sdp;
  52. } cmDspKr_t;
  53. cmDspClass_t _cmKrDC;
  54. //==========================================================================================================================================
  55. cmDspInst_t* _cmDspKrAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsigned storeSymId, unsigned instSymId, unsigned id, unsigned va_cnt, va_list vl )
  56. {
  57. cmDspVarArg_t args[] =
  58. {
  59. { "wndn", kWndSmpCntKrId, 0, 0, kInDsvFl | kUIntDsvFl | kReqArgDsvFl, "Window sample count" },
  60. { "hopf", kHopFactKrId, 0, 0, kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "Hop factor" },
  61. { "mode", kModeKrId, 0, 0, kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "Mode 0=bypass 1=basic 2=spec cnt 3=amp env" },
  62. { "thrh", kThreshKrId, 0, 0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Threshold" },
  63. { "lwrs", kLwrSlopeKrId, 0, 0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Lower Slope"},
  64. { "uprs", kUprSlopeKrId, 0, 0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Upper Slope"},
  65. { "offs", kOffsetKrId, 0, 0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Offset"},
  66. { "invt", kInvertKrId, 0, 0, kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "Invert"},
  67. { "in", kAudioInKrId, 0, 0, kInDsvFl | kAudioBufDsvFl, "Audio Input" },
  68. { "out", kAudioOutKrId, 0, 1, kOutDsvFl | kAudioBufDsvFl, "Audio Output" },
  69. { NULL, 0, 0, 0, 0 }
  70. };
  71. cmDspKr_t* p = cmDspInstAlloc(cmDspKr_t,ctx,classPtr,args,instSymId,id,storeSymId,va_cnt,vl);
  72. unsigned defWndSmpCnt = cmDspDefaultUInt(&p->inst,kWndSmpCntKrId);
  73. unsigned wndSmpCnt = cmNextPowerOfTwo( defWndSmpCnt );
  74. cmDspSetDefaultUInt( ctx,&p->inst, kWndSmpCntKrId, defWndSmpCnt, wndSmpCnt );
  75. cmDspSetDefaultUInt( ctx,&p->inst, kHopFactKrId, 0, 4 );
  76. cmDspSetDefaultUInt( ctx,&p->inst, kModeKrId, 0, kBasicModeSdId );
  77. cmDspSetDefaultDouble( ctx,&p->inst, kThreshKrId, 0, 60.0 );
  78. cmDspSetDefaultDouble( ctx,&p->inst, kLwrSlopeKrId, 0, 2.0 );
  79. cmDspSetDefaultDouble( ctx,&p->inst, kUprSlopeKrId, 0, 0.0 );
  80. cmDspSetDefaultDouble( ctx,&p->inst, kOffsetKrId, 0, 30.0);
  81. cmDspSetDefaultUInt( ctx,&p->inst, kInvertKrId, 0, 0 );
  82. //_cmDspKrCmInit(ctx,p); // initialize the cm library
  83. p->ctx = cmCtxAlloc(NULL,ctx->rpt,ctx->lhH,ctx->stH);
  84. return &p->inst;
  85. }
  86. cmDspRC_t _cmDspKrFree(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
  87. {
  88. cmDspRC_t rc = kOkDspRC;
  89. cmDspKr_t* p = (cmDspKr_t*)inst;
  90. cmSpecDistFree(&p->sdp);
  91. cmCtxFree(&p->ctx);
  92. //_cmDspKrCmFinal(ctx,p); // finalize the cm library
  93. return rc;
  94. }
  95. cmDspRC_t _cmDspKrSetup(cmDspCtx_t* ctx, cmDspKr_t* p )
  96. {
  97. cmDspRC_t rc = kOkDspRC;
  98. unsigned wndSmpCnt = cmDspUInt(&p->inst,kWndSmpCntKrId);
  99. unsigned hopFact = cmDspUInt(&p->inst,kHopFactKrId);
  100. unsigned olaWndTypeId = kHannWndId;
  101. cmSpecDistFree(&p->sdp);
  102. p->sdp = cmSpecDistAlloc(p->ctx, NULL, cmDspSamplesPerCycle(ctx), cmDspSampleRate(ctx), wndSmpCnt, hopFact, olaWndTypeId);
  103. assert(p->sdp != NULL );
  104. if((rc = cmDspZeroAudioBuf(ctx,&p->inst,kAudioOutKrId)) != kOkDspRC )
  105. return rc;
  106. return rc;
  107. }
  108. cmDspRC_t _cmDspKrReset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
  109. {
  110. cmDspKr_t* p = (cmDspKr_t*)inst;
  111. cmDspRC_t rc;
  112. if((rc = cmDspApplyAllDefaults(ctx,inst)) != kOkDspRC )
  113. return rc;
  114. return _cmDspKrSetup(ctx,p);
  115. }
  116. cmDspRC_t _cmDspKrExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
  117. {
  118. cmDspKr_t* p = (cmDspKr_t*)inst;
  119. cmDspRC_t rc = kOkDspRC;
  120. unsigned iChIdx = 0;
  121. const cmSample_t* ip = cmDspAudioBuf(ctx,inst,kAudioInKrId,iChIdx);
  122. unsigned iSmpCnt = cmDspVarRows(inst,kAudioInKrId);
  123. unsigned oChIdx = 0;
  124. cmSample_t* op = cmDspAudioBuf(ctx,inst,kAudioOutKrId,oChIdx);
  125. unsigned oSmpCnt = cmDspVarRows(inst,kAudioOutKrId);
  126. const cmSample_t* sp;
  127. cmSpecDistExec(p->sdp,ip,iSmpCnt);
  128. if((sp = cmSpecDistOut(p->sdp)) != NULL )
  129. vs_Copy(op,sp,oSmpCnt);
  130. return rc;
  131. }
  132. cmDspRC_t _cmDspKrRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
  133. {
  134. cmDspKr_t* p = (cmDspKr_t*)inst;
  135. cmDspRC_t rc = kOkDspRC;
  136. cmDspSetEvent(ctx,inst,evt);
  137. switch( evt->dstVarId )
  138. {
  139. case kWndSmpCntKrId:
  140. case kHopFactKrId:
  141. _cmDspKrSetup(ctx,p);
  142. printf("wsn:%i hsn:%i\n",p->sdp->wndSmpCnt,p->sdp->hopSmpCnt);
  143. break;
  144. case kModeKrId:
  145. p->sdp->mode = cmDspUInt(inst,kModeKrId);
  146. printf("mode:%i\n",p->sdp->mode);
  147. break;
  148. case kThreshKrId:
  149. p->sdp->thresh = cmDspDouble(inst,kThreshKrId);
  150. break;
  151. case kUprSlopeKrId:
  152. p->sdp->uprSlope = cmDspDouble(inst,kUprSlopeKrId);
  153. printf("upr slope:%f\n",p->sdp->uprSlope);
  154. break;
  155. case kLwrSlopeKrId:
  156. p->sdp->lwrSlope = cmDspDouble(inst,kLwrSlopeKrId);
  157. printf("upr slope:%f\n",p->sdp->lwrSlope);
  158. break;
  159. case kOffsetKrId:
  160. p->sdp->offset = cmDspDouble(inst,kOffsetKrId);
  161. break;
  162. case kInvertKrId:
  163. p->sdp->invertFl = cmDspUInt(inst,kInvertKrId)!=0;
  164. break;
  165. default:
  166. { assert(0); }
  167. }
  168. return rc;
  169. }
  170. struct cmDspClass_str* cmKrClassCons( cmDspCtx_t* ctx )
  171. {
  172. cmDspClassSetup(&_cmKrDC,ctx,"Kr",
  173. NULL,
  174. _cmDspKrAlloc,
  175. _cmDspKrFree,
  176. _cmDspKrReset,
  177. _cmDspKrExec,
  178. _cmDspKrRecv,
  179. NULL,NULL,
  180. "Fourier based non-linear transformer.");
  181. return &_cmKrDC;
  182. }
  183. //==========================================================================================================================================
  184. enum
  185. {
  186. kValTlId,
  187. kLblTlId
  188. };
  189. cmDspClass_t _cmTimeLineDC;
  190. typedef struct
  191. {
  192. cmDspInst_t inst;
  193. } cmDspTimeLine_t;
  194. cmDspInst_t* _cmDspTimeLineAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsigned storeSymId, unsigned instSymId, unsigned id, unsigned va_cnt, va_list vl )
  195. {
  196. cmDspVarArg_t args[] =
  197. {
  198. { "val", kValTlId, 0, 0, kInDsvFl | kOutDsvFl | kStrzDsvFl | kReqArgDsvFl | kSendDfltDsvFl, "Current string"},
  199. { "lbl", kLblTlId, 0, 0, kStrzDsvFl | kOptArgDsvFl, "Label"},
  200. { NULL, 0, 0, 0, 0 }
  201. };
  202. cmDspTimeLine_t* p = cmDspInstAlloc(cmDspTimeLine_t,ctx,classPtr,args,instSymId,id,storeSymId,va_cnt,vl);
  203. // create the UI control
  204. cmDspUiTimeLineCreate(ctx,&p->inst,kValTlId,kLblTlId);
  205. return &p->inst;
  206. }
  207. cmDspRC_t _cmDspTimeLineReset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
  208. {
  209. cmDspApplyAllDefaults(ctx,inst);
  210. return kOkDspRC;
  211. }
  212. cmDspRC_t _cmDspTimeLineRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
  213. {
  214. switch( evt->dstVarId )
  215. {
  216. case kValTlId:
  217. cmDspSetEvent(ctx,inst,evt);
  218. break;
  219. default:
  220. {assert(0);}
  221. }
  222. return kOkDspRC;
  223. }
  224. struct cmDspClass_str* cmTimeLineClassCons( cmDspCtx_t* ctx )
  225. {
  226. cmDspClassSetup(&_cmTimeLineDC,ctx,"TimeLine",
  227. NULL,
  228. _cmDspTimeLineAlloc,
  229. NULL,
  230. _cmDspTimeLineReset,
  231. NULL,
  232. _cmDspTimeLineRecv,
  233. NULL,NULL,
  234. "Time Line control.");
  235. return &_cmTimeLineDC;
  236. }