From 2bc819afb98e0a5ad52e76e2378743ed96471a62 Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 25 Mar 2013 17:00:10 -0700 Subject: [PATCH] cmAudioSys.c,cmAudioSysMsg.h,cmMsgProtocol.h: Removed cmAudioSys.c dependency on cmDspValue(). Removed cmAudioSys.c dependency on cmDspValue.h by changing the host to audio system message format from cmDspUiHdr_t to cmAudioSysMstr_t. All audio system message records are now isolated in cmAudioSysMsg.h which cmMsgProtocol directly includes. --- cmAudioSys.c | 30 ++++++------- cmAudioSysMsg.h | 113 ++++++++++++++++++++++++++++++++++++++++++++++++ cmMsgProtocol.h | 87 +------------------------------------ 3 files changed, 128 insertions(+), 102 deletions(-) create mode 100644 cmAudioSysMsg.h diff --git a/cmAudioSys.c b/cmAudioSys.c index bb7e64a..75f4317 100644 --- a/cmAudioSys.c +++ b/cmAudioSys.c @@ -9,15 +9,11 @@ #include "cmAudioPort.h" #include "cmAudioPortFile.h" #include "cmApBuf.h" - -#include "cmJson.h" // these files are -#include "dsp/cmDspValue.h" // only required for -#include "dsp/cmDspUi.h" // UI building - +#include "cmJson.h" #include "cmThread.h" #include "cmUdpPort.h" #include "cmUdpNet.h" -#include "cmMsgProtocol.h" +#include "cmAudioSysMsg.h" #include "cmAudioSys.h" #include "cmMidi.h" #include "cmMidiPort.h" @@ -155,10 +151,10 @@ cmAsRC_t _cmAsHostInitNotify( cmAs_t* p ) return rc; } -cmAsRC_t _cmAsDispatchNonSubSysMsg( cmAs_t* p, const void* msg, unsigned msgByteCnt ) +cmAsRC_t _cmAsParseNonSubSysMsg( cmAs_t* p, const void* msg, unsigned msgByteCnt ) { cmAsRC_t rc = kOkAsRC; - cmDspUiHdr_t* h = (cmDspUiHdr_t*)msg; + cmAudioSysMstr_t* h = (cmAudioSysMstr_t*)msg; unsigned devIdx = cmAudioSysUiInstIdToDevIndex(h->instId); unsigned chIdx = cmAudioSysUiInstIdToChIndex(h->instId); unsigned inFl = cmAudioSysUiInstIdToInFlag(h->instId); @@ -166,8 +162,8 @@ cmAsRC_t _cmAsDispatchNonSubSysMsg( cmAs_t* p, const void* msg, unsigned msgBy // if the valuu associated with this msg is a mtx then set // its mtx data area pointer to just after the msg header. - if( cmDsvIsMtx(&h->value) ) - h->value.u.m.u.vp = ((char*)msg) + sizeof(cmDspUiHdr_t); + //if( cmDsvIsMtx(&h->value) ) + // h->value.u.m.u.vp = ((char*)msg) + sizeof(cmDspUiHdr_t); unsigned flags = inFl ? kInApFl : kOutApFl; @@ -175,24 +171,24 @@ cmAsRC_t _cmAsDispatchNonSubSysMsg( cmAs_t* p, const void* msg, unsigned msgBy { case kSliderUiAsId: // slider - cmApBufSetGain(devIdx,chIdx, flags, cmDsvGetDouble(&h->value)); + cmApBufSetGain(devIdx,chIdx, flags, h->value); break; case kMeterUiAsId: // meter break; case kMuteUiAsId: // mute - flags += cmDsvGetDouble(&h->value) == 0 ? kEnableApFl : 0; + flags += h->value == 0 ? kEnableApFl : 0; cmApBufEnableChannel(devIdx,chIdx,flags); break; case kToneUiAsId: // tone - flags += cmDsvGetDouble(&h->value) > 0 ? kEnableApFl : 0; + flags += h->value > 0 ? kEnableApFl : 0; cmApBufEnableTone(devIdx,chIdx,flags); break; case kPassUiAsId: // pass - flags += cmDsvGetDouble(&h->value) > 0 ? kEnableApFl : 0; + flags += h->value > 0 ? kEnableApFl : 0; cmApBufEnablePass(devIdx,chIdx,flags); break; @@ -210,7 +206,7 @@ cmAsRC_t _cmAsHandleNonSubSysMsg( cmAs_t* p, const void* msgDataPtrArray[], un // if the message is contained in a single segment it can be dispatched immediately ... if( msgSegCnt == 1 ) - rc = _cmAsDispatchNonSubSysMsg(p,msgDataPtrArray[0],msgByteCntArray[0]); + rc = _cmAsParseNonSubSysMsg(p,msgDataPtrArray[0],msgByteCntArray[0]); else { // ... otherwise deserialize the message into contiguous memory .... @@ -228,7 +224,7 @@ cmAsRC_t _cmAsHandleNonSubSysMsg( cmAs_t* p, const void* msgDataPtrArray[], un b += msgByteCntArray[i]; } // ... and then dispatch it - rc = _cmAsDispatchNonSubSysMsg(p,buf,byteCnt); + rc = _cmAsParseNonSubSysMsg(p,buf,byteCnt); } @@ -970,7 +966,7 @@ cmAsRC_t cmAudioSysDeliverSegMsg( cmAudioSysH_t h, const void* msgDataPtrArray // BUG BUG BUG - there is no reason that both the asSubIdx and the selId must // be in the first segment but it would be nice. - assert( msgByteCntArray[0] >= 2*sizeof(unsigned) ); + assert( msgByteCntArray[0] >= 2*sizeof(unsigned) || (msgSegCnt>1 && msgByteCntArray[0]==sizeof(unsigned) && msgByteCntArray[1]>=sizeof(unsigned)) ); // The audio sub-system index is always the first field of the msg // and the msg selector id is always the second field diff --git a/cmAudioSysMsg.h b/cmAudioSysMsg.h new file mode 100644 index 0000000..b73faac --- /dev/null +++ b/cmAudioSysMsg.h @@ -0,0 +1,113 @@ +#ifndef cmAudioSysMsg_h +#define cmAudioSysMsg_h + +#ifdef __cplusplus +extern "C" { +#endif + + /// 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 + }; + + + + // 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. + + + // 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 + unsigned rsrvd; + double value; + } cmAudioSysMstr_t; + + + /// 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; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/cmMsgProtocol.h b/cmMsgProtocol.h index 49bd1d3..f351661 100644 --- a/cmMsgProtocol.h +++ b/cmMsgProtocol.h @@ -1,6 +1,8 @@ #ifndef cmMsgProtocol_h #define cmMsgProtocol_h +#include "cmAudioSysMsg.h" + #ifdef __cplusplus extern "C" { #endif @@ -8,19 +10,6 @@ extern "C" { #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 @@ -84,78 +73,6 @@ extern "C" { 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 {