summaryrefslogtreecommitdiff
path: root/kernel/framework/include/midi_core.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/framework/include/midi_core.h')
-rw-r--r--kernel/framework/include/midi_core.h337
1 files changed, 337 insertions, 0 deletions
diff --git a/kernel/framework/include/midi_core.h b/kernel/framework/include/midi_core.h
new file mode 100644
index 0000000..2d95efc
--- /dev/null
+++ b/kernel/framework/include/midi_core.h
@@ -0,0 +1,337 @@
+#ifndef MIDI_CORE_H
+#define MIDI_CORE_H
+/*
+ * Purpose: Structure and function definitions for OSS MIDI core
+ *
+ * IMPORTANT NOTICE!
+ *
+ * This file contains internal structures used by Open Sound Systems.
+ * They will change without any notice between OSS versions. Care must be taken
+ * to make sure any software using this header gets properly re-compiled before
+ * use.
+ *
+ * 4Front Technologies (or anybody else) takes no responsibility of damages
+ * caused by use of this file.
+ */
+
+/*
+ *
+ * This file is part of Open Sound System.
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This this source file is released under GPL v2 license (no other versions).
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ *
+ */
+
+#define OSS_MIDI_DRIVER_VERSION 1
+
+struct midi_input_info
+{ /* MIDI input scanner variables */
+#define MI_MAX 32
+ int m_busy;
+ unsigned char m_buf[MI_MAX];
+ unsigned char m_prev_status; /* For running status */
+ int m_ptr;
+#define MST_INIT 0
+#define MST_DATA 1
+#define MST_SYSEX 2
+ int m_state;
+ int m_left;
+ int m_f1_flag; /* MTC Quarter frame message flag */
+};
+
+
+typedef int (*oss_midi_inputbyte_t) (int dev, unsigned char data);
+typedef int (*oss_midi_inputbuf_t) (int dev, unsigned char *data, int len);
+typedef int (*oss_midi_outputintr_t) (int dev);
+
+typedef struct _midi_driver
+{
+ int (*open) (int dev, int mode, oss_midi_inputbyte_t inputbyte,
+ oss_midi_inputbuf_t inputbuf,
+ oss_midi_outputintr_t outputintr);
+ void (*close) (int dev, int mode);
+ int (*ioctl) (int dev, unsigned int cmd, ioctl_arg arg);
+ int (*outputc) (int dev, unsigned char data);
+ int (*bulk_write) (int dev, unsigned char *buf, int len);
+ int max_bulk_bytes; /* Maximum len parameter for the bulk_write() entry point */
+ void (*flush_output) (int dev);
+ int (*wait_output) (int dev);
+ void (*timer_setup) (int dev);
+ void (*init_device) (int dev);
+} midi_driver_t;
+
+/*
+ * MIDI ports (physical and virtual)
+ */
+
+typedef struct midi_queue_t midi_queue_t;
+
+typedef struct _midi_operations
+{
+ int dev; /* MIDI device number */
+ char name[64];
+ midi_driver_t *d;
+ int caps;
+ int open_mode; /* OPEN_READ | OPEN_WRITE */
+
+ int working_mode; /* See SNDCTL_MIDI_SETMODE */
+ int timebase;
+ int tempo;
+ struct midi_input_info in_info;
+ struct coproc_operations *coproc;
+ void *devc;
+ void *os_id; /* The device ID (dip) given by the system. */
+ int enabled;
+ int unloaded;
+ int is_killed;
+ oss_device_t *osdev;
+ oss_device_t *master_osdev; /* osdev struct of the master device (for virtual drivers) */
+ int card_number;
+ int port_number;
+ oss_devnode_t devnode;
+ int real_dev;
+ char handle[32];
+ unsigned long flags;
+#define MFLAG_NOSEQUENCER 0x00000001 /* Device not to be opened by the sequencer driver */
+#define MFLAG_VIRTUAL 0x00000002
+#define MFLAG_SELFTIMING 0x00000004 /* Generates MTC timing itself */
+#define MFLAG_CLIENT 0x00000008 /* Client side virtual device */
+#define MFLAG_SERVER 0x00000010 /* Client side virtual device */
+#define MFLAG_INTERNAL 0x00000020 /* Internal device */
+#define MFLAG_EXTERNAL 0x00000040 /* External device */
+
+#define MFLAG_INPUT 0x00000080
+#define MFLAG_OUTPUT 0x00000100
+
+#define MFLAG_OUTINTR 0x00000200 /* Supports output interrupts - no polling needed */
+#define MFLAG_MTC 0x00000400 /* Device is MTC/SMPTE capable */
+#define MFLAG_QUIET 0x00000800 /* No automatic messages */
+
+ void (*input_callback) (int dev, unsigned char midich);
+ void (*event_input) (int dev, unsigned char *data, int len);
+
+#ifndef CONFIGURE_C
+ oss_mutex_t mutex;
+ oss_wait_queue_t *in_wq, *out_wq;
+ timeout_id_t out_timeout;
+#endif
+ pid_t pid;
+ int magic;
+ char cmd[16];
+
+ int prech_timeout; /* Wait time for the first input byte */
+
+/*
+ * MTC generator
+ */
+
+ int mtc_timebase;
+ int mtc_phase; /* Which part should be sent next */
+ long long mtc_t0;
+ int mtc_prev_t, mtc_codetype, mtc_current;
+ timeout_id_t mtc_timeout_id;
+
+/*
+ * Event queues
+ */
+
+ struct midi_queue_t *in_queue, *out_queue;
+
+/*
+ * Timer
+ */
+ int timer_driver;
+ int timer_dev;
+ int latency; /* In usecs, -1=unknown */
+ int is_timing_master;
+} mididev_t, *mididev_p;
+
+/*
+ * MIDI clients (/dev/midi device files)
+ */
+
+typedef struct
+{
+ int num; /* Own index in the oss_midi_clients[] table */
+ int open_mode; /* OPEN_READ and/or OPEN_WRITE */
+ mididev_p mididev; /* Pointer to the MIDI device (or NULL) */
+} oss_midi_client_t;
+
+#define MAX_MIDI_CLIENTS (MAX_MIDI_DEV + 20)
+extern int num_midi_clients;
+extern oss_midi_client_t *oss_midi_clients[MAX_MIDI_CLIENTS];
+
+extern mididev_t **midi_devs;
+extern int num_mididevs;
+
+struct oss_timer_driver;
+typedef void (*oss_midi_wait_callback_t) (void *arg);
+
+typedef struct
+{
+ oss_device_t *osdev;
+ oss_mutex_t mutex;
+ int driver_dev;
+ int timer_dev;
+ char *name; /* Pointer to driver->name */
+ int refcount; /* Number of /dev/midi* devices currently using this timer */
+ unsigned long password; /* Random number given when an instance is created */
+
+ struct oss_timer_driver *d;
+
+ oss_midi_time_t next_tick, prev_tick;
+ oss_midi_time_t bookmark_tick;
+ oss_uint64_t bookmark_time;
+ int tempo, pending_tempo;
+ int timebase;
+ int run_state; /* 0=stopped, 1=run */
+ oss_uint64_t prev_time, next_time;
+
+ void *devc;
+ void *timerc;
+ oss_midi_wait_callback_t callback;
+
+ /*
+ * Bitmap of MIDI devices linked with this one
+ */
+ unsigned int midimap[(MAX_MIDI_DEV + 31) / 32];
+ oss_uint64_t midi_times[MAX_MIDI_DEV]; /* Next event times in usecs */
+ oss_midi_time_t midi_ticks[MAX_MIDI_DEV];
+} tdev_t;
+
+typedef struct oss_timer_driver
+{
+/*
+ * Driver methods
+ */
+ int (*create_instance) (int timer_dev, int driver_dev);
+ void (*free_instance) (int timer_dev, int driver_dev);
+ int (*attach_client) (int timer_dev, int mididev);
+ void (*detach_client) (int timer_dev, int mididev);
+ int (*ioctl) (int timer_dev, unsigned int cmd, ioctl_arg arg);
+ int (*wait) (int timer_dev, unsigned long long time,
+ oss_midi_wait_callback_t callback, void *arg);
+ unsigned long long (*get_current_time) (int timer_dev);
+ int (*set_source) (int timer_dev, int source);
+ int (*set_tempo) (int timer_dev, int tempo);
+ int (*set_timebase) (int timer_dev, int timebase);
+ int (*start) (int timer_dev, oss_uint64_t tick);
+ int (*stop) (int timer_dev);
+ int (*cont) (int timer_dev);
+
+/*
+ * Dynamic content
+ */
+ char name[64];
+ int driver_dev;
+ oss_device_t *osdev;
+ void *devc;
+ oss_mutex_t mutex;
+ int max_instances;
+ int num_instances;
+ unsigned int flags;
+ int priority;
+ int resolution; /* In usecs */
+} oss_timer_driver_t;
+
+#define OSS_TIMER_DRIVER_VERSION 1
+
+extern int oss_install_timer (int version, char *name, oss_timer_driver_t * d, int driver_size, unsigned int flags, int max_instances, int resolution, /* In usecs */
+ void *devc, oss_device_t * osdev);
+extern int oss_timer_create_instance (int driver_dev, mididev_t * mididev);
+extern int oss_timer_attach_client (int timer_dev, mididev_t * mididev);
+extern void oss_timer_detach_client (int timer_dev, mididev_t * mididev);
+extern int oss_timer_set_tempo (int timer_dev, int tempo);
+extern int oss_timer_set_timebase (int timer_dev, int timebase);
+extern int oss_timer_wait_time (int timer_dev, int midi_dev, int latency,
+ oss_midi_time_t time,
+ oss_midi_wait_callback_t callback,
+ unsigned short options);
+extern oss_midi_time_t oss_timer_get_current_time (int timer_dev, int latency,
+ int use_abs);
+extern int oss_timer_get_timeout (int timer_dev, int midi_dev);
+extern void oss_timer_start (int timer_dev);
+extern void oss_timer_stop (int timer_dev);
+extern void oss_timer_continue (int timer_dev);
+extern int oss_timer_is_running (int timer_dev);
+
+extern oss_timer_driver_t *oss_timer_drivers[MAX_TIMER_DEV];
+extern int oss_num_timer_drivers;
+
+extern tdev_t *oss_timer_devs[MAX_TIMER_DEV];
+extern int oss_num_timers;
+
+#define MIDI_MARK_OPENED(md, mode) \
+{ \
+ char *cmd; \
+ md->open_mode=mode; \
+ if ((cmd = GET_PROCESS_NAME ()) != NULL) \
+ { \
+ strncpy (md->cmd, cmd, sizeof (md->cmd)); \
+ md->cmd [sizeof (md->cmd) - 1] = '\0'; \
+ } \
+ md->pid = GET_PROCESS_PID (); \
+}
+
+#define MIDI_MARK_CLOSED(md) \
+{ \
+ memset (md->cmd, 0, sizeof (md->cmd)); \
+ md->pid = -1; \
+ md->open_mode=0; \
+}
+
+extern void oss_midi_init (oss_device_t * osdev);
+extern void oss_midi_uninit (void);
+extern void oss_midi_copy_timer (int dev, int source_dev);
+extern void midi_mapper_init (oss_device_t * osdev);
+extern void midi_mapper_uninit (void);
+extern int midi_mapper_autobind (int client_dev, int mode);
+extern int oss_midi_ioctl (int dev, struct fileinfo *file,
+ unsigned int cmd, ioctl_arg arg);
+
+/* Interrupt callback functions */
+extern int oss_midi_input_byte (int dev, unsigned char data);
+extern int oss_midi_input_buf (int dev, unsigned char *data, int len);
+extern int oss_midi_output_intr (int dev);
+
+extern int
+oss_install_mididev (int version,
+ char *id, char *name,
+ midi_driver_t * d, int driver_size,
+ unsigned int flags, void *devc, oss_device_t * osdev);
+
+extern void install_vmidi (oss_device_t * osdev);
+
+/*
+ * Prototypes for midi_queue.c
+ */
+extern midi_queue_t *midi_queue_alloc (oss_device_t * osdev,
+ const char *name);
+extern void midi_queue_free (midi_queue_t * queue);
+
+extern int midi_queue_alloc_record (midi_queue_t * queue,
+ unsigned char **data, int len,
+ midi_packet_header_t * hdr);
+extern int midi_queue_put (midi_queue_t * queue, unsigned char *data, int len,
+ midi_packet_header_t * hdr);
+extern int midi_queue_get (midi_queue_t * queue, unsigned char **data,
+ int max_len, midi_packet_header_t ** hdr);
+extern int midi_queue_find_buffer (midi_queue_t * queue, unsigned char **data,
+ midi_packet_header_t ** hdr);
+extern void midi_queue_remove_chars (midi_queue_t * queue, int len);
+extern void midi_queue_removeall (midi_queue_t * queue);
+extern void oss_midi_set_defaults (mididev_t * mididev);
+extern int midi_queue_isempty (midi_queue_t * queue);
+extern int midi_queue_spaceleft (midi_queue_t * queue);
+extern void midi_queue_debugging (midi_queue_t * queue);
+extern void midi_queue_trace (midi_queue_t * queue);
+extern int oss_init_timers (oss_device_t * osdev);
+extern int oss_uninit_timers (void);
+extern void attach_oss_default_timer (oss_device_t * osdev);
+extern void detach_oss_default_timer (void);
+
+#endif