merge with master and fix 4 conflicts by hand

This commit is contained in:
Paul Davis 2014-06-02 11:32:13 -04:00
commit 8c9749e42f
19 changed files with 137 additions and 29 deletions

View file

@ -18,6 +18,7 @@ export ARDOUR_MIDIMAPS_PATH=$TOP/midi_maps:.
export ARDOUR_MCP_PATH=$TOP/mcp:. export ARDOUR_MCP_PATH=$TOP/mcp:.
export ARDOUR_EXPORT_FORMATS_PATH=$TOP/export:. export ARDOUR_EXPORT_FORMATS_PATH=$TOP/export:.
export ARDOUR_BACKEND_PATH=$libs/backends/jack:$libs/backends/wavesaudio:$libs/backends/dummy export ARDOUR_BACKEND_PATH=$libs/backends/jack:$libs/backends/wavesaudio:$libs/backends/dummy
export ARDOUR_TEST_PATH=$libs/ardour/test/data
# #
# even though we set the above variables, ardour requires that these # even though we set the above variables, ardour requires that these

View file

@ -114,7 +114,7 @@ EditorRegions::EditorRegions (Editor* e)
{ 3, _("Length"), _("Length of the region") }, { 3, _("Length"), _("Length of the region") },
{ 4, _("Sync"), _("Position of region sync point, relative to start of the region") }, { 4, _("Sync"), _("Position of region sync point, relative to start of the region") },
{ 5, _("Fade In"), _("Length of region fade-in (units: secondary clock), () if disabled") }, { 5, _("Fade In"), _("Length of region fade-in (units: secondary clock), () if disabled") },
{ 6, _("Fade Out"), _("Length of region fade-out (units: secondary clock), () if dsisabled") }, { 6, _("Fade Out"), _("Length of region fade-out (units: secondary clock), () if disabled") },
{ 7, _("L"), _("Region position locked?") }, { 7, _("L"), _("Region position locked?") },
{ 8, _("G"), _("Region position glued to Bars|Beats time?") }, { 8, _("G"), _("Region position glued to Bars|Beats time?") },
{ 9, _("M"), _("Region muted?") }, { 9, _("M"), _("Region muted?") },

View file

@ -339,7 +339,7 @@ This mode provides many different operations on both regions and control points,
@trans|Transport/ToggleAutoPlay|5|toggle auto play @trans|Transport/ToggleAutoPlay|5|toggle auto play
@trans|Transport/ToggleAutoReturn|6|toggle auto return @trans|Transport/ToggleAutoReturn|6|toggle auto return
@trans|Transport/ToggleClick|7|toggle click (metronome) @trans|Transport/ToggleClick|7|toggle click (metronome)
@ranges|Editor/set-tempo-from-region|9|set tempo (1 bar) from region(s) @ranges|Region/set-tempo-from-region|9|set tempo (1 bar) from region(s)
@ranges|Editor/set-tempo-from-edit-range|0|set tempo (1 bar) from edit range @ranges|Editor/set-tempo-from-edit-range|0|set tempo (1 bar) from edit range
; mouse stuff ; mouse stuff

View file

@ -102,7 +102,7 @@ ARDOUR_COMMAND_LINE::parse_opts (int argc, char *argv[])
{ "help", 0, 0, 'h' }, { "help", 0, 0, 'h' },
{ "no-announcements", 0, 0, 'a' }, { "no-announcements", 0, 0, 'a' },
{ "bindings", 0, 0, 'b' }, { "bindings", 0, 0, 'b' },
{ "disable-plugins", 1, 0, 'd' }, { "disable-plugins", 0, 0, 'd' },
{ "debug", 1, 0, 'D' }, { "debug", 1, 0, 'D' },
{ "no-splash", 0, 0, 'n' }, { "no-splash", 0, 0, 'n' },
{ "menus", 1, 0, 'm' }, { "menus", 1, 0, 'm' },

View file

