Merge branch 'master' into cairocanvas

This commit is contained in:
Paul Davis 2013-12-05 17:50:28 -05:00
commit 59da788793
8 changed files with 85 additions and 77 deletions

View file

@ -1217,7 +1217,7 @@ ARDOUR_UI::update_cpu_load ()
should also be changed. should also be changed.
*/ */
float const c = AudioEngine::instance()->get_cpu_load (); float const c = AudioEngine::instance()->get_dsp_load ();
snprintf (buf, sizeof (buf), _("DSP: <span foreground=\"%s\">%5.1f%%</span>"), c >= 90 ? X_("red") : X_("green"), c); snprintf (buf, sizeof (buf), _("DSP: <span foreground=\"%s\">%5.1f%%</span>"), c >= 90 ? X_("red") : X_("green"), c);
cpu_load_label.set_markup (buf); cpu_load_label.set_markup (buf);
} }

View file

@ -361,7 +361,7 @@ class AudioBackend : public PortEngine {
* Implementations can feel free to smooth the values returned over * Implementations can feel free to smooth the values returned over
* time (e.g. high pass filtering, or its equivalent). * time (e.g. high pass filtering, or its equivalent).
*/ */
virtual float cpu_load() const = 0; virtual float dsp_load() const = 0;
/* Transport Control (JACK is the only audio API that currently offers /* Transport Control (JACK is the only audio API that currently offers
the concept of shared transport control) the concept of shared transport control)

View file

@ -86,7 +86,7 @@ public:
int start (bool for_latency_measurement=false); int start (bool for_latency_measurement=false);
int stop (bool for_latency_measurement=false); int stop (bool for_latency_measurement=false);
int freewheel (bool start_stop); int freewheel (bool start_stop);
float get_cpu_load() const ; float get_dsp_load() const ;
void transport_start (); void transport_start ();
void transport_stop (); void transport_stop ();
TransportState transport_state (); TransportState transport_state ();

View file

@ -675,12 +675,12 @@ AudioEngine::freewheel (bool start_stop)
} }
float float
AudioEngine::get_cpu_load() const AudioEngine::get_dsp_load() const
{ {
if (!_backend) { if (!_backend) {
return 0.0; return 0.0;
} }
return _backend->cpu_load (); return _backend->dsp_load ();
} }
bool bool

View file

@ -83,7 +83,7 @@ Session::process (pframes_t nframes)
*/ */
try { try {
if (!_engine.freewheeling() && Config->get_send_midi_clock() && transport_speed() == 1.0f && midi_clock->has_midi_port()) { if (!_silent && !_engine.freewheeling() && Config->get_send_midi_clock() && (transport_speed() == 1.0f || transport_speed() == 0.0f) && midi_clock->has_midi_port()) {
midi_clock->tick (transport_at_start, nframes); midi_clock->tick (transport_at_start, nframes);
} }
} catch (...) { } catch (...) {

View file

@ -42,22 +42,24 @@ public:
~Position() { } ~Position() { }
/** Sync timing information taken from the given Session /** Sync timing information taken from the given Session
@return True if timings differed */ * @return True if timings differed
*/
bool sync (Session* s) { bool sync (Session* s) {
bool didit = false; bool changed = false;
double sp = s->transport_speed(); double sp = s->transport_speed();
framecnt_t fr = s->transport_frame(); framecnt_t fr = s->transport_frame();
if (speed != sp) { if (speed != sp) {
speed = sp; speed = sp;
didit = true; changed = true;
} }
if (frame != fr) { if (frame != fr) {
frame = fr; frame = fr;
didit = true; changed = true;
} }
/* Midi beats and clocks always gets updated for now */ /* Midi beats and clocks always gets updated for now */
@ -69,17 +71,23 @@ public:
const double divisions = tempo.meter_at(frame).divisions_per_bar(); const double divisions = tempo.meter_at(frame).divisions_per_bar();
const double divisor = tempo.meter_at(frame).note_divisor(); const double divisor = tempo.meter_at(frame).note_divisor();
const double qnote_scale = divisor * 0.25f; const double qnote_scale = divisor * 0.25f;
double mb;
/** Midi Beats in terms of Song Position Pointer is equivalent to total /** Midi Beats in terms of Song Position Pointer is equivalent to total
sixteenth notes at 'time' */ * sixteenth notes at 'time'
*/
midi_beats = (((bars - 1) * divisions) + beats - 1); mb = (((bars - 1) * divisions) + beats - 1);
midi_beats += (double)ticks / (double)Position::ticks_per_beat * qnote_scale; mb += (double)ticks / (double)Position::ticks_per_beat * qnote_scale;
midi_beats *= 16.0f / divisor; mb *= 16.0f / divisor;
if (mb != midi_beats) {
midi_beats = mb;
midi_clocks = midi_beats * 6.0f; midi_clocks = midi_beats * 6.0f;
changed = true;
}
return didit; return changed;
} }
double speed; double speed;
@ -127,7 +135,7 @@ MidiClockTicker::session_located()
{ {
DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Session Located: %1, speed: %2\n", _session->transport_frame(), _session->transport_speed())); DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Session Located: %1, speed: %2\n", _session->transport_frame(), _session->transport_speed()));
if (0 == _session || ! _pos->sync (_session)) { if (!_session || !_pos->sync (_session)) {
return; return;
} }
@ -212,37 +220,30 @@ MidiClockTicker::transport_looped()
void void
MidiClockTicker::tick (const framepos_t& /* transport_frame */, pframes_t nframes) MidiClockTicker::tick (const framepos_t& /* transport_frame */, pframes_t nframes)
{ {
if (!Config->get_send_midi_clock() || _session == 0 || _session->transport_speed() != 1.0f || _midi_port == 0) { if (!Config->get_send_midi_clock() || _session == 0 || _midi_port == 0) {
return; return;
} }
if (_send_pos) { if (_send_pos) {
if (_pos->speed == 0.0f) { if (_pos->speed == 0.0f) {
uint32_t where = llrint (_pos->midi_beats); send_position_event (llrint (_pos->midi_beats), 0, nframes);
send_position_event (where, 0, nframes);
} else if (_pos->speed == 1.0f) { } else if (_pos->speed == 1.0f) {
#if 1
/* Experimental. To really do this and have accuracy, the
stop/locate/continue sequence would need queued to send immediately
before the next midi clock. */
send_stop_event (0, nframes); send_stop_event (0, nframes);
if (_pos->frame == 0) { if (_pos->frame == 0) {
send_start_event (0, nframes); send_start_event (0, nframes);
} else { } else {
uint32_t where = llrint (_pos->midi_beats); send_position_event (llrint (_pos->midi_beats), 0, nframes);
send_position_event (where, 0, nframes);
send_continue_event (0, nframes); send_continue_event (0, nframes);
} }
#endif
} else { } else {
/* Varispeed not supported */ /* Varispeed not supported */
} }
_send_pos = true; _send_pos = false;
} }
if (_send_state) { if (_send_state) {
if (_pos->speed == 1.0f) { if (_pos->speed == 1.0f) {
if (_session->get_play_loop()) { if (_session->get_play_loop()) {
@ -270,6 +271,10 @@ MidiClockTicker::tick (const framepos_t& /* transport_frame */, pframes_t nframe
_send_state = false; _send_state = false;
} }
if (_session->transport_speed() != 1.0f) {
/* no varispeed support and nothing to do after this if stopped */
return;
}
const framepos_t end = _pos->frame + nframes; const framepos_t end = _pos->frame + nframes;
double iter = _last_tick; double iter = _last_tick;
@ -317,11 +322,12 @@ MidiClockTicker::send_midi_clock_event (pframes_t offset, pframes_t nframes)
return; return;
} }
DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Tick with offset %1\n", offset)); static uint8_t msg = MIDI_CMD_COMMON_CLOCK;
static uint8_t tick_byte = { MIDI_CMD_COMMON_CLOCK };
MidiBuffer& mb (_midi_port->get_midi_buffer (nframes)); MidiBuffer& mb (_midi_port->get_midi_buffer (nframes));
mb.push_back (offset, 1, &tick_byte); mb.push_back (offset, 1, &msg);
DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Tick with offset %1\n", offset));
} }
void void
@ -331,11 +337,11 @@ MidiClockTicker::send_start_event (pframes_t offset, pframes_t nframes)
return; return;
} }
DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Start %1\n", _last_tick)); static uint8_t msg = { MIDI_CMD_COMMON_START };
static uint8_t tick_byte = { MIDI_CMD_COMMON_START };
MidiBuffer& mb (_midi_port->get_midi_buffer (nframes)); MidiBuffer& mb (_midi_port->get_midi_buffer (nframes));
mb.push_back (offset, 1, &tick_byte); mb.push_back (offset, 1, &msg);
DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Start %1\n", _last_tick));
} }
void void
@ -345,11 +351,11 @@ MidiClockTicker::send_continue_event (pframes_t offset, pframes_t nframes)
return; return;
} }
DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Continue %1\n", _last_tick)); static uint8_t msg = { MIDI_CMD_COMMON_CONTINUE };
static uint8_t tick_byte = { MIDI_CMD_COMMON_CONTINUE };
MidiBuffer& mb (_midi_port->get_midi_buffer (nframes)); MidiBuffer& mb (_midi_port->get_midi_buffer (nframes));
mb.push_back (offset, 1, &tick_byte); mb.push_back (offset, 1, &msg);
DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Continue %1\n", _last_tick));
} }
void void
@ -359,11 +365,11 @@ MidiClockTicker::send_stop_event (pframes_t offset, pframes_t nframes)
return; return;
} }
DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Stop %1\n", _last_tick)); static uint8_t msg = MIDI_CMD_COMMON_STOP;
static uint8_t tick_byte = { MIDI_CMD_COMMON_STOP };
MidiBuffer& mb (_midi_port->get_midi_buffer (nframes)); MidiBuffer& mb (_midi_port->get_midi_buffer (nframes));
mb.push_back (offset, 1, &tick_byte); mb.push_back (offset, 1, &msg);
DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Stop %1\n", _last_tick));
} }
void void
@ -387,5 +393,7 @@ MidiClockTicker::send_position_event (uint32_t midi_beats, pframes_t offset, pfr
MidiBuffer& mb (_midi_port->get_midi_buffer (nframes)); MidiBuffer& mb (_midi_port->get_midi_buffer (nframes));
mb.push_back (offset, 3, &msg[0]); mb.push_back (offset, 3, &msg[0]);
DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Song Position Sent: %1\n", midi_beats)); DEBUG_TRACE (DEBUG::MidiClock, string_compose ("Song Position Sent: %1 to %2 (events now %3, buf = %4)\n", midi_beats, _midi_port->name(),
mb.size(), &mb));
} }

View file

@ -1016,7 +1016,7 @@ JACKAudioBackend::disconnected (const char* why)
} }
float float
JACKAudioBackend::cpu_load() const JACKAudioBackend::dsp_load() const
{ {
GET_PRIVATE_JACK_POINTER_RET(_priv_jack,0); GET_PRIVATE_JACK_POINTER_RET(_priv_jack,0);
return jack_cpu_load (_priv_jack); return jack_cpu_load (_priv_jack);

View file

@ -92,7 +92,7 @@ class JACKAudioBackend : public AudioBackend {
int stop (); int stop ();
int freewheel (bool); int freewheel (bool);
float cpu_load() const; float dsp_load() const;
pframes_t sample_time (); pframes_t sample_time ();
pframes_t sample_time_at_cycle_start (); pframes_t sample_time_at_cycle_start ();