diff options
author | Robin Gareus <robin@gareus.org> | 2014-01-22 15:26:23 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2014-01-22 15:30:27 +0100 |
commit | acaf46c27d151438a13da7c16e3c02aefb646f55 (patch) | |
tree | 5c18731ba1fafbd7e8d1cf70a4eca7b58e053524 /gtk2_ardour/sfdb_ui.cc | |
parent | 8aa6585702037810d20e14cae3b73b5ebf2b122b (diff) |
prepare GUI for auditioning midi files
Diffstat (limited to 'gtk2_ardour/sfdb_ui.cc')
-rw-r--r-- | gtk2_ardour/sfdb_ui.cc | 134 |
1 files changed, 92 insertions, 42 deletions
diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index 826dde8b7b..39b7a33525 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -279,6 +279,38 @@ SoundFileBox::setup_labels (const string& filename) string error_msg; + if (SMFSource::safe_midi_file_extension (path)) { + + boost::shared_ptr<SMFSource> ms = + boost::dynamic_pointer_cast<SMFSource> ( + SourceFactory::createExternal (DataType::MIDI, *_session, + path, 0, Source::Flag (0), false)); + + preview_label.set_markup (_("<b>Midi File Information</b>")); + + format_text.set_text ("MIDI"); + samplerate_value.set_text ("-"); + tags_entry.get_buffer()->set_text (""); + timecode_clock.set (0); + tags_entry.set_sensitive (false); + + if (ms) { + channels_value.set_text (to_string(ms->num_tracks(), std::dec)); + length_clock.set (ms->length(ms->timeline_position())); + } else { + channels_value.set_text (""); + length_clock.set (0); + } + + if (_session && ms) { + play_btn.set_sensitive (true); + } else { + play_btn.set_sensitive (false); + } + + return true; + } + if(!AudioFileSource::get_soundfile_info (filename, sf_info, error_msg)) { preview_label.set_markup (_("<b>Sound File Information</b>")); @@ -363,11 +395,6 @@ SoundFileBox::audition () return; } - if (SMFSource::safe_midi_file_extension (path)) { - error << _("Auditioning of MIDI files is not yet supported") << endmsg; - return; - } - _session->cancel_audition(); if (!Glib::file_test (path, Glib::FILE_TEST_EXISTS)) { @@ -376,51 +403,74 @@ SoundFileBox::audition () } boost::shared_ptr<Region> r; - SourceList srclist; - boost::shared_ptr<AudioFileSource> afs; - bool old_sbp = AudioSource::get_build_peakfiles (); - - /* don't even think of building peakfiles for these files */ - - AudioSource::set_build_peakfiles (false); - - for (int n = 0; n < sf_info.channels; ++n) { - try { - afs = boost::dynamic_pointer_cast<AudioFileSource> ( - SourceFactory::createExternal (DataType::AUDIO, *_session, - path, n, - Source::Flag (0), false)); - if (afs->sample_rate() != _session->nominal_frame_rate()) { - boost::shared_ptr<SrcFileSource> sfs (new SrcFileSource(*_session, afs, _src_quality)); - srclist.push_back(sfs); - } else { - srclist.push_back(afs); - } - } catch (failed_constructor& err) { - error << _("Could not access soundfile: ") << path << endmsg; - AudioSource::set_build_peakfiles (old_sbp); - return; + if (SMFSource::safe_midi_file_extension (path)) { + + boost::shared_ptr<SMFSource> ms = + boost::dynamic_pointer_cast<SMFSource> ( + SourceFactory::createExternal (DataType::MIDI, *_session, + path, 0, Source::Flag (0), false)); + + string rname = region_name_from_path (ms->path(), false); + + PropertyList plist; + + plist.add (ARDOUR::Properties::start, 0); + plist.add (ARDOUR::Properties::length, ms->length(ms->timeline_position())); + plist.add (ARDOUR::Properties::name, rname); + plist.add (ARDOUR::Properties::layer, 0); + + r = boost::dynamic_pointer_cast<MidiRegion> (RegionFactory::create (boost::dynamic_pointer_cast<Source>(ms), plist, false)); + assert(r); + + } else { + + SourceList srclist; + boost::shared_ptr<AudioFileSource> afs; + bool old_sbp = AudioSource::get_build_peakfiles (); + + /* don't even think of building peakfiles for these files */ + + AudioSource::set_build_peakfiles (false); + + for (int n = 0; n < sf_info.channels; ++n) { + try { + afs = boost::dynamic_pointer_cast<AudioFileSource> ( + SourceFactory::createExternal (DataType::AUDIO, *_session, + path, n, + Source::Flag (0), false)); + if (afs->sample_rate() != _session->nominal_frame_rate()) { + boost::shared_ptr<SrcFileSource> sfs (new SrcFileSource(*_session, afs, _src_quality)); + srclist.push_back(sfs); + } else { + srclist.push_back(afs); + } + + } catch (failed_constructor& err) { + error << _("Could not access soundfile: ") << path << endmsg; + AudioSource::set_build_peakfiles (old_sbp); + return; + } } - } - AudioSource::set_build_peakfiles (old_sbp); + AudioSource::set_build_peakfiles (old_sbp); - if (srclist.empty()) { - return; - } + if (srclist.empty()) { + return; + } - afs = boost::dynamic_pointer_cast<AudioFileSource> (srclist[0]); - string rname = region_name_from_path (afs->path(), false); + afs = boost::dynamic_pointer_cast<AudioFileSource> (srclist[0]); + string rname = region_name_from_path (afs->path(), false); - PropertyList plist; + PropertyList plist; - plist.add (ARDOUR::Properties::start, 0); - plist.add (ARDOUR::Properties::length, srclist[0]->length(srclist[0]->timeline_position())); - plist.add (ARDOUR::Properties::name, rname); - plist.add (ARDOUR::Properties::layer, 0); + plist.add (ARDOUR::Properties::start, 0); + plist.add (ARDOUR::Properties::length, srclist[0]->length(srclist[0]->timeline_position())); + plist.add (ARDOUR::Properties::name, rname); + plist.add (ARDOUR::Properties::layer, 0); - r = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, plist, false)); + r = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, plist, false)); + } _session->audition_region(r); } |