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.

cmDspSys.h 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. #ifndef cmDspSys_h
  2. #define cmDspSys_h
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. extern cmDspSysH_t cmDspNullHandle;
  7. // Print labels of the form 'label'-xxx. Where xxx is an integer.
  8. // The total length of the label must be <=127 or it will be truncated.
  9. // The returned string is kept in static memory and therefore will be
  10. // rewritten by the next call to this function. This makes the function
  11. // inherently useless if called by multiple threads.
  12. const cmChar_t* cmDspSysPrintLabel( const cmChar_t* label, unsigned i );
  13. const cmChar_t* cmDspSysPrintLabel2( const cmChar_t* label, unsigned i );
  14. //----------------------------------------------------------------------------------------------------
  15. // Control Functions
  16. //
  17. cmDspRC_t cmDspSysInitialize( cmCtx_t* ctx, cmDspSysH_t* hp, cmUdpNetH_t netH );
  18. cmDspRC_t cmDspSysFinalize( cmDspSysH_t* hp );
  19. bool cmDspSysIsValid( cmDspSysH_t h );
  20. cmDspRC_t cmDspSysLastRC( cmDspSysH_t h );
  21. unsigned cmDspSysPgmCount( cmDspSysH_t h );
  22. const cmChar_t* cmDspPgmLabel( cmDspSysH_t h, unsigned pgmIdx );
  23. // Load a DSP program.
  24. cmDspRC_t cmDspSysLoad( cmDspSysH_t h, cmAudioSysCtx_t* asCtx, unsigned pgmIdx );
  25. // Unload the previously loaded DSP program
  26. cmDspRC_t cmDspSysUnload( cmDspSysH_t h );
  27. // Call 'reset' on each of the DSP processer instances in the current program.
  28. cmDspRC_t cmDspSysReset( cmDspSysH_t h );
  29. // Called by the audioSystem to send messages to the DSP system during runtime.
  30. cmDspRC_t cmDspSysRcvMsg( cmDspSysH_t h, cmAudioSysCtx_t* asCtx, const void* msgPtr, unsigned msgByteCnt, unsigned srcNetNodeId );
  31. enum { kSyncPreDspId, kSyncPendingDspId, kSyncSuccessDspId, kSyncFailDspId };
  32. unsigned cmDspSysSyncState( cmDspSysH_t h );
  33. //----------------------------------------------------------------------------------------------------
  34. // Preset function:
  35. //
  36. // A 'preset group' identifies a collection of 'preset's. The group id allows
  37. // a particular preset instance to be restored to the same place from which it was formed.
  38. unsigned cmDspSysPresetGroupCount( cmDspSysH_t h );
  39. unsigned cmDspSysPresetGroupSymId( cmDspSysH_t h, unsigned groupIdx );
  40. const cmChar_t* cmDspSysPresetGroupLabel( cmDspSysH_t h, unsigned groupIdx );
  41. cmDspRC_t cmDspSysPresetGroupJsonList( cmDspSysH_t h, cmJsonH_t* jsHPtr );
  42. // A 'preset' is a collection of stored DSP instances and there variables. A preset belongs
  43. // to a group. A given group may have multiple presets. Each preset represents a saved
  44. // instance/var state.
  45. unsigned cmDspSysPresetPresetCount( cmDspSysH_t h, unsigned groupIdx );
  46. unsigned cmDspSysPresetPresetSymId( cmDspSysH_t h, unsigned groupIdx, unsigned presetIdx );
  47. const cmChar_t* cmDspSysPresetPresetLabel( cmDspSysH_t h, unsigned groupIdx, unsigned presetIdx );
  48. cmDspRC_t cmDspSysPresetPresetJsonList(cmDspSysH_t h, unsigned groupSymId, cmJsonH_t* jsHPtr );
  49. // This function returns a preset group id from a string label.
  50. unsigned cmDspSysPresetRegisterGroup( cmDspSysH_t h, const cmChar_t* groupLabel );
  51. // Create a preset named 'presetLabel' in the group named 'groupLabel'. If the group does not
  52. // exist it will be created. The creation will fail if the 'presetLabel' already exists.
  53. // This function calls the 'storeFunc' on every DSP instance belonging to the group
  54. // identified by 'groupLabel'.
  55. cmDspRC_t cmDspSysPresetCreate( cmDspSysH_t h, const cmChar_t* groupLabel, const cmChar_t* presetLabel );
  56. // Apply the stored preset named by 'groupLabel' and 'presetLabel'.
  57. cmDspRC_t cmDspSysPresetRecall( cmDspSysH_t h, const cmChar_t* groupLabel, const cmChar_t* presetLabel );
  58. // Helper functions used by DSP instances to read and write preset variable values. These functions
  59. // are called from inside the user defined DSP instance 'storeFunc'.
  60. cmDspRC_t cmDspSysPresetWriteValue( cmDspSysH_t h, unsigned varSymId, const cmDspValue_t* valPtr );
  61. cmDspRC_t cmDspSysPresetReadValue( cmDspSysH_t h, unsigned varSymId, cmDspValue_t* valPtr );
  62. //----------------------------------------------------------------------------------------------------
  63. // Generic constructors
  64. //
  65. // Allocate single DSP instances.
  66. cmDspInst_t* cmDspSysAllocInstSV( cmDspSysH_t h, const cmChar_t* classLabelStr, unsigned presetGroupSymId, const cmChar_t* instLabelStr, unsigned va_cnt, va_list vl );
  67. cmDspInst_t* cmDspSysAllocInstS( cmDspSysH_t h, const cmChar_t* classLabelStr, unsigned presetGroupSymId, const cmChar_t* instLabelStr, unsigned va_cnt, ... );
  68. cmDspInst_t* cmDspSysAllocInst( cmDspSysH_t h, const cmChar_t* classLabelStr, const cmChar_t* instLabelStr, unsigned va_cnt, ... );
  69. typedef const cmChar_t* (*cmDspSysLabelFunc_t)( cmDspSysH_t h, unsigned i );
  70. // Allocate arrays of DSP instances. The memory used by the array is allocated from
  71. // the cmDspSys linked heap and is therefore automatically garbage collected.
  72. cmDspInst_t** cmDspSysAllocInstArraySV( cmDspSysH_t h, unsigned cnt, unsigned presetGroupSymId, const cmChar_t* classLabelStr, const cmChar_t* instLabelStr, cmDspSysLabelFunc_t labelFunc, unsigned va_cnt, va_list vl );
  73. cmDspInst_t** cmDspSysAllocInstArrayS( cmDspSysH_t h, unsigned cnt, unsigned presetGroupSymId, const cmChar_t* classLabelStr, const cmChar_t* instLabelStr, cmDspSysLabelFunc_t labelFunc, unsigned va_cnt, ... );
  74. cmDspInst_t** cmDspSysAllocInstArray( cmDspSysH_t h, unsigned cnt, const cmChar_t* classLabelStr, const cmChar_t* instLabelStr, cmDspSysLabelFunc_t labelFunc, unsigned va_cnt, ... );
  75. cmDspRC_t cmDspSysNewColumn( cmDspSysH_t h, unsigned colW );
  76. cmDspRC_t cmDspSysInsertHorzBorder( cmDspSysH_t h );
  77. cmDspRC_t cmDspSysNewPage( cmDspSysH_t h, const cmChar_t* title );
  78. //----------------------------------------------------------------------------------------------------
  79. // Connection Functions.
  80. //
  81. cmDspRC_t cmDspSysConnectAudio( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarLbl, cmDspInst_t* dstInstPtr, const cmChar_t* dstVarLbl );
  82. cmDspRC_t cmDspSysConnectAudioN11N( cmDspSysH_t h, cmDspInst_t* srcInstArray[], const cmChar_t* srcVarLabel, cmDspInst_t* dstInstPtr, const cmChar_t* dstVarPrefixStr, unsigned n );
  83. cmDspRC_t cmDspSysConnectAudio1NN1( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarPrefixStr, cmDspInst_t* dstInstArray[], const cmChar_t* dstVarLabel, unsigned n );
  84. cmDspRC_t cmDspSysConnectAudio1N1N( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarPrefixStr, cmDspInst_t* dstInstPtr, const cmChar_t* dstVarPrefixLabel, unsigned n );
  85. cmDspRC_t cmDspSysConnectAudioN1N1( cmDspSysH_t h, cmDspInst_t* srcInstArray[], const cmChar_t* srcVarLabel, cmDspInst_t* dstInstArray[], const cmChar_t* dstVarLabel, unsigned n );
  86. cmDspRC_t cmDspSysConnectAudio11N1( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarLabel, cmDspInst_t* dstInstPArray[],const cmChar_t* dstVarPrefixStr, unsigned n );
  87. cmDspRC_t cmDspSysConnectAudio111N( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarLabel, cmDspInst_t* dstInstPtr, const cmChar_t* dstVarLabel, unsigned n );
  88. // Connect srcInstArray[ map[i] ] to dstInst.in[i] - map[dstCnt] therefore contains dstCnt elements
  89. cmDspRC_t cmDspSysConnectAudioN11NM( cmDspSysH_t h, cmDspInst_t* srcInstArray[], const cmChar_t* srcVarLabel, unsigned srcCnt, cmDspInst_t* dstInstPtr, const cmChar_t* dstVarPrefixStr, unsigned dstCnt, const unsigned* map );
  90. cmDspRC_t cmDspSysInstallCb( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarLabel, cmDspInst_t* dstInstPtr, const cmChar_t* dstVarLabel, void* dstCbDataPtr);
  91. cmDspRC_t cmDspSysInstallCbN11N( cmDspSysH_t h, cmDspInst_t* srcInstArray[], const cmChar_t* srcVarLabel, cmDspInst_t* dstInstPtr, const cmChar_t* dstVarPrefixStr, unsigned n );
  92. cmDspRC_t cmDspSysInstallCb1NN1( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarPrefixStr, cmDspInst_t* dstInstArray[], const cmChar_t* dstVarLabel, unsigned n );
  93. cmDspRC_t cmDspSysInstallCb1N1N( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarPrefixStr, cmDspInst_t* dstInstPtr, const cmChar_t* dstVarPrefixLabel, unsigned n );
  94. cmDspRC_t cmDspSysInstallCbN1N1( cmDspSysH_t h, cmDspInst_t* srcInstArray[], const cmChar_t* srcVarLabel, cmDspInst_t* dstInstArray[], const cmChar_t* dstVarLabel, unsigned n );
  95. cmDspRC_t cmDspSysInstallCb11N1( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarLabel, cmDspInst_t* dstInstArray[], const cmChar_t* dstVarLabel, unsigned n );
  96. cmDspRC_t cmDspSysInstallCb111N( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarLabel, cmDspInst_t* dstInstPtr, const cmChar_t* dstVarPrefixLabel, unsigned n );
  97. cmDspRC_t cmDspSysInstallCbN111( cmDspSysH_t h, cmDspInst_t* srcInstArray[], const cmChar_t* srcVarLabel, cmDspInst_t* dstInstPtr, const cmChar_t* dstVarLabel, unsigned n );
  98. cmDspRC_t cmDspSysInstallCb1N11( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarPrefixStr, cmDspInst_t* dstInstPtr, const cmChar_t* dstVarLabel, unsigned n );
  99. cmDspRC_t cmDspSysInstallCb1N1NM( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarPrefixStr, unsigned srcCnt, cmDspInst_t* dstInstPtr, const cmChar_t* dstVarPrefixLabel, unsigned dstCnt, const unsigned* map );
  100. cmDspRC_t cmDspSysInstallCb1NN1M( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarPrefixStr, unsigned srcCnt, cmDspInst_t* dstInstArray[], const cmChar_t* dstVarLabel, unsigned dstCnt, const unsigned* map );
  101. cmDspRC_t cmDspSysInstallCb1NN1M2(cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarPrefixStr, unsigned srcCnt, const unsigned* map, cmDspInst_t* dstInstArray[], const cmChar_t* dstVarLabel, unsigned dstCnt );
  102. cmDspRC_t cmDspSysInstallNetCb( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarLabel, const cmChar_t* dstNetNodeLabel, const cmChar_t* dstInstLabel, const cmChar_t* dstVarLabel );
  103. cmDspRC_t cmDspSysInstallNetCb1N1N( cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarPrefixStr, const cmChar_t* dstNetNodeLabel, const cmChar_t* dstInstLabel, const cmChar_t* dstVarPrefixStr, unsigned dstOffs, unsigned n );
  104. cmDspRC_t cmDspSysInstallNetCb1N1NM(cmDspSysH_t h, cmDspInst_t* srcInstPtr, const cmChar_t* srcVarPrefixStr, unsigned srcCnt, const cmChar_t* dstNetNodeLabel, const cmChar_t* dstInstLabel, const cmChar_t* dstVarPrefixStr, unsigned dstCnt, const unsigned* map );
  105. //----------------------------------------------------------------------------------------------------
  106. // cmDspSysH_t Accessor Functions
  107. //
  108. double cmDspSysSampleRate( cmDspSysH_t h );
  109. cmJsonH_t cmDspSysPgmRsrcHandle( cmDspSysH_t h );
  110. cmSymTblH_t cmDspSysSymbolTable( cmDspSysH_t h );
  111. unsigned cmDspSysRegisterStaticSymbol( cmDspSysH_t h, const cmChar_t* symLabel );
  112. unsigned cmDspSysRegisterSymbol( cmDspSysH_t h, const cmChar_t* symLabel );
  113. cmCtx_t* cmDspSysPgmCtx( cmDspSysH_t h );
  114. cmLHeapH_t cmDspSysLHeap( cmDspSysH_t h );
  115. unsigned cmDspSysNetNodeId( cmDspSysH_t h );
  116. const cmChar_t* cmDspSysNetNodeLabel( cmDspSysH_t h );
  117. const cmChar_t* cmDspSysNetNodeIdToLabel( cmDspSysH_t h, unsigned netNodeId );
  118. unsigned cmDspSysNetNodeLabelToId( cmDspSysH_t h, const cmChar_t* netNodeLabel );
  119. //----------------------------------------------------------------------------------------------------
  120. // Attribute Symbol assignment and value broadcasing
  121. //
  122. // Each DSP instance can be tagged with an arbitrary number of 'attribute' symbols.
  123. // The primary use of an attribute symbol is to identify targets of
  124. // messages sent via the cmDspSysBroadcastValue() call.
  125. // This function declares an active attribute symbol which will be assigned to all DSP
  126. // instances which are created after the function is called and before
  127. // cmDspSysRemoveInstAttrSymbol(). Multiple attribute symbols may be made active
  128. // in this way - in which case all active attribute symbols will be assigned to any
  129. // DSP instances created during their life time.
  130. // Return symId or cmInvalidId on failure.
  131. unsigned cmDspSysRegisterInstAttrSymbol( cmDspSysH_t h, unsigned symId );
  132. unsigned cmDspSysRegisterInstAttrSymbolStr( cmDspSysH_t h, const cmChar_t* symLabel );
  133. // Assign a instance attribute symbol to a DSP instance.
  134. cmDspRC_t cmDspSysAssignInstAttrSymbol( cmDspSysH_t h, cmDspInst_t* inst, unsigned symId );
  135. // Return cmInvalidId on error otherwise returns the symbol id associated with symLabel.
  136. unsigned cmDspSysAssignInstAttrSymbolStr( cmDspSysH_t h, cmDspInst_t* inst, const cmChar_t* symLabel );
  137. // Remove a previously registered attribute symbol.
  138. cmDspRC_t cmDspSysRemoveInstAttrSymbol( cmDspSysH_t h, unsigned symId );
  139. cmDspRC_t cmDspSysRemoveInstAttrSymbolStr( cmDspSysH_t h, const cmChar_t* symLabel );
  140. // Send a value to every DSP instance tagged with the attribute symbol
  141. // 'instAttrSymId'.
  142. // Set instAttrSymId to cmInvalidId to send to all instances
  143. cmDspRC_t cmDspSysBroadcastValue( cmDspSysH_t h, unsigned instAttrSymId, const cmDspValue_t* valuePtr );
  144. //----------------------------------------------------------------------------------------------------
  145. // Specialized Constructors:
  146. //
  147. // align: kRightAlignDuiId, kLeftAlignDuiId, kCenterAlignDuiId
  148. cmDspInst_t* cmDspSysAllocLabel( cmDspSysH_t h, const cmChar_t* label, unsigned alignId );
  149. cmDspInst_t* cmDspSysAllocScalar( cmDspSysH_t h, const cmChar_t* label, cmReal_t min, cmReal_t max, cmReal_t step, cmReal_t val );
  150. cmDspInst_t* cmDspSysAllocScalarP( cmDspSysH_t h, unsigned presetGroupSymId, const cmChar_t* prefixLabel, const cmChar_t* label, cmReal_t min, cmReal_t max, cmReal_t step, cmReal_t val );
  151. cmDspInst_t* cmDspSysAllocScalarRsrc( cmDspSysH_t h, const cmChar_t* label, cmReal_t min, cmReal_t max, cmReal_t step, const cmChar_t* rsrcPath );
  152. cmDspInst_t** cmDspSysAllocScalarA( cmDspSysH_t h, unsigned cnt, unsigned presetGroupSymId, const cmChar_t* prefixLabel, const cmChar_t* label, cmReal_t min, cmReal_t max, cmReal_t step, cmReal_t val );
  153. cmDspInst_t* cmDspSysAllocButton( cmDspSysH_t h, const cmChar_t* label, cmReal_t val );
  154. cmDspInst_t* cmDspSysAllocButtonP( cmDspSysH_t h, const cmChar_t* prefixLabel, const cmChar_t* label, cmReal_t val );
  155. cmDspInst_t* cmDspSysAllocButtonRsrc( cmDspSysH_t h, const cmChar_t* label, const cmChar_t* rsrcPath );
  156. cmDspInst_t* cmDspSysAllocCheck( cmDspSysH_t h, const cmChar_t* label, cmReal_t val );
  157. cmDspInst_t* cmDspSysAllocCheckP( cmDspSysH_t h, unsigned presetGroupSymId, const cmChar_t* prefixLabel, const cmChar_t* label, cmReal_t val );
  158. cmDspInst_t* cmDspSysAllocCheckRsrc( cmDspSysH_t h, const cmChar_t* label, const cmChar_t* rsrcPath );
  159. // If 'fn' is NULL then the DSP rsrc tree is used to locate the resource.
  160. // The resource named by 'rsrcLabel' may be any place in the resource tree.
  161. cmDspInst_t* cmDspSysAllocMsgList( cmDspSysH_t h, const cmChar_t* fn, const cmChar_t* rsrcLabel, unsigned initSelIdx );
  162. cmDspInst_t* cmDspSysAllocMsgListP( cmDspSysH_t h, unsigned presetGroupSymId, const cmChar_t* preLabel, const cmChar_t* label, const cmChar_t* fn, const cmChar_t* rsrcLabel, unsigned initSelIdx );
  163. cmDspInst_t* cmDspSysAllocAudioIn( cmDspSysH_t h, unsigned chIdx, cmReal_t gain );
  164. // Set chMapRsrcLabel to NULL to use the rsrc named 'audioInMap'.
  165. // *retChCntPtr is set to the count of audio channels created (and the count of channels in the map).
  166. cmDspInst_t** cmDspSysAllocAudioInAR( cmDspSysH_t h, const cmChar_t* chMapRsrcLabel, cmReal_t gain, unsigned* retChCntPtr );
  167. cmDspInst_t* cmDspSysAllocAudioOut( cmDspSysH_t h, unsigned chIdx, cmReal_t gain );
  168. // Set chMapRsrcLabel to NULL to use the rsrc named 'audioOutMap'.
  169. // *retChCntPtr is set to the count of audio channels created (and the count of channels in the map).
  170. cmDspInst_t** cmDspSysAllocAudioOutAR( cmDspSysH_t h, const cmChar_t* chMapRsrcLabel, cmReal_t gain, unsigned* retChCntPtr );
  171. //----------------------------------------------------------------------------------------------------
  172. // Read resource values from the program resource file.
  173. //
  174. cmDspRC_t cmDspRsrcBoolV( cmDspSysH_t h, bool* vp, va_list vl );
  175. cmDspRC_t cmDspRsrcIntV( cmDspSysH_t h, int* vp, va_list vl );
  176. cmDspRC_t cmDspRsrcUIntV( cmDspSysH_t h, unsigned* vp, va_list vl );
  177. cmDspRC_t cmDspRsrcDblV( cmDspSysH_t h, double* vp, va_list vl );
  178. cmDspRC_t cmDspRsrcRealV( cmDspSysH_t h, cmReal_t* vp, va_list vl );
  179. cmDspRC_t cmDspRsrcStringV( cmDspSysH_t h, const cmChar_t** vp, va_list vl );
  180. cmDspRC_t cmDspRsrcArrayCountV( cmDspSysH_t h, unsigned* np, va_list vl );
  181. cmDspRC_t cmDspRsrcBoolArrayV( cmDspSysH_t h, unsigned* np, bool** vpp, va_list vl );
  182. cmDspRC_t cmDspRsrcIntArrayV( cmDspSysH_t h, unsigned* np, int** vpp, va_list vl );
  183. cmDspRC_t cmDspRsrcUIntArrayV( cmDspSysH_t h, unsigned* np, unsigned** vpp, va_list vl );
  184. cmDspRC_t cmDspRsrcDblArrayV( cmDspSysH_t h, unsigned* np, double** vpp, va_list vl );
  185. cmDspRC_t cmDspRsrcRealArrayV( cmDspSysH_t h, unsigned* np, cmReal_t** vpp, va_list vl );
  186. cmDspRC_t cmDspRsrcStringArrayV(cmDspSysH_t h, unsigned* np, const cmChar_t*** vpp, va_list vl );
  187. cmDspRC_t cmDspRsrcInt( cmDspSysH_t h, int* vp, ... );
  188. cmDspRC_t cmDspRsrcBool( cmDspSysH_t h, bool* vp, ... );
  189. cmDspRC_t cmDspRsrcUInt( cmDspSysH_t h, unsigned* vp, ... );
  190. cmDspRC_t cmDspRsrcDbl( cmDspSysH_t h, double* vp, ... );
  191. cmDspRC_t cmDspRsrcReal( cmDspSysH_t h, cmReal_t* vp, ... );
  192. cmDspRC_t cmDspRsrcString( cmDspSysH_t h, const cmChar_t** vp, ... );
  193. cmDspRC_t cmDspRsrcArrayCount( cmDspSysH_t h, unsigned* np, ... );
  194. cmDspRC_t cmDspRsrcBoolArray( cmDspSysH_t h, unsigned* np, bool** vpp, ... );
  195. cmDspRC_t cmDspRsrcIntArray( cmDspSysH_t h, unsigned* np, int** vpp, ... );
  196. cmDspRC_t cmDspRsrcUIntArray( cmDspSysH_t h, unsigned* np, unsigned** vpp, ... );
  197. cmDspRC_t cmDspRsrcDblArray( cmDspSysH_t h, unsigned* np, double** vpp, ... );
  198. cmDspRC_t cmDspRsrcRealArray( cmDspSysH_t h, unsigned* np, cmReal_t** vpp, ... );
  199. cmDspRC_t cmDspRsrcStringArray( cmDspSysH_t h, unsigned* np, const cmChar_t*** vpp, ... );
  200. #ifdef __cplusplus
  201. }
  202. #endif
  203. #endif