From 6a0ea658850b32cd06ff0fcc72a14ea57e5a0388 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 16 Dec 2016 13:45:43 +0000 Subject: "toll free bridging" between smf_tempo_t and Evoral::SMF::Tempo --- libs/evoral/evoral/SMF.hpp | 21 ++++++++++++++++++++- libs/evoral/src/SMF.cpp | 30 +++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 4 deletions(-) (limited to 'libs/evoral') diff --git a/libs/evoral/evoral/SMF.hpp b/libs/evoral/evoral/SMF.hpp index 0c312890b2..f0757929bd 100644 --- a/libs/evoral/evoral/SMF.hpp +++ b/libs/evoral/evoral/SMF.hpp @@ -93,7 +93,26 @@ public: int num_tempos () const; - typedef smf_tempo_t Tempo; + /* This is exactly modelled on smf_tempo_t */ + struct Tempo { + size_t time_pulses; + double time_seconds; + int microseconds_per_quarter_note; + int numerator; + int denominator; + int clocks_per_click; + int notes_per_note; + + Tempo () + : time_pulses (0) + , time_seconds (0) + , microseconds_per_quarter_note (-1) + , numerator (-1) + , denominator (-1) + , clocks_per_click (-1) + , notes_per_note (-1) {} + Tempo (smf_tempo_t*); + }; Tempo* tempo_at_smf_pulse (size_t smf_pulse) const; Tempo* tempo_at_seconds (double seconds) const; diff --git a/libs/evoral/src/SMF.cpp b/libs/evoral/src/SMF.cpp index 63050b63be..b5d34aa538 100644 --- a/libs/evoral/src/SMF.cpp +++ b/libs/evoral/src/SMF.cpp @@ -522,6 +522,17 @@ SMF::instrument_names(vector& names) const } } +SMF::Tempo::Tempo (smf_tempo_t* smft) + : time_pulses (smft->time_pulses) + , time_seconds (smft->time_seconds) + , microseconds_per_quarter_note (smft->microseconds_per_quarter_note) + , numerator (smft->numerator) + , denominator (smft->denominator) + , clocks_per_click (smft->clocks_per_click) + , notes_per_note (smft->notes_per_note) +{ +} + int SMF::num_tempos () const { @@ -532,13 +543,21 @@ SMF::num_tempos () const SMF::Tempo* SMF::tempo_at_smf_pulse (size_t smf_pulse) const { - return smf_get_tempo_by_seconds (_smf, smf_pulse); + smf_tempo_t* t = smf_get_tempo_by_seconds (_smf, smf_pulse); + if (!t) { + return 0; + } + return new Tempo (t); } SMF::Tempo* SMF::tempo_at_seconds (double seconds) const { - return smf_get_tempo_by_seconds (_smf, seconds); + smf_tempo_t* t = smf_get_tempo_by_seconds (_smf, seconds); + if (!t) { + return 0; + } + return new Tempo (t); } SMF::Tempo* @@ -546,7 +565,12 @@ SMF::nth_tempo (size_t n) const { assert (_smf); - return smf_get_tempo_by_number (_smf, n); + smf_tempo_t* t = smf_get_tempo_by_number (_smf, n); + if (!t) { + return 0; + } + + return new Tempo (t); } } // namespace Evoral -- cgit v1.2.3