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.

cmAudDspLocal.c 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #include "cmPrefix.h"
  2. #include "cmGlobal.h"
  3. #include "cmFloatTypes.h"
  4. #include "cmRpt.h"
  5. #include "cmErr.h"
  6. #include "cmCtx.h"
  7. #include "cmMem.h"
  8. #include "cmMallocDebug.h"
  9. #include "cmJson.h"
  10. #include "dsp/cmDspValue.h"
  11. #include "cmMsgProtocol.h"
  12. #include "cmAudDsp.h"
  13. #include "cmAudDspIF.h"
  14. #include "cmAudDspLocal.h"
  15. cmAdlH_t cmAdlNullHandle = cmSTATIC_NULL_HANDLE;
  16. typedef struct
  17. {
  18. cmErr_t err;
  19. cmAiH_t aiH;
  20. cmAdH_t adH;
  21. } cmAdl_t;
  22. cmAdl_t* _cmAdlHandleToPtr( cmAdlH_t h )
  23. {
  24. cmAdl_t* p = (cmAdl_t*)h.h;
  25. assert( p != NULL );
  26. return p;
  27. }
  28. // Forward messages coming from the audio DSP system to the audio DSP IF
  29. // for later dispatch to the client application.
  30. cmMsgRC_t _cmAudDspLocalCallback(void* cbDataPtr, unsigned msgByteCnt, const void* msg )
  31. {
  32. cmMsgRC_t rc = kOkMsgRC;
  33. cmAdl_t* p = (cmAdl_t*)cbDataPtr;
  34. if( cmAdIfRecvAudDspMsg(p->aiH, msgByteCnt, msg ) != kOkAiRC )
  35. {
  36. cmErrMsg(&p->err,kAudDspIfFailAdlRC,"Message transmission to the audio DSP interface failed.");
  37. rc = kSendFailMsgRC;
  38. }
  39. return rc;
  40. }
  41. // Forward messages from the audio DSP interface to the audio DSP system.
  42. cmMsgRC_t _cmAdlAudDspSendFunc( void* cbDataPtr, unsigned msgByteCnt, const void* msg )
  43. {
  44. cmMsgRC_t rc = kOkMsgRC;
  45. cmAdl_t* p = (cmAdl_t*)cbDataPtr;
  46. if( cmAudDspReceiveClientMsg( p->adH, msgByteCnt, msg ) != kOkAdRC )
  47. {
  48. cmErrMsg(&p->err,kAudDspFailAdlRC,"Message transmission the audio DSP system failed.");
  49. rc = kSendFailMsgRC;
  50. }
  51. return rc;
  52. }
  53. cmAdlRC_t _cmAudDspLocalFree( cmAdl_t* p )
  54. {
  55. cmAdlRC_t rc = kOkAdlRC;
  56. if( cmAdIfFree(&p->aiH) != kOkAiRC )
  57. {
  58. rc = cmErrMsg(&p->err,kAudDspIfFailAdlRC,"The audio DSP interface release failed.");
  59. goto errLabel;
  60. }
  61. if( cmAudDspFree(&p->adH) != kOkAdRC )
  62. {
  63. rc = cmErrMsg(&p->err,kAudDspFailAdlRC,"The audio DSP release failed.");
  64. goto errLabel;
  65. }
  66. cmMemFree(p);
  67. errLabel:
  68. return rc;
  69. }
  70. cmAdlRC_t cmAudDspLocalAllocate( cmCtx_t* ctx, cmAdlH_t* hp, const cmAdIfDispatch_t* recd )
  71. {
  72. cmAdlRC_t rc;
  73. if((rc = cmAudDspLocalFree(hp)) != kOkAdlRC )
  74. return rc;
  75. cmAdl_t* p = cmMemAllocZ(cmAdl_t,1);
  76. cmErrSetup(&p->err,&ctx->rpt,"Audio DSP Local");
  77. cmAdIfParm_t parms;
  78. parms.dispatchRecd = *recd;
  79. parms.audDspFunc = _cmAdlAudDspSendFunc;
  80. parms.audDspFuncDataPtr = p;
  81. if( cmAdIfAllocate(ctx, &p->aiH, &parms ) != kOkAiRC )
  82. {
  83. rc = cmErrMsg(&p->err,kAudDspIfFailAdlRC,"The audio DSP interface system allocation failed.");
  84. goto errLabel;
  85. }
  86. if( cmAudDspAlloc(ctx, &p->adH, _cmAudDspLocalCallback, p ) != kOkAdRC )
  87. {
  88. rc = cmErrMsg(&p->err,kAudDspFailAdlRC,"The audio DSP system allocation failed.");
  89. goto errLabel;
  90. }
  91. hp->h = p;
  92. errLabel:
  93. if( rc != kOkAdlRC )
  94. _cmAudDspLocalFree(p);
  95. return rc;
  96. }
  97. cmAdlRC_t cmAudDspLocalFree( cmAdlH_t* hp )
  98. {
  99. cmAdlRC_t rc = kOkAdlRC;
  100. if( hp == NULL || cmAudDspLocalIsValid(*hp) == false )
  101. return kOkAdlRC;
  102. cmAdl_t* p = _cmAdlHandleToPtr(*hp);
  103. if((rc = _cmAudDspLocalFree(p)) != kOkAdlRC )
  104. return rc;
  105. hp->h = NULL;
  106. return rc;
  107. }
  108. cmAdlRC_t cmAudDspLocalSendSetup( cmAdlH_t h )
  109. {
  110. cmAdlRC_t rc = kOkAdlRC;
  111. cmAdl_t* p = _cmAdlHandleToPtr(h);
  112. if( cmAudDspSendSetup(p->adH) != kOkAdRC )
  113. {
  114. rc = cmErrMsg(&p->err,kAudDspFailAdlRC,"The audio DSP system setup request failed.");
  115. goto errLabel;
  116. }
  117. errLabel:
  118. return rc;
  119. }
  120. bool cmAudDspLocalIsValid( cmAdlH_t h )
  121. { return h.h != NULL; }
  122. cmAiH_t cmAudDspLocalIF_Handle( cmAdlH_t h )
  123. {
  124. cmAdl_t* p = _cmAdlHandleToPtr(h);
  125. return p->aiH;
  126. }