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.

cmMsgProtocol.c 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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 "cmJson.h"
  10. #include "dsp/cmDspValue.h"
  11. #include "cmMsgProtocol.h"
  12. // buffer layout is:
  13. // [ cmDspUiHdr_t <data> ]
  14. // The format of the <data> is determiend by hdr.value.
  15. // Since hdr.value is the last field in the cmDspUiHdr_t record
  16. // the data follows this value.
  17. cmMsgRC_t cmMsgSend(
  18. cmErr_t* err,
  19. unsigned asSubIdx,
  20. unsigned msgTypeId,
  21. unsigned selId,
  22. unsigned flags,
  23. unsigned instId,
  24. unsigned instVarId,
  25. const cmDspValue_t* valPtr,
  26. cmMsgSendFuncPtr_t sendFunc,
  27. void* cbDataPtr )
  28. {
  29. unsigned bufByteCnt = sizeof(cmDspUiHdr_t);
  30. unsigned dataByteCnt = 0;
  31. if( valPtr != NULL )
  32. dataByteCnt = cmDsvSerialDataByteCount(valPtr);
  33. bufByteCnt += dataByteCnt;
  34. char buf[ bufByteCnt ];
  35. cmDspUiHdr_t* hdr = (cmDspUiHdr_t*)buf;
  36. hdr->asSubIdx = asSubIdx;
  37. hdr->uiId = msgTypeId; // see kXXXSelAsId identifiers in cmAudioSys.h
  38. hdr->selId = selId; // if msgTypeId==kUiSelAsId then see kXXXDuId in cmDspUi.h
  39. hdr->flags = flags;
  40. hdr->instId = instId;
  41. hdr->instVarId = instVarId;
  42. if( valPtr == NULL )
  43. cmDsvSetNull(&hdr->value);
  44. else
  45. {
  46. // this function relies on the 'hdr.value' field being the last field in the 'hdr'.
  47. if( cmDsvSerialize( valPtr, &hdr->value, sizeof(cmDspValue_t) + dataByteCnt) != kOkDsvRC )
  48. return cmErrMsg(err,kSerializeFailMsgRC,"An attempt to serialize a UI msg failed.");
  49. }
  50. const void* vp = buf;
  51. if( sendFunc(cbDataPtr,bufByteCnt,vp) != cmOkRC )
  52. return cmErrMsg(err,kSendFailMsgRC,"An attempt to transmit a msg to the host failed.");
  53. return kOkMsgRC;
  54. }
  55. // Return the unsigned value at the specified byte offset into the msg buffer.
  56. cmMsgRC_t _cmMsgPeekAtUInt( const void* msgArray[], unsigned msgByteCntArray[], unsigned segCnt, unsigned offset, unsigned* retValPtr )
  57. {
  58. unsigned i,j,k;
  59. for(k=0,i=0; i<segCnt; ++i)
  60. for(j=0; j<msgByteCntArray[i]; ++j,++k)
  61. if( k == offset )
  62. break;
  63. if( i == segCnt )
  64. return kDecodeFailMsgRC;
  65. *retValPtr = *((unsigned*)((char*)(msgArray[i]) + j));
  66. return kOkMsgRC;
  67. }
  68. cmMsgRC_t cmMsgPeekAsSubIndex( const void* msgArray[], unsigned msgByteCntArray[], unsigned segCnt, unsigned* retValPtr )
  69. {
  70. cmDspUiHdr_t h;
  71. unsigned offset = ((char*)(&h.asSubIdx)) - ((char*)&h);
  72. return _cmMsgPeekAtUInt(msgArray,msgByteCntArray,segCnt,offset,retValPtr);
  73. }
  74. cmMsgRC_t cmMsgPeekMsgTypeId( const void* msgArray[], unsigned msgByteCntArray[], unsigned segCnt, unsigned* retValPtr )
  75. {
  76. cmDspUiHdr_t h;
  77. unsigned offset = ((char*)(&h.uiId)) - ((char*)&h);
  78. return _cmMsgPeekAtUInt(msgArray,msgByteCntArray,segCnt,offset,retValPtr);
  79. }
  80. cmMsgRC_t cmMsgPeekSelId( const void* msgArray[], unsigned msgByteCntArray[], unsigned segCnt, unsigned* retValPtr )
  81. {
  82. cmDspUiHdr_t h;
  83. unsigned offset = ((char*)(&h.selId)) - ((char*)&h);
  84. return _cmMsgPeekAtUInt(msgArray,msgByteCntArray,segCnt,offset,retValPtr);
  85. }
  86. cmMsgRC_t cmMsgPeekFlags( const void* msgArray[], unsigned msgByteCntArray[], unsigned segCnt, unsigned* retValPtr )
  87. {
  88. cmDspUiHdr_t h;
  89. unsigned offset = ((char*)(&h.flags)) - ((char*)&h);
  90. return _cmMsgPeekAtUInt(msgArray,msgByteCntArray,segCnt,offset,retValPtr);
  91. }
  92. cmMsgRC_t cmMsgPeekInstId( const void* msgArray[], unsigned msgByteCntArray[], unsigned segCnt, unsigned* retValPtr )
  93. {
  94. cmDspUiHdr_t h;
  95. unsigned offset = ((char*)(&h.instId)) - ((char*)&h);
  96. return _cmMsgPeekAtUInt(msgArray,msgByteCntArray,segCnt,offset,retValPtr);
  97. }
  98. cmMsgRC_t cmMsgPeekInstVarId( const void* msgArray[], unsigned msgByteCntArray[], unsigned segCnt, unsigned* retValPtr )
  99. {
  100. cmDspUiHdr_t h;
  101. unsigned offset = ((char*)(&h.instVarId)) - ((char*)&h);
  102. return _cmMsgPeekAtUInt(msgArray,msgByteCntArray,segCnt,offset,retValPtr);
  103. }