* added XML deserialisation for control and program changes
authorHans Baier <hansfbaier@googlemail.com>
Sat, 22 Nov 2008 15:40:19 +0000 (15:40 +0000)
committerHans Baier <hansfbaier@googlemail.com>
Sat, 22 Nov 2008 15:40:19 +0000 (15:40 +0000)
* added pointer checks
* fixed typos in comments

git-svn-id: svn://localhost/ardour2/branches/3.0@4234 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/midi_ring_buffer.h
libs/evoral/evoral/MIDIEvent.hpp
libs/evoral/src/MIDIEvent.cpp
libs/midi++2/jack_midiport.cc

index 8bd426028339f4a266c294d3981f69a76ae7921a..ba271df6155ffeee1c64f16b1f46d06accf90c20 100644 (file)
@@ -85,7 +85,7 @@ private:
 
 
 /** Read the time and size of an event.  This call MUST be immediately proceeded
- * by a call to read_contents (or the read pointer will be garabage).
+ * by a call to read_contents (or the read pointer will be garbage).
  */
 inline bool
 MidiRingBuffer::read_prefix(Evoral::EventTime* time, Evoral::EventType* type, uint32_t* size)
@@ -100,8 +100,8 @@ MidiRingBuffer::read_prefix(Evoral::EventTime* time, Evoral::EventType* type, ui
 }
 
 
-/** Read the contenst of an event.  This call MUST be immediately preceeded
- * by a call to read_prefix (or the returned even will be garabage).
+/** Read the content of an event.  This call MUST be immediately preceded
+ * by a call to read_prefix (or the returned even will be garbage).
  */
 inline bool
 MidiRingBuffer::read_contents(uint32_t size, uint8_t* buf)
@@ -112,7 +112,7 @@ MidiRingBuffer::read_contents(uint32_t size, uint8_t* buf)
 
 /** Read a block of MIDI events from buffer.
  *
- * Timestamps of events returned are relative to start (ie event with stamp 0
+ * Timestamps of events returned are relative to start (i.e. event with stamp 0
  * occurred at start), with offset added.
  */
 inline size_t
index 863103aa742da5e0ad4093fc927294952edae22d..bbf1e580f116f431be7f64925885c4feb59962fb 100644 (file)
@@ -69,7 +69,9 @@ struct MIDIEvent : public Event {
        inline uint8_t  note()                  const { return (_buffer[1]); }
        inline uint8_t  velocity()              const { return (_buffer[2]); }
        inline uint8_t  cc_number()             const { return (_buffer[1]); }
+       inline void     set_cc_number(uint8_t number) { _buffer[1] = number; }
        inline uint8_t  cc_value()              const { return (_buffer[2]); }
+       inline void     set_cc_value(uint8_t value)   { _buffer[2] = value; }
        inline uint8_t  pitch_bender_lsb()      const { return (_buffer[1]); }
        inline uint8_t  pitch_bender_msb()      const { return (_buffer[2]); }
        inline uint16_t pitch_bender_value()    const { return ( ((0x7F & _buffer[2]) << 7)
index 35161515d61f8478bcc2ffc6497441780c0ba603..7617d2ae9ae169a9e8970ee6ce12a5089365f998 100644 (file)
@@ -22,14 +22,24 @@ namespace Evoral {
 
 #ifdef EVORAL_MIDI_XML
 
-MIDIEvent::MIDIEvent(const XMLNode& event)
+MIDIEvent::MIDIEvent(const XMLNode& event) 
+  : Event()
 {
        string name = event.name();
        
        if (name == "ControlChange") {
+               _buffer = (uint8_t*) ::malloc(3);
+               _owns_buffer = true;
+               set_type(MIDI_CMD_CONTROL);
                
+               set_cc_number(atoi(event.property("Control")->value().c_str()));
+               set_cc_value (atoi(event.property("Value")->value().c_str()));
        } else if (name == "ProgramChange") {
-               
+               _buffer = (uint8_t*) ::malloc(2);
+               _owns_buffer = true;
+               set_type(MIDI_CMD_PGM_CHANGE);
+
+               set_pgm_number(atoi(event.property("Number")->value().c_str()));
        }
 }
 
index 6f3661d937bd38445d44ead923e83763d9a24017..0464649989ace883dbb36b7f5acfab43bb3c12e3 100644 (file)
@@ -60,28 +60,32 @@ JACK_MidiPort::cycle_start (nframes_t nframes)
        _last_read_index = 0;
        _last_write_timestamp = 0;
 
-       // output
-       void *buffer = jack_port_get_buffer (_jack_output_port, nframes);
-       jack_midi_clear_buffer (buffer);
-       flush (buffer);
+       if (_jack_output_port != 0) {
+               // output
+               void *buffer = jack_port_get_buffer (_jack_output_port, nframes);
+               jack_midi_clear_buffer (buffer);
+               flush (buffer); 
+       }
        
-       // input
-       void* jack_buffer = jack_port_get_buffer(_jack_input_port, nframes);
-       const nframes_t event_count = jack_midi_get_event_count(jack_buffer);
+       if (_jack_input_port != 0) {
+               // input
+               void* jack_buffer = jack_port_get_buffer(_jack_input_port, nframes);
+               const nframes_t event_count = jack_midi_get_event_count(jack_buffer);
 
-       jack_midi_event_t ev;
+               jack_midi_event_t ev;
 
-       for (nframes_t i=0; i < event_count; ++i) {
+               for (nframes_t i=0; i < event_count; ++i) {
 
-               jack_midi_event_get (&ev, jack_buffer, i);
+                       jack_midi_event_get (&ev, jack_buffer, i);
 
-               if (input_parser) {
-                       for (size_t i = 0; i < ev.size; i++) {
-                               // the midi events here are used for MIDI clock only
-                               input_parser->set_midi_clock_timestamp(ev.time + jack_last_frame_time(_jack_client));
-                               input_parser->scanner (ev.buffer[i]);
-                       }       
-               }
+                       if (input_parser) {
+                               for (size_t i = 0; i < ev.size; i++) {
+                                       // the midi events here are used for MIDI clock only
+                                       input_parser->set_midi_clock_timestamp(ev.time + jack_last_frame_time(_jack_client));
+                                       input_parser->scanner (ev.buffer[i]);
+                               }       
+                       }
+               }       
        }
 }