optimize some performance bottlenecks; remove jack_nframes_t that crept back into...
[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 #include <ardour/midi_ring_buffer.h>
36
37 #include "i18n.h"
38
39 using namespace std;
40 using namespace ARDOUR;
41 using namespace PBD;
42
43 sigc::signal<void,MidiSource *> MidiSource::MidiSourceCreated;
44
45 MidiSource::MidiSource (Session& s, string name)
46         : Source (s, name, DataType::MIDI)
47 {
48         _read_data_count = 0;
49         _write_data_count = 0;
50 }
51
52 MidiSource::MidiSource (Session& s, const XMLNode& node) 
53         : Source (s, node)
54 {
55         _read_data_count = 0;
56         _write_data_count = 0;
57
58         if (set_state (node)) {
59                 throw failed_constructor();
60         }
61 }
62
63 MidiSource::~MidiSource ()
64 {
65 }
66
67 XMLNode&
68 MidiSource::get_state ()
69 {
70         XMLNode& node (Source::get_state());
71
72         if (_captured_for.length()) {
73                 node.add_property ("captured-for", _captured_for);
74         }
75
76         return node;
77 }
78
79 int
80 MidiSource::set_state (const XMLNode& node)
81 {
82         const XMLProperty* prop;
83
84         Source::set_state (node);
85
86         if ((prop = node.property ("captured-for")) != 0) {
87                 _captured_for = prop->value();
88         }
89
90         return 0;
91 }
92
93 nframes_t
94 MidiSource::read (MidiRingBuffer& dst, nframes_t start, nframes_t cnt, nframes_t stamp_offset) const
95 {
96         Glib::Mutex::Lock lm (_lock);
97         return read_unlocked (dst, start, cnt, stamp_offset);
98 }
99
100 nframes_t
101 MidiSource::write (MidiRingBuffer& dst, nframes_t cnt)
102 {
103         Glib::Mutex::Lock lm (_lock);
104         return write_unlocked (dst, cnt);
105 }
106
107 bool
108 MidiSource::file_changed (string path)
109 {
110         struct stat stat_file;
111
112         int e1 = stat (path.c_str(), &stat_file);
113         
114         return ( !e1 );
115 }
116