- Changed IO's vector<Port*>'s to PortList
[ardour.git] / libs / ardour / midi_source.cc
1 /*
2     Copyright (C) 2006 Paul Davis
3         Written by Dave Robillard, 2006
4
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 #include <sys/stat.h>
21 #include <unistd.h>
22 #include <fcntl.h>
23 #include <poll.h>
24 #include <float.h>
25 #include <cerrno>
26 #include <ctime>
27 #include <cmath>
28 #include <iomanip>
29 #include <algorithm>
30
31 #include <pbd/xml++.h>
32 #include <pbd/pthread_utils.h>
33
34 #include <ardour/midi_source.h>
35
36 #include "i18n.h"
37
38 using namespace std;
39 using namespace ARDOUR;
40 using namespace PBD;
41
42 sigc::signal<void,MidiSource *> MidiSource::MidiSourceCreated;
43
44 MidiSource::MidiSource (string name)
45         : Source (name)
46 {
47         _read_data_count = 0;
48         _write_data_count = 0;
49 }
50
51 MidiSource::MidiSource (const XMLNode& node) 
52         : Source (node)
53 {
54         _read_data_count = 0;
55         _write_data_count = 0;
56
57         if (set_state (node)) {
58                 throw failed_constructor();
59         }
60 }
61
62 MidiSource::~MidiSource ()
63 {
64 }
65
66 XMLNode&
67 MidiSource::get_state ()
68 {
69         XMLNode& node (Source::get_state());
70
71         if (_captured_for.length()) {
72                 node.add_property ("captured-for", _captured_for);
73         }
74
75         return node;
76 }
77
78 int
79 MidiSource::set_state (const XMLNode& node)
80 {
81         const XMLProperty* prop;
82
83         Source::set_state (node);
84
85         if ((prop = node.property ("captured-for")) != 0) {
86                 _captured_for = prop->value();
87         }
88
89         return 0;
90 }
91
92 jack_nframes_t
93 MidiSource::read (RawMidi* dst, jack_nframes_t start, jack_nframes_t cnt) const
94 {
95         Glib::Mutex::Lock lm (_lock);
96         return read_unlocked (dst, start, cnt);
97 }
98
99 jack_nframes_t
100 MidiSource::write (RawMidi* dst, jack_nframes_t cnt)
101 {
102         Glib::Mutex::Lock lm (_lock);
103         return write_unlocked (dst, cnt);
104 }
105
106 bool
107 MidiSource::file_changed (string path)
108 {
109         struct stat stat_file;
110
111         int e1 = stat (path.c_str(), &stat_file);
112         
113         return ( !e1 );
114 }
115