Added 'decls' include files to hold public declarations for audio,midi,serial,socket, and websock modules.

Other minor changes to prepare for integration into cwIo.
In cwMidi* replaced 'byte_t' with 'uint8_t'.
In cwAudioDevice* removed redundant 'device' prefix from function names.
This commit is contained in:
kpl 2020-03-23 10:41:28 -04:00
parent 11f6d38330
commit 5cda838a93
20 changed files with 315 additions and 241 deletions

View File

@ -14,26 +14,31 @@ SRC += cwThread.cpp cwMutex.cpp
HDR += cwWebSock.h cwWebSockSvr.h cwLib.h HDR += cwWebSock.h cwWebSockSvr.h cwLib.h
SRC += cwWebSock.cpp cwWebSockSvr.cpp cwLib.cpp SRC += cwWebSock.cpp cwWebSockSvr.cpp cwLib.cpp
HDR += cwSerialPort.h cwSerialPortSrv.h HDR += cwUiDecls.h cwUi.h cwUiTest.h
SRC += cwSerialPort.cpp cwSerialPortSrv.cpp SRC += cwUi.cpp cwUiTest.cpp
HDR += cwMidi.h cwMidiPort.h HDR += cwSerialPortDecls.h cwSerialPort.h cwSerialPortSrv.h
SRC += cwMidi.cpp cwMidiPort.cpp cwMidiAlsa.cpp SRC += cwSerialPort.cpp cwSerialPortSrv.cpp
HDR += cwMidiDecls.h cwMidi.h cwMidiPort.h
SRC += cwMidi.cpp cwMidiPort.cpp cwMidiAlsa.cpp
HDR += cwAudioBufDecls.h cwAudioBuf.h cwAudioDeviceDecls.h cwAudioDevice.h cwAudioDeviceAlsa.h
SRC += cwAudioBuf.cpp cwAudioDevice.cpp cwAudioDeviceAlsa.cpp cwAudioDeviceTest.cpp
HDR += cwSocketDecls.h cwSocket.h
SRC += cwSocket.cpp
HDR += cwIo.h cwIoTest.h
SRC += cwIo.cpp cwIoTest.cpp
HDR += cwAudioBuf.h cwAudioDevice.h cwAudioDeviceAlsa.h
SRC += cwAudioBuf.cpp cwAudioDevice.cpp cwAudioDeviceAlsa.cpp cwAudioDeviceTest.cpp
HDR += cwTcpSocket.h cwTcpSocketSrv.h cwTcpSocketTest.h HDR += cwTcpSocket.h cwTcpSocketSrv.h cwTcpSocketTest.h
SRC += cwTcpSocket.cpp cwTcpSocketSrv.cpp cwTcpSocketTest.cpp SRC += cwTcpSocket.cpp cwTcpSocketSrv.cpp cwTcpSocketTest.cpp
HDR += cwSocket.h
SRC += cwSocket.cpp
HDR += cwMdns.h cwEuCon.h cwDnsSd.h dns_sd/dns_sd.h dns_sd/dns_sd_print.h dns_sd/dns_sd_const.h dns_sd/fader.h dns_sd/rpt.h HDR += cwMdns.h cwEuCon.h cwDnsSd.h dns_sd/dns_sd.h dns_sd/dns_sd_print.h dns_sd/dns_sd_const.h dns_sd/fader.h dns_sd/rpt.h
SRC += cwMdns.cpp cwEuCon.cpp cwDnsSd.cpp dns_sd/dns_sd.cpp dns_sd/dns_sd_print.cpp dns_sd/fader.cpp dns_sd/rpt.cpp SRC += cwMdns.cpp cwEuCon.cpp cwDnsSd.cpp dns_sd/dns_sd.cpp dns_sd/dns_sd_print.cpp dns_sd/fader.cpp dns_sd/rpt.cpp
HDR += cwIo.h cwIoTest.h
SRC += cwIo.cpp cwIoTest.cpp
# -ldl = dlopen,dlclose,dlsym # -ldl = dlopen,dlclose,dlsym
LIBS = -lpthread -lwebsockets -lasound -ldl LIBS = -lpthread -lwebsockets -lasound -ldl

View File

