View Javadoc

1   package net.sf.jack4j;
2   
3   /*
4   Copyright (C) 2008 Ondrej Par
5   
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU Lesser General Public License as published by
8   the Free Software Foundation; either version 2.1 of the License, or
9   (at your option) any later version.
10  
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  GNU Lesser General Public License for more details.
15  
16  You should have received a copy of the GNU Lesser General Public License
17  along with this program; if not, write to the Free Software
18  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  
20  */
21  
22  /**
23   * MIDI buffer for {@link JackLocalMidiPort}.
24   * 
25   * <p>
26   * The instance may be obtained with
27   * {@link JackLocalMidiPort#initializeMidiBuffer(int)}, and is only valid
28   * <b>during the current process cycle</b>.
29   */
30  public class JackMidiPortBuffer {
31  
32  	private long bufferPointer;
33  
34  	public JackMidiPortBuffer(long bufferPointer) {
35  		this.bufferPointer = bufferPointer;
36  	}
37  
38  	/**
39  	 * Native pointer to buffer data.
40  	 * 
41  	 * <p>
42  	 * The pointer is packed as <code>long</code> value.
43  	 */
44  	public long getBufferPointer() {
45  		return bufferPointer;
46  	}
47  
48  	/**
49  	 * To be used solely by {@link JackLocalMidiPort}.
50  	 */
51  	void setBufferPointer(long bufferPointer) {
52  		this.bufferPointer = bufferPointer;
53  	}
54  
55  	/**
56  	 * Returns current number of MIDI events in the buffer.
57  	 */
58  	public native int getEventCount();
59  
60  	/**
61  	 * Returns MIDI event from the (input) buffer.
62  	 * 
63  	 * @param index
64  	 *            event number, must be non-negative and lower than
65  	 *            {@link #getEventCount()}
66  	 * @return the event
67  	 * @throws JackException
68  	 *             if native Jack API fails
69  	 */
70  	public native JackMidiEvent getEvent(int index) throws JackException;
71  
72  	/**
73  	 * Clears an event buffer.
74  	 * 
75  	 * <p>
76  	 * May be called only during client's process callback.
77  	 * 
78  	 * <p>
79  	 * This should be called at the beginning of each process cycle before
80  	 * calling {@link #eventReserve(int, int)} or
81  	 * {@link #eventWrite(int, byte[])}. This function may not be called on an
82  	 * input port.
83  	 */
84  	public native void clearBuffer();
85  
86  	/**
87  	 * Allocate space for an event to be written to an event port buffer.
88  	 * 
89  	 * <p>
90  	 * May be called only during client's process callback.
91  	 * 
92  	 * <p>
93  	 * There's probably no good reason to use this method in Java; use
94  	 * {@link #eventWrite(int, byte[])} instead.
95  	 * 
96  	 * <p>
97  	 * The returned value is a native pointer of type
98  	 * <code>jack_midi_data_t*</code>. packed as long.
99  	 * 
100 	 * <p>
101 	 * Clients are to write the actual event data to be written starting at the
102 	 * pointer returned by this function. Clients must not write more than
103 	 * dataSize bytes into this buffer. Clients must write normalized MIDI data
104 	 * to the port - no running status and no (1-byte) realtime messages
105 	 * interspersed with other messages (realtime messages are fine when they
106 	 * occur on their own, like other messages).
107 	 * 
108 	 * @param time
109 	 *            sample offset of the event (number of frames since cycle
110 	 *            start)
111 	 * @param dataSize
112 	 *            length of event's raw data in bytes
113 	 * @return <code>jack_midi_data_t*</code> packed as long
114 	 * @throws JackException
115 	 *             if the error occurrs (native function
116 	 *             <code>jack_midi_event_reserve</code> returns NULL)
117 	 */
118 	public native long eventReserve(int time, int dataSize) throws JackException;
119 
120 	/**
121 	 * Write an event into an event port buffer.
122 	 * 
123 	 * <p>
124 	 * May be called only during client's process callback.
125 	 * 
126 	 * <p>
127 	 * The <code>data</code> must be normalized MIDI data - no running status
128 	 * and no (1-byte) realtime messages interspersed with other messages
129 	 * (realtime messages are fine when they occur on their own, like other
130 	 * messages).
131 	 * 
132 	 * @param time
133 	 *            sample offset of the event (number of frames since cycle
134 	 *            start)
135 	 * @param data
136 	 *            raw MIDI data
137 	 * @throws JackException
138 	 *             if error occurrs
139 	 */
140 	public native void eventWrite(int time, byte[] data) throws JackException;
141 
142 	/**
143 	 * Not for public use, intended for unit tests.
144 	 * 
145 	 * <p>
146 	 * Calls {@link #eventReserve(int, int)} and then writes given data to the
147 	 * reserved space.
148 	 */
149 	native void eventReserveAndWrite(int time, byte[] data) throws JackException;
150 
151 	/**
152 	 * Returns the size of the largest event that can be stored by the port.
153 	 * 
154 	 * <p>
155 	 * May be called only during client's process callback.
156 	 */
157 	public native int getMaxEventSize();
158 
159 	/**
160 	 * Returns the number of events that could not be written to port.
161 	 */
162 	public native int getLostEventsCount();
163 
164 }