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:
parent
11f6d38330
commit
5cda838a93
27
Makefile
27
Makefile
@ -14,26 +14,31 @@ SRC += cwThread.cpp cwMutex.cpp
|
||||
HDR += cwWebSock.h cwWebSockSvr.h cwLib.h
|
||||
SRC += cwWebSock.cpp cwWebSockSvr.cpp cwLib.cpp
|
||||
|
||||
HDR += cwSerialPort.h cwSerialPortSrv.h
|
||||
SRC += cwSerialPort.cpp cwSerialPortSrv.cpp
|
||||
HDR += cwUiDecls.h cwUi.h cwUiTest.h
|
||||
SRC += cwUi.cpp cwUiTest.cpp
|
||||
|
||||
HDR += cwMidi.h cwMidiPort.h
|
||||
SRC += cwMidi.cpp cwMidiPort.cpp cwMidiAlsa.cpp
|
||||
HDR += cwSerialPortDecls.h cwSerialPort.h cwSerialPortSrv.h
|
||||
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
|
||||
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
|
||||
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
|
||||
LIBS = -lpthread -lwebsockets -lasound -ldl
|
||||
|
11
cwAudioBuf.h
11
cwAudioBuf.h
@ -29,8 +29,10 @@
|
||||
// out - outgoing samples are filled with a 1k sine tone
|
||||
//)
|
||||
|
||||
#ifndef cmApBuf_H
|
||||
#define cmApBuf_H
|
||||
#ifndef cwAudioBuf_H
|
||||
#define cwAudioBuf_H
|
||||
|
||||
#include "cwAudioBufDecls.h"
|
||||
|
||||
namespace cw
|
||||
{
|
||||
@ -113,7 +115,7 @@ namespace cw
|
||||
// Return the meter window period as set by initialize()
|
||||
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 );
|
||||
|
||||
// Returns the channel count set via setup().
|
||||
@ -211,7 +213,8 @@ namespace cw
|
||||
// 3) This function just returns audio information it does not
|
||||
// change any internal states.
|
||||
// 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 );
|
||||
|
||||
|
||||
|
16
cwAudioBufDecls.h
Normal file
16
cwAudioBufDecls.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef cwAudioBufDecls_H
|
||||
#define cwAudioBufDecls_H
|
||||
|
||||
namespace cw
|
||||
{
|
||||
namespace audio
|
||||
{
|
||||
namespace buf
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
@ -112,19 +112,19 @@ cw::rc_t cw::audio::device::registerDriver( handle_t h, driver_t* drv )
|
||||
return kOkRC;
|
||||
}
|
||||
|
||||
unsigned cw::audio::device::deviceCount( handle_t h )
|
||||
unsigned cw::audio::device::count( handle_t h )
|
||||
{
|
||||
device_t* p = _handleToPtr(h);
|
||||
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;
|
||||
for(i=0; i<n; ++i)
|
||||
{
|
||||
const char* s = deviceLabel(h,i);
|
||||
const char* s = device::label(h,i);
|
||||
if( textCompare(s,label)==0)
|
||||
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;
|
||||
if((d = _indexToDriver(h,devIdx)) != nullptr )
|
||||
@ -140,7 +140,7 @@ const char* cw::audio::device::deviceLabel( handle_t h, unsigned devIdx )
|
||||
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;
|
||||
if((d = _indexToDriver(h,devIdx)) != nullptr )
|
||||
@ -148,7 +148,7 @@ unsigned cw::audio::device::deviceChannelCount( handle_t h, unsigned devIdx, boo
|
||||
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;
|
||||
if((d = _indexToDriver(h,devIdx)) != nullptr )
|
||||
@ -156,7 +156,7 @@ double cw::audio::device::deviceSampleRate( handle_t h, unsigned devIdx )
|
||||
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;
|
||||
if((d = _indexToDriver(h,devIdx)) != nullptr )
|
||||
@ -164,7 +164,7 @@ unsigned cw::audio::device::deviceFramesPerCycle( handle_t h, unsigned devIdx, b
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
if((d = _indexToDriver(h,devIdx)) != nullptr )
|
||||
@ -180,7 +180,7 @@ cw::rc_t cw::audio::device::deviceStart( handle_t h, unsigned devIdx )
|
||||
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;
|
||||
if((d = _indexToDriver(h,devIdx)) != nullptr )
|
||||
@ -188,7 +188,7 @@ cw::rc_t cw::audio::device::deviceStop( handle_t h, unsigned devIdx )
|
||||
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;
|
||||
if((d = _indexToDriver(h,devIdx)) != nullptr )
|
||||
@ -196,7 +196,7 @@ bool cw::audio::device::deviceIsStarted(handle_t h, unsigned devIdx )
|
||||
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;
|
||||
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 )
|
||||
{
|
||||
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",
|
||||
deviceSampleRate(h,i),
|
||||
deviceChannelCount(h,i,true), deviceFramesPerCycle(h,i,true),
|
||||
deviceChannelCount(h,i,false), deviceFramesPerCycle(h,i,false),
|
||||
deviceLabel(h,i));
|
||||
sampleRate(h,i),
|
||||
channelCount(h,i,true), framesPerCycle(h,i,true),
|
||||
channelCount(h,i,false), framesPerCycle(h,i,false),
|
||||
label(h,i));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -22,36 +22,14 @@
|
||||
#ifndef cwAudioDevice_H
|
||||
#define cwAudioDevice_H
|
||||
|
||||
#include "cwAudioDeviceDecls.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;
|
||||
|
||||
|
||||
// Audio port callback signature.
|
||||
// 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 );
|
||||
|
||||
unsigned deviceCount( handle_t h );
|
||||
unsigned deviceLabelToIndex( handle_t h, const char* label );
|
||||
const char* deviceLabel( handle_t h, unsigned devIdx );
|
||||
unsigned deviceChannelCount( handle_t h, unsigned devIdx, bool inputFl );
|
||||
double deviceSampleRate( handle_t h, unsigned devIdx );
|
||||
unsigned deviceFramesPerCycle( handle_t h, unsigned devIdx, bool inputFl );
|
||||
unsigned count( handle_t h );
|
||||
unsigned labelToIndex( handle_t h, const char* label );
|
||||
const char* label( handle_t h, unsigned devIdx );
|
||||
unsigned channelCount( handle_t h, unsigned devIdx, bool inputFl );
|
||||
double sampleRate( handle_t h, unsigned devIdx );
|
||||
unsigned framesPerCycle( handle_t h, unsigned devIdx, bool inputFl );
|
||||
|
||||
// Configure a device.
|
||||
// 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
|
||||
// automatically stopped and then restarted following the reconfiguration.
|
||||
// If the reconfiguration fails then the device may not be restared.
|
||||
rc_t deviceSetup(
|
||||
rc_t setup(
|
||||
handle_t h,
|
||||
unsigned devIdx,
|
||||
double sr,
|
||||
@ -119,10 +97,10 @@ namespace cw
|
||||
cbFunc_t cb,
|
||||
void* cbData );
|
||||
|
||||
rc_t deviceStart( handle_t h, unsigned devIdx );
|
||||
rc_t deviceStop( handle_t h, unsigned devIdx );
|
||||
bool deviceIsStarted( handle_t h, unsigned devIdx );
|
||||
void deviceRealTimeReport( handle_t h, unsigned devIdx );
|
||||
rc_t start( handle_t h, unsigned devIdx );
|
||||
rc_t stop( handle_t h, unsigned devIdx );
|
||||
bool isStarted( handle_t h, unsigned devIdx );
|
||||
void realTimeReport( handle_t h, unsigned devIdx );
|
||||
|
||||
void report( handle_t h );
|
||||
}
|
||||
|
36
cwAudioDeviceDecls.h
Normal file
36
cwAudioDeviceDecls.h
Normal 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
|
@ -25,11 +25,7 @@ namespace cw
|
||||
typedef struct
|
||||
{
|
||||
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 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 outDevIdx; // output device index
|
||||
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"
|
||||
"\n"
|
||||
"-r <srate> = sample rate\n"
|
||||
"-a <chidx> = first channel\n"
|
||||
"-c <chcnt> = audio channels\n"
|
||||
"-b <bufcnt> = count of buffers\n"
|
||||
"-f <frmcnt> = count of samples per buffer\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) )
|
||||
_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.chIdx = _cmApGetOpt(argc,argv,"-a",0);
|
||||
//r.chCnt = _cmApGetOpt(argc,argv,"-c",2);
|
||||
r.bufCnt = _cmApGetOpt(argc,argv,"-b",3);
|
||||
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.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
|
||||
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
|
||||
@ -172,29 +160,29 @@ cw::rc_t cw::audio::device::test( int argc, const char** argv )
|
||||
if( runFl )
|
||||
{
|
||||
// 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
|
||||
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
|
||||
//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
|
||||
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.");
|
||||
else
|
||||
// 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.");
|
||||
else
|
||||
// start the input device
|
||||
if( deviceStart(h, r.inDevIdx) != kOkRC )
|
||||
if( start(h, r.inDevIdx) != kOkRC )
|
||||
cwLogInfo("In device start failed.");
|
||||
else
|
||||
// start the output device
|
||||
if( deviceStart(h, r.outDevIdx) != kOkRC )
|
||||
if( start(h, r.outDevIdx) != kOkRC )
|
||||
cwLogInfo("Out Device start failed.");
|
||||
else
|
||||
cwLogInfo("Setup complete!");
|
||||
@ -208,7 +196,7 @@ cw::rc_t cw::audio::device::test( int argc, const char** argv )
|
||||
char c;
|
||||
while((c=getchar()) != 'q')
|
||||
{
|
||||
deviceRealTimeReport(h, r.outDevIdx );
|
||||
realTimeReport(h, r.outDevIdx );
|
||||
|
||||
switch(c)
|
||||
{
|
||||
@ -241,13 +229,13 @@ cw::rc_t cw::audio::device::test( int argc, const char** argv )
|
||||
}
|
||||
|
||||
// stop the input device
|
||||
if( deviceIsStarted(h,r.inDevIdx) )
|
||||
if( deviceStop(h,r.inDevIdx) != kOkRC )
|
||||
if( isStarted(h,r.inDevIdx) )
|
||||
if( stop(h,r.inDevIdx) != kOkRC )
|
||||
cwLogInfo("In device stop failed.");
|
||||
|
||||
// stop the output device
|
||||
if( deviceIsStarted(h,r.outDevIdx) )
|
||||
if( deviceStop(h,r.outDevIdx) != kOkRC )
|
||||
if( isStarted(h,r.outDevIdx) )
|
||||
if( stop(h,r.outDevIdx) != kOkRC )
|
||||
cwLogInfo("Out device stop failed.");
|
||||
}
|
||||
|
||||
|
27
cwMidi.cpp
27
cwMidi.cpp
@ -2,6 +2,7 @@
|
||||
#include "cwLog.h"
|
||||
#include "cwCommonImpl.h"
|
||||
#include "cwMem.h"
|
||||
#include "cwTime.h"
|
||||
#include "cwMidi.h"
|
||||
|
||||
namespace cw {
|
||||
@ -9,8 +10,8 @@ namespace cw {
|
||||
|
||||
typedef struct statusDesc_str
|
||||
{
|
||||
byte_t status;
|
||||
byte_t byteCnt;
|
||||
uint8_t status;
|
||||
uint8_t byteCnt;
|
||||
const char* label;
|
||||
} 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;
|
||||
|
||||
@ -102,7 +103,7 @@ const char* cw::midi::statusToLabel( byte_t status )
|
||||
return _statusDescArray[i].label;
|
||||
}
|
||||
|
||||
const char* cw::midi::metaStatusToLabel( byte_t metaStatus )
|
||||
const char* cw::midi::metaStatusToLabel( uint8_t metaStatus )
|
||||
{
|
||||
int 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;
|
||||
}
|
||||
|
||||
const char* cw::midi::pedalLabel( byte_t d0 )
|
||||
const char* cw::midi::pedalLabel( uint8_t d0 )
|
||||
{
|
||||
int 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;
|
||||
}
|
||||
|
||||
cw::midi::byte_t cw::midi::statusToByteCount( byte_t status )
|
||||
uint8_t cw::midi::statusToByteCount( uint8_t status )
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
@ -142,7 +143,7 @@ cw::midi::byte_t cw::midi::statusToByteCount( byte_t status )
|
||||
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;
|
||||
val <<= 7;
|
||||
@ -150,26 +151,26 @@ unsigned cw::midi::to14Bits( byte_t d0, byte_t d1 )
|
||||
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;
|
||||
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);
|
||||
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;
|
||||
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 ];
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
bool sharpFl = false;
|
||||
|
44
cwMidi.h
44
cwMidi.h
@ -77,8 +77,6 @@ namespace cw
|
||||
};
|
||||
|
||||
|
||||
typedef unsigned char byte_t;
|
||||
typedef struct timespec timestamp_t;
|
||||
|
||||
//===============================================================================================
|
||||
// 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 isPedalUp( T s, T d0, T d1 ) { return ( cmMidiIsPedal(s,d0) && (d1)<64 ); }
|
||||
|
||||
|
||||
|
||||
const char* statusToLabel( byte_t status );
|
||||
const char* metaStatusToLabel( byte_t metaStatus );
|
||||
const char* pedalLabel( byte_t d0 );
|
||||
const char* statusToLabel( uint8_t status );
|
||||
const char* metaStatusToLabel( uint8_t metaStatus );
|
||||
const char* pedalLabel( uint8_t d0 );
|
||||
|
||||
// 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 );
|
||||
void split14Bits( unsigned v, byte_t& d0Ref, byte_t& d1Ref );
|
||||
int toPbend( byte_t d0, byte_t d1 );
|
||||
void splitPbend( int v, byte_t& d0Ref, byte_t& d1Ref );
|
||||
unsigned to14Bits( uint8_t d0, uint8_t d1 );
|
||||
void split14Bits( unsigned v, uint8_t& d0Ref, uint8_t& d1Ref );
|
||||
int toPbend( uint8_t d0, uint8_t d1 );
|
||||
void splitPbend( int v, uint8_t& d0Ref, uint8_t& d1Ref );
|
||||
|
||||
//===============================================================================================
|
||||
// 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
|
||||
// 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
|
||||
// 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.
|
||||
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.
|
||||
// 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.
|
||||
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.
|
||||
@ -163,7 +143,7 @@ namespace cw
|
||||
// scientific pitch string. This function will convert C-1 to G9 to
|
||||
// valid MIDI pitch values 0 to 127. Scientific pitch strings outside
|
||||
// of this range will be returned as kInvalidMidiPitch.
|
||||
byte_t sciPitchToMidi( const char* sciPitchStr );
|
||||
uint8_t sciPitchToMidi( const char* sciPitchStr );
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -2,8 +2,8 @@
|
||||
#include "cwLog.h"
|
||||
#include "cwCommonImpl.h"
|
||||
#include "cwMem.h"
|
||||
#include "cwMidi.h"
|
||||
#include "cwTime.h"
|
||||
#include "cwMidi.h"
|
||||
#include "cwTextBuf.h"
|
||||
#include "cwMidiPort.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;
|
||||
*d1 = v & 0x7f;
|
||||
@ -156,9 +156,9 @@ namespace cw
|
||||
|
||||
unsigned microSecs1 = (ev->time.time.tv_sec * 1000000) + (ev->time.time.tv_nsec/1000);
|
||||
//unsigned deltaMicroSecs = p->prvTimeMicroSecs==0 ? 0 : microSecs1 - p->prvTimeMicroSecs;
|
||||
byte_t d0 = 0xff;
|
||||
byte_t d1 = 0xff;
|
||||
byte_t status = 0;
|
||||
uint8_t d0 = 0xff;
|
||||
uint8_t d1 = 0xff;
|
||||
uint8_t status = 0;
|
||||
|
||||
switch(ev->type)
|
||||
{
|
||||
@ -244,7 +244,7 @@ namespace cw
|
||||
|
||||
if( status != 0 )
|
||||
{
|
||||
byte_t ch = ev->data.note.channel;
|
||||
uint8_t ch = ev->data.note.channel;
|
||||
time::spec_t ts;
|
||||
ts.tv_sec = p->baseTimeStamp.tv_sec + ev->time.time.tv_sec;
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
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.");
|
||||
}
|
||||
|
29
cwMidiDecls.h
Normal file
29
cwMidiDecls.h
Normal 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
|
@ -2,8 +2,8 @@
|
||||
#include "cwLog.h"
|
||||
#include "cwCommonImpl.h"
|
||||
#include "cwMem.h"
|
||||
#include "cwMidi.h"
|
||||
#include "cwTime.h"
|
||||
#include "cwMidi.h"
|
||||
#include "cwTextBuf.h"
|
||||
|
||||
#include "cwMidiPort.h"
|
||||
@ -43,11 +43,11 @@ namespace cw
|
||||
|
||||
unsigned state; // parser state id
|
||||
unsigned errCnt; // accumlated error count
|
||||
byte_t status; // running status
|
||||
byte_t data0; // data byte 0
|
||||
uint8_t status; // running status
|
||||
uint8_t data0; // data byte 0
|
||||
unsigned dataCnt; // data byte cnt for current status
|
||||
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 bufIdx; // next output buffer index
|
||||
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
|
||||
// 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->linkPtr = NULL;
|
||||
p->cbChain = NULL;
|
||||
p->buf = mem::allocZ<byte_t>( bufByteCnt );
|
||||
p->buf = mem::allocZ<uint8_t>( bufByteCnt );
|
||||
p->bufByteCnt = bufByteCnt;
|
||||
p->bufIdx = 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);
|
||||
@ -235,8 +235,8 @@ void cw::midi::parser::parseMidiData( handle_t h, const time::spec_t* timeStamp,
|
||||
if( p == NULL )
|
||||
return;
|
||||
|
||||
const byte_t* ip = iBuf;
|
||||
const byte_t* ep = iBuf + iByteCnt;
|
||||
const uint8_t* ip = iBuf;
|
||||
const uint8_t* ep = iBuf + iByteCnt;
|
||||
|
||||
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;
|
||||
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 )
|
||||
p->dataCnt = 0;
|
||||
|
@ -1,6 +1,7 @@
|
||||
#ifndef cwMidiPort_H
|
||||
#define cwMidiPort_H
|
||||
|
||||
#include "cwMidiDecls.h"
|
||||
|
||||
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 destroy( handle_t& hRef );
|
||||
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.
|
||||
// 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.
|
||||
// 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 );
|
||||
|
||||
// Install/Remove additional callbacks.
|
||||
@ -79,8 +80,8 @@ namespace cw
|
||||
unsigned portCount( handle_t h, unsigned devIdx, unsigned flags );
|
||||
const char* portName( handle_t h, unsigned devIdx, unsigned flags, unsigned portIdx );
|
||||
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 sendData( handle_t h, unsigned devIdx, unsigned portIdx, const byte_t* dataPtr, unsigned byteCnt );
|
||||
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 uint8_t* dataPtr, unsigned byteCnt );
|
||||
|
||||
// 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.
|
||||
|
@ -1,35 +1,12 @@
|
||||
#ifndef cwSerialPort_H
|
||||
#define cwSerialPort_H
|
||||
|
||||
#include "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
|
||||
};
|
||||
|
||||
|
||||
typedef handle<struct device_str> handle_t;
|
||||
typedef void (*callbackFunc_t)( void* cbArg, unsigned userId, const void* byteA, unsigned byteN );
|
||||
|
35
cwSerialPortDecls.h
Normal file
35
cwSerialPortDecls.h
Normal 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
|
31
cwSocket.h
31
cwSocket.h
@ -1,47 +1,18 @@
|
||||
#ifndef cwSocket_H
|
||||
#define cwSocket_H
|
||||
|
||||
#include "cwSocketDecls.h"
|
||||
|
||||
namespace cw
|
||||
{
|
||||
namespace sock
|
||||
{
|
||||
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
|
||||
// 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 );
|
||||
|
||||
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 destroyMgr( handle_t& hRef );
|
||||
|
||||
|
42
cwSocketDecls.h
Normal file
42
cwSocketDecls.h
Normal 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
|
@ -25,19 +25,20 @@ namespace cw
|
||||
|
||||
typedef struct websock_str
|
||||
{
|
||||
cbFunc_t _cbFunc;
|
||||
void* _cbArg;
|
||||
cbFunc_t _cbFunc; //
|
||||
void* _cbArg; //
|
||||
struct lws_context* _ctx = nullptr; //
|
||||
struct lws_protocols* _protocolA = nullptr; // Websocket internal protocol state array
|
||||
unsigned _protocolN = 0; // Count of protocol records in _protocolA[].
|
||||
unsigned _nextSessionId = 0; // Next session id.
|
||||
unsigned _connSessionN = 0; // Count of connected sessions.
|
||||
unsigned _protocolN = 0; // Count of protocol records in _protocolA[].
|
||||
unsigned _nextSessionId = 0; // Next session id.
|
||||
unsigned _connSessionN = 0; // Count of connected sessions.
|
||||
struct lws_http_mount* _mount = nullptr; //
|
||||
MpScNbQueue<msg_t>* _q; // Thread safe, non-blocking, protocol independent msg queue.
|
||||
|
||||
} 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.
|
||||
|
19
cwWebSock.h
19
cwWebSock.h
@ -26,29 +26,14 @@ need to make the protocol state queue thread-safe.
|
||||
|
||||
*/
|
||||
|
||||
#include "cwWebSockDecls.h"
|
||||
|
||||
namespace cw
|
||||
{
|
||||
|
||||
namespace websock
|
||||
{
|
||||
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 handle<struct websock_str> handle_t;
|
||||
|
||||
typedef void (*cbFunc_t)( void* cbArg, unsigned protocolId, unsigned connectionId, msgTypeId_t msg_type, const void* msg, unsigned byteN );
|
||||
|
||||
|
26
cwWebSockDecls.h
Normal file
26
cwWebSockDecls.h
Normal 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
|
Loading…
Reference in New Issue
Block a user