#ifndef cmAudDsp_h
#define cmAudDsp_h

#ifdef __cplusplus
extern "C" {
#endif

  // This API supports a serialized interface to an internal instance of 
  // cmAudioSys and cmDspSys.  

  enum
  {
    kOkAdRC = cmOkRC,
    kAudioPortFailAdRC,
    kAudioSysFailAdRC,
    kMidiSysFailAdRC,
    kDspSysFailAdRC,
    kFileSysFailAdRC,
    kJsonFailAdRC,
    kSendMsgFailAdRC,
    kInvalidCfgIdxAdRC,
    kNoPgmLoadedAdRC,
    kInvalidSubSysIdxAdRC,
    kUnknownMsgTypeAdRC,
    kAggDevSysFailAdRC,
    kAggDevCreateFailAdRC,
    kNrtDevSysFailAdRC,
    kAfpDevSysFailAdRC,
    kNetSysFailAdRC
  };


  typedef cmRC_t     cmAdRC_t;
  typedef cmHandle_t cmAdH_t;
  
  extern cmAdH_t cmAdNullHandle;

  // Create a audio dsp engine and send device and program information to the 
  // host application.  
  // cbPtr provides a function used by cmAudDsp to send messages to the client.
  cmAdRC_t cmAudDspAlloc( cmCtx_t* ctx, cmAdH_t* hp, cmMsgSendFuncPtr_t cbPtr, void* cbDataPtr );
  cmAdRC_t cmAudDspFree(  cmAdH_t* hp );

  // Send the setup to the UI (device list,system cfg list, DSP programs)
  cmAdRC_t cmAudDspSendSetup( cmAdH_t h );

  bool cmAudDspIsValid( cmAdH_t h );

  // This function provides the primary interface for communication from the
  // client program to the aud_dsp system.
  cmAdRC_t cmAudDspReceiveClientMsg( cmAdH_t h, unsigned msgBytecnt, const void* msg );
  

#ifdef __cplusplus
  }
#endif


#endif