@ -281,7 +281,7 @@ SoundFileBox::setup_labels (const string& filename)
string error_msg; string error_msg;
if (SMFSource::safe_midi_file_extension (path)) { if (SMFSource::valid_midi_file (path)) {
boost::shared_ptr<SMFSource> ms = boost::shared_ptr<SMFSource> ms =
boost::dynamic_pointer_cast<SMFSource> ( boost::dynamic_pointer_cast<SMFSource> (
@ -406,7 +406,7 @@ SoundFileBox::audition ()
boost::shared_ptr<Region> r; boost::shared_ptr<Region> r;
if (SMFSource::safe_midi_file_extension (path)) { if (SMFSource::valid_midi_file (path)) {
boost::shared_ptr<SMFSource> ms = boost::shared_ptr<SMFSource> ms =
boost::dynamic_pointer_cast<SMFSource> ( boost::dynamic_pointer_cast<SMFSource> (
@ -1326,7 +1326,7 @@ SoundFileOmega::reset_options ()
/* See if we are thinking about importing any MIDI files */ /* See if we are thinking about importing any MIDI files */
vector<string>::iterator i = paths.begin (); vector<string>::iterator i = paths.begin ();
while (i != paths.end() && SMFSource::safe_midi_file_extension (*i) == false) { while (i != paths.end() && SMFSource::valid_midi_file (*i) == false) {
++i; ++i;
} }
bool const have_a_midi_file = (i != paths.end ()); bool const have_a_midi_file = (i != paths.end ());
@ -1554,7 +1554,7 @@ SoundFileOmega::check_info (const vector<string>& paths, bool& same_size, bool&
src_needed = true; src_needed = true;
} }
} else if (SMFSource::safe_midi_file_extension (*i)) { } else if (SMFSource::valid_midi_file (*i)) {
Evoral::SMF reader; Evoral::SMF reader;
reader.open(*i); reader.open(*i);

View file

@ -71,17 +71,19 @@ TranscodeFfmpeg::TranscodeFfmpeg (std::string f)
if (ffmpeg_exe.empty() || ffprobe_exe.empty()) { if (ffmpeg_exe.empty() || ffprobe_exe.empty()) {
warning << string_compose( warning << string_compose(
_( _(
"No ffprobe or ffmpeg executables could be found on this system.\n" "No ffprobe or ffmpeg executables could be found on this system.\n"
"Video import and export is not possible until you install those tools.\n" "Video import and export is not possible until you install those tools.\n"
"%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n" "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n"
"\n" "\n"
"The tools are included with the %1 releases from ardour.org " "The tools are included with the %1 releases from ardour.org "
"and also available with the video-server at http://x42.github.com/harvid/\n" "and also available with the video-server at http://x42.github.com/harvid/\n"
"\n" "\n"
"Important: the files need to be installed in $PATH and named ffmpeg_harvid and ffprobe_harvid.\n" "Important: the files need to be installed in $PATH and named ffmpeg_harvid and ffprobe_harvid.\n"
"If you already have a suitable ffmpeg installation on your system, we recommend creating " "If you already have a suitable ffmpeg installation on your system, we recommend creating "
"symbolic links from ffmpeg to ffmpeg_harvid and from ffprobe to ffprobe_harvid.\n" "symbolic links from ffmpeg to ffmpeg_harvid and from ffprobe to ffprobe_harvid.\n"
), PROGRAM_NAME) << endmsg; "\n"
"see also http://manual.ardour.org/video-timeline/setup/"
), PROGRAM_NAME) << endmsg;
return; return;
} }
ffexecok = true; ffexecok = true;

View file

@ -123,8 +123,13 @@ VideoServerDialog::VideoServerDialog (Session* s)
else { else {
PBD::warning << PBD::warning <<
string_compose( string_compose(
_("The external video server 'harvid' can not be found. The tool is included with the %1 releases from ardour.org, " _("The external video server 'harvid' can not be found.\n"
"alternatively you can download it from http://x42.github.com/harvid/ or acquire it from your distribution."), PROGRAM_NAME) "The tool is included with the %1 releases from ardour.org, "
"alternatively you can download it from http://x42.github.com/harvid/ "
"or acquire it from your distribution.\n"
"\n"
"see also http://manual.ardour.org/video-timeline/setup/"
), PROGRAM_NAME)
<< endmsg; << endmsg;
} }

View file

@ -765,7 +765,9 @@ VideoTimeLine::find_xjadeo () {
_xjadeo_bin = X_(""); _xjadeo_bin = X_("");
warning << _("Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ " warning << _("Video-monitor 'xjadeo' was not found. Please install http://xjadeo.sf.net/ "
"(a custom path to xjadeo can be specified by setting the XJREMOTE environment variable. " "(a custom path to xjadeo can be specified by setting the XJREMOTE environment variable. "
"It should point to an application compatible with xjadeo's remote-control interface 'xjremote').") "It should point to an application compatible with xjadeo's remote-control interface 'xjremote').\n"
"\n"
"see also http://manual.ardour.org/video-timeline/setup/")
<< endmsg; << endmsg;
} }
} }

View file

@ -85,6 +85,9 @@ public:
void existence_check (); void existence_check ();
virtual void prevent_deletion (); virtual void prevent_deletion ();
void existence_check ();
virtual void prevent_deletion ();
protected: protected:
FileSource (Session& session, DataType type, FileSource (Session& session, DataType type,
const std::string& path, const std::string& path,

View file

@ -36,9 +36,11 @@ template<typename T> class MidiRingBuffer;
/** Standard Midi File (Type 0) Source */ /** Standard Midi File (Type 0) Source */
class LIBARDOUR_API SMFSource : public MidiSource, public FileSource, public Evoral::SMF { class LIBARDOUR_API SMFSource : public MidiSource, public FileSource, public Evoral::SMF {
public: public:
/** Constructor for new internal-to-session files */
SMFSource (Session& session, const std::string& path, Source::Flag flags);
/** Constructor for existing external-to-session files */ /** Constructor for existing external-to-session files */
SMFSource (Session& session, const std::string& path, SMFSource (Session& session, const std::string& path);
Source::Flag flags = Source::Flag(0));
/** Constructor for existing in-session files */ /** Constructor for existing in-session files */
SMFSource (Session& session, const XMLNode&, bool must_exist = false); SMFSource (Session& session, const XMLNode&, bool must_exist = false);
@ -75,6 +77,9 @@ public:
void ensure_disk_file (); void ensure_disk_file ();
static bool safe_midi_file_extension (const std::string& path); static bool safe_midi_file_extension (const std::string& path);
static bool valid_midi_file (const std::string& path);
void prevent_deletion ();
void prevent_deletion (); void prevent_deletion ();

View file

@ -1203,6 +1203,10 @@ PluginInsert::PluginControl::PluginControl (PluginInsert* p, const Evoral::Param
_logarithmic = desc.logarithmic; _logarithmic = desc.logarithmic;
_sr_dependent = desc.sr_dependent; _sr_dependent = desc.sr_dependent;
_toggled = desc.toggled; _toggled = desc.toggled;
if (desc.toggled) {
set_flags(Controllable::Toggle);
}
} }
/** @param val `user' value */ /** @param val `user' value */

View file

@ -35,6 +35,7 @@
#include <glibmm/fileutils.h> #include <glibmm/fileutils.h>
#include "evoral/Control.hpp" #include "evoral/Control.hpp"
#include "evoral/evoral/SMF.hpp"
#include "ardour/event_type_map.h" #include "ardour/event_type_map.h"
#include "ardour/midi_model.h" #include "ardour/midi_model.h"
@ -49,6 +50,7 @@
using namespace ARDOUR; using namespace ARDOUR;
using namespace Glib; using namespace Glib;
using namespace PBD; using namespace PBD;
using namespace Evoral;
/** Constructor used for new internal-to-session files. File cannot exist. */ /** Constructor used for new internal-to-session files. File cannot exist. */
SMFSource::SMFSource (Session& s, const string& path, Source::Flag flags) SMFSource::SMFSource (Session& s, const string& path, Source::Flag flags)
@ -83,6 +85,39 @@ SMFSource::SMFSource (Session& s, const string& path, Source::Flag flags)
_open = true; _open = true;
} }
/** Constructor used for external-to-session files. File must exist. */
SMFSource::SMFSource (Session& s, const string& path)
: Source(s, DataType::MIDI, path, Source::Flag (0))
, MidiSource(s, path, Source::Flag (0))
, FileSource(s, DataType::MIDI, path, string(), Source::Flag (0))
, Evoral::SMF()
, _last_ev_time_beats(0.0)
, _last_ev_time_frames(0)
, _smf_last_read_end (0)
, _smf_last_read_time (0)
{
/* note that origin remains empty */
if (init (_path, false)) {
throw failed_constructor ();
}
assert (Glib::file_test (_path, Glib::FILE_TEST_EXISTS));
existence_check ();
/* file is not opened until write */
if (_flags & Writable) {
return;
}
if (open (_path)) {
throw failed_constructor ();
}
_open = true;
}
/** Constructor used for existing internal-to-session files. */ /** Constructor used for existing internal-to-session files. */
SMFSource::SMFSource (Session& s, const XMLNode& node, bool must_exist) SMFSource::SMFSource (Session& s, const XMLNode& node, bool must_exist)
: Source(s, node) : Source(s, node)
@ -464,6 +499,15 @@ SMFSource::mark_midi_streaming_write_completed (Evoral::Sequence<Evoral::Musical
mark_nonremovable (); mark_nonremovable ();
} }
bool
SMFSource::valid_midi_file (const string& file)
{
if (safe_midi_file_extension (file) ) {
return (SMF::test (file) );
}
return false;
}
bool bool
SMFSource::safe_midi_file_extension (const string& file) SMFSource::safe_midi_file_extension (const string& file)
{ {

View file

@ -272,7 +272,7 @@ SourceFactory::createExternal (DataType type, Session& s, const string& path,
} else if (type == DataType::MIDI) { } else if (type == DataType::MIDI) {
boost::shared_ptr<SMFSource> src (new SMFSource (s, path, SMFSource::Flag(0))); boost::shared_ptr<SMFSource> src (new SMFSource (s, path));
src->load_model (true, true); src->load_model (true, true);
#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
// boost_debug_shared_ptr_mark_interesting (src, "Source"); // boost_debug_shared_ptr_mark_interesting (src, "Source");

View file

@ -52,6 +52,7 @@ public:
SMF() : _smf(0), _smf_track(0), _empty(true) {}; SMF() : _smf(0), _smf_track(0), _empty(true) {};
virtual ~SMF(); virtual ~SMF();
static bool test(const std::string& path);
int open(const std::string& path, int track=1) THROW_FILE_ERROR; int open(const std::string& path, int track=1) THROW_FILE_ERROR;
int create(const std::string& path, int track=1, uint16_t ppqn=19200) THROW_FILE_ERROR; int create(const std::string& path, int track=1, uint16_t ppqn=19200) THROW_FILE_ERROR;
void close() THROW_FILE_ERROR; void close() THROW_FILE_ERROR;

View file

@ -71,6 +71,28 @@ SMF::seek_to_track(int track)
} }
} }
/** Attempt to open the SMF file just to see if it is valid.
*
* \return true on success
* false on failure
*/
bool
SMF::test(const std::string& path)
{
PBD::StdioFileDescriptor d (path, "r");
FILE* f = d.allocate ();
if (f == 0) {
return false;
}
smf_t* test_smf;
if ((test_smf = smf_load (f)) == NULL) {
return false;
}
smf_delete (test_smf);
return true;
}
/** Attempt to open the SMF file for reading and/or writing. /** Attempt to open the SMF file for reading and/or writing.
* *
* \return 0 on success * \return 0 on success

View file

@ -23,7 +23,7 @@ SequenceTest::preserveEventOrderingTest ()
seq->start_write(); seq->start_write();
for (Notes::const_iterator i = test_notes.begin(); i != test_notes.end(); ++i) { for (Notes::const_iterator i = test_notes.begin(); i != test_notes.end(); ++i) {
uint8_t buffer[2]; uint8_t buffer[3];
Event<Time>* event = new Event<Time>( Event<Time>* event = new Event<Time>(
DummyTypeMap::CONTROL, (*i)->on_event().time(), 3, buffer, true DummyTypeMap::CONTROL, (*i)->on_event().time(), 3, buffer, true
); );

View file

@ -32,7 +32,7 @@ using PBD::closedir;
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#include <glib/gstdio.h> #include <glib.h>
#include <glibmm/miscutils.h> #include <glibmm/miscutils.h>
#include "pbd/error.h" #include "pbd/error.h"
@ -122,7 +122,7 @@ PBD::remove_directory (const std::string& dir) {
} }
if (::g_unlink (fullpath.c_str())) { if (::g_unlink (fullpath.c_str())) {
error << string_compose (_("cannot remove file %1 (%2)"), fullpath, strerror (errno)) << endmsg; error << string_compose (_("cannot remove file %1 (%2)"), fullpath, strerror (errno)) << endmsg;
} }
} }
if (::g_rmdir(dir.c_str())) { if (::g_rmdir(dir.c_str())) {

View file

@ -29,6 +29,8 @@
namespace PBD { namespace PBD {
LIBPBD_API int clear_directory (const std::string&, size_t* = 0, std::vector<std::string>* = 0); LIBPBD_API int clear_directory (const std::string&, size_t* = 0, std::vector<std::string>* = 0);
LIBPBD_API void remove_directory (const std::string& dir); LIBPBD_API void remove_directory (const std::string& dir);
int clear_directory (const std::string&, size_t* = 0, std::vector<std::string>* = 0);
void remove_directory (const std::string& dir);
} }
#endif /* __pbd_clear_dir_h__ */ #endif /* __pbd_clear_dir_h__ */

View file

@ -169,7 +169,7 @@ MIDIControllable::control_to_midi (float val)
float control_min = controllable->lower (); float control_min = controllable->lower ();
float control_max = controllable->upper (); float control_max = controllable->upper ();
const float control_range = control_max - control_min; float control_range = control_max - control_min;
if (controllable->is_toggle()) { if (controllable->is_toggle()) {
if (val >= (control_min + (control_range/2.0f))) { if (val >= (control_min + (control_range/2.0f))) {
@ -177,6 +177,14 @@ MIDIControllable::control_to_midi (float val)
} else { } else {
return 0; return 0;
} }
} else {
AutomationControl *actl = dynamic_cast<AutomationControl*> (controllable);
if (actl) {
control_min = actl->internal_to_interface(control_min);
control_max = actl->internal_to_interface(control_max);
control_range = control_max - control_min;
val = actl->internal_to_interface(val);
}
} }
return (val - control_min) / control_range * max_value_for_type (); return (val - control_min) / control_range * max_value_for_type ();
@ -198,8 +206,17 @@ MIDIControllable::midi_to_control (int val)
float control_min = controllable->lower (); float control_min = controllable->lower ();
float control_max = controllable->upper (); float control_max = controllable->upper ();
const float control_range = control_max - control_min; float control_range = control_max - control_min;
AutomationControl *actl = dynamic_cast<AutomationControl*> (controllable);
if (actl) {
if (fv == 0.f) return control_min;
if (fv == 1.f) return control_max;
control_min = actl->internal_to_interface(control_min);
control_max = actl->internal_to_interface(control_max);
control_range = control_max - control_min;
return actl->interface_to_internal((fv * control_range) + control_min);
}
return (fv * control_range) + control_min; return (fv * control_range) + control_min;
} }