234 lines
9.4 KiB
C
234 lines
9.4 KiB
C
|
#ifndef cmMsgProtocol_h
|
||
|
#define cmMsgProtocol_h
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#define cmAudDspSys_FILENAME "aud_dsp.js"
|
||
|
|
||
|
|
||
|
/// Reserved DSP message selector id's (second field of all host<->audio system messages)
|
||
|
enum
|
||
|
{
|
||
|
kMidiMsgArraySelAsId = 1000,
|
||
|
kMidiSysExSelAsId,
|
||
|
kUiSelAsId, // indicates a cmDspUiHdr_t msg
|
||
|
kUiMstrSelAsId, // indicates a cmDspUiHdr_t msg containing master control information for the audio system
|
||
|
kSsInitSelAsId, // indicates the msg is of type cmAudioSysSsInitMsg_t
|
||
|
kStatusSelAsId, // indicates the msg is of type cmAudioSysStatus_t
|
||
|
kNetSyncSelAsId, // sent with a cmDspNetMsg_t object
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
// UI seletor id's used in the cmDspUiHdr_t selId field
|
||
|
enum
|
||
|
{
|
||
|
kPrintDuiId, // ui<--eng print the value to the console
|
||
|
kSliderDuiId, // ui<--eng create a slider control
|
||
|
kButtonDuiId, // ui<--eng create button control
|
||
|
kCheckDuiId, // ui<--eng create a check box control
|
||
|
kLabelDuiId, // ui<--end create a label control
|
||
|
kNumberDuiId, // ui<--eng create a number box
|
||
|
kTextDuiId, // ui<--eng create a text entry control
|
||
|
kFnameDuiId, // ui<--eng create a file/directory picker control
|
||
|
kMsgListDuiId, // ui<--eng create a msg list control
|
||
|
kMeterDuiId, // ui<--eng create a meter display
|
||
|
kValueDuiId, // ui<->eng a control changed values
|
||
|
kColumnDuiId, // ui<--eng start a new column
|
||
|
kHBorderDuiId, // ui<--eng insert a vertical border
|
||
|
kPageDuiId, // ui<--eng insert a new control page
|
||
|
|
||
|
kAudioSysCfgDuiId, // ui<--audio system cfg label
|
||
|
kSubSysCntDuiId, // ui<--eng audio sub-system count
|
||
|
kDeviceDuiId, // ui<--eng device label
|
||
|
kProgramDuiId, // ui<--eng program label
|
||
|
|
||
|
// The following selId's are used by cmAudDsp to indicate various commands.
|
||
|
kSetAudioCfgDuiId, // 1) select an audio system setup
|
||
|
kSetAudioDevDuiId, // 2) (optional) set an audio device on an audio sub-system
|
||
|
kSetSampleRateDuiId, // 3) (optional) set the sample rate of an audio sub-system
|
||
|
kSetPgmDuiId, // 4) select a program
|
||
|
kEnableDuiId, // 5) enable/disable the audio system (also resets the DSP system)
|
||
|
kSyncDuiId, // 6) sent by cmAudDsp to client to indicate sync success or failure.
|
||
|
kSetNotifyEnableDuiId, // enable/disable periodic status notification from the audio system.
|
||
|
kClientMsgPollDuiId, // Periodic check for and deliver messages waiting in the audio system for delivery to the client.
|
||
|
kSendMsgDuiId, // forward msg to the audio system
|
||
|
kDevReportDuiId, // print a device report
|
||
|
|
||
|
kRightAlignDuiId = 0, // label alignment id used by kLabelDuiId
|
||
|
kLeftAlignDuiId,
|
||
|
kCenterAlignDuiId
|
||
|
};
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
kDuplexDuiFl = 0x01
|
||
|
};
|
||
|
|
||
|
// Header record for all messages between the host and the DSP controllers.
|
||
|
typedef struct
|
||
|
{
|
||
|
unsigned asSubIdx; // the audio sub-system this UI belongs to
|
||
|
unsigned uiId; // msg type kXXXAsId
|
||
|
unsigned selId; // action to perform see above
|
||
|
unsigned flags; //
|
||
|
unsigned instId; // DSP instance id
|
||
|
unsigned instVarId; // DSP instance var id
|
||
|
|
||
|
// The cmDspValue_t field must come last in the structure in
|
||
|
// order for the cmDsvSerialize() to work in cmDspUI.c:_cmDspUiMsg().
|
||
|
cmDspValue_t value; // Data value associated with this msg.
|
||
|
} cmDspUiHdr_t;
|
||
|
|
||
|
// All of the UI messages that create a UI control contain an array of integers
|
||
|
// as in the 'value' field. The array contains the id's associated with
|
||
|
// the different programmable paramters which are part of the control.
|
||
|
// For example a slider control has minimum,maximum, step size, and value
|
||
|
// parameters. The location in the array is hard coded according to the
|
||
|
// parameters meaning but the actual value of the id is left up to the
|
||
|
// engine. This allows the engine to use whatever values work best for
|
||
|
// it on a per instance basis.
|
||
|
|
||
|
|
||
|
|
||
|
/// The cmDspUiHdr_t.instId of UI control messages associated with master
|
||
|
/// control encode the device,channel,in/out, and control type. These macros
|
||
|
/// should be used for encoding and decoding.
|
||
|
#define cmAudioSysFormUiInstId(dev,ch,ifl,ctl) (((dev)<<16) + ((ch)<<4) + ((ifl)<<3) + (ctl))
|
||
|
#define cmAudioSysUiInstIdToDevIndex(instId) ( (instId) >> 16)
|
||
|
#define cmAudioSysUiInstIdToChIndex(instId) (((instId) & 0x0000ffff) >> 4)
|
||
|
#define cmAudioSysUiInstIdToInFlag(instId) ( (instId) & 0x08)
|
||
|
#define cmAudioSysUiInstIdToCtlId(instId) ( (instId) & 0x07)
|
||
|
|
||
|
/// Control id's used to identify the control type of master contols.
|
||
|
enum
|
||
|
{
|
||
|
kSliderUiAsId = 0,
|
||
|
kMeterUiAsId = 1,
|
||
|
kMuteUiAsId = 2,
|
||
|
kToneUiAsId = 3,
|
||
|
kPassUiAsId = 4
|
||
|
};
|
||
|
|
||
|
|
||
|
/// This message is transmitted to the host application just prior to returning
|
||
|
/// from cmAudioSysInitialize().
|
||
|
/// When transmitted to the host this record acts as a message header.
|
||
|
/// This header is followed by two zero terminated char arrays containing the device
|
||
|
/// labels associated with the input and output devices.
|
||
|
/// Message Layout: [ cmAudioSysInitMsg_t "In Device Label" "Out Device Label"]
|
||
|
typedef struct
|
||
|
{
|
||
|
unsigned asSubIdx; ///< asSubIdx of this sub-system
|
||
|
unsigned selId; ///< always kSsInitAsId
|
||
|
unsigned asSubCnt; ///< count of sub-systems
|
||
|
unsigned inDevIdx; ///< input device index
|
||
|
unsigned outDevIdx; ///< output device index
|
||
|
unsigned inChCnt; ///< input device channel count
|
||
|
unsigned outChCnt; ///< outut device channel count
|
||
|
} cmAudioSysSsInitMsg_t;
|
||
|
|
||
|
/// Audio sub-system status record - this message can be transmitted to the host at
|
||
|
/// periodic intervals. See cmAudioSysStatusNotifyEnable().
|
||
|
/// When transmitted to the host this record acts as the message header.
|
||
|
/// This header is followed by two arrays of doubles containing the input and output meter values
|
||
|
/// associated with the input and output audio devices.
|
||
|
/// Message Layout: [ asSubIdx kStatusSelId cmAudioSysStatus_t iMeterArray[iMeterCnt] oMeterArray[oMeterCnt] ]
|
||
|
typedef struct
|
||
|
{
|
||
|
unsigned asSubIdx; ///< originating audio sub-system
|
||
|
|
||
|
unsigned updateCnt; ///< count of callbacks from the audio devices.
|
||
|
unsigned wakeupCnt; ///< count of times the audio system thread has woken up after the cond. var has been signaled by the audio update thread.
|
||
|
unsigned msgCbCnt; ///< count of msgs delivered via cmAsCallback() .
|
||
|
unsigned audioCbCnt; ///< count of times the DSP execution was requested via cmAsCallback().
|
||
|
|
||
|
unsigned iDevIdx; ///< Input device index
|
||
|
unsigned oDevIdx; ///< Output device index
|
||
|
|
||
|
unsigned overflowCnt; ///< count of times the audio input buffers overflowed
|
||
|
unsigned underflowCnt; ///< count of times the audio output buffers underflowed
|
||
|
unsigned iMeterCnt; ///< count of input meter channels
|
||
|
unsigned oMeterCnt; ///< count of output meter channels
|
||
|
|
||
|
} cmAudioSysStatus_t;
|
||
|
|
||
|
// cmDspNetMsg_t sub-selector id's
|
||
|
enum {
|
||
|
kNetHelloSelAsId, // node->node awake msg
|
||
|
kNetDstIdReqSelAsId, // src->dst request a dst id
|
||
|
kNetDstIdReqDoneAsId, // src->dst all requests have been sent
|
||
|
kNetDstIdSelAsId, // dst->src provide dst id
|
||
|
kNetDoneSelAsId, // node->node sync done
|
||
|
kNetErrSelAsId, // node->node sync error
|
||
|
kNetEvtSelAsId // src->dst send cmDspEvnt_t
|
||
|
};
|
||
|
|
||
|
// Message Layout [ cmDspNetMsg_t dstInstLabel[] dstVarLabel[] ]
|
||
|
typedef struct
|
||
|
{
|
||
|
unsigned asSubIdx;
|
||
|
unsigned selId; // kNetSyncSelAsId
|
||
|
unsigned subSelId; // see above kNetXXXSelAsId
|
||
|
unsigned srcId;
|
||
|
unsigned dstId;
|
||
|
cmDspValue_t value;
|
||
|
// char dstInstLabel[] - with kNetSyncSelAsId only
|
||
|
// char dstVarLabel[] - with kNetSyncSelAsId only
|
||
|
} cmDspNetMsg_t;
|
||
|
|
||
|
/*
|
||
|
typedef struct
|
||
|
{
|
||
|
unsigned asSubIdx;
|
||
|
unsigned selId; // kNetEvtSelAsId
|
||
|
unsigned dstId;
|
||
|
|
||
|
// The cmDspValue_t field must come last in the structure in
|
||
|
// order for the cmDsvSerialize() to work.
|
||
|
cmDspValue_t value; // Data value associated with this msg.
|
||
|
|
||
|
} cmDspNetEvt_t;
|
||
|
*/
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
kOkMsgRC = cmOkRC,
|
||
|
kSerializeFailMsgRC,
|
||
|
kSendFailMsgRC,
|
||
|
kDecodeFailMsgRC
|
||
|
};
|
||
|
|
||
|
typedef cmRC_t cmMsgRC_t;
|
||
|
|
||
|
|
||
|
typedef cmMsgRC_t (*cmMsgSendFuncPtr_t)(void* cbDataPtr, unsigned msgByteCnt, const void* msg );
|
||
|
|
||
|
cmMsgRC_t cmMsgSend(
|
||
|
cmErr_t* err,
|
||
|
unsigned asSubIdx,
|
||
|
unsigned msgTypeId,
|
||
|
unsigned selId,
|
||
|
unsigned flags,
|
||
|
unsigned instId,
|
||
|
unsigned instVarId,
|
||
|
const cmDspValue_t* valPtr,
|
||
|
cmMsgSendFuncPtr_t sendFunc,
|
||
|
void* cbDataPtr );
|
||
|
|
||
|
cmMsgRC_t cmMsgPeekAsSubIndex( const void* msgArray[], unsigned msgByteCntArray[], unsigned segCnt, unsigned* retValPtr );
|
||
|
cmMsgRC_t cmMsgPeekMsgTypeId( const void* msgArray[], unsigned msgByteCntArray[], unsigned segCnt, unsigned* retValPtr );
|
||
|
cmMsgRC_t cmMsgPeekSelId( const void* msgArray[], unsigned msgByteCntArray[], unsigned segCnt, unsigned* retValPtr );
|
||
|
cmMsgRC_t cmMsgPeekFlags( const void* msgArray[], unsigned msgByteCntArray[], unsigned segCnt, unsigned* retValPtr );
|
||
|
cmMsgRC_t cmMsgPeekInstId( const void* msgArray[], unsigned msgByteCntArray[], unsigned segCnt, unsigned* retValPtr );
|
||
|
cmMsgRC_t cmMsgPeekInstVarId( const void* msgArray[], unsigned msgByteCntArray[], unsigned segCnt, unsigned* retValPtr );
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#endif
|