A filter can be used to specify the events accepted by an application (see MidiSetFilter and MidiGetFilter). For an event to be accepted, the corresponding bits of its port, type and channel must be set to 1 in the filter.
typedef struct TFilter *FilterPtr; typedef struct TFilter { char port[32]; // 256 bits : 1 = port accepted, 0 = port rejected char evType[32]; // 256 bits : 1 = type accepted, 0 = type rejected char channel[2]; // 16 bits : 1 = channel accepted, 0 = channel rejected char unused[2]; // 16 bits } TFilter;
Macros for accessing filter bits.
#define AcceptBit(a,n) ( ((char*) (a))[(n)>>3] |= (1<<((n)&7)) ) #define RejectBit(a,n) ( ((char*) (a))[(n)>>3] &= ~(1<<((n)&7)) ) #define InvertBit(a,n) ( ((char*) (a))[(n)>>3] ^= (1<<((n)&7)) ) #define IsAcceptedBit(a,n) ( ((char*) (a))[(n)>>3] & (1<<((n)&7)) )