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.

cmAudDspLocal.c 3.6KB

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