summaryrefslogtreecommitdiff
path: root/libs/ardour/audioengine.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/audioengine.cc')
-rw-r--r--libs/ardour/audioengine.cc40
1 files changed, 37 insertions, 3 deletions
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc
index a16f268edd..d2cf8d12a4 100644
--- a/libs/ardour/audioengine.cc
+++ b/libs/ardour/audioengine.cc
@@ -232,6 +232,15 @@ AudioEngine::start ()
}
_raw_buffer_sizes[DataType::AUDIO] = blocksize * sizeof(float);
+
+ jack_port_t* midi_port = jack_port_register (_priv_jack, "m", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
+ if (!midi_port) {
+ error << _("Cannot create temporary MIDI port to determine MIDI buffer size") << endmsg;
+ } else {
+ _raw_buffer_sizes[DataType::MIDI] = jack_midi_max_event_size (jack_port_get_buffer(midi_port, blocksize));
+ cerr << "MIDI port buffers = " << _raw_buffer_sizes[DataType::MIDI] << endl;
+ jack_port_unregister (_priv_jack, midi_port);
+ }
}
return _running ? 0 : -1;
@@ -420,6 +429,7 @@ AudioEngine::process_thread ()
jack_nframes_t nframes = jack_cycle_wait (_jack);
if (process_callback (nframes)) {
+ cerr << "--- process\n";
return 0;
}
@@ -583,16 +593,40 @@ AudioEngine::_bufsize_callback (nframes_t nframes, void *arg)
int
AudioEngine::jack_bufsize_callback (nframes_t nframes)
{
+ bool need_midi_size = true;
+ bool need_audio_size = true;
+
_buffer_size = nframes;
- _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof(float);
- cout << "FIXME: Assuming maximum MIDI buffer size " << nframes * 4 << "bytes" << endl;
- _raw_buffer_sizes[DataType::MIDI] = nframes * 4;
_usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
last_monitor_check = 0;
boost::shared_ptr<Ports> p = ports.reader();
+ /* crude guesses, see below where we try to get the right answers.
+
+ Note that our guess for MIDI deliberatey tries to overestimate
+ by a little. It would be nicer if we could get the actual
+ size from a port, but we have to use this estimate in the
+ event that there are no MIDI ports currently. If there are
+ the value will be adjusted below.
+ */
+
+ _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
+ _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
+
for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
+
+ if (need_audio_size && (*i)->type() == DataType::AUDIO) {
+ _raw_buffer_sizes[DataType::AUDIO] = (*i)->raw_buffer_size (nframes);
+ need_audio_size = false;
+ }
+
+
+ if (need_midi_size && (*i)->type() == DataType::MIDI) {
+ _raw_buffer_sizes[DataType::MIDI] = (*i)->raw_buffer_size (nframes);
+ need_midi_size = false;
+ }
+
(*i)->reset();
}