#include "utils.h"
#include "color.h"
+#include "i18n.h"
+
using namespace ARDOUR;
using namespace PBD;
using namespace Editing;
{
}
-int
-AudioStreamView::set_height (gdouble h)
-{
- /* limit the values to something sane-ish */
- if (h < 10.0 || h > 1000.0) {
- return -1;
- }
-
- StreamView::set_height(h);
-
- for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
- (*i)->set_height (h);
- }
-
- return 0;
-}
-
int
AudioStreamView::set_samples_per_unit (gdouble spp)
{
void
AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wait_for_waves)
{
- AudioRegionView *region_view;
+ AudioRegionView *region_view = 0;
ENSURE_GUI_THREAD (bind (mem_fun (*this, &AudioStreamView::add_region_view), r));
region_view = new TapeAudioRegionView (canvas_group, _trackview, region,
_samples_per_unit, region_color);
break;
+ default:
+ fatal << string_compose (_("programming error: %1"), "illegal track mode in ::add_region_view_internal") << endmsg;
+ /*NOTREACHED*/
+
}
region_view->init (region_color, wait_for_waves);
region_view->set_amplitude_above_axis(_amplitude_above_axis);
region_views.push_front (region_view);
+
+ /* if its the special single-sample length that we use for rec-regions, make it
+ insensitive to events
+ */
+
+ if (region->length() == 1) {
+ region_view->set_sensitive (false);
+ }
+
/* if this was the first one, then lets query the waveform scale and shape.
otherwise, we set it to the current value */
}
void
-AudioStreamView::playlist_modified ()
+AudioStreamView::playlist_modified_weak (boost::weak_ptr<Diskstream> ds)
+{
+ boost::shared_ptr<Diskstream> sp (ds.lock());
+ if (!sp) {
+ return;
+ }
+
+ playlist_modified (sp);
+}
+
+void
+AudioStreamView::playlist_modified (boost::shared_ptr<Diskstream> ds)
{
- ENSURE_GUI_THREAD (mem_fun (*this, &AudioStreamView::playlist_modified));
+ /* we do not allow shared_ptr<T> to be bound to slots */
+ ENSURE_GUI_THREAD (bind (mem_fun (*this, &AudioStreamView::playlist_modified_weak), ds));
- StreamView::playlist_modified();
+ StreamView::playlist_modified (ds);
/* make sure xfades are on top and all the regionviews are stacked correctly. */
playlist_connections.push_back (apl->NewCrossfade.connect (mem_fun (*this, &AudioStreamView::add_crossfade)));
}
+void
+AudioStreamView::add_crossfade_weak (boost::weak_ptr<Crossfade> crossfade)
+{
+ boost::shared_ptr<Crossfade> sp (crossfade.lock());
+
+ if (!sp) {
+ return;
+ }
+
+ add_crossfade (sp);
+}
+
void
AudioStreamView::add_crossfade (boost::shared_ptr<Crossfade> crossfade)
{
AudioRegionView* lview = 0;
AudioRegionView* rview = 0;
+
+ /* we do not allow shared_ptr<T> to be bound to slots */
- ENSURE_GUI_THREAD (bind (mem_fun (*this, &AudioStreamView::add_crossfade), crossfade));
+ ENSURE_GUI_THREAD (bind (mem_fun (*this, &AudioStreamView::add_crossfade_weak), boost::weak_ptr<Crossfade> (crossfade)));
/* first see if we already have a CrossfadeView for this Crossfade */
for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
if ((*i)->crossfade == crossfade) {
- if (!crossfades_visible) {
+ if (!crossfades_visible || layer_display == Stacked) {
(*i)->hide();
} else {
(*i)->show ();
crossfade->Invalidated.connect (mem_fun (*this, &AudioStreamView::remove_crossfade));
crossfade_views.push_back (cv);
- if (!Config->get_xfades_visible() || !crossfades_visible) {
+ if (!Config->get_xfades_visible() || !crossfades_visible || layer_display == Stacked) {
cv->hide ();
}
}
void
-AudioStreamView::remove_crossfade (boost::shared_ptr<Crossfade> xfade)
+AudioStreamView::remove_crossfade (boost::shared_ptr<Region> r)
{
- ENSURE_GUI_THREAD (bind (mem_fun (*this, &AudioStreamView::remove_crossfade), xfade));
+ ENSURE_GUI_THREAD (bind (mem_fun (*this, &AudioStreamView::remove_crossfade), r));
+
+ boost::shared_ptr<Crossfade> xfade = boost::dynamic_pointer_cast<Crossfade> (r);
for (list<CrossfadeView*>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
if ((*i)->crossfade == xfade) {
for (xi = crossfade_views.begin(); xi != crossfade_views.end(); ++xi) {
(*xi)->set_valid (false);
- if ((*xi)->visible()) {
+ if ((*xi)->visible() && layer_display != Stacked) {
(*xi)->show ();
}
}
boost::shared_ptr<AudioDiskstream> ads = boost::dynamic_pointer_cast<AudioDiskstream>(_trackview.get_diskstream());
assert(ads);
- for (uint32_t n=0; n < ads->n_channels().get(DataType::AUDIO); ++n) {
+ for (uint32_t n=0; n < ads->n_channels().n_audio(); ++n) {
boost::shared_ptr<AudioFileSource> src = boost::static_pointer_cast<AudioFileSource> (ads->write_source (n));
if (src) {
sources.push_back (src);
rec_data_ready_map[src] = true;
- if (rec_data_ready_map.size() == _trackview.get_diskstream()->n_channels().get(DataType::AUDIO)) {
+ if (rec_data_ready_map.size() == _trackview.get_diskstream()->n_channels().n_audio()) {
this->update_rec_regions ();
rec_data_ready_map.clear();
}
AudioStreamView::reveal_xfades_involving (AudioRegionView& rv)
{
for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
- if ((*i)->crossfade->involves (rv.audio_region()) && (*i)->visible()) {
+ if ((*i)->crossfade->involves (rv.audio_region()) && (*i)->visible() && layer_display != Stacked) {
(*i)->show ();
}
}
}
}
+void
+AudioStreamView::update_contents_y_position_and_height ()
+{
+ StreamView::update_contents_y_position_and_height ();
+
+ for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
+ if (layer_display == Overlaid) {
+ (*i)->show ();
+ (*i)->set_y_position_and_height (0, height);
+ } else {
+ (*i)->hide ();
+ }
+ }
+}