aboutsummaryrefslogtreecommitdiff
path: root/pd/portmidi_osx/pminternal.h
blob: 2a92e16d97916d6ae77707a388cfff6681aa78dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/* pminternal.h -- header for interface implementations */

/* this file is included by files that implement library internals */

#ifdef __cplusplus
extern "C" {
#endif

#include <sys/types.h>

/* these are defined in system-specific file */
void *pm_alloc(size_t s);
void pm_free(void *ptr);

struct pm_internal_struct;

/* these do not use PmInternal because it is not defined yet... */
typedef PmError (*pm_write_fn)(struct pm_internal_struct *midi, 
                              PmEvent *buffer, long length);
typedef PmError (*pm_open_fn)(struct pm_internal_struct *midi, 
                              void *driverInfo);
typedef PmError (*pm_abort_fn)(struct pm_internal_struct *midi);
typedef PmError (*pm_close_fn)(struct pm_internal_struct *midi);

typedef struct {
    pm_write_fn write;
    pm_open_fn open;
    pm_abort_fn abort;
    pm_close_fn close;
} pm_fns_node, *pm_fns_type;

/* when open fails, the dictionary gets this set of functions: */
extern pm_fns_node pm_none_dictionary;

typedef struct {
    PmDeviceInfo pub;
    void *descriptor; /* system-specific data to open device */
    pm_fns_type dictionary;
} descriptor_node, *descriptor_type;


#define pm_descriptor_max 32
extern descriptor_node descriptors[pm_descriptor_max];
extern int descriptor_index;


typedef unsigned long (*time_get_proc_type)(void *time_info);

typedef struct pm_internal_struct {
    short write_flag;	/* MIDI_IN, or MIDI_OUT */
    int device_id; /* which device is open (index to descriptors) */
    PmTimeProcPtr time_proc; /* where to get the time */
    void *time_info;    /* pass this to get_time() */
    PmEvent *buffer; /* input or output buffer */
    long buffer_len; /* how big is the buffer */
    long latency; /* time delay in ms between timestamps and actual output */
                  /* set to zero to get immediate, simple blocking output */
                  /* if latency is zero, timestamps will be ignored */
    int overflow;    /* set to non-zero if input is dropped */
    int flush;  /* flag to drop incoming sysex data because of overflow */
    int sysex_in_progress; /* use for overflow management */
    struct pm_internal_struct *thru;
    PmTimestamp last_msg_time;   /* timestamp of last message */
    long head;
    long tail;
    pm_fns_type dictionary; /* implementation functions */
    void *descriptor;         /* system-dependent state */
} PmInternal;


typedef struct {
    long head;
    long tail;
    long len;
    long msg_size;
    long overflow;
    char *buffer;
} PmQueueRep;


PmError pm_init(void); /* defined in a system-specific file */
PmError pm_term(void); /* defined in a system-specific file */
int pm_in_device(int n, char *interf, char *device);
int pm_out_device(int n, char *interf, char *device);
PmError none_write(PmInternal *midi, PmEvent *buffer, long length);
PmError pm_success_fn(PmInternal *midi);
PmError pm_fail_fn(PmInternal *midi);
long pm_in_poll(PmInternal *midi);
long pm_out_poll(PmInternal *midi);

PmError pm_add_device(char *interf, char *name, int input, void *descriptor,
                      pm_fns_type dictionary);

void pm_enqueue(PmInternal *midi, PmEvent *event);


#ifdef __cplusplus
}
#endif