libcm is a C development framework with an emphasis on audio signal processing applications.
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

cmDspKr.c 9.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  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. #include "cmAudioFile.h"
  35. #include "cmMidiFile.h"
  36. #include "cmTimeLine.h"
  37. enum
  38. {
  39. kWndSmpCntKrId,
  40. kHopFactKrId,
  41. kModeKrId,
  42. kThreshKrId,
  43. kLwrSlopeKrId,
  44. kUprSlopeKrId,
  45. kOffsetKrId,
  46. kInvertKrId,
  47. kAudioInKrId,
  48. kAudioOutKrId
  49. };
  50. typedef struct
  51. {
  52. cmDspInst_t inst;
  53. cmCtx* ctx;
  54. cmSpecDist_t* sdp;
  55. } cmDspKr_t;
  56. cmDspClass_t _cmKrDC;
  57. //==========================================================================================================================================
  58. cmDspInst_t* _cmDspKrAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsigned storeSymId, unsigned instSymId, unsigned id, unsigned va_cnt, va_list vl )
  59. {
  60. cmDspVarArg_t args[] =
  61. {
  62. { "wndn", kWndSmpCntKrId, 0, 0, kInDsvFl | kUIntDsvFl | kReqArgDsvFl, "Window sample count" },
  63. { "hopf", kHopFactKrId, 0, 0, kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "Hop factor" },
  64. { "mode", kModeKrId, 0, 0, kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "Mode 0=bypass 1=basic 2=spec cnt 3=amp env" },
  65. { "thrh", kThreshKrId, 0, 0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Threshold" },
  66. { "lwrs", kLwrSlopeKrId, 0, 0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Lower Slope"},
  67. { "uprs", kUprSlopeKrId, 0, 0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Upper Slope"},
  68. { "offs", kOffsetKrId, 0, 0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Offset"},
  69. { "invt", kInvertKrId, 0, 0, kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "Invert"},
  70. { "in", kAudioInKrId, 0, 0, kInDsvFl | kAudioBufDsvFl, "Audio Input" },
  71. { "out", kAudioOutKrId, 0, 1, kOutDsvFl | kAudioBufDsvFl, "Audio Output" },
  72. { NULL, 0, 0, 0, 0 }
  73. };
  74. cmDspKr_t* p = cmDspInstAlloc(cmDspKr_t,ctx,classPtr,args,instSymId,id,storeSymId,va_cnt,vl);
  75. unsigned defWndSmpCnt = cmDspDefaultUInt(&p->inst,kWndSmpCntKrId);
  76. unsigned wndSmpCnt = cmNextPowerOfTwo( defWndSmpCnt );
  77. cmDspSetDefaultUInt( ctx,&p->inst, kWndSmpCntKrId, defWndSmpCnt, wndSmpCnt );
  78. cmDspSetDefaultUInt( ctx,&p->inst, kHopFactKrId, 0, 4 );
  79. cmDspSetDefaultUInt( ctx,&p->inst, kModeKrId, 0, kBasicModeSdId );
  80. cmDspSetDefaultDouble( ctx,&p->inst, kThreshKrId, 0, 60.0 );
  81. cmDspSetDefaultDouble( ctx,&p->inst, kLwrSlopeKrId, 0, 2.0 );
  82. cmDspSetDefaultDouble( ctx,&p->inst, kUprSlopeKrId, 0, 0.0 );
  83. cmDspSetDefaultDouble( ctx,&p->inst, kOffsetKrId, 0, 30.0);
  84. cmDspSetDefaultUInt( ctx,&p->inst, kInvertKrId, 0, 0 );
  85. //_cmDspKrCmInit(ctx,p); // initialize the cm library
  86. p->ctx = cmCtxAlloc(NULL,ctx->rpt,ctx->lhH,ctx->stH);
  87. return &p->inst;
  88. }
  89. cmDspRC_t _cmDspKrFree(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
  90. {
  91. cmDspRC_t rc = kOkDspRC;
  92. cmDspKr_t* p = (cmDspKr_t*)inst;
  93. cmSpecDistFree(&p->sdp);
  94. cmCtxFree(&p->ctx);
  95. //_cmDspKrCmFinal(ctx,p); // finalize the cm library
  96. return rc;
  97. }
  98. cmDspRC_t _cmDspKrSetup(cmDspCtx_t* ctx, cmDspKr_t* p )
  99. {
  100. cmDspRC_t rc = kOkDspRC;
  101. unsigned wndSmpCnt = cmDspUInt(&p->inst,kWndSmpCntKrId);
  102. unsigned hopFact = cmDspUInt(&p->inst,kHopFactKrId);
  103. unsigned olaWndTypeId = kHannWndId;
  104. cmSpecDistFree(&p->sdp);
  105. p->sdp = cmSpecDistAlloc(p->ctx, NULL, cmDspSamplesPerCycle(ctx), cmDspSampleRate(ctx), wndSmpCnt, hopFact, olaWndTypeId);
  106. assert(p->sdp != NULL );
  107. if((rc = cmDspZeroAudioBuf(ctx,&p->inst,kAudioOutKrId)) != kOkDspRC )
  108. return rc;
  109. return rc;
  110. }
  111. cmDspRC_t _cmDspKrReset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
  112. {
  113. cmDspKr_t* p = (cmDspKr_t*)inst;
  114. cmDspRC_t rc;
  115. if((rc = cmDspApplyAllDefaults(ctx,inst)) != kOkDspRC )
  116. return rc;
  117. return _cmDspKrSetup(ctx,p);
  118. }
  119. cmDspRC_t _cmDspKrExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
  120. {
  121. cmDspKr_t* p = (cmDspKr_t*)inst;
  122. cmDspRC_t rc = kOkDspRC;
  123. unsigned iChIdx = 0;
  124. const cmSample_t* ip = cmDspAudioBuf(ctx,inst,kAudioInKrId,iChIdx);
  125. unsigned iSmpCnt = cmDspVarRows(inst,kAudioInKrId);
  126. unsigned oChIdx = 0;
  127. cmSample_t* op = cmDspAudioBuf(ctx,inst,kAudioOutKrId,oChIdx);
  128. unsigned oSmpCnt = cmDspVarRows(inst,kAudioOutKrId);
  129. const cmSample_t* sp;
  130. cmSpecDistExec(p->sdp,ip,iSmpCnt);
  131. if((sp = cmSpecDistOut(p->sdp)) != NULL )
  132. vs_Copy(op,sp,oSmpCnt);
  133. return rc;
  134. }
  135. cmDspRC_t _cmDspKrRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
  136. {
  137. cmDspKr_t* p = (cmDspKr_t*)inst;
  138. cmDspRC_t rc = kOkDspRC;
  139. cmDspSetEvent(ctx,inst,evt);
  140. switch( evt->dstVarId )
  141. {
  142. case kWndSmpCntKrId:
  143. case kHopFactKrId:
  144. _cmDspKrSetup(ctx,p);
  145. printf("wsn:%i hsn:%i\n",p->sdp->wndSmpCnt,p->sdp->hopSmpCnt);
  146. break;
  147. case kModeKrId:
  148. p->sdp->mode = cmDspUInt(inst,kModeKrId);
  149. printf("mode:%i\n",p->sdp->mode);
  150. break;
  151. case kThreshKrId:
  152. p->sdp->thresh = cmDspDouble(inst,kThreshKrId);
  153. break;
  154. case kUprSlopeKrId:
  155. p->sdp->uprSlope = cmDspDouble(inst,kUprSlopeKrId);
  156. printf("upr slope:%f\n",p->sdp->uprSlope);
  157. break;
  158. case kLwrSlopeKrId:
  159. p->sdp->lwrSlope = cmDspDouble(inst,kLwrSlopeKrId);
  160. printf("upr slope:%f\n",p->sdp->lwrSlope);
  161. break;
  162. case kOffsetKrId:
  163. p->sdp->offset = cmDspDouble(inst,kOffsetKrId);
  164. break;
  165. case kInvertKrId:
  166. p->sdp->invertFl = cmDspUInt(inst,kInvertKrId)!=0;
  167. break;
  168. default:
  169. { assert(0); }
  170. }
  171. return rc;
  172. }
  173. struct cmDspClass_str* cmKrClassCons( cmDspCtx_t* ctx )
  174. {
  175. cmDspClassSetup(&_cmKrDC,ctx,"Kr",
  176. NULL,
  177. _cmDspKrAlloc,
  178. _cmDspKrFree,
  179. _cmDspKrReset,
  180. _cmDspKrExec,
  181. _cmDspKrRecv,
  182. NULL,NULL,
  183. "Fourier based non-linear transformer.");
  184. return &_cmKrDC;
  185. }
  186. //==========================================================================================================================================
  187. enum
  188. {
  189. kTlFileTlId,
  190. kAudPathTlId,
  191. kSelTlId,
  192. kAudFnTlId,
  193. kBegSmpIdxTlId,
  194. kEndSmpIdxTlId
  195. };
  196. cmDspClass_t _cmTimeLineDC;
  197. typedef struct
  198. {
  199. cmDspInst_t inst;
  200. cmTlH_t tlH;
  201. } cmDspTimeLine_t;
  202. cmDspInst_t* _cmDspTimeLineAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsigned storeSymId, unsigned instSymId, unsigned id, unsigned va_cnt, va_list vl )
  203. {
  204. cmDspVarArg_t args[] =
  205. {
  206. { "tlfile", kTlFileTlId, 0, 0, kInDsvFl | kStrzDsvFl | kReqArgDsvFl, "Time line file." },
  207. { "path", kAudPathTlId, 0, 0, kInDsvFl | kStrzDsvFl | kReqArgDsvFl, "Audio path" },
  208. { "sel", kSelTlId, 0, 0, kInDsvFl | kInDsvFl | kOutDsvFl | kUIntDsvFl, "Selected marker id."},
  209. { "afn", kAudFnTlId, 0, 0, kOutDsvFl | kStrzDsvFl, "Selected Audio file." },
  210. { "bsi", kBegSmpIdxTlId, 0, 0, kOutDsvFl | kUIntDsvFl, "Begin audio sample index."},
  211. { "esi", kEndSmpIdxTlId, 0, 0, kOutDsvFl | kUIntDsvFl, "End audio sample index."},
  212. { NULL, 0, 0, 0, 0 }
  213. };
  214. cmDspTimeLine_t* p = cmDspInstAlloc(cmDspTimeLine_t,ctx,classPtr,args,instSymId,id,storeSymId,va_cnt,vl);
  215. cmDspSetDefaultUInt( ctx, &p->inst, kSelTlId, 0, cmInvalidId);
  216. cmDspSetDefaultStrcz( ctx, &p->inst, kAudFnTlId, NULL, "");
  217. cmDspSetDefaultUInt( ctx, &p->inst, kBegSmpIdxTlId, 0, cmInvalidIdx);
  218. cmDspSetDefaultUInt( ctx, &p->inst, kEndSmpIdxTlId, 0, cmInvalidIdx);
  219. // create the UI control
  220. cmDspUiTimeLineCreate(ctx,&p->inst,kTlFileTlId,kAudPathTlId,kSelTlId);
  221. p->tlH = cmTimeLineNullHandle;
  222. return &p->inst;
  223. }
  224. cmDspRC_t _cmDspTimeLineFree(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
  225. {
  226. cmDspRC_t rc = kOkDspRC;
  227. cmDspTimeLine_t* p = (cmDspTimeLine_t*)inst;
  228. if( cmTimeLineFinalize(&p->tlH) != kOkTlRC )
  229. return cmErrMsg(&inst->classPtr->err, kInstFinalFailDspRC, "Time-line finalize failed.");
  230. return rc;
  231. }
  232. cmDspRC_t _cmDspTimeLineReset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
  233. {
  234. cmDspRC_t rc = kOkDspRC;
  235. cmDspTimeLine_t* p = (cmDspTimeLine_t*)inst;
  236. cmDspApplyAllDefaults(ctx,inst);
  237. const cmChar_t* tlFn;
  238. if((tlFn = cmDspStrcz(inst, kTlFileTlId )) != NULL )
  239. if( cmTimeLineInitializeFromFile(ctx->cmCtx, &p->tlH, NULL, NULL, tlFn ) != kOkTlRC )
  240. rc = cmErrMsg(&inst->classPtr->err, kInstResetFailDspRC, "Time-line file open failed.");
  241. return rc;
  242. }
  243. cmDspRC_t _cmDspTimeLineRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
  244. {
  245. switch( evt->dstVarId )
  246. {
  247. case kSelTlId:
  248. cmDspSetEvent(ctx,inst,evt);
  249. break;
  250. default:
  251. {assert(0);}
  252. }
  253. return kOkDspRC;
  254. }
  255. struct cmDspClass_str* cmTimeLineClassCons( cmDspCtx_t* ctx )
  256. {
  257. cmDspClassSetup(&_cmTimeLineDC,ctx,"TimeLine",
  258. NULL,
  259. _cmDspTimeLineAlloc,
  260. _cmDspTimeLineFree,
  261. _cmDspTimeLineReset,
  262. NULL,
  263. _cmDspTimeLineRecv,
  264. NULL,NULL,
  265. "Time Line control.");
  266. return &_cmTimeLineDC;
  267. }