#include "gtk2ardour-config.h"
#endif
+#include "i18n.h"
+
#include <map>
#include <cerrno>
#include <sstream>
#include <unistd.h>
#include <limits.h>
-#include <sys/stat.h>
#include <gtkmm/box.h>
#include <gtkmm/stock.h>
+
+#include "pbd/gstdio_compat.h"
#include <glibmm/fileutils.h>
#include "pbd/convert.h"
#include "ardour/auditioner.h"
#include "ardour/audioregion.h"
#include "ardour/audiofilesource.h"
+#include "ardour/midi_region.h"
#include "ardour/smf_source.h"
#include "ardour/region_factory.h"
#include "ardour/source_factory.h"
#include "prompter.h"
#include "sfdb_ui.h"
#include "editing.h"
-#include "utils.h"
#include "gain_meter.h"
#include "main_clock.h"
#include "public_editor.h"
+#include "timers.h"
+#include "ui_config.h"
#include "sfdb_freesound_mootcher.h"
-#include "i18n.h"
-
using namespace ARDOUR;
using namespace PBD;
using namespace std;
case ImportAsTapeTrack:
return _("as new tape tracks");
}
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
return _("as new tracks");
}
if (SMFSource::valid_midi_file (path)) {
- boost::shared_ptr<SMFSource> ms =
- boost::dynamic_pointer_cast<SMFSource> (
- SourceFactory::createExternal (DataType::MIDI, *_session,
- path, 0, Source::Flag (0), false));
+ boost::shared_ptr<SMFSource> ms;
+ try {
+ ms = boost::dynamic_pointer_cast<SMFSource> (
+ SourceFactory::createExternal (DataType::MIDI, *_session,
+ path, 0, Source::Flag (0), false));
+ } catch (const std::exception& e) {
+ error << string_compose(_("Could not read file: %1 (%2)."),
+ path, e.what()) << endmsg;
+ }
preview_label.set_markup (_("<b>Midi File Information</b>"));
afs = boost::dynamic_pointer_cast<AudioFileSource> (
SourceFactory::createExternal (DataType::AUDIO, *_session,
path, n,
- Source::Flag (0), false));
+ Source::Flag (ARDOUR::AudioFileSource::NoPeakFile), false));
if (afs->sample_rate() != _session->nominal_frame_rate()) {
boost::shared_ptr<SrcFileSource> sfs (new SrcFileSource(*_session, afs, _src_quality));
srclist.push_back(sfs);
r = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, plist, false));
}
+ frameoffset_t audition_position = 0;
+ switch(_import_position) {
+ case ImportAtTimestamp:
+ audition_position = 0;
+ break;
+ case ImportAtPlayhead:
+ audition_position = _session->transport_frame();
+ break;
+ case ImportAtStart:
+ audition_position = _session->current_start_frame();
+ break;
+ case ImportAtEditPoint:
+ audition_position = PublicEditor::instance().get_preferred_edit_position ();
+ break;
+ }
+ r->set_position(audition_position);
+
_session->audition_region(r);
}
, matches (0)
, _status (0)
, _done (false)
- , ok_button (Stock::OK)
- , cancel_button (Stock::CANCEL)
- , apply_button (Stock::APPLY)
+ , import_button (_("Import"))
+ , close_button (Stock::CLOSE)
, gm (0)
{
-#ifdef GTKOSX
- chooser.add_shortcut_folder_uri("file:///Library/GarageBand/Apple Loops");
- chooser.add_shortcut_folder_uri("file:///Library/Audio/Apple Loops");
- chooser.add_shortcut_folder_uri("file:///Library/Application Support/GarageBand/Instrument Library/Sampler/Sampler Files");
- chooser.add_shortcut_folder_uri("file:///Volumes");
+#ifdef __APPLE__
+ try {
+ /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */
+ chooser.add_shortcut_folder_uri("file:///Library/GarageBand/Apple Loops");
+ chooser.add_shortcut_folder_uri("file:///Library/Audio/Apple Loops");
+ chooser.add_shortcut_folder_uri("file:///Library/Application Support/GarageBand/Instrument Library/Sampler/Sampler Files");
+ }
+ catch (Glib::Error & e) {
+ std::cerr << "sfdb.add_shortcut_folder() threw Glib::Error " << e.what() << std::endl;
+ }
#endif
+ Gtkmm2ext::add_volume_shortcuts (chooser);
//add the file chooser
chooser.set_border_width (12);
-
+
audio_and_midi_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun (*this, &SoundFileBrowser::on_audio_and_midi_filter));
audio_and_midi_filter.set_name (_("Audio and MIDI files"));
-
+
audio_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun(*this, &SoundFileBrowser::on_audio_filter));
audio_filter.set_name (_("Audio files"));
-
+
midi_filter.add_custom (FILE_FILTER_FILENAME, sigc::mem_fun(*this, &SoundFileBrowser::on_midi_filter));
midi_filter.set_name (_("MIDI files"));
-
+
matchall_filter.add_pattern ("*.*");
matchall_filter.set_name (_("All files"));
-
+
chooser.add_filter (audio_and_midi_filter);
chooser.add_filter (audio_filter);
chooser.add_filter (midi_filter);
chooser.signal_update_preview().connect(sigc::mem_fun(*this, &SoundFileBrowser::update_preview));
chooser.signal_file_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::chooser_file_activated));
-#ifdef GTKOSX
+#ifdef __APPLE__
/* some broken redraw behaviour - this is a bandaid */
chooser.signal_selection_changed().connect (mem_fun (chooser, &Widget::queue_draw));
#endif
-
+
if (!persistent_folder.empty()) {
chooser.set_current_folder (persistent_folder);
}
notebook.append_page (chooser, _("Browse Files"));
-
+
hpacker.set_spacing (6);
hpacker.pack_start (notebook, true, true);
hpacker.pack_start (preview, false, false);
VBox* vbox;
HBox* hbox;
-
-
+
+
hbox = manage(new HBox);
hbox->pack_start (found_entry);
hbox->pack_start (found_search_btn);
-
+
Gtk::ScrolledWindow *scroll = manage(new ScrolledWindow);
scroll->add(found_list_view);
scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
-
+
vbox = manage(new VBox);
vbox->pack_start (*hbox, PACK_SHRINK);
vbox->pack_start (*scroll);
-
+
found_list_view.append_column(_("Paths"), found_list_columns.pathname);
-
+
found_list_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_list_view_selected));
-
+
found_list_view.signal_row_activated().connect (sigc::mem_fun (*this, &SoundFileBrowser::found_list_view_activated));
-
+
found_search_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_search_clicked));
found_entry.signal_activate().connect(sigc::mem_fun(*this, &SoundFileBrowser::found_search_clicked));
-
+
notebook.append_page (*vbox, _("Search Tags"));
//add freesound search
+#ifdef FREESOUND_GOT_FIXED
HBox* passbox;
Label* label;
-
+
passbox = manage(new HBox);
passbox->set_spacing (6);
-
+
label = manage (new Label);
label->set_text (_("Tags:"));
passbox->pack_start (*label, false, false);
passbox->pack_start (freesound_entry, true, true);
-
+
label = manage (new Label);
label->set_text (_("Sort:"));
passbox->pack_start (*label, false, false);
passbox->pack_start (freesound_sort, false, false);
freesound_sort.clear_items();
-
+
// Order of the following must correspond with enum sortMethod
- // in sfdb_freesound_mootcher.h
+ // in sfdb_freesound_mootcher.h
freesound_sort.append_text(_("None"));
freesound_sort.append_text(_("Longest"));
freesound_sort.append_text(_("Shortest"));
freesound_sort.append_text(_("Highest rated"));
freesound_sort.append_text(_("Lowest rated"));
freesound_sort.set_active(0);
-
+
passbox->pack_start (freesound_search_btn, false, false);
passbox->pack_start (freesound_more_btn, false, false);
freesound_more_btn.set_label(_("More"));
passbox->pack_start (freesound_similar_btn, false, false);
freesound_similar_btn.set_label(_("Similar"));
freesound_similar_btn.set_sensitive(false);
-
+
scroll = manage(new ScrolledWindow);
scroll->add(freesound_list_view);
scroll->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
-
+
vbox = manage(new VBox);
vbox->set_spacing (3);
vbox->pack_start (*passbox, PACK_SHRINK);
freesound_list_view.get_column(3)->set_alignment(0.5);
freesound_list_view.get_column(4)->set_alignment(0.5);
freesound_list_view.get_column(5)->set_alignment(0.5);
-
+
freesound_list_view.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_list_view_selected));
freesound_list_view.set_tooltip_column(1);
freesound_more_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_more_clicked));
freesound_similar_btn.signal_clicked().connect(sigc::mem_fun(*this, &SoundFileBrowser::freesound_similar_clicked));
notebook.append_page (*vbox, _("Search Freesound"));
+#endif
notebook.set_size_request (500, -1);
notebook.signal_switch_page().connect (sigc::hide_return (sigc::hide (sigc::hide (sigc::mem_fun (*this, &SoundFileBrowser::reset_options)))));
Gtk::HButtonBox* button_box = manage (new HButtonBox);
button_box->set_layout (BUTTONBOX_END);
- button_box->pack_start (cancel_button, false, false);
- cancel_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &SoundFileBrowser::do_something), RESPONSE_CANCEL));
- if (persistent) {
- button_box->pack_start (apply_button, false, false);
- apply_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &SoundFileBrowser::do_something), RESPONSE_APPLY));
- }
+ button_box->pack_start (close_button, false, false);
+ close_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &SoundFileBrowser::do_something), RESPONSE_CLOSE));
- button_box->pack_start (ok_button, false, false);
- ok_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &SoundFileBrowser::do_something), RESPONSE_OK));
+ button_box->pack_start (import_button, false, false);
+ import_button.signal_clicked().connect (sigc::bind (sigc::mem_fun (*this, &SoundFileBrowser::do_something), RESPONSE_OK));
- Gtkmm2ext::UI::instance()->set_tip (ok_button, _("Press to import selected files and close this window"));
- Gtkmm2ext::UI::instance()->set_tip (apply_button, _("Press to import selected files and leave this window open"));
- Gtkmm2ext::UI::instance()->set_tip (cancel_button, _("Press to close this window without importing any files"));
+ Gtkmm2ext::UI::instance()->set_tip (import_button, _("Press to import selected files"));
+ Gtkmm2ext::UI::instance()->set_tip (close_button, _("Press to close this window without importing any files"));
vpacker.pack_end (*button_box, false, false);
void
SoundFileBrowser::set_action_sensitive (bool yn)
{
- ok_button.set_sensitive (yn);
- apply_button.set_sensitive (yn);
+ import_button.set_sensitive (yn);
}
void
boost::shared_ptr<Route> r = _session->the_auditioner ();
- gm->set_controls (r, r->shared_peak_meter(), r->amp());
+ gm->set_controls (r, r->shared_peak_meter(), r->amp(), r->gain_control());
gm->set_fader_name (X_("GainFader"));
meter_packer.set_border_width (12);
void
SoundFileBrowser::start_metering ()
{
- metering_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (sigc::mem_fun(*this, &SoundFileBrowser::meter));
+ metering_connection = Timers::super_rapid_connect (sigc::mem_fun(*this, &SoundFileBrowser::meter));
}
void
// there's a single item selected in the freesound list
//XXX make a function to be used to construct the actual file name both here and in the mootcher
Gtk::TreeIter row = freesound_list->get_iter(*rows.begin());
- std::string selected_ID = (*row)[freesound_list_columns.id];
+ std::string selected_ID = (*row)[freesound_list_columns.id];
if (ID == selected_ID) {
// the selected item in the freesound list is the item that has just finished downloading
chooser.set_filename(file);
prev_cursor = gdk_window_get_cursor (get_window()->gobj());
gdk_window_set_cursor (get_window()->gobj(), gdk_cursor_new(GDK_WATCH));
gdk_flush();
-
+
std::string theString = mootcher.searchSimilar(id);
-
+
gdk_window_set_cursor (get_window()->gobj(), prev_cursor);
handle_freesound_results(theString);
}
gdk_flush();
std::string theString = mootcher.searchText(
- search_string,
+ search_string,
freesound_page,
-#ifdef GTKOSX
+#ifdef __APPLE__
"", // OSX eats anything incl mp3
#else
"type:wav OR type:aiff OR type:flac OR type:aif OR type:ogg OR type:oga",
vector<string>::iterator i;
for (i = filenames.begin(); i != filenames.end(); ++i) {
- struct stat buf;
- if ((!stat((*i).c_str(), &buf)) && S_ISREG(buf.st_mode)) {
+ GStatBuf buf;
+ if ((!g_stat((*i).c_str(), &buf)) && S_ISREG(buf.st_mode)) {
results.push_back (*i);
}
}
bool
SoundFileOmega::reset_options ()
{
+ if (_import_active) {
+ _reset_post_import = true;
+ return true;
+ }
+
vector<string> paths = get_paths ();
if (paths.empty()) {
to do embedding (or if we are importing a MIDI file).
*/
- if (Config->get_only_copy_imported_files()) {
+ if (UIConfiguration::instance().get_only_copy_imported_files()) {
copy_files_btn.set_sensitive (false);
} else {
copy_files_btn.set_sensitive (false);
if (selected_audio_track_cnt > 0) {
if (channel_combo.get_active_text().length()) {
ImportDisposition id = get_channel_disposition();
-
+
switch (id) {
case Editing::ImportDistinctFiles:
if (selected_audio_track_cnt == paths.size()) {
action_strings.push_back (importmode2string (ImportToTrack));
}
break;
-
+
case Editing::ImportDistinctChannels:
/* XXX it would be nice to allow channel-per-selected track
but its too hard we don't want to deal with all the
different per-file + per-track channel configurations.
*/
break;
-
+
default:
action_strings.push_back (importmode2string (ImportToTrack));
break;
}
}
}
-
+
} else {
/* MIDI ONLY */
/* We must copy MIDI files or those from Freesound
* or any file if we are under nsm control */
bool const must_copy = _session->get_nsm_state() || have_a_midi_file || notebook.get_current_page() == 2;
-
- if (Config->get_only_copy_imported_files()) {
+
+ if (UIConfiguration::instance().get_only_copy_imported_files()) {
if (selection_can_be_embedded_with_links && !must_copy) {
copy_files_btn.set_sensitive (true);
if (must_copy) {
copy_files_btn.set_active (true);
- }
+ }
copy_files_btn.set_sensitive (!must_copy);
}
bool
SoundFileOmega::check_link_status (const Session* s, const vector<string>& paths)
{
+#ifdef PLATFORM_WINDOWS
+ return false;
+#else
std::string tmpdir(Glib::build_filename (s->session_directory().sound_path(), "linktest"));
bool ret = false;
- if (mkdir (tmpdir.c_str(), 0744)) {
+ if (g_mkdir (tmpdir.c_str(), 0744)) {
if (errno != EEXIST) {
return false;
}
goto out;
}
- unlink (tmpc);
+ ::g_unlink (tmpc);
}
ret = true;
out:
- rmdir (tmpdir.c_str());
+ g_rmdir (tmpdir.c_str());
return ret;
+#endif
}
SoundFileChooser::SoundFileChooser (string title, ARDOUR::Session* s)
return paths.front();
}
-SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s,
- uint32_t selected_audio_tracks,
- uint32_t selected_midi_tracks,
+SoundFileOmega::SoundFileOmega (string title, ARDOUR::Session* s,
+ uint32_t selected_audio_tracks,
+ uint32_t selected_midi_tracks,
bool persistent,
Editing::ImportMode mode_hint)
: SoundFileBrowser (title, s, persistent)
, copy_files_btn ( _("Copy files to session"))
, selected_audio_track_cnt (selected_audio_tracks)
, selected_midi_track_cnt (selected_midi_tracks)
+ , _import_active (false)
+ , _reset_post_import (false)
{
VBox* vbox;
HBox* hbox;
str.push_back (_("playhead"));
str.push_back (_("session start"));
set_popdown_strings (where_combo, str);
- where_combo.set_active_text (str.front());
+ where_combo.set_active_text (str.back());
+ where_combo.signal_changed().connect (sigc::mem_fun (*this, &SoundFileOmega::where_combo_changed));
Label* l = manage (new Label);
- l->set_markup (_("<b>Add files as ...</b>"));
+ l->set_markup (_("<b>Add files ...</b>"));
vbox = manage (new VBox);
vbox->set_border_width (12);
hbox->pack_start (*vbox, false, false);
options.pack_start (*hbox, false, false);
- /* dummy entry for action combo so that it doesn't look odd if we
- come up with no tracks selected.
- */
-
- str.clear ();
- str.push_back (importmode2string (mode_hint));
- set_popdown_strings (action_combo, str);
- action_combo.set_active_text (str.front());
- action_combo.set_sensitive (false);
-
l = manage (new Label);
l->set_markup (_("<b>Insert at</b>"));
hbox->pack_start (*vbox, false, false);
options.pack_start (*hbox, false, false);
+ l = manage (new Label);
+ l->set_markup (_("<b>Instrument</b>"));
+
+ vbox = manage (new VBox);
+ vbox->set_border_width (12);
+ vbox->set_spacing (6);
+ vbox->pack_start (*l, false, false);
+ vbox->pack_start (instrument_combo, false, false);
+ hbox = manage (new HBox);
+ hbox->pack_start (*vbox, false, false);
+ options.pack_start (*hbox, false, false);
+
str.clear ();
str.push_back (_("Best"));
str.push_back (_("Good"));
src_combo.set_sensitive (false);
src_combo.signal_changed().connect (sigc::mem_fun (*this, &SoundFileOmega::src_combo_changed));
- reset_options ();
-
action_combo.signal_changed().connect (sigc::mem_fun (*this, &SoundFileOmega::reset_options_noret));
channel_combo.signal_changed().connect (sigc::mem_fun (*this, &SoundFileOmega::reset_options_noret));
selects a file to import, which in turn prevents the size of the dialog from jumping
around. */
- vector<string> t;
- t.push_back (_("one track per file"));
- t.push_back (_("one track per channel"));
- t.push_back (_("sequence files"));
- t.push_back (_("all files in one region"));
- set_popdown_strings (channel_combo, t);
+ str.clear ();
+ str.push_back (_("one track per file"));
+ str.push_back (_("one track per channel"));
+ str.push_back (_("sequence files"));
+ str.push_back (_("all files in one region"));
+ set_popdown_strings (channel_combo, str);
+
+ str.clear ();
+ str.push_back (importmode2string (ImportAsTrack));
+ str.push_back (importmode2string (ImportToTrack));
+ str.push_back (importmode2string (ImportAsRegion));
+ str.push_back (importmode2string (ImportAsTapeTrack));
+ set_popdown_strings (action_combo, str);
+ action_combo.set_active_text (importmode2string(mode_hint));
- t.clear ();
- t.push_back (importmode2string (ImportAsTrack));
- t.push_back (importmode2string (ImportToTrack));
- t.push_back (importmode2string (ImportAsRegion));
- t.push_back (importmode2string (ImportAsTapeTrack));
- set_popdown_strings (action_combo, t);
+ reset (selected_audio_tracks, selected_midi_tracks);
}
void
preview.set_src_quality(get_src_quality());
}
+void
+SoundFileOmega::where_combo_changed()
+{
+ preview.set_import_position(get_position());
+}
+
ImportDisposition
SoundFileOmega::get_channel_disposition () const
{
if (x == disposition_map.end()) {
fatal << string_compose (_("programming error: %1 (%2)"), "unknown string for import disposition", str) << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
return x->second;
{
SoundFileBrowser::do_something (action);
- if (action == RESPONSE_CANCEL) {
+ if (action == RESPONSE_CLOSE) {
hide ();
return;
}
/* lets do it */
-
+
vector<string> paths = get_paths ();
ImportPosition pos = get_position ();
ImportMode mode = get_mode ();
ImportDisposition chns = get_channel_disposition ();
+ PluginInfoPtr instrument = instrument_combo.selected_instrument();
framepos_t where;
-
+
switch (pos) {
case ImportAtEditPoint:
where = PublicEditor::instance().get_preferred_edit_position ();
where = _session->current_start_frame();
break;
}
-
+
SrcQuality quality = get_src_quality();
-
+
+ _import_active = true;
+
if (copy_files_btn.get_active()) {
- PublicEditor::instance().do_import (paths, chns, mode, quality, where);
+ PublicEditor::instance().do_import (paths, chns, mode, quality, where, instrument);
} else {
- PublicEditor::instance().do_embed (paths, chns, mode, where);
+ PublicEditor::instance().do_embed (paths, chns, mode, where, instrument);
}
-
- if (action == RESPONSE_OK) {
- hide ();
+
+ _import_active = false;
+
+ if (_reset_post_import) {
+ _reset_post_import = false;
+ reset_options ();
}
}
-
+