cmMidiPort.h/c: Changed cmMidiPort to support cmMidiAlsa.c.
Updated cmMpInitialize() and cmMpTest() to use cmCtx_t. Added following public functions: cmMpDeviceNameToIndex() cmMpDevicePortNameToIndex() cmMpParserMidiTriple() and cmMpParserTransmit() to allow the MIDI parser to transmit pre-parsed MIDI messages.
This commit is contained in:
parent
c07243c4fd
commit
2171cf09ad
93
cmMidiPort.c
93
cmMidiPort.c
@ -2,6 +2,7 @@
|
|||||||
#include "cmGlobal.h"
|
#include "cmGlobal.h"
|
||||||
#include "cmRpt.h"
|
#include "cmRpt.h"
|
||||||
#include "cmErr.h"
|
#include "cmErr.h"
|
||||||
|
#include "cmCtx.h"
|
||||||
#include "cmMem.h"
|
#include "cmMem.h"
|
||||||
#include "cmMallocDebug.h"
|
#include "cmMallocDebug.h"
|
||||||
#include "cmMidi.h"
|
#include "cmMidi.h"
|
||||||
@ -180,7 +181,8 @@ void _cmMpTransmitSysEx( cmMpParser_t* p )
|
|||||||
|
|
||||||
void _cmMpParserStoreChMsg( cmMpParser_t* p, unsigned deltaMicroSecs, cmMidiByte_t d )
|
void _cmMpParserStoreChMsg( cmMpParser_t* p, unsigned deltaMicroSecs, cmMidiByte_t d )
|
||||||
{
|
{
|
||||||
// if there is not enough room left in the buffer then transmit the current messages
|
// if there is not enough room left in the buffer then transmit
|
||||||
|
// the current messages
|
||||||
if( p->bufByteCnt - p->bufIdx < sizeof(cmMidiMsg) )
|
if( p->bufByteCnt - p->bufIdx < sizeof(cmMidiMsg) )
|
||||||
_cmMpTransmitChMsgs(p);
|
_cmMpTransmitChMsgs(p);
|
||||||
|
|
||||||
@ -346,6 +348,58 @@ void cmMpParseMidiData( cmMpParserH_t h, unsigned deltaMicroSecs, const cmMidiBy
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cmMpRC_t cmMpParserMidiTriple( cmMpParserH_t h, unsigned deltaMicroSecs, cmMidiByte_t status, cmMidiByte_t d0, cmMidiByte_t d1 )
|
||||||
|
{
|
||||||
|
cmMpRC_t rc = kOkMpRC;
|
||||||
|
cmMpParser_t* p = _cmMpParserFromHandle(h);
|
||||||
|
cmMidiByte_t mb = -1;
|
||||||
|
|
||||||
|
if( d0 == 0xff )
|
||||||
|
p->dataCnt = 0;
|
||||||
|
else
|
||||||
|
if( d1 == 0xff )
|
||||||
|
p->dataCnt = 1;
|
||||||
|
else
|
||||||
|
p->dataCnt = 2;
|
||||||
|
|
||||||
|
p->status = status;
|
||||||
|
switch( p->dataCnt )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
mb = status;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
mb = d0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
p->data0 = d0;
|
||||||
|
mb = d1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
rc = cmErrMsg(&p->err,kInvalidArgMpRC,"An invalid MIDI status byte (0x%x) was encountered by the MIDI data parser.");
|
||||||
|
goto errLabel;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( mb != -1 )
|
||||||
|
_cmMpParserStoreChMsg(p,deltaMicroSecs,mb);
|
||||||
|
|
||||||
|
p->dataCnt = cmInvalidCnt;
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmMpRC_t cmMpParserTransmit( cmMpParserH_t h )
|
||||||
|
{
|
||||||
|
cmMpParser_t* p = _cmMpParserFromHandle(h);
|
||||||
|
_cmMpTransmitChMsgs(p);
|
||||||
|
return kOkMpRC;
|
||||||
|
}
|
||||||
|
|
||||||
cmMpRC_t cmMpParserInstallCallback( cmMpParserH_t h, cmMpCallback_t cbFunc, void* cbDataPtr )
|
cmMpRC_t cmMpParserInstallCallback( cmMpParserH_t h, cmMpCallback_t cbFunc, void* cbDataPtr )
|
||||||
{
|
{
|
||||||
cmMpParser_t* p = _cmMpParserFromHandle(h);
|
cmMpParser_t* p = _cmMpParserFromHandle(h);
|
||||||
@ -418,6 +472,32 @@ bool cmMpParserHasCallback( cmMpParserH_t h, cmMpCallback_t cbFunc, void* cbData
|
|||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
||||||
|
unsigned cmMpDeviceNameToIndex(const cmChar_t* name)
|
||||||
|
{
|
||||||
|
assert(name!=NULL);
|
||||||
|
unsigned i;
|
||||||
|
unsigned n = cmMpDeviceCount();
|
||||||
|
for(i=0; i<n; ++i)
|
||||||
|
if( strcmp(cmMpDeviceName(i),name)==0)
|
||||||
|
return i;
|
||||||
|
return cmInvalidIdx;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned cmMpDevicePortNameToIndex( unsigned devIdx, unsigned flags, const cmChar_t* name )
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
unsigned n = cmMpDevicePortCount(devIdx,flags);
|
||||||
|
for(i=0; i<n; ++i)
|
||||||
|
if( strcmp(cmMpDevicePortName(devIdx,flags,i),name)==0)
|
||||||
|
return i;
|
||||||
|
|
||||||
|
return cmInvalidIdx;
|
||||||
|
}
|
||||||
|
|
||||||
|
//====================================================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
void cmMpTestPrint( void* userDataPtr, const char* fmt, va_list vl )
|
void cmMpTestPrint( void* userDataPtr, const char* fmt, va_list vl )
|
||||||
{
|
{
|
||||||
vprintf(fmt,vl);
|
vprintf(fmt,vl);
|
||||||
@ -439,20 +519,21 @@ void cmMpTestCb( const cmMidiPacket_t* pktArray, unsigned pktCnt )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmMpTest( cmRpt_t* rpt )
|
void cmMpTest( cmCtx_t* ctx )
|
||||||
{
|
{
|
||||||
char ch;
|
char ch;
|
||||||
unsigned parserBufByteCnt = 1024;
|
unsigned parserBufByteCnt = 1024;
|
||||||
cmMpInitialize(cmMpTestCb,NULL,parserBufByteCnt,"app",rpt);
|
cmMpInitialize(ctx,cmMpTestCb,NULL,parserBufByteCnt,"app");
|
||||||
cmMpReport(rpt);
|
cmMpReport(&ctx->rpt);
|
||||||
|
|
||||||
|
|
||||||
cmRptPrintf(rpt,"<return> to continue\n");
|
cmRptPrintf(&ctx->rpt,"<return> to continue\n");
|
||||||
|
|
||||||
while((ch = getchar()) != 'q')
|
while((ch = getchar()) != 'q')
|
||||||
{
|
{
|
||||||
cmMpDeviceSend(0,0,0x90,60,60);
|
cmMpDeviceSend(2,0,0x90,60,60);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
cmMpFinalize();
|
cmMpFinalize();
|
||||||
}
|
}
|
||||||
|
15
cmMidiPort.h
15
cmMidiPort.h
@ -19,6 +19,8 @@ extern "C" {
|
|||||||
{
|
{
|
||||||
kOkMpRC = cmOkRC,
|
kOkMpRC = cmOkRC,
|
||||||
kCfStringErrMpRC,
|
kCfStringErrMpRC,
|
||||||
|
kLHeapErrMpRC,
|
||||||
|
kThreadErrMpRC,
|
||||||
kSysErrMpRC,
|
kSysErrMpRC,
|
||||||
kInvalidArgMpRC,
|
kInvalidArgMpRC,
|
||||||
kMemAllocFailMpRC,
|
kMemAllocFailMpRC,
|
||||||
@ -46,6 +48,13 @@ extern "C" {
|
|||||||
unsigned cmMpParserErrorCount( cmMpParserH_t h );
|
unsigned cmMpParserErrorCount( cmMpParserH_t h );
|
||||||
void cmMpParseMidiData( cmMpParserH_t h, unsigned deltaMicroSecs, const cmMidiByte_t* buf, unsigned bufByteCnt );
|
void cmMpParseMidiData( cmMpParserH_t h, unsigned deltaMicroSecs, const cmMidiByte_t* buf, unsigned bufByteCnt );
|
||||||
|
|
||||||
|
// The following two functions are intended to be used togetther.
|
||||||
|
// Use cmMpParserMidiTriple() to insert pre-parsed msg's to the output buffer,
|
||||||
|
// and then use cmMpParserTransmit() to send the buffer via the parsers callback function.
|
||||||
|
// Set the data bytes to 0xff if they are not used by the message.
|
||||||
|
cmMpRC_t cmMpParserMidiTriple( cmMpParserH_t h, unsigned deltaMicroSecs, cmMidiByte_t status, cmMidiByte_t d0, cmMidiByte_t d1 );
|
||||||
|
cmMpRC_t cmMpParserTransmit( cmMpParserH_t h );
|
||||||
|
|
||||||
// Install/Remove additional callbacks.
|
// Install/Remove additional callbacks.
|
||||||
cmMpRC_t cmMpParserInstallCallback( cmMpParserH_t h, cmMpCallback_t cbFunc, void* cbDataPtr );
|
cmMpRC_t cmMpParserInstallCallback( cmMpParserH_t h, cmMpCallback_t cbFunc, void* cbDataPtr );
|
||||||
cmMpRC_t cmMpParserRemoveCallback( cmMpParserH_t h, cmMpCallback_t cbFunc, void* cbDataPtr );
|
cmMpRC_t cmMpParserRemoveCallback( cmMpParserH_t h, cmMpCallback_t cbFunc, void* cbDataPtr );
|
||||||
@ -60,14 +69,16 @@ extern "C" {
|
|||||||
|
|
||||||
// 'cbFunc' and 'cbDataPtr' are optional (they may be set to NULL). In this case
|
// 'cbFunc' and 'cbDataPtr' are optional (they may be set to NULL). In this case
|
||||||
// 'cbFunc' and 'cbDataPtr' may be set in a later call to cmMpInstallCallback().
|
// 'cbFunc' and 'cbDataPtr' may be set in a later call to cmMpInstallCallback().
|
||||||
cmMpRC_t cmMpInitialize( cmMpCallback_t cbFunc, void* cbDataPtr, unsigned parserBufByteCnt, const char* appNameStr, cmRpt_t* rpt );
|
cmMpRC_t cmMpInitialize( cmCtx_t* ctx, cmMpCallback_t cbFunc, void* cbDataPtr, unsigned parserBufByteCnt, const char* appNameStr );
|
||||||
cmMpRC_t cmMpFinalize();
|
cmMpRC_t cmMpFinalize();
|
||||||
bool cmMpIsInitialized();
|
bool cmMpIsInitialized();
|
||||||
|
|
||||||
unsigned cmMpDeviceCount();
|
unsigned cmMpDeviceCount();
|
||||||
const char* cmMpDeviceName( unsigned devIdx );
|
const char* cmMpDeviceName( unsigned devIdx );
|
||||||
|
unsigned cmMpDeviceNameToIndex(const cmChar_t* name);
|
||||||
unsigned cmMpDevicePortCount( unsigned devIdx, unsigned flags );
|
unsigned cmMpDevicePortCount( unsigned devIdx, unsigned flags );
|
||||||
const char* cmMpDevicePortName( unsigned devIdx, unsigned flags, unsigned portIdx );
|
const char* cmMpDevicePortName( unsigned devIdx, unsigned flags, unsigned portIdx );
|
||||||
|
unsigned cmMpDevicePortNameToIndex( unsigned devIdx, unsigned flags, const cmChar_t* name );
|
||||||
cmMpRC_t cmMpDeviceSend( unsigned devIdx, unsigned portIdx, cmMidiByte_t st, cmMidiByte_t d0, cmMidiByte_t d1 );
|
cmMpRC_t cmMpDeviceSend( unsigned devIdx, unsigned portIdx, cmMidiByte_t st, cmMidiByte_t d0, cmMidiByte_t d1 );
|
||||||
cmMpRC_t cmMpDeviceSendData( unsigned devIdx, unsigned portIdx, const cmMidiByte_t* dataPtr, unsigned byteCnt );
|
cmMpRC_t cmMpDeviceSendData( unsigned devIdx, unsigned portIdx, const cmMidiByte_t* dataPtr, unsigned byteCnt );
|
||||||
|
|
||||||
@ -80,7 +91,7 @@ extern "C" {
|
|||||||
|
|
||||||
void cmMpReport( cmRpt_t* rpt );
|
void cmMpReport( cmRpt_t* rpt );
|
||||||
|
|
||||||
void cmMpTest( cmRpt_t* rpt );
|
void cmMpTest( cmCtx_t* ctx );
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user