Actually added the code mentioned in my last commit. Whoops.
[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 (unsigned char *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const
94 {
95         //Glib::Mutex::Lock lm (_lock);
96         //return read_unlocked (dst, start, cnt, workbuf);
97         return 0;
98 }
99
100 jack_nframes_t
101 MidiSource::write (unsigned char *dst, jack_nframes_t cnt, char * workbuf)
102 {
103         //Glib::Mutex::Lock lm (_lock);
104         //return write_unlocked (dst, cnt, workbuf);
105         return 0;
106 }
107
108
109 bool
110 MidiSource::file_changed (string path)
111 {
112         struct stat stat_file;
113         //struct stat stat_peak;
114
115         int e1 = stat (path.c_str(), &stat_file);
116         //int e2 = stat (peak_path(path).c_str(), &stat_peak);
117         
118         if (!e1){//&& !e2 && stat_file.st_mtime > stat_peak.st_mtime){
119                 return true;
120         } else {
121                 return false;
122         }
123 }
124
125
126 void
127 MidiSource::update_length (jack_nframes_t pos, jack_nframes_t cnt)
128 {
129         if (pos + cnt > _length) {
130                 _length = pos+cnt;
131         }
132 }
133