@ -29,8 +29,10 @@
// out - outgoing samples are filled with a 1k sine tone // out - outgoing samples are filled with a 1k sine tone
//) //)
#ifndef cmApBuf_H #ifndef cwAudioBuf_H
#define cmApBuf_H #define cwAudioBuf_H
#include "cwAudioBufDecls.h"
namespace cw namespace cw
{ {
@ -113,7 +115,7 @@ namespace cw
// Return the meter window period as set by initialize() // Return the meter window period as set by initialize()
unsigned meterMs(handle_t h); unsigned meterMs(handle_t h);
// Set the meter update period. THis function limits the value to between 10 and 1000. // Set the meter update period. This function limits the value to between 10 and 1000.
void setMeterMs( handle_t h, unsigned meterMs ); void setMeterMs( handle_t h, unsigned meterMs );
// Returns the channel count set via setup(). // Returns the channel count set via setup().
@ -211,7 +213,8 @@ namespace cw
// 3) This function just returns audio information it does not // 3) This function just returns audio information it does not
// change any internal states. // change any internal states.
// 4) The timestamp pointers are optional. // 4) The timestamp pointers are optional.
void getIO( handle_t h, unsigned iDevIdx, sample_t* iBufArray[], unsigned iBufChCnt, time::spec_t* iTimeStampPtr, void getIO( handle_t h,
unsigned iDevIdx, sample_t* iBufArray[], unsigned iBufChCnt, time::spec_t* iTimeStampPtr,
unsigned oDevIdx, sample_t* oBufArray[], unsigned oBufChCnt, time::spec_t* oTimeStampPtr ); unsigned oDevIdx, sample_t* oBufArray[], unsigned oBufChCnt, time::spec_t* oTimeStampPtr );

16
cwAudioBufDecls.h Normal file
View File

@ -0,0 +1,16 @@
#ifndef cwAudioBufDecls_H
#define cwAudioBufDecls_H
namespace cw
{
namespace audio
{
namespace buf
{
}
}
}
#endif

View File

@ -112,19 +112,19 @@ cw::rc_t cw::audio::device::registerDriver( handle_t h, driver_t* drv )
return kOkRC; return kOkRC;
} }
unsigned cw::audio::device::deviceCount( handle_t h ) unsigned cw::audio::device::count( handle_t h )
{ {
device_t* p = _handleToPtr(h); device_t* p = _handleToPtr(h);
return p->nextDrvIdx; return p->nextDrvIdx;
} }
unsigned cw::audio::device::deviceLabelToIndex( handle_t h, const char* label ) unsigned cw::audio::device::labelToIndex( handle_t h, const char* label )
{ {
unsigned n = deviceCount(h); unsigned n = count(h);
unsigned i; unsigned i;
for(i=0; i<n; ++i) for(i=0; i<n; ++i)
{ {
const char* s = deviceLabel(h,i); const char* s = device::label(h,i);
if( textCompare(s,label)==0) if( textCompare(s,label)==0)
return i; return i;
} }
@ -132,7 +132,7 @@ unsigned cw::audio::device::deviceLabelToIndex( handle_t h, const char* lab
} }
const char* cw::audio::device::deviceLabel( handle_t h, unsigned devIdx ) const char* cw::audio::device::label( handle_t h, unsigned devIdx )
{ {
drv_t* d; drv_t* d;
if((d = _indexToDriver(h,devIdx)) != nullptr ) if((d = _indexToDriver(h,devIdx)) != nullptr )
@ -140,7 +140,7 @@ const char* cw::audio::device::deviceLabel( handle_t h, unsigned devIdx )
return nullptr; return nullptr;
} }
unsigned cw::audio::device::deviceChannelCount( handle_t h, unsigned devIdx, bool inputFl ) unsigned cw::audio::device::channelCount( handle_t h, unsigned devIdx, bool inputFl )
{ {
drv_t* d; drv_t* d;
if((d = _indexToDriver(h,devIdx)) != nullptr ) if((d = _indexToDriver(h,devIdx)) != nullptr )
@ -148,7 +148,7 @@ unsigned cw::audio::device::deviceChannelCount( handle_t h, unsigned devIdx, boo
return 0; return 0;
} }
double cw::audio::device::deviceSampleRate( handle_t h, unsigned devIdx ) double cw::audio::device::sampleRate( handle_t h, unsigned devIdx )
{ {
drv_t* d; drv_t* d;
if((d = _indexToDriver(h,devIdx)) != nullptr ) if((d = _indexToDriver(h,devIdx)) != nullptr )
@ -156,7 +156,7 @@ double cw::audio::device::deviceSampleRate( handle_t h, unsigned devIdx )
return 0; return 0;
} }
unsigned cw::audio::device::deviceFramesPerCycle( handle_t h, unsigned devIdx, bool inputFl ) unsigned cw::audio::device::framesPerCycle( handle_t h, unsigned devIdx, bool inputFl )
{ {
drv_t* d; drv_t* d;
if((d = _indexToDriver(h,devIdx)) != nullptr ) if((d = _indexToDriver(h,devIdx)) != nullptr )
@ -164,7 +164,7 @@ unsigned cw::audio::device::deviceFramesPerCycle( handle_t h, unsigned devIdx, b
return 0; return 0;
} }
cw::rc_t cw::audio::device::deviceSetup( handle_t h, unsigned devIdx, double sr, unsigned frmPerCycle, cbFunc_t cb, void* cbData ) cw::rc_t cw::audio::device::setup( handle_t h, unsigned devIdx, double sr, unsigned frmPerCycle, cbFunc_t cb, void* cbData )
{ {
drv_t* d; drv_t* d;
if((d = _indexToDriver(h,devIdx)) != nullptr ) if((d = _indexToDriver(h,devIdx)) != nullptr )
@ -172,7 +172,7 @@ cw::rc_t cw::audio::device::deviceSetup( handle_t h, unsigned devIdx, double sr
return kInvalidArgRC; return kInvalidArgRC;
} }
cw::rc_t cw::audio::device::deviceStart( handle_t h, unsigned devIdx ) cw::rc_t cw::audio::device::start( handle_t h, unsigned devIdx )
{ {
drv_t* d; drv_t* d;
if((d = _indexToDriver(h,devIdx)) != nullptr ) if((d = _indexToDriver(h,devIdx)) != nullptr )
@ -180,7 +180,7 @@ cw::rc_t cw::audio::device::deviceStart( handle_t h, unsigned devIdx )
return kInvalidArgRC; return kInvalidArgRC;
} }
cw::rc_t cw::audio::device::deviceStop( handle_t h, unsigned devIdx ) cw::rc_t cw::audio::device::stop( handle_t h, unsigned devIdx )
{ {
drv_t* d; drv_t* d;
if((d = _indexToDriver(h,devIdx)) != nullptr ) if((d = _indexToDriver(h,devIdx)) != nullptr )
@ -188,7 +188,7 @@ cw::rc_t cw::audio::device::deviceStop( handle_t h, unsigned devIdx )
return kInvalidArgRC; return kInvalidArgRC;
} }
bool cw::audio::device::deviceIsStarted(handle_t h, unsigned devIdx ) bool cw::audio::device::isStarted(handle_t h, unsigned devIdx )
{ {
drv_t* d; drv_t* d;
if((d = _indexToDriver(h,devIdx)) != nullptr ) if((d = _indexToDriver(h,devIdx)) != nullptr )
@ -196,7 +196,7 @@ bool cw::audio::device::deviceIsStarted(handle_t h, unsigned devIdx )
return false; return false;
} }
void cw::audio::device::deviceRealTimeReport( handle_t h, unsigned devIdx ) void cw::audio::device::realTimeReport( handle_t h, unsigned devIdx )
{ {
drv_t* d; drv_t* d;
if((d = _indexToDriver(h,devIdx)) != nullptr ) if((d = _indexToDriver(h,devIdx)) != nullptr )
@ -205,13 +205,13 @@ void cw::audio::device::deviceRealTimeReport( handle_t h, unsigned devIdx )
void cw::audio::device::report( handle_t h ) void cw::audio::device::report( handle_t h )
{ {
for(unsigned i=0; i<deviceCount(h); ++i) for(unsigned i=0; i<count(h); ++i)
{ {
cwLogInfo( "%8.1f in:%i (%i) out:%i (%i) %s", cwLogInfo( "%8.1f in:%i (%i) out:%i (%i) %s",
deviceSampleRate(h,i), sampleRate(h,i),
deviceChannelCount(h,i,true), deviceFramesPerCycle(h,i,true), channelCount(h,i,true), framesPerCycle(h,i,true),
deviceChannelCount(h,i,false), deviceFramesPerCycle(h,i,false), channelCount(h,i,false), framesPerCycle(h,i,false),
deviceLabel(h,i)); label(h,i));
} }
} }

View File

@ -22,36 +22,14 @@
#ifndef cwAudioDevice_H #ifndef cwAudioDevice_H
#define cwAudioDevice_H #define cwAudioDevice_H
#include "cwAudioDeviceDecls.h"
namespace cw namespace cw
{ {
namespace audio namespace audio
{ {
namespace device namespace device
{ {
typedef float sample_t;
// audioPacket_t flags
enum
{
kInterleavedApFl = 0x01, // The audio samples are interleaved.
kFloatApFl = 0x02 // The audio samples are single precision floating point values.
};
// Audio packet record used by the audioPacket_t callback.
// Audio ports send and receive audio using this data structure.
typedef struct
{
unsigned devIdx; // device associated with packet
unsigned begChIdx; // first device channel
unsigned chCnt; // count of channels
unsigned audioFramesCnt; // samples per channel (see note below)
unsigned bitsPerSample; // bits per sample word
unsigned flags; // kInterleavedApFl | kFloatApFl
void* audioBytesPtr; // pointer to sample data
void* cbArg; // user defined argument passed in via deviceSetup()
time::spec_t timeStamp; // Packet time stamp.
} audioPacket_t;
// Audio port callback signature. // Audio port callback signature.
// inPktArray[inPktCnt] are full packets of audio coming from the ADC to the application. // inPktArray[inPktCnt] are full packets of audio coming from the ADC to the application.
@ -94,12 +72,12 @@ namespace cw
rc_t registerDriver( handle_t h, driver_t* drv ); rc_t registerDriver( handle_t h, driver_t* drv );
unsigned deviceCount( handle_t h ); unsigned count( handle_t h );
unsigned deviceLabelToIndex( handle_t h, const char* label ); unsigned labelToIndex( handle_t h, const char* label );
const char* deviceLabel( handle_t h, unsigned devIdx ); const char* label( handle_t h, unsigned devIdx );
unsigned deviceChannelCount( handle_t h, unsigned devIdx, bool inputFl ); unsigned channelCount( handle_t h, unsigned devIdx, bool inputFl );
double deviceSampleRate( handle_t h, unsigned devIdx ); double sampleRate( handle_t h, unsigned devIdx );
unsigned deviceFramesPerCycle( handle_t h, unsigned devIdx, bool inputFl ); unsigned framesPerCycle( handle_t h, unsigned devIdx, bool inputFl );
// Configure a device. // Configure a device.
// All devices must be setup before they are started. // All devices must be setup before they are started.
@ -111,7 +89,7 @@ namespace cw
// If the device is started when this function is called then it will be // If the device is started when this function is called then it will be
// automatically stopped and then restarted following the reconfiguration. // automatically stopped and then restarted following the reconfiguration.
// If the reconfiguration fails then the device may not be restared. // If the reconfiguration fails then the device may not be restared.
rc_t deviceSetup( rc_t setup(
handle_t h, handle_t h,
unsigned devIdx, unsigned devIdx,
double sr, double sr,
@ -119,10 +97,10 @@ namespace cw
cbFunc_t cb, cbFunc_t cb,
void* cbData ); void* cbData );
rc_t deviceStart( handle_t h, unsigned devIdx ); rc_t start( handle_t h, unsigned devIdx );
rc_t deviceStop( handle_t h, unsigned devIdx ); rc_t stop( handle_t h, unsigned devIdx );
bool deviceIsStarted( handle_t h, unsigned devIdx ); bool isStarted( handle_t h, unsigned devIdx );
void deviceRealTimeReport( handle_t h, unsigned devIdx ); void realTimeReport( handle_t h, unsigned devIdx );
void report( handle_t h ); void report( handle_t h );
} }

36
cwAudioDeviceDecls.h Normal file
View File

@ -0,0 +1,36 @@
#ifndef cwAudioDeviceDefs_H
#define cwAudioDeviceDefs_H
namespace cw
{
namespace audio
{
namespace device
{
typedef float sample_t;
// audioPacket_t flags
enum
{
kInterleavedApFl = 0x01, // The audio samples are interleaved.
kFloatApFl = 0x02 // The audio samples are single precision floating point values.
};
// Audio packet record used by the audioPacket_t callback.
// Audio ports send and receive audio using this data structure.
typedef struct
{
unsigned devIdx; // device associated with packet
unsigned begChIdx; // first device channel
unsigned chCnt; // count of channels
unsigned audioFramesCnt; // samples per channel (see note below)
unsigned bitsPerSample; // bits per sample word
unsigned flags; // kInterleavedApFl | kFloatApFl
void* audioBytesPtr; // pointer to sample data
void* cbArg; // user defined argument passed in via deviceSetup()
time::spec_t timeStamp; // Packet time stamp.
} audioPacket_t;
}
}
}
#endif

View File

@ -25,11 +25,7 @@ namespace cw
typedef struct typedef struct
{ {
unsigned bufCnt; // 2=double buffering 3=triple buffering unsigned bufCnt; // 2=double buffering 3=triple buffering
unsigned chIdx; // first test channel
//unsigned chCnt; // count of channels to test
unsigned framesPerCycle; // DSP frames per cycle unsigned framesPerCycle; // DSP frames per cycle
unsigned bufFrmCnt; // count of DSP frames used by the audio buffer (bufCnt * framesPerCycle)
unsigned bufSmpCnt; // count of samples used by the audio buffer (chCnt * bufFrmCnt)
unsigned inDevIdx; // input device index unsigned inDevIdx; // input device index
unsigned outDevIdx; // output device index unsigned outDevIdx; // output device index
double srate; // audio sample rate double srate; // audio sample rate
@ -51,8 +47,6 @@ namespace cw
"-r <srate> -c <chcnt> -b <bufcnt> -f <frmcnt> -i <idevidx> -o <odevidx> -t -p -h \n" "-r <srate> -c <chcnt> -b <bufcnt> -f <frmcnt> -i <idevidx> -o <odevidx> -t -p -h \n"
"\n" "\n"
"-r <srate> = sample rate\n" "-r <srate> = sample rate\n"
"-a <chidx> = first channel\n"
"-c <chcnt> = audio channels\n"
"-b <bufcnt> = count of buffers\n" "-b <bufcnt> = count of buffers\n"
"-f <frmcnt> = count of samples per buffer\n" "-f <frmcnt> = count of samples per buffer\n"
"-i <idevidx> = input device index\n" "-i <idevidx> = input device index\n"
@ -119,16 +113,10 @@ cw::rc_t cw::audio::device::test( int argc, const char** argv )
if( _cmApGetOpt(argc,argv,"-h",0,true) ) if( _cmApGetOpt(argc,argv,"-h",0,true) )
_cmApPrintUsage(); _cmApPrintUsage();
runFl = _cmApGetOpt(argc,argv,"-p",0,true) ? false : true;
runFl = _cmApGetOpt(argc,argv,"-p",0,true)?false:true;
r.srate = _cmApGetOpt(argc,argv,"-r",44100); r.srate = _cmApGetOpt(argc,argv,"-r",44100);
//r.chIdx = _cmApGetOpt(argc,argv,"-a",0);
//r.chCnt = _cmApGetOpt(argc,argv,"-c",2);
r.bufCnt = _cmApGetOpt(argc,argv,"-b",3); r.bufCnt = _cmApGetOpt(argc,argv,"-b",3);
r.framesPerCycle = _cmApGetOpt(argc,argv,"-f",512); r.framesPerCycle = _cmApGetOpt(argc,argv,"-f",512);
//r.bufFrmCnt = (r.bufCnt*r.framesPerCycle);
//r.bufSmpCnt = (r.chCnt * r.bufFrmCnt);
//r.logCnt = 100;
r.meterMs = 50; r.meterMs = 50;
r.inDevIdx = _cmGlobalInDevIdx = _cmApGetOpt(argc,argv,"-i",0); r.inDevIdx = _cmGlobalInDevIdx = _cmApGetOpt(argc,argv,"-i",0);
@ -161,9 +149,9 @@ cw::rc_t cw::audio::device::test( int argc, const char** argv )
} }
// report the current audio device configuration // report the current audio device configuration
for(i=0; i<deviceCount(h); ++i) for(i=0; i<device::count(h); ++i)
{ {
cwLogInfo("%i [in: chs=%i frames=%i] [out: chs=%i frames=%i] srate:%8.1f %s",i,deviceChannelCount(h,i,true),deviceFramesPerCycle(h,i,true),deviceChannelCount(h,i,false),deviceFramesPerCycle(h,i,false),deviceSampleRate(h,i),deviceLabel(h,i)); cwLogInfo("%i [in: chs=%i frames=%i] [out: chs=%i frames=%i] srate:%8.1f %s",i,device::channelCount(h,i,true),framesPerCycle(h,i,true),channelCount(h,i,false),framesPerCycle(h,i,false),sampleRate(h,i),label(h,i));
} }
// report the current audio devices using the audio port interface function // report the current audio devices using the audio port interface function
@ -172,29 +160,29 @@ cw::rc_t cw::audio::device::test( int argc, const char** argv )
if( runFl ) if( runFl )
{ {
// initialize the audio bufer // initialize the audio bufer
buf::create( r.audioBufH, deviceCount(h), r.meterMs ); buf::create( r.audioBufH, device::count(h), r.meterMs );
// setup the buffer for the output device // setup the buffer for the output device
buf::setup( r.audioBufH, r.outDevIdx, r.srate, r.framesPerCycle, r.bufCnt, deviceChannelCount(h,r.outDevIdx,true), r.framesPerCycle, deviceChannelCount(h,r.outDevIdx,false), r.framesPerCycle ); buf::setup( r.audioBufH, r.outDevIdx, r.srate, r.framesPerCycle, r.bufCnt, channelCount(h,r.outDevIdx,true), r.framesPerCycle, channelCount(h,r.outDevIdx,false), r.framesPerCycle );
// setup the buffer for the input device // setup the buffer for the input device
//if( r.inDevIdx != r.outDevIdx ) //if( r.inDevIdx != r.outDevIdx )
buf::setup( r.audioBufH, r.inDevIdx, r.srate, r.framesPerCycle, r.bufCnt, deviceChannelCount(h,r.inDevIdx,true), r.framesPerCycle, deviceChannelCount(h,r.inDevIdx,false), r.framesPerCycle ); buf::setup( r.audioBufH, r.inDevIdx, r.srate, r.framesPerCycle, r.bufCnt, channelCount(h,r.inDevIdx,true), r.framesPerCycle, channelCount(h,r.inDevIdx,false), r.framesPerCycle );
// setup an output device // setup an output device
if(deviceSetup(h, r.outDevIdx,r.srate,r.framesPerCycle,_cmApPortCb2,&r) != kOkRC ) if(setup(h, r.outDevIdx,r.srate,r.framesPerCycle,_cmApPortCb2,&r) != kOkRC )
cwLogInfo("Out device setup failed."); cwLogInfo("Out device setup failed.");
else else
// setup an input device // setup an input device
if( deviceSetup(h, r.inDevIdx,r.srate,r.framesPerCycle,_cmApPortCb2,&r) != kOkRC ) if( setup(h, r.inDevIdx,r.srate,r.framesPerCycle,_cmApPortCb2,&r) != kOkRC )
cwLogInfo("In device setup failed."); cwLogInfo("In device setup failed.");
else else
// start the input device // start the input device
if( deviceStart(h, r.inDevIdx) != kOkRC ) if( start(h, r.inDevIdx) != kOkRC )
cwLogInfo("In device start failed."); cwLogInfo("In device start failed.");
else else
// start the output device // start the output device
if( deviceStart(h, r.outDevIdx) != kOkRC ) if( start(h, r.outDevIdx) != kOkRC )
cwLogInfo("Out Device start failed."); cwLogInfo("Out Device start failed.");
else else
cwLogInfo("Setup complete!"); cwLogInfo("Setup complete!");
@ -208,7 +196,7 @@ cw::rc_t cw::audio::device::test( int argc, const char** argv )
char c; char c;
while((c=getchar()) != 'q') while((c=getchar()) != 'q')
{ {
deviceRealTimeReport(h, r.outDevIdx ); realTimeReport(h, r.outDevIdx );
switch(c) switch(c)
{ {
@ -241,13 +229,13 @@ cw::rc_t cw::audio::device::test( int argc, const char** argv )
} }
// stop the input device // stop the input device
if( deviceIsStarted(h,r.inDevIdx) ) if( isStarted(h,r.inDevIdx) )
if( deviceStop(h,r.inDevIdx) != kOkRC ) if( stop(h,r.inDevIdx) != kOkRC )
cwLogInfo("In device stop failed."); cwLogInfo("In device stop failed.");
// stop the output device // stop the output device
if( deviceIsStarted(h,r.outDevIdx) ) if( isStarted(h,r.outDevIdx) )
if( deviceStop(h,r.outDevIdx) != kOkRC ) if( stop(h,r.outDevIdx) != kOkRC )
cwLogInfo("Out device stop failed."); cwLogInfo("Out device stop failed.");
} }

View File

@ -2,6 +2,7 @@
#include "cwLog.h" #include "cwLog.h"
#include "cwCommonImpl.h" #include "cwCommonImpl.h"
#include "cwMem.h" #include "cwMem.h"
#include "cwTime.h"
#include "cwMidi.h" #include "cwMidi.h"
namespace cw { namespace cw {
@ -9,8 +10,8 @@ namespace cw {
typedef struct statusDesc_str typedef struct statusDesc_str
{ {
byte_t status; uint8_t status;
byte_t byteCnt; uint8_t byteCnt;
const char* label; const char* label;
} statusDesc_t; } statusDesc_t;
@ -84,7 +85,7 @@ namespace cw {
//==================================================================================================== //====================================================================================================
const char* cw::midi::statusToLabel( byte_t status ) const char* cw::midi::statusToLabel( uint8_t status )
{ {
unsigned i; unsigned i;
@ -102,7 +103,7 @@ const char* cw::midi::statusToLabel( byte_t status )
return _statusDescArray[i].label; return _statusDescArray[i].label;
} }
const char* cw::midi::metaStatusToLabel( byte_t metaStatus ) const char* cw::midi::metaStatusToLabel( uint8_t metaStatus )
{ {
int i; int i;
for(i=0; _metaStatusDescArray[i].status != kInvalidMetaMdId; ++i) for(i=0; _metaStatusDescArray[i].status != kInvalidMetaMdId; ++i)
@ -112,7 +113,7 @@ const char* cw::midi::metaStatusToLabel( byte_t metaStatus )
return _metaStatusDescArray[i].label; return _metaStatusDescArray[i].label;
} }
const char* cw::midi::pedalLabel( byte_t d0 ) const char* cw::midi::pedalLabel( uint8_t d0 )
{ {
int i; int i;
for(i=0; _pedalLabel[i].status != kInvalidMidiByte; ++i) for(i=0; _pedalLabel[i].status != kInvalidMidiByte; ++i)
@ -122,7 +123,7 @@ const char* cw::midi::pedalLabel( byte_t d0 )
return _pedalLabel[i].label; return _pedalLabel[i].label;
} }
cw::midi::byte_t cw::midi::statusToByteCount( byte_t status ) uint8_t cw::midi::statusToByteCount( uint8_t status )
{ {
unsigned i; unsigned i;
@ -142,7 +143,7 @@ cw::midi::byte_t cw::midi::statusToByteCount( byte_t status )
return 0; return 0;
} }
unsigned cw::midi::to14Bits( byte_t d0, byte_t d1 ) unsigned cw::midi::to14Bits( uint8_t d0, uint8_t d1 )
{ {
unsigned val = d0; unsigned val = d0;
val <<= 7; val <<= 7;
@ -150,26 +151,26 @@ unsigned cw::midi::to14Bits( byte_t d0, byte_t d1 )
return val; return val;
} }
void cw::midi::split14Bits( unsigned v, byte_t& d0Ref, byte_t& d1Ref ) void cw::midi::split14Bits( unsigned v, uint8_t& d0Ref, uint8_t& d1Ref )
{ {
d0Ref = (v & 0x3f80) >> 7; d0Ref = (v & 0x3f80) >> 7;
d1Ref = v & 0x7f; d1Ref = v & 0x7f;
} }
int cw::midi::toPbend( byte_t d0, byte_t d1 ) int cw::midi::toPbend( uint8_t d0, uint8_t d1 )
{ {
int v = to14Bits(d0,d1); int v = to14Bits(d0,d1);
return v - 8192; return v - 8192;
} }
void cw::midi::splitPbend( int v, byte_t& d0Ref, byte_t& d1Ref ) void cw::midi::splitPbend( int v, uint8_t& d0Ref, uint8_t& d1Ref )
{ {
unsigned uv = v + 8192; unsigned uv = v + 8192;
split14Bits(uv,d0Ref,d1Ref); split14Bits(uv,d0Ref,d1Ref);
} }
//==================================================================================================== //====================================================================================================
const char* cw::midi::midiToSciPitch( byte_t pitch, char* label, unsigned labelCharCnt ) const char* cw::midi::midiToSciPitch( uint8_t pitch, char* label, unsigned labelCharCnt )
{ {
static char buf[ kMidiSciPitchCharCnt ]; static char buf[ kMidiSciPitchCharCnt ];
@ -214,7 +215,7 @@ const char* cw::midi::midiToSciPitch( byte_t pitch, char* label, unsigned la
} }
cw::midi::byte_t cw::midi::sciPitchToMidiPitch( char pitch, int acc, int octave ) uint8_t cw::midi::sciPitchToMidiPitch( char pitch, int acc, int octave )
{ {
int idx = -1; int idx = -1;
@ -240,7 +241,7 @@ cw::midi::byte_t cw::midi::sciPitchToMidiPitch( char pitch, int acc, int octa
} }
cw::midi::byte_t cw::midi::sciPitchToMidi( const char* sciPitchStr ) uint8_t cw::midi::sciPitchToMidi( const char* sciPitchStr )
{ {
const char* cp = sciPitchStr; const char* cp = sciPitchStr;
bool sharpFl = false; bool sharpFl = false;

View File

@ -77,8 +77,6 @@ namespace cw
}; };
typedef unsigned char byte_t;
typedef struct timespec timestamp_t;
//=============================================================================================== //===============================================================================================
// Utility Functions // Utility Functions
@ -103,42 +101,24 @@ namespace cw
template< typename T> bool isPedalDown( T s, T d0, T d1 ) { return ( cmMidiIsPedal(s,d0) && (d1)>=64 ); } template< typename T> bool isPedalDown( T s, T d0, T d1 ) { return ( cmMidiIsPedal(s,d0) && (d1)>=64 ); }
template< typename T> bool isPedalUp( T s, T d0, T d1 ) { return ( cmMidiIsPedal(s,d0) && (d1)<64 ); } template< typename T> bool isPedalUp( T s, T d0, T d1 ) { return ( cmMidiIsPedal(s,d0) && (d1)<64 ); }
const char* statusToLabel( byte_t status ); const char* statusToLabel( uint8_t status );
const char* metaStatusToLabel( byte_t metaStatus ); const char* metaStatusToLabel( uint8_t metaStatus );
const char* pedalLabel( byte_t d0 ); const char* pedalLabel( uint8_t d0 );
// Returns kInvalidMidiByte if status is not a valid status byte // Returns kInvalidMidiByte if status is not a valid status byte
byte_t statusToByteCount( byte_t status ); uint8_t statusToByteCount( uint8_t status );
unsigned to14Bits( byte_t d0, byte_t d1 ); unsigned to14Bits( uint8_t d0, uint8_t d1 );
void split14Bits( unsigned v, byte_t& d0Ref, byte_t& d1Ref ); void split14Bits( unsigned v, uint8_t& d0Ref, uint8_t& d1Ref );
int toPbend( byte_t d0, byte_t d1 ); int toPbend( uint8_t d0, uint8_t d1 );
void splitPbend( int v, byte_t& d0Ref, byte_t& d1Ref ); void splitPbend( int v, uint8_t& d0Ref, uint8_t& d1Ref );
//=============================================================================================== //===============================================================================================
// MIDI Communication data types // MIDI Communication data types
// //
typedef struct msg_str
{
//unsigned deltaUs; // time since last MIDI msg in microseconds
timestamp_t timeStamp;
byte_t status; // midi status byte
byte_t d0; // midi data byte 0
byte_t d1; // midi data byte 1
byte_t pad;
} msg_t;
typedef struct packet_str
{
void* cbDataPtr; // application supplied reference value from mdParserCreate()
unsigned devIdx; // the device the msg originated from
unsigned portIdx; // the port index on the source device
msg_t* msgArray; // pointer to an array of 'msgCnt' mdMsg records or NULL if sysExMsg is non-NULL
byte_t* sysExMsg; // pointer to a sys-ex msg or NULL if msgArray is non-NULL (see note below)
unsigned msgCnt; // count of mdMsg records or sys-ex bytes
} packet_t;
// Notes: If the sys-ex message can be contained in a single msg then // Notes: If the sys-ex message can be contained in a single msg then
// then the first msg byte is kSysExMdId and the last is kSysComEoxMdId. // then the first msg byte is kSysExMdId and the last is kSysComEoxMdId.
@ -150,12 +130,12 @@ namespace cw
// buffer is returned. If label[] is given the it // buffer is returned. If label[] is given the it
// should have at least 5 (kMidiPitchCharCnt) char's (including the terminating zero). // should have at least 5 (kMidiPitchCharCnt) char's (including the terminating zero).
// If 'pitch' is outside of the range 0-127 then a blank string is returned. // If 'pitch' is outside of the range 0-127 then a blank string is returned.
const char* midiToSciPitch( byte_t pitch, char* label, unsigned labelCharCnt ); const char* midiToSciPitch( uint8_t pitch, char* label, unsigned labelCharCnt );
// Convert a scientific pitch to MIDI pitch. acc == 1 == sharp, acc == -1 == flat. // Convert a scientific pitch to MIDI pitch. acc == 1 == sharp, acc == -1 == flat.
// The pitch character must be in the range 'A' to 'G'. Upper or lower case is valid. // The pitch character must be in the range 'A' to 'G'. Upper or lower case is valid.
// Return kInvalidMidiPitch if the arguments are not valid. // Return kInvalidMidiPitch if the arguments are not valid.
byte_t sciPitchToMidiPitch( char pitch, int acc, int octave ); uint8_t sciPitchToMidiPitch( char pitch, int acc, int octave );
// Scientific pitch string: [A-Ga-g][#b][#] where # may be -1 to 9. // Scientific pitch string: [A-Ga-g][#b][#] where # may be -1 to 9.
@ -163,7 +143,7 @@ namespace cw
// scientific pitch string. This function will convert C-1 to G9 to // scientific pitch string. This function will convert C-1 to G9 to
// valid MIDI pitch values 0 to 127. Scientific pitch strings outside // valid MIDI pitch values 0 to 127. Scientific pitch strings outside
// of this range will be returned as kInvalidMidiPitch. // of this range will be returned as kInvalidMidiPitch.
byte_t sciPitchToMidi( const char* sciPitchStr ); uint8_t sciPitchToMidi( const char* sciPitchStr );
} }
} }

View File

@ -2,8 +2,8 @@
#include "cwLog.h" #include "cwLog.h"
#include "cwCommonImpl.h" #include "cwCommonImpl.h"
#include "cwMem.h" #include "cwMem.h"
#include "cwMidi.h"
#include "cwTime.h" #include "cwTime.h"
#include "cwMidi.h"
#include "cwTextBuf.h" #include "cwTextBuf.h"
#include "cwMidiPort.h" #include "cwMidiPort.h"
#include "cwThread.h" #include "cwThread.h"
@ -111,7 +111,7 @@ namespace cw
} }
void _cmMpSplit14Bits( unsigned v, byte_t* d0, byte_t* d1 ) void _cmMpSplit14Bits( unsigned v, uint8_t* d0, uint8_t* d1 )
{ {
*d0 = (v & 0x3f80) >> 7; *d0 = (v & 0x3f80) >> 7;
*d1 = v & 0x7f; *d1 = v & 0x7f;
@ -156,9 +156,9 @@ namespace cw
unsigned microSecs1 = (ev->time.time.tv_sec * 1000000) + (ev->time.time.tv_nsec/1000); unsigned microSecs1 = (ev->time.time.tv_sec * 1000000) + (ev->time.time.tv_nsec/1000);
//unsigned deltaMicroSecs = p->prvTimeMicroSecs==0 ? 0 : microSecs1 - p->prvTimeMicroSecs; //unsigned deltaMicroSecs = p->prvTimeMicroSecs==0 ? 0 : microSecs1 - p->prvTimeMicroSecs;
byte_t d0 = 0xff; uint8_t d0 = 0xff;
byte_t d1 = 0xff; uint8_t d1 = 0xff;
byte_t status = 0; uint8_t status = 0;
switch(ev->type) switch(ev->type)
{ {
@ -244,7 +244,7 @@ namespace cw
if( status != 0 ) if( status != 0 )
{ {
byte_t ch = ev->data.note.channel; uint8_t ch = ev->data.note.channel;
time::spec_t ts; time::spec_t ts;
ts.tv_sec = p->baseTimeStamp.tv_sec + ev->time.time.tv_sec; ts.tv_sec = p->baseTimeStamp.tv_sec + ev->time.time.tv_sec;
ts.tv_nsec = p->baseTimeStamp.tv_nsec + ev->time.time.tv_nsec; ts.tv_nsec = p->baseTimeStamp.tv_nsec + ev->time.time.tv_nsec;
@ -709,7 +709,7 @@ const char* cw::midi::device::portName( handle_t h, unsigned devIdx, unsign
} }
cw::rc_t cw::midi::device::send( handle_t h, unsigned devIdx, unsigned portIdx, byte_t status, byte_t d0, byte_t d1 ) cw::rc_t cw::midi::device::send( handle_t h, unsigned devIdx, unsigned portIdx, uint8_t status, uint8_t d0, uint8_t d1 )
{ {
rc_t rc = kOkRC; rc_t rc = kOkRC;
snd_seq_event_t ev; snd_seq_event_t ev;
@ -797,7 +797,7 @@ cw::rc_t cw::midi::device::send( handle_t h, unsigned devIdx, unsigned portIdx,
return rc; return rc;
} }
cw::rc_t cw::midi::device::sendData( handle_t h, unsigned devIdx, unsigned portIdx, const byte_t* dataPtr, unsigned byteCnt ) cw::rc_t cw::midi::device::sendData( handle_t h, unsigned devIdx, unsigned portIdx, const uint8_t* dataPtr, unsigned byteCnt )
{ {
return cwLogError(kInvalidOpRC,"cmMpDeviceSendData() has not yet been implemented for ALSA."); return cwLogError(kInvalidOpRC,"cmMpDeviceSendData() has not yet been implemented for ALSA.");
} }

29
cwMidiDecls.h Normal file
View File

@ -0,0 +1,29 @@
#ifndef cwMidiDecls_H
#define cwMidiDecls_H
namespace cw
{
namespace midi
{
typedef struct msg_str
{
//unsigned deltaUs; // time since last MIDI msg in microseconds
time::spec_t timeStamp;
uint8_t status; // midi status byte
uint8_t d0; // midi data byte 0
uint8_t d1; // midi data byte 1
uint8_t pad;
} msg_t;
typedef struct packet_str
{
void* cbDataPtr; // application supplied reference value from mdParserCreate()
unsigned devIdx; // the device the msg originated from
unsigned portIdx; // the port index on the source device
msg_t* msgArray; // pointer to an array of 'msgCnt' mdMsg records or NULL if sysExMsg is non-NULL
uint8_t* sysExMsg; // pointer to a sys-ex msg or NULL if msgArray is non-NULL (see note below)
unsigned msgCnt; // count of mdMsg records or sys-ex bytes
} packet_t;
}
}
#endif

View File

@ -2,8 +2,8 @@
#include "cwLog.h" #include "cwLog.h"
#include "cwCommonImpl.h" #include "cwCommonImpl.h"
#include "cwMem.h" #include "cwMem.h"
#include "cwMidi.h"
#include "cwTime.h" #include "cwTime.h"
#include "cwMidi.h"
#include "cwTextBuf.h" #include "cwTextBuf.h"
#include "cwMidiPort.h" #include "cwMidiPort.h"
@ -43,11 +43,11 @@ namespace cw
unsigned state; // parser state id unsigned state; // parser state id
unsigned errCnt; // accumlated error count unsigned errCnt; // accumlated error count
byte_t status; // running status uint8_t status; // running status
byte_t data0; // data byte 0 uint8_t data0; // data byte 0
unsigned dataCnt; // data byte cnt for current status unsigned dataCnt; // data byte cnt for current status
unsigned dataIdx; // index (0 or 1) of next data byte unsigned dataIdx; // index (0 or 1) of next data byte
byte_t* buf; // output buffer uint8_t* buf; // output buffer
unsigned bufByteCnt; // output buffer byte cnt unsigned bufByteCnt; // output buffer byte cnt
unsigned bufIdx; // next output buffer index unsigned bufIdx; // next output buffer index
unsigned msgCnt; // count of channel messages in the buffer unsigned msgCnt; // count of channel messages in the buffer
@ -95,7 +95,7 @@ namespace cw
} }
void _cmMpParserStoreChMsg( parser_t* p, const time::spec_t* timeStamp, byte_t d ) void _cmMpParserStoreChMsg( parser_t* p, const time::spec_t* timeStamp, uint8_t d )
{ {
// if there is not enough room left in the buffer then transmit // if there is not enough room left in the buffer then transmit
// the current messages // the current messages
@ -176,7 +176,7 @@ cw::rc_t cw::midi::parser::create( handle_t& hRef, unsigned devIdx, unsigned por
//p->cbChain->cbDataPtr = cbDataPtr; //p->cbChain->cbDataPtr = cbDataPtr;
//p->cbChain->linkPtr = NULL; //p->cbChain->linkPtr = NULL;
p->cbChain = NULL; p->cbChain = NULL;
p->buf = mem::allocZ<byte_t>( bufByteCnt ); p->buf = mem::allocZ<uint8_t>( bufByteCnt );
p->bufByteCnt = bufByteCnt; p->bufByteCnt = bufByteCnt;
p->bufIdx = 0; p->bufIdx = 0;
p->msgCnt = 0; p->msgCnt = 0;
@ -227,7 +227,7 @@ unsigned cw::midi::parser::errorCount( handle_t h )
} }
void cw::midi::parser::parseMidiData( handle_t h, const time::spec_t* timeStamp, const byte_t* iBuf, unsigned iByteCnt ) void cw::midi::parser::parseMidiData( handle_t h, const time::spec_t* timeStamp, const uint8_t* iBuf, unsigned iByteCnt )
{ {
parser_t* p = _handleToPtr(h); parser_t* p = _handleToPtr(h);
@ -235,8 +235,8 @@ void cw::midi::parser::parseMidiData( handle_t h, const time::spec_t* timeStamp,
if( p == NULL ) if( p == NULL )
return; return;
const byte_t* ip = iBuf; const uint8_t* ip = iBuf;
const byte_t* ep = iBuf + iByteCnt; const uint8_t* ep = iBuf + iByteCnt;
for(; ip < ep; ++ip ) for(; ip < ep; ++ip )
{ {
@ -354,11 +354,11 @@ void cw::midi::parser::parseMidiData( handle_t h, const time::spec_t* timeStamp,
} }
cw::rc_t cw::midi::parser::midiTriple( handle_t h, const time::spec_t* timeStamp, byte_t status, byte_t d0, byte_t d1 ) cw::rc_t cw::midi::parser::midiTriple( handle_t h, const time::spec_t* timeStamp, uint8_t status, uint8_t d0, uint8_t d1 )
{ {
rc_t rc = kOkRC; rc_t rc = kOkRC;
parser_t* p = _handleToPtr(h); parser_t* p = _handleToPtr(h);
byte_t mb = 0xff; // a midi triple may never have a status of 0xff uint8_t mb = 0xff; // a midi triple may never have a status of 0xff
if( d0 == 0xff ) if( d0 == 0xff )
p->dataCnt = 0; p->dataCnt = 0;

View File

@ -1,6 +1,7 @@
#ifndef cwMidiPort_H #ifndef cwMidiPort_H
#define cwMidiPort_H #define cwMidiPort_H
#include "cwMidiDecls.h"
namespace cw namespace cw
{ {
@ -37,13 +38,13 @@ namespace cw
rc_t create( handle_t& hRef, unsigned devIdx, unsigned portIdx, cbFunc_t cbFunc, void* cbArg, unsigned bufByteCnt ); rc_t create( handle_t& hRef, unsigned devIdx, unsigned portIdx, cbFunc_t cbFunc, void* cbArg, unsigned bufByteCnt );
rc_t destroy( handle_t& hRef ); rc_t destroy( handle_t& hRef );
unsigned errorCount( handle_t h ); unsigned errorCount( handle_t h );
void parseMidiData( handle_t h, const time::spec_t* timestamp, const byte_t* buf, unsigned bufByteCnt ); void parseMidiData( handle_t h, const time::spec_t* timestamp, const uint8_t* buf, unsigned bufByteCnt );
// The following two functions are intended to be used togetther. // The following two functions are intended to be used togetther.
// Use midiTriple() to insert pre-parsed msg's to the output buffer, // Use midiTriple() to insert pre-parsed msg's to the output buffer,
// and then use transmit() to send the buffer via the parsers callback function. // and then use transmit() to send the buffer via the parsers callback function.
// Set the data bytes to 0xff if they are not used by the message. // Set the data bytes to 0xff if they are not used by the message.
rc_t midiTriple( handle_t h, const time::spec_t* timestamp, byte_t status, byte_t d0, byte_t d1 ); rc_t midiTriple( handle_t h, const time::spec_t* timestamp, uint8_t status, uint8_t d0, uint8_t d1 );
rc_t transmit( handle_t h ); rc_t transmit( handle_t h );
// Install/Remove additional callbacks. // Install/Remove additional callbacks.
@ -79,8 +80,8 @@ namespace cw
unsigned portCount( handle_t h, unsigned devIdx, unsigned flags ); unsigned portCount( handle_t h, unsigned devIdx, unsigned flags );
const char* portName( handle_t h, unsigned devIdx, unsigned flags, unsigned portIdx ); const char* portName( handle_t h, unsigned devIdx, unsigned flags, unsigned portIdx );
unsigned portNameToIndex( handle_t h, unsigned devIdx, unsigned flags, const char* portName ); unsigned portNameToIndex( handle_t h, unsigned devIdx, unsigned flags, const char* portName );
rc_t send( handle_t h, unsigned devIdx, unsigned portIdx, byte_t st, byte_t d0, byte_t d1 ); rc_t send( handle_t h, unsigned devIdx, unsigned portIdx, uint8_t st, uint8_t d0, uint8_t d1 );
rc_t sendData( handle_t h, unsigned devIdx, unsigned portIdx, const byte_t* dataPtr, unsigned byteCnt ); rc_t sendData( handle_t h, unsigned devIdx, unsigned portIdx, const uint8_t* dataPtr, unsigned byteCnt );
// Set devIdx to -1 to assign the callback to all devices. // Set devIdx to -1 to assign the callback to all devices.
// Set portIdx to -1 to assign the callback to all ports on the specified devices. // Set portIdx to -1 to assign the callback to all ports on the specified devices.

View File

@ -1,35 +1,12 @@
#ifndef cwSerialPort_H #ifndef cwSerialPort_H
#define cwSerialPort_H #define cwSerialPort_H
#include "cwSerialPortDecls.h"
namespace cw namespace cw
{ {
namespace serialPort namespace serialPort
{ {
enum
{
kDataBits5Fl = 0x0001,
kDataBits6Fl = 0x0002,
kDataBits7Fl = 0x0004,
kDataBits8Fl = 0x0008,
kDataBitsMask = 0x000f,
k1StopBitFl = 0x0010,
k2StopBitFl = 0x0020,
kEvenParityFl = 0x0040,
kOddParityFl = 0x0080,
kNoParityFl = 0x0000,
/*
kCTS_OutFlowCtlFl = 0x0100,
kRTS_InFlowCtlFl = 0x0200,
kDTR_InFlowCtlFl = 0x0400,
kDSR_OutFlowCtlFl = 0x0800,
kDCD_OutFlowCtlFl = 0x1000
*/
kDefaultCfgFlags = kDataBits8Fl | k1StopBitFl | kNoParityFl
};
typedef handle<struct device_str> handle_t; typedef handle<struct device_str> handle_t;
typedef void (*callbackFunc_t)( void* cbArg, unsigned userId, const void* byteA, unsigned byteN ); typedef void (*callbackFunc_t)( void* cbArg, unsigned userId, const void* byteA, unsigned byteN );

35
cwSerialPortDecls.h Normal file
View File

@ -0,0 +1,35 @@
#ifndef cwSerialPortDecls_H
#define cwSerialPortDecls_H
namespace cw
{
namespace serialPort
{
enum
{
kDataBits5Fl = 0x0001,
kDataBits6Fl = 0x0002,
kDataBits7Fl = 0x0004,
kDataBits8Fl = 0x0008,
kDataBitsMask = 0x000f,
k1StopBitFl = 0x0010,
k2StopBitFl = 0x0020,
kEvenParityFl = 0x0040,
kOddParityFl = 0x0080,
kNoParityFl = 0x0000,
/*
kCTS_OutFlowCtlFl = 0x0100,
kRTS_InFlowCtlFl = 0x0200,
kDTR_InFlowCtlFl = 0x0400,
kDSR_OutFlowCtlFl = 0x0800,
kDCD_OutFlowCtlFl = 0x1000
*/
kDefaultCfgFlags = kDataBits8Fl | k1StopBitFl | kNoParityFl
};
}
}
#endif

View File

@ -1,47 +1,18 @@
#ifndef cwSocket_H #ifndef cwSocket_H
#define cwSocket_H #define cwSocket_H
#include "cwSocketDecls.h"
namespace cw namespace cw
{ {
namespace sock namespace sock
{ {
typedef handle< struct mgr_str > handle_t; typedef handle< struct mgr_str > handle_t;
typedef uint16_t portNumber_t;
typedef enum
{
kReceiveCbId,
kConnectCbId,
kDisconnectCbId
} cbId_t;
// userId is the id assigned to the receiving socket // userId is the id assigned to the receiving socket
// connId is an automatically assigned id which represents the remote endpoint which is connected to 'userId'. // connId is an automatically assigned id which represents the remote endpoint which is connected to 'userId'.
typedef void (*callbackFunc_t)( void* cbArg, cbId_t cbId, unsigned userId, unsigned connId, const void* byteA, unsigned byteN, const struct sockaddr_in* srcAddr ); typedef void (*callbackFunc_t)( void* cbArg, cbId_t cbId, unsigned userId, unsigned connId, const void* byteA, unsigned byteN, const struct sockaddr_in* srcAddr );
enum
{
kNonBlockingFl = 0x000, // Create a non-blocking socket.
kBlockingFl = 0x001, // Create a blocking socket.
kTcpFl = 0x002, // Create a TCP socket rather than a UDP socket.
kBroadcastFl = 0x004, //
kReuseAddrFl = 0x008, //
kReusePortFl = 0x010, //
kMultiCastTtlFl = 0x020, //
kMultiCastLoopFl = 0x040, //
kListenFl = 0x080, // Use this socket to listen for incoming connections
kStreamFl = 0x100, // Connected stream (not Datagram)
};
enum
{
// port 0 is reserved by and is therefore a convenient invalid port number
kInvalidPortNumber = 0
};
rc_t createMgr( handle_t& hRef, unsigned recvBufByteN, unsigned maxSocketN ); rc_t createMgr( handle_t& hRef, unsigned recvBufByteN, unsigned maxSocketN );
rc_t destroyMgr( handle_t& hRef ); rc_t destroyMgr( handle_t& hRef );

42
cwSocketDecls.h Normal file
View File

@ -0,0 +1,42 @@
#ifndef cwSocketDecls_H
#define cwSocketDecls_H
namespace cw
{
namespace sock
{
typedef uint16_t portNumber_t;
typedef enum
{
kReceiveCbId,
kConnectCbId,
kDisconnectCbId
} cbId_t;
enum
{
kNonBlockingFl = 0x000, // Create a non-blocking socket.
kBlockingFl = 0x001, // Create a blocking socket.
kTcpFl = 0x002, // Create a TCP socket rather than a UDP socket.
kBroadcastFl = 0x004, //
kReuseAddrFl = 0x008, //
kReusePortFl = 0x010, //
kMultiCastTtlFl = 0x020, //
kMultiCastLoopFl = 0x040, //
kListenFl = 0x080, // Use this socket to listen for incoming connections
kStreamFl = 0x100, // Connected stream (not Datagram)
};
enum
{
// port 0 is reserved by and is therefore a convenient invalid port number
kInvalidPortNumber = 0
};
}
}
#endif

View File

@ -25,19 +25,20 @@ namespace cw
typedef struct websock_str typedef struct websock_str
{ {
cbFunc_t _cbFunc; cbFunc_t _cbFunc; //
void* _cbArg; void* _cbArg; //
struct lws_context* _ctx = nullptr; // struct lws_context* _ctx = nullptr; //
struct lws_protocols* _protocolA = nullptr; // Websocket internal protocol state array struct lws_protocols* _protocolA = nullptr; // Websocket internal protocol state array
unsigned _protocolN = 0; // Count of protocol records in _protocolA[]. unsigned _protocolN = 0; // Count of protocol records in _protocolA[].
unsigned _nextSessionId = 0; // Next session id. unsigned _nextSessionId = 0; // Next session id.
unsigned _connSessionN = 0; // Count of connected sessions. unsigned _connSessionN = 0; // Count of connected sessions.
struct lws_http_mount* _mount = nullptr; // struct lws_http_mount* _mount = nullptr; //
MpScNbQueue<msg_t>* _q; // Thread safe, non-blocking, protocol independent msg queue. MpScNbQueue<msg_t>* _q; // Thread safe, non-blocking, protocol independent msg queue.
} websock_t; } websock_t;
inline websock_t* _handleToPtr(handle_t h){ return handleToPtr<handle_t,websock_t>(h); } inline websock_t* _handleToPtr(handle_t h)
{ return handleToPtr<handle_t,websock_t>(h); }
// Internal session record. // Internal session record.

View File

@ -26,29 +26,14 @@ need to make the protocol state queue thread-safe.
*/ */
#include "cwWebSockDecls.h"
namespace cw namespace cw
{ {
namespace websock namespace websock
{ {
typedef handle<struct websock_str> handle_t; typedef handle<struct websock_str> handle_t;
typedef struct protocol_str
{
const char* label; // unique label identifying this protocol
unsigned id; // unique id identifying this protocol
unsigned rcvBufByteN; // larger rcv'd packages will be broken into multiple parts
unsigned xmtBufByteN; // larger xmt'd packages are broken into multiple parts
} protocol_t;
typedef enum
{
kConnectTId,
kDisconnectTId,
kMessageTId
} msgTypeId_t;
typedef void (*cbFunc_t)( void* cbArg, unsigned protocolId, unsigned connectionId, msgTypeId_t msg_type, const void* msg, unsigned byteN ); typedef void (*cbFunc_t)( void* cbArg, unsigned protocolId, unsigned connectionId, msgTypeId_t msg_type, const void* msg, unsigned byteN );

26
cwWebSockDecls.h Normal file
View File

@ -0,0 +1,26 @@
#ifndef cwWebSockDecls_H
#define cwWebSockDecls_H
namespace cw
{
namespace websock
{
typedef struct protocol_str
{
const char* label; // unique label identifying this protocol
unsigned id; // unique id identifying this protocol
unsigned rcvBufByteN; // larger rcv'd packages will be broken into multiple parts
unsigned xmtBufByteN; // larger xmt'd packages are broken into multiple parts
} protocol_t;
typedef enum
{
kConnectTId,
kDisconnectTId,
kMessageTId
} msgTypeId_t;
}
}
#endif