1 1.26 mrg /* $NetBSD: midi_if.h,v 1.27 2015/03/01 00:34:14 mrg Exp $ */ 2 1.1 augustss 3 1.1 augustss /* 4 1.1 augustss * Copyright (c) 1998 The NetBSD Foundation, Inc. 5 1.1 augustss * All rights reserved. 6 1.1 augustss * 7 1.3 augustss * This code is derived from software contributed to The NetBSD Foundation 8 1.13 keihan * by Lennart Augustsson (augustss (at) NetBSD.org). 9 1.1 augustss * 10 1.1 augustss * Redistribution and use in source and binary forms, with or without 11 1.1 augustss * modification, are permitted provided that the following conditions 12 1.1 augustss * are met: 13 1.1 augustss * 1. Redistributions of source code must retain the above copyright 14 1.1 augustss * notice, this list of conditions and the following disclaimer. 15 1.1 augustss * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 augustss * notice, this list of conditions and the following disclaimer in the 17 1.1 augustss * documentation and/or other materials provided with the distribution. 18 1.1 augustss * 19 1.1 augustss * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 augustss * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 augustss * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 augustss * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 augustss * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 augustss * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 augustss * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 augustss * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 augustss * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 augustss * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 augustss * POSSIBILITY OF SUCH DAMAGE. 30 1.1 augustss */ 31 1.1 augustss 32 1.1 augustss #ifndef _SYS_DEV_MIDI_IF_H_ 33 1.1 augustss #define _SYS_DEV_MIDI_IF_H_ 34 1.1 augustss 35 1.23 jmcneill #include <sys/mutex.h> 36 1.23 jmcneill 37 1.1 augustss struct midi_info { 38 1.16 christos const char *name; /* Name of MIDI hardware */ 39 1.1 augustss int props; 40 1.1 augustss }; 41 1.1 augustss #define MIDI_PROP_OUT_INTR 1 42 1.1 augustss #define MIDI_PROP_CAN_INPUT 2 43 1.18 chap #define MIDI_PROP_NO_OUTPUT 4 44 1.1 augustss 45 1.24 mrg /* 46 1.24 mrg * XXX expand 47 1.24 mrg * 48 1.24 mrg * List of hardware interface methods, and when locks are held by each 49 1.24 mrg * called by this module: 50 1.24 mrg * 51 1.24 mrg * METHOD INTR NOTES 52 1.24 mrg * ----------------------- ------- ------------------------- 53 1.27 mrg * open - 54 1.27 mrg * close - 55 1.27 mrg * output - 56 1.27 mrg * getinfo - Called at attach time 57 1.27 mrg * ioctl - 58 1.24 mrg * get_locks - Called at attach time 59 1.24 mrg */ 60 1.24 mrg 61 1.1 augustss struct midi_softc; 62 1.1 augustss 63 1.1 augustss struct midi_hw_if { 64 1.10 augustss int (*open)(void *, int, /* open hardware */ 65 1.10 augustss void (*)(void *, int), /* input callback */ 66 1.10 augustss void (*)(void *), /* output callback */ 67 1.10 augustss void *); 68 1.10 augustss void (*close)(void *); /* close hardware */ 69 1.10 augustss int (*output)(void *, int); /* output a byte */ 70 1.10 augustss void (*getinfo)(void *, struct midi_info *); 71 1.19 christos int (*ioctl)(void *, u_long, void *, int, struct lwp *); 72 1.23 jmcneill void (*get_locks)(void *, kmutex_t **, kmutex_t **); 73 1.1 augustss }; 74 1.1 augustss 75 1.18 chap /* 76 1.18 chap * The extended hardware interface is for use by drivers that are better off 77 1.18 chap * getting messages whole to transmit, rather than byte-by-byte through 78 1.18 chap * output(). Two examples are midisyn (which interprets MIDI messages in 79 1.18 chap * software to drive synth chips) and umidi (which has to send messages in the 80 1.18 chap * packet-based USB MIDI protocol). It is silly for them to have to reassemble 81 1.18 chap * messages midi had to split up to poke through the single-byte interface. 82 1.18 chap * 83 1.18 chap * To register use of the extended interface, a driver will call back midi's 84 1.18 chap * midi_register_hw_if_ext() function during getinfo(); thereafter midi will 85 1.18 chap * deliver channel messages, system common messages other than sysex, and sysex 86 1.18 chap * messages, respectively, through these methods, and use the original output 87 1.18 chap * method only for system realtime messages (all of which are single byte). 88 1.18 chap * Other drivers that have no reason to change from the single-byte interface 89 1.18 chap * simply don't call the register function, and nothing changes for them. 90 1.18 chap * 91 1.18 chap * IMPORTANT: any code that provides a midi_hw_if_ext struct MUST initialize 92 1.18 chap * its members BY NAME (typically with a C99-style initializer with designators) 93 1.18 chap * and assure that any unused members contain zeroes (which is what C99 94 1.18 chap * initializers will do), and make no assumptions about the size or order of 95 1.18 chap * the struct, to allow for further extension of this interface as needed. 96 1.18 chap */ 97 1.18 chap struct midi_hw_if_ext { 98 1.18 chap int (*channel)(void *, int, int, u_char *, int); 99 1.18 chap int (*common)(void *, int, u_char *, int); 100 1.18 chap int (*sysex)(void *, u_char *, int); 101 1.18 chap int compress:1; /* if hw wants channel msgs in compressed form */ 102 1.18 chap }; 103 1.18 chap void midi_register_hw_if_ext(struct midi_hw_if_ext *); 104 1.18 chap 105 1.25 plunky void midi_attach(struct midi_softc *); 106 1.22 dyoung int mididetach(device_t, int); 107 1.20 cube device_t midi_attach_mi(const struct midi_hw_if *, void *, device_t); 108 1.10 augustss 109 1.10 augustss int midi_unit_count(void); 110 1.10 augustss void midi_getinfo(dev_t, struct midi_info *); 111 1.10 augustss int midi_writebytes(int, u_char *, int); 112 1.4 mycroft 113 1.9 wrstuden #if !defined(IPL_AUDIO) 114 1.4 mycroft #define splaudio splbio /* XXX */ 115 1.4 mycroft #define IPL_AUDIO IPL_BIO /* XXX */ 116 1.4 mycroft #endif 117 1.1 augustss 118 1.1 augustss #endif /* _SYS_DEV_MIDI_IF_H_ */ 119