virtualize audioregion, make crossfade IS-A audioregion
authorPaul Davis <paul@linuxaudiosystems.com>
Mon, 21 May 2007 22:12:06 +0000 (22:12 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 21 May 2007 22:12:06 +0000 (22:12 +0000)
git-svn-id: svn://localhost/ardour2/trunk@1889 d708f5d6-7413-0410-9779-e7cbd77b26cf

19 files changed:
gtk2_ardour/audio_clock.cc
gtk2_ardour/audio_streamview.cc
gtk2_ardour/audio_streamview.h
gtk2_ardour/crossfade_edit.cc
gtk2_ardour/icons/crossfade_in_default.svg [new file with mode: 0644]
gtk2_ardour/icons/crossfade_out_default.svg [new file with mode: 0644]
libs/ardour/ardour/audioplaylist.h
libs/ardour/ardour/audioregion.h
libs/ardour/ardour/automation_event.h
libs/ardour/ardour/crossfade.h
libs/ardour/ardour/midi_region.h
libs/ardour/ardour/region.h
libs/ardour/audio_playlist.cc
libs/ardour/audioregion.cc
libs/ardour/crossfade.cc
libs/ardour/midi_playlist.cc
libs/ardour/midi_region.cc
libs/ardour/playlist.cc
libs/ardour/region.cc

index 8c24f429984e87ee89a637d9518fccb4cb2f8d70..d0e6b9ad76befe6b06f3815e381e13668593ce2d 100644 (file)
@@ -1818,18 +1818,12 @@ AudioClock::build_ops_menu ()
        ops_menu = new Menu;
        MenuList& ops_items = ops_menu->items();
        ops_menu->set_name ("ArdourContextMenu");
-
-       Menu *mode_menu = manage (new Menu);
-       MenuList& mode_items = mode_menu->items();
-       mode_menu->set_name ("ArdourContextMenu");
        
-       mode_items.push_back (MenuElem (_("Timecode"), bind (mem_fun(*this, &AudioClock::set_mode), SMPTE)));
-       mode_items.push_back (MenuElem (_("Bars:Beats"), bind (mem_fun(*this, &AudioClock::set_mode), BBT)));
-       mode_items.push_back (MenuElem (_("Minutes:Seconds"), bind (mem_fun(*this, &AudioClock::set_mode), MinSec)));
-       mode_items.push_back (MenuElem (_("Audio Frames"), bind (mem_fun(*this, &AudioClock::set_mode), Frames)));
-       mode_items.push_back (MenuElem (_("Off"), bind (mem_fun(*this, &AudioClock::set_mode), Off)));
-
-       ops_items.push_back (MenuElem (_("Mode"), *mode_menu));
+       ops_items.push_back (MenuElem (_("Timecode"), bind (mem_fun(*this, &AudioClock::set_mode), SMPTE)));
+       ops_items.push_back (MenuElem (_("Bars:Beats"), bind (mem_fun(*this, &AudioClock::set_mode), BBT)));
+       ops_items.push_back (MenuElem (_("Minutes:Seconds"), bind (mem_fun(*this, &AudioClock::set_mode), MinSec)));
+       ops_items.push_back (MenuElem (_("Audio Frames"), bind (mem_fun(*this, &AudioClock::set_mode), Frames)));
+       ops_items.push_back (MenuElem (_("Off"), bind (mem_fun(*this, &AudioClock::set_mode), Off)));
 }
 
 void
index 4ca3ad38b92f2388e54222d4441255e29ab83a2f..09510e8d428c8a52bd6a65423f20288081a5c26a 100644 (file)
@@ -348,9 +348,11 @@ AudioStreamView::add_crossfade (boost::shared_ptr<Crossfade> crossfade)
 }
 
 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) {
index fc707e97e7c5c5e700194605e1194088952eb739..0f51889ca29a18eff2705d4449eebf60e79e3cd3 100644 (file)
@@ -95,7 +95,7 @@ class AudioStreamView : public StreamView
 
        void add_crossfade (boost::shared_ptr<ARDOUR::Crossfade>);
        void add_crossfade_weak (boost::weak_ptr<ARDOUR::Crossfade>);
-       void remove_crossfade (boost::shared_ptr<ARDOUR::Crossfade>);
+       void remove_crossfade (boost::shared_ptr<ARDOUR::Region>);
 
        void color_handler (ColorID id, uint32_t val);
 
index 26d61035ba566447abfd8a0e3ba5589c8d1970d6..ae63f8c6fa78963578dfac114f63a3a3aa7622dc 100644 (file)
@@ -882,6 +882,15 @@ CrossfadeEditor::build_presets ()
        p->push_back (PresetPoint (1, 1));
        fade_in_presets->push_back (p);
 
+       p = new Preset ("crossfade_in_default");
+       p->push_back (PresetPoint (0, 0));
+       p->push_back (PresetPoint (0.1, 0.01));
+       p->push_back (PresetPoint (0.2, 0.03));
+       p->push_back (PresetPoint (0.8, 0.97));
+       p->push_back (PresetPoint (0.9, 0.99));
+       p->push_back (PresetPoint (1, 1));
+       fade_in_presets->push_back (p);
+       
        /* FADE OUT */
 
        // p = new Preset ("hiout.xpm");
@@ -932,6 +941,15 @@ CrossfadeEditor::build_presets ()
        p->push_back (PresetPoint (0, 1));
        p->push_back (PresetPoint (1, 0));
        fade_out_presets->push_back (p);
+       
+       p = new Preset ("crossfade_out_default");
+       p->push_back (PresetPoint (0, 1));
+       p->push_back (PresetPoint (0.1, 0.99));
+       p->push_back (PresetPoint (0.2, 0.97));
+       p->push_back (PresetPoint (0.8, 0.03));
+       p->push_back (PresetPoint (0.9, 0.01));
+       p->push_back (PresetPoint (1, 0));
+       fade_out_presets->push_back (p);
 }
 
 void
diff --git a/gtk2_ardour/icons/crossfade_in_default.svg b/gtk2_ardour/icons/crossfade_in_default.svg
new file mode 100644 (file)
index 0000000..35e4080
--- /dev/null
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   id="svg2226"
+   sodipodi:version="0.32"
+   inkscape:version="0.45.1"
+   version="1.0"
+   sodipodi:docbase="/home/markus/src/ardour-contrib"
+   sodipodi:docname="crossfade_in_default.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:export-filename="/home/markus/src/ardour-contrib/stdin.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs2228">
+    <filter
+       inkscape:collect="always"
+       x="-0.15679207"
+       width="1.3135841"
+       y="-0.15023329"
+       height="1.3004666"
+       id="filter5448">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.3122991"
+         id="feGaussianBlur5450" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       id="filter5468">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.13459478"
+         id="feGaussianBlur5470" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="16"
+     inkscape:cy="16"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     width="25px"
+     height="25px"
+     inkscape:object-points="false"
+     inkscape:grid-points="true"
+     inkscape:window-width="980"
+     inkscape:window-height="881"
+     inkscape:window-x="106"
+     inkscape:window-y="23" />
+  <metadata
+     id="metadata2231">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <g
+       id="g5304"
+       style="filter:url(#filter5448)">
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/home/markus/src/ardour-contrib/stdin.png"
+         sodipodi:nodetypes="ccccc"
+         id="path3364"
+         d="M 22,23.446516 C 20.874493,23.446516 11,23.535819 4,23.535819 C 15,23.428852 4.4939054,4 18,4 C 19.525085,4 20.324302,4 22,4 C 22,7.3981402 22,21.74689 22,23.446516 z "
+         style="fill:#236c99;fill-opacity:1;fill-rule:evenodd;stroke:#236c99;stroke-width:0.11291049;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/home/markus/src/ardour-contrib/stdin.png"
+         sodipodi:nodetypes="cssc"
+         id="path2234"
+         d="M 4,22.464181 C 11.694787,22.464181 9.1135021,13.428978 10.97521,7.9992932 C 11.774887,5.6670305 13.394313,4 17,4 C 19.446516,4 23,4 21,4"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#0bb6c2;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.78289473;stroke-miterlimit:4;stroke-dasharray:none" />
+    </g>
+    <image
+       y="-159.8214"
+       x="52.168793"
+       id="image2369"
+       height="24"
+       width="24"
+       sodipodi:absref="/sw/ardour2/gtk2_ardour/icons/crossfade_out_transition.png"
+       xlink:href="/sw/ardour2/gtk2_ardour/icons/crossfade_out_transition.png" />
+    <path
+       id="path2386"
+       d="M 48.844104,-105.43559 C 47.952303,-105.79544 47.594104,-109.03758 47.594104,-116.74965 C 47.594104,-128.64018 47.666281,-128.77331 54.112997,-128.77331 C 57.381124,-128.77331 57.54141,-128.57504 60.281209,-121.14358 C 61.828301,-116.94723 64.54001,-111.92741 66.307228,-109.98842 C 68.074446,-108.04944 69.285389,-106.08281 68.998211,-105.61815 C 68.448145,-104.72812 50.989316,-104.56998 48.844104,-105.43559 z "
+       style="fill:#c6c9c9" />
+    <path
+       id="path2384"
+       d="M 48.594104,-116.8281 L 48.594104,-127.88289 L 53.144306,-127.5781 L 57.694508,-127.27331 L 60.106961,-120.35371 C 61.68993,-115.81332 63.805457,-112.1171 66.259707,-109.60371 L 70,-105.77331 L 59.297052,-105.77331 L 48.594104,-105.77331 L 48.594104,-116.8281 z "
+       style="fill:#a1ced5" />
+    <path
+       id="path2382"
+       d="M 48.67522,-115.07138 C 48.455846,-126.84011 48.810632,-127.77331 53.50426,-127.77331 L 57.200438,-127.77331 L 59.485444,-120.67859 C 60.942082,-116.15588 63.049503,-112.16812 65.29864,-109.67859 L 68.826829,-105.77331 L 58.837685,-105.77331 L 48.848541,-105.77331 L 48.67522,-115.07138 z "
+       style="fill:#98bdce" />
+    <path
+       id="path2380"
+       d="M 49.810272,-116.52331 L 50.094104,-127.27331 L 53.722845,-127.57644 C 57.174233,-127.86477 57.384535,-127.70394 58.025766,-124.28589 C 59.080364,-118.6644 62.054291,-112.57323 65.477502,-109.02331 L 68.6115,-105.77331 L 59.06897,-105.77331 L 49.526441,-105.77331 L 49.810272,-116.52331 z "
+       style="fill:#78a8c1" />
+    <path
+       id="path2378"
+       d="M 50.594104,-116.77331 L 50.594104,-127.77331 L 53.875996,-127.77331 C 56.623432,-127.77331 57.190416,-127.38029 57.357627,-125.35992 C 57.896234,-118.85205 63.823165,-108.01431 67.676363,-106.4915 C 68.45612,-106.18334 64.931604,-105.89568 59.844104,-105.85225 L 50.594104,-105.77331 L 50.594104,-116.77331 z "
+       style="fill:#5499b2" />
+    <path
+       id="path2376"
+       d="M 6.742252,-196.77331 L 6.742252,-207.77331 L 9.334845,-207.77331 C 10.760771,-207.77331 11.652862,-207.49873 11.317271,-207.16314 C 10.42623,-206.2721 14.96346,-194.31743 17.718929,-190.29609 C 19.018178,-188.39996 20.984103,-186.66792 22.087652,-186.44713 C 23.191201,-186.22633 20.189937,-185.98439 15.418178,-185.90949 L 6.742252,-185.77331 L 6.742252,-196.77331 z "
+       style="fill:#2e8aa7" />
+    <path
+       id="path2374"
+       d="M 58.066461,-166.38315 C 58.666254,-166.6342 58.938947,-170.60468 58.747841,-176.3042 C 58.485958,-184.11458 58.689241,-185.80669 59.889433,-185.80669 C 60.69255,-185.80669 61.645316,-184.56919 62.006691,-183.05669 C 63.169516,-178.18981 68.993201,-166.87499 70.553939,-166.45029 C 71.385826,-166.22391 68.691461,-166.02202 64.566461,-166.00164 C 60.441461,-165.98126 57.516461,-166.15294 58.066461,-166.38315 z "
+       style="fill:#27709b" />
+    <g
+       id="g5342"
+       transform="translate(-0.2315996,-0.714181)"
+       style="filter:url(#filter5468)">
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/home/markus/src/ardour-contrib/stdin.png"
+         sodipodi:nodetypes="ccccc"
+         id="path5344"
+         d="M 22,23.446516 C 20.874493,23.446516 11,23.535819 4,23.535819 C 15,23.428852 4.4939054,4 18,4 C 19.525085,4 20.324302,4 22,4 C 22,7.3981402 22,21.74689 22,23.446516 z "
+         style="fill:#236c99;fill-opacity:1;fill-rule:evenodd;stroke:#236c99;stroke-width:0.11291049;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/home/markus/src/ardour-contrib/stdin.png"
+         sodipodi:nodetypes="cssc"
+         id="path5346"
+         d="M 4,22.464181 C 11.694787,22.464181 9.1135021,13.428978 10.97521,7.9992932 C 11.774887,5.6670305 13.394313,4 17,4 C 19.446516,4 23,4 21,4"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#0bb6c2;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.78289472" />
+    </g>
+  </g>
+</svg>
diff --git a/gtk2_ardour/icons/crossfade_out_default.svg b/gtk2_ardour/icons/crossfade_out_default.svg
new file mode 100644 (file)
index 0000000..d2852ee
--- /dev/null
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25"
+   height="25"
+   id="svg2226"
+   sodipodi:version="0.32"
+   inkscape:version="0.45.1"
+   version="1.0"
+   sodipodi:docbase="/home/markus/src/ardour-contrib"
+   sodipodi:docname="crossfade_out_default.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:export-filename="/home/markus/src/ardour-contrib/crossfade_out_default.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs2228">
+    <filter
+       inkscape:collect="always"
+       x="-0.15679207"
+       width="1.3135841"
+       y="-0.15023329"
+       height="1.3004666"
+       id="filter5448">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.3122991"
+         id="feGaussianBlur5450" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       id="filter5468">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.13459478"
+         id="feGaussianBlur5470" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="16"
+     inkscape:cy="16"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     width="25px"
+     height="25px"
+     inkscape:object-points="false"
+     inkscape:grid-points="true"
+     inkscape:window-width="980"
+     inkscape:window-height="881"
+     inkscape:window-x="59"
+     inkscape:window-y="0" />
+  <metadata
+     id="metadata2231">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <g
+       id="g5304"
+       style="filter:url(#filter5448)"
+       transform="matrix(-1,0,0,1,25.355627,0)">
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/home/markus/src/ardour-contrib/stdin.png"
+         sodipodi:nodetypes="ccccc"
+         id="path3364"
+         d="M 22,23.446516 C 20.874493,23.446516 11,23.535819 4,23.535819 C 15,23.428852 4.4939054,4 18,4 C 19.525085,4 20.324302,4 22,4 C 22,7.3981402 22,21.74689 22,23.446516 z "
+         style="fill:#236c99;fill-opacity:1;fill-rule:evenodd;stroke:#236c99;stroke-width:0.11291049;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/home/markus/src/ardour-contrib/stdin.png"
+         sodipodi:nodetypes="cssc"
+         id="path2234"
+         d="M 4,22.464181 C 11.694787,22.464181 9.1135021,13.428978 10.97521,7.9992932 C 11.774887,5.6670305 13.394313,4 17,4 C 19.446516,4 23,4 21,4"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#0bb6c2;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.78289472" />
+    </g>
+    <image
+       y="-159.8214"
+       x="52.168793"
+       id="image2369"
+       height="24"
+       width="24"
+       sodipodi:absref="/sw/ardour2/gtk2_ardour/icons/crossfade_out_transition.png"
+       xlink:href="/sw/ardour2/gtk2_ardour/icons/crossfade_out_transition.png" />
+    <path
+       id="path2386"
+       d="M 48.844104,-105.43559 C 47.952303,-105.79544 47.594104,-109.03758 47.594104,-116.74965 C 47.594104,-128.64018 47.666281,-128.77331 54.112997,-128.77331 C 57.381124,-128.77331 57.54141,-128.57504 60.281209,-121.14358 C 61.828301,-116.94723 64.54001,-111.92741 66.307228,-109.98842 C 68.074446,-108.04944 69.285389,-106.08281 68.998211,-105.61815 C 68.448145,-104.72812 50.989316,-104.56998 48.844104,-105.43559 z "
+       style="fill:#c6c9c9" />
+    <path
+       id="path2384"
+       d="M 48.594104,-116.8281 L 48.594104,-127.88289 L 53.144306,-127.5781 L 57.694508,-127.27331 L 60.106961,-120.35371 C 61.68993,-115.81332 63.805457,-112.1171 66.259707,-109.60371 L 70,-105.77331 L 59.297052,-105.77331 L 48.594104,-105.77331 L 48.594104,-116.8281 z "
+       style="fill:#a1ced5" />
+    <path
+       id="path2382"
+       d="M 48.67522,-115.07138 C 48.455846,-126.84011 48.810632,-127.77331 53.50426,-127.77331 L 57.200438,-127.77331 L 59.485444,-120.67859 C 60.942082,-116.15588 63.049503,-112.16812 65.29864,-109.67859 L 68.826829,-105.77331 L 58.837685,-105.77331 L 48.848541,-105.77331 L 48.67522,-115.07138 z "
+       style="fill:#98bdce" />
+    <path
+       id="path2380"
+       d="M 49.810272,-116.52331 L 50.094104,-127.27331 L 53.722845,-127.57644 C 57.174233,-127.86477 57.384535,-127.70394 58.025766,-124.28589 C 59.080364,-118.6644 62.054291,-112.57323 65.477502,-109.02331 L 68.6115,-105.77331 L 59.06897,-105.77331 L 49.526441,-105.77331 L 49.810272,-116.52331 z "
+       style="fill:#78a8c1" />
+    <path
+       id="path2378"
+       d="M 50.594104,-116.77331 L 50.594104,-127.77331 L 53.875996,-127.77331 C 56.623432,-127.77331 57.190416,-127.38029 57.357627,-125.35992 C 57.896234,-118.85205 63.823165,-108.01431 67.676363,-106.4915 C 68.45612,-106.18334 64.931604,-105.89568 59.844104,-105.85225 L 50.594104,-105.77331 L 50.594104,-116.77331 z "
+       style="fill:#5499b2" />
+    <path
+       id="path2376"
+       d="M 6.742252,-196.77331 L 6.742252,-207.77331 L 9.334845,-207.77331 C 10.760771,-207.77331 11.652862,-207.49873 11.317271,-207.16314 C 10.42623,-206.2721 14.96346,-194.31743 17.718929,-190.29609 C 19.018178,-188.39996 20.984103,-186.66792 22.087652,-186.44713 C 23.191201,-186.22633 20.189937,-185.98439 15.418178,-185.90949 L 6.742252,-185.77331 L 6.742252,-196.77331 z "
+       style="fill:#2e8aa7" />
+    <path
+       id="path2374"
+       d="M 58.066461,-166.38315 C 58.666254,-166.6342 58.938947,-170.60468 58.747841,-176.3042 C 58.485958,-184.11458 58.689241,-185.80669 59.889433,-185.80669 C 60.69255,-185.80669 61.645316,-184.56919 62.006691,-183.05669 C 63.169516,-178.18981 68.993201,-166.87499 70.553939,-166.45029 C 71.385826,-166.22391 68.691461,-166.02202 64.566461,-166.00164 C 60.441461,-165.98126 57.516461,-166.15294 58.066461,-166.38315 z "
+       style="fill:#27709b" />
+    <g
+       id="g5342"
+       transform="matrix(-1,0,0,1,25.587227,-0.714181)"
+       style="filter:url(#filter5468)">
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/home/markus/src/ardour-contrib/stdin.png"
+         sodipodi:nodetypes="ccccc"
+         id="path5344"
+         d="M 22,23.446516 C 20.874493,23.446516 11,23.535819 4,23.535819 C 15,23.428852 4.4939054,4 18,4 C 19.525085,4 20.324302,4 22,4 C 22,7.3981402 22,21.74689 22,23.446516 z "
+         style="fill:#236c99;fill-opacity:1;fill-rule:evenodd;stroke:#236c99;stroke-width:0.11291049;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/home/markus/src/ardour-contrib/stdin.png"
+         sodipodi:nodetypes="cssc"
+         id="path5346"
+         d="M 4,22.464181 C 11.694787,22.464181 9.1135021,13.428978 10.97521,7.9992932 C 11.774887,5.6670305 13.394313,4 17,4 C 19.446516,4 23,4 21,4"
+         style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#0bb6c2;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.78289472" />
+    </g>
+  </g>
+</svg>
index 39f41d5d1cf1fd4dea52e8fbf2b7b5bd2d1fb4c3..4acbc9ad510328d52fac709004fcbb1a299e777e 100644 (file)
@@ -75,7 +75,7 @@ class AudioPlaylist : public ARDOUR::Playlist
        Crossfades      _crossfades;
        Crossfades      _pending_xfade_adds;
 
-       void crossfade_invalidated (boost::shared_ptr<Crossfade>);
+       void crossfade_invalidated (boost::shared_ptr<Region>);
        XMLNode& state (bool full_state);
        void dump () const;
 
index ccc0d82f2aeecaddc5be45701c5e34264d2993d8..f844d45ef122a0290f96d4dcde36cd37ed0ff0bb 100644 (file)
@@ -77,14 +77,14 @@ class AudioRegion : public Region
        
        virtual nframes_t read_at (Sample *buf, Sample *mixdown_buf,
                                   float *gain_buf, nframes_t position, nframes_t cnt, 
-                                  uint32_t       chan_n      = 0,
-                                  nframes_t read_frames = 0,
-                                  nframes_t skip_frames = 0) const;
+                                  uint32_t       chan_n      = 0) const;
        
        virtual nframes_t master_read_at (Sample *buf, Sample *mixdown_buf, 
                                          float *gain_buf,
                                          nframes_t position, nframes_t cnt, uint32_t chan_n=0) const;
        
+       virtual nframes_t read_raw_internal (Sample*, nframes_t, nframes_t) const;
+
        XMLNode& state (bool);
        int      set_state (const XMLNode&);
 
@@ -137,11 +137,11 @@ class AudioRegion : public Region
        AudioRegion (boost::shared_ptr<AudioSource>, nframes_t start, nframes_t length, const string& name, layer_t = 0, Region::Flag flags = Region::DefaultFlags);
        AudioRegion (SourceList &, nframes_t start, nframes_t length, const string& name, layer_t = 0, Region::Flag flags = Region::DefaultFlags);
        AudioRegion (boost::shared_ptr<const AudioRegion>, nframes_t start, nframes_t length, const string& name, layer_t = 0, Region::Flag flags = Region::DefaultFlags);
-       AudioRegion (boost::shared_ptr<const AudioRegion>);
        AudioRegion (boost::shared_ptr<AudioSource>, const XMLNode&);
        AudioRegion (SourceList &, const XMLNode&);
 
   private:
+       void init ();
        void set_default_fades ();
        void set_default_fade_in ();
        void set_default_fade_out ();
@@ -150,10 +150,8 @@ class AudioRegion : public Region
        void recompute_gain_at_start ();
 
        nframes_t _read_at (const SourceList&, Sample *buf, Sample *mixdown_buffer, 
-                                float *gain_buffer, nframes_t position, nframes_t cnt, 
-                                uint32_t chan_n = 0,
-                                nframes_t read_frames = 0,
-                                nframes_t skip_frames = 0) const;
+                           float *gain_buffer, nframes_t position, nframes_t cnt, 
+                           uint32_t chan_n = 0) const;
 
        void recompute_at_start ();
        void recompute_at_end ();
@@ -174,6 +172,11 @@ class AudioRegion : public Region
        uint32_t          _fade_out_disabled;
 
   protected:
+       /* default constructor for derived (compound) types */
+
+       AudioRegion (nframes_t, nframes_t, std::string name); 
+       AudioRegion (boost::shared_ptr<const AudioRegion>);
+
        int set_live_state (const XMLNode&, Change&, bool send);
        
        virtual bool verify_start (nframes_t);
@@ -182,8 +185,6 @@ class AudioRegion : public Region
        virtual bool verify_length (nframes_t);
        /*virtual void recompute_at_start () = 0;
        virtual void recompute_at_end () = 0;*/
-
-       virtual nframes_t read_raw_internal (Sample*, nframes_t, nframes_t) const;
 };
 
 } /* namespace ARDOUR */
index 007bad7259052240f5d8019962c5de64859bd776..5a9792c11da63da747244b3e2fe341d0588ab1ae 100644 (file)
@@ -199,7 +199,7 @@ class AutomationList : public PBD::StatefulDestructible
            std::pair<AutomationList::iterator,AutomationList::iterator> range;
        };
 
-       LookupCache lookup_cache;
+       mutable LookupCache lookup_cache;
 
        AutoState  _state;
        AutoStyle  _style;
index 7346e645fb136e8fbf795258ab2ec597eebe6ff3..61a30f1c0f3c60391e320aeaa819de51a517d099 100644 (file)
@@ -23,7 +23,6 @@
 #include <vector>
 #include <algorithm>
 #include <boost/shared_ptr.hpp>
-#include <boost/enable_shared_from_this.hpp>
 
 #include <sigc++/signal.h>
 
@@ -40,7 +39,7 @@ namespace ARDOUR {
 class AudioRegion;
 class Playlist;
 
-class Crossfade : public PBD::StatefulDestructible, public boost::enable_shared_from_this<ARDOUR::Crossfade>
+class Crossfade : public ARDOUR::AudioRegion
 {
   public:
 
@@ -66,7 +65,7 @@ class Crossfade : public PBD::StatefulDestructible, public boost::enable_shared_
        /* copy constructor to copy a crossfade with new regions. used (for example)
           when a playlist copy is made 
        */
-       Crossfade (const Crossfade &, boost::shared_ptr<ARDOUR::AudioRegion>, boost::shared_ptr<ARDOUR::AudioRegion>);
+       Crossfade (boost::shared_ptr<Crossfade>, boost::shared_ptr<ARDOUR::AudioRegion>, boost::shared_ptr<ARDOUR::AudioRegion>);
        
        /* the usual XML constructor */
 
@@ -82,10 +81,8 @@ class Crossfade : public PBD::StatefulDestructible, public boost::enable_shared_
        boost::shared_ptr<ARDOUR::AudioRegion> out() const { return _out; }
        
        nframes_t read_at (Sample *buf, Sample *mixdown_buffer, 
-                               float *gain_buffer, nframes_t position, nframes_t cnt, 
-                               uint32_t chan_n,
-                               nframes_t read_frames = 0,
-                               nframes_t skip_frames = 0);
+                          float *gain_buffer, nframes_t position, nframes_t cnt, 
+                          uint32_t chan_n) const;
        
        bool refresh ();
 
@@ -105,13 +102,11 @@ class Crossfade : public PBD::StatefulDestructible, public boost::enable_shared_
                return (_in == a && _out == b) || (_in == b && _out == a);
        }
 
-       nframes_t length() const { return _length; }
        nframes_t overlap_length() const;
-       nframes_t position() const { return _position; }
 
        void invalidate();
 
-       sigc::signal<void,boost::shared_ptr<Crossfade> > Invalidated;
+       sigc::signal<void,boost::shared_ptr<Region> > Invalidated;
        sigc::signal<void,Change>     StateChanged;
 
        bool covers (nframes_t frame) const {
@@ -133,6 +128,11 @@ class Crossfade : public PBD::StatefulDestructible, public boost::enable_shared_
        Curve& fade_out() { return _fade_out; }
 
        nframes_t set_length (nframes_t);
+
+       bool is_dependent() const { return true; }
+       bool depends_on (boost::shared_ptr<Region> other) const { 
+               return other == _in || other == _out; 
+       }
        
        static nframes_t short_xfade_length() { return _short_xfade_length; }
        static void set_short_xfade_length (nframes_t n);
@@ -151,14 +151,14 @@ class Crossfade : public PBD::StatefulDestructible, public boost::enable_shared_
        bool                 _active;
        bool                 _in_update;
        OverlapType           overlap_type;
-       nframes_t       _length;
-       nframes_t       _position;
        AnchorPoint          _anchor_point;
        bool                 _follow_overlap;
        bool                 _fixed;
        int32_t               layer_relation;
-       Curve _fade_in;
-       Curve _fade_out;
+
+
+       mutable Curve _fade_in;
+       mutable Curve _fade_out;
 
        static Sample* crossfade_buffer_out;
        static Sample* crossfade_buffer_in;
@@ -166,6 +166,9 @@ class Crossfade : public PBD::StatefulDestructible, public boost::enable_shared_
        void initialize ();
        int  compute (boost::shared_ptr<ARDOUR::AudioRegion>, boost::shared_ptr<ARDOUR::AudioRegion>, CrossfadeModel);
        bool update ();
+
+  protected:
+       nframes_t read_raw_internal (Sample*, nframes_t, nframes_t) const;      
 };
 
 
index 200599541e28c264bbde999bd0326b7f55275a26..2b783a92a8cd77438ee041c5fb34fc411b230961 100644 (file)
@@ -51,11 +51,9 @@ class MidiRegion : public Region
        boost::shared_ptr<MidiSource> midi_source (uint32_t n=0) const;
 
        nframes_t read_at (MidiRingBuffer& dst,
-                       nframes_t position,
-                       nframes_t dur, 
-                       uint32_t       chan_n      = 0,
-                       nframes_t read_frames = 0,
-                       nframes_t skip_frames = 0) const;
+                          nframes_t position,
+                          nframes_t dur, 
+                          uint32_t       chan_n      = 0) const;
 
        nframes_t master_read_at (MidiRingBuffer& dst,
                        nframes_t position,
@@ -85,11 +83,9 @@ class MidiRegion : public Region
 
   private:
        nframes_t _read_at (const SourceList&, MidiRingBuffer& dst,
-               nframes_t position,
-               nframes_t dur, 
-               uint32_t chan_n = 0,
-               nframes_t read_frames = 0,
-               nframes_t skip_frames = 0) const;
+                           nframes_t position,
+                           nframes_t dur, 
+                           uint32_t chan_n = 0) const;
 
        void recompute_at_start ();
        void recompute_at_end ();
index 64d4ee1d83a2d7d83e88c18df91555228192921a..c3aac3dfa881959ad563911aaaa84c6525fc2594 100644 (file)
@@ -177,7 +177,9 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro
        uint32_t                  n_channels()          const { return _sources.size(); }
 
        std::vector<string> master_source_names();
-
+       
+       const SourceList& sources() const { return _sources; }
+       const SourceList& master_sources() const { return _master_sources; }
 
        /* serialization */
        
@@ -191,6 +193,9 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro
        uint64_t last_layer_op() const { return _last_layer_op; }
        void set_last_layer_op (uint64_t when);
 
+       virtual bool is_dependent() const { return false; }
+       virtual bool depends_on (boost::shared_ptr<Region> other) const { return false; }
+
   protected:
        friend class RegionFactory;
 
@@ -204,6 +209,10 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro
        Region (boost::shared_ptr<Source> src, const XMLNode&);
        Region (SourceList& srcs, const XMLNode&);
 
+       /* this one is for derived types of derived types */
+
+       Region (nframes_t start, nframes_t length, const string& name, DataType, layer_t = 0, Flag flags = DefaultFlags);
+
   protected:
        XMLNode& get_short_state (); /* used only by Session */
 
@@ -221,9 +230,7 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro
        virtual bool verify_length (nframes_t);
        virtual void recompute_at_start () = 0;
        virtual void recompute_at_end () = 0;
-       
 
-       PBD::ID                 _id;
        string                  _name;
        DataType                _type;
        Flag                    _flags;
index 929101fe6d005098cdbd8f0f619da0c2984058bc..246384689e0f501c2118afc117ca50da3695e763 100644 (file)
@@ -79,7 +79,7 @@ AudioPlaylist::AudioPlaylist (boost::shared_ptr<const AudioPlaylist> other, stri
                                        if ((*xfades)->out() == ar2) {
                                                boost::shared_ptr<AudioRegion>in  = boost::dynamic_pointer_cast<AudioRegion>(*in_n);
                                                boost::shared_ptr<AudioRegion>out = boost::dynamic_pointer_cast<AudioRegion>(*out_n);
-                                               boost::shared_ptr<Crossfade> new_fade = boost::shared_ptr<Crossfade> (new Crossfade (*(*xfades), in, out));
+                                               boost::shared_ptr<Crossfade> new_fade = boost::shared_ptr<Crossfade> (new Crossfade (*xfades, in, out));
                                                add_crossfade(new_fade);
                                                break;
                                        }
@@ -125,8 +125,6 @@ AudioPlaylist::read (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, nf
 {
        nframes_t ret = cnt;
        nframes_t end;
-       nframes_t read_frames;
-       nframes_t skip_frames;
 
        /* optimizing this memset() away involves a lot of conditionals
           that may well cause more of a hit due to cache misses 
@@ -151,8 +149,6 @@ AudioPlaylist::read (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, nf
 
        end =  start + cnt - 1;
 
-       read_frames = 0;
-       skip_frames = 0;
        _read_data_count = 0;
 
        map<uint32_t,vector<boost::shared_ptr<Region> > > relevant_regions;
@@ -191,7 +187,7 @@ AudioPlaylist::read (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, nf
                for (vector<boost::shared_ptr<Region> >::iterator i = r.begin(); i != r.end(); ++i) {
                        boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion>(*i);
                        assert(ar);
-                       ar->read_at (buf, mixdown_buffer, gain_buffer, start, cnt, chan_n, read_frames, skip_frames);
+                       ar->read_at (buf, mixdown_buffer, gain_buffer, start, cnt, chan_n);
                        _read_data_count += ar->read_data_count();
                }
                
@@ -309,19 +305,19 @@ AudioPlaylist::finalize_split_region (boost::shared_ptr<Region> o, boost::shared
                
                if ((*x)->_in == orig) {
                        if (! (*x)->covers(right->position())) {
-                               fade = boost::shared_ptr<Crossfade> (new Crossfade (**x, left, (*x)->_out));
+                               fade = boost::shared_ptr<Crossfade> (new Crossfade (*x, left, (*x)->_out));
                        } else {
                                // Overlap, the crossfade is copied on the left side of the right region instead
-                               fade = boost::shared_ptr<Crossfade> (new Crossfade (**x, right, (*x)->_out));
+                               fade = boost::shared_ptr<Crossfade> (new Crossfade (*x, right, (*x)->_out));
                        }
                }
                
                if ((*x)->_out == orig) {
                        if (! (*x)->covers(right->position())) {
-                               fade = boost::shared_ptr<Crossfade> (new Crossfade (**x, (*x)->_in, right));
+                               fade = boost::shared_ptr<Crossfade> (new Crossfade (*x, (*x)->_in, right));
                        } else {
                                // Overlap, the crossfade is copied on the right side of the left region instead
-                               fade = boost::shared_ptr<Crossfade> (new Crossfade (**x, (*x)->_in, left));
+                               fade = boost::shared_ptr<Crossfade> (new Crossfade (*x, (*x)->_in, left));
                        }
                }
                
@@ -478,9 +474,10 @@ void AudioPlaylist::notify_crossfade_added (boost::shared_ptr<Crossfade> x)
 }
 
 void
-AudioPlaylist::crossfade_invalidated (boost::shared_ptr<Crossfade> xfade)
+AudioPlaylist::crossfade_invalidated (boost::shared_ptr<Region> r)
 {
        Crossfades::iterator i;
+       boost::shared_ptr<Crossfade> xfade = boost::dynamic_pointer_cast<Crossfade> (r);
 
        xfade->in()->resume_fade_in ();
        xfade->out()->resume_fade_out ();
index 09fe669867c6b7315e3c947b75949f5095c708be..55a187972695758d9a550f37493577749c4c465e 100644 (file)
@@ -59,6 +59,27 @@ Change AudioRegion::EnvelopeActiveChanged = ARDOUR::new_change();
 Change AudioRegion::ScaleAmplitudeChanged = ARDOUR::new_change();
 Change AudioRegion::EnvelopeChanged       = ARDOUR::new_change();
 
+void
+AudioRegion::init ()
+{
+       _scale_amplitude = 1.0;
+
+       set_default_fades ();
+       set_default_envelope ();
+
+       listen_to_my_curves ();
+}
+
+/* constructor for use by derived types only */
+AudioRegion::AudioRegion (nframes_t start, nframes_t length, string name)
+       : Region (start, length, name, DataType::AUDIO),
+         _fade_in (0.0, 2.0, 1.0, false),
+         _fade_out (0.0, 2.0, 1.0, false),
+         _envelope (0.0, 2.0, 1.0, false)
+{
+       init ();
+}
+
 /** Basic AudioRegion constructor (one channel) */
 AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, nframes_t length)
        : Region (src, start, length, PBD::basename_nosuffix(src->name()), DataType::AUDIO, 0,  Region::Flag(Region::DefaultFlags|Region::External)),
@@ -71,12 +92,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, n
                afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
        }
 
-       _scale_amplitude = 1.0;
-
-       set_default_fades ();
-       set_default_envelope ();
-
-       listen_to_my_curves ();
+       init ();
 }
 
 /* Basic AudioRegion constructor (one channel) */
@@ -91,12 +107,7 @@ AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, nframes_t start, n
                afs->HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioRegion::source_offset_changed));
        }
 
-       _scale_amplitude = 1.0;
-
-       set_default_fades ();
-       set_default_envelope ();
-
-       listen_to_my_curves ();
+       init ();
 }
 
 /* Basic AudioRegion constructor (many channels) */
@@ -106,12 +117,7 @@ AudioRegion::AudioRegion (SourceList& srcs, nframes_t start, nframes_t length, c
        , _fade_out (0.0, 2.0, 1.0, false)
        , _envelope (0.0, 2.0, 1.0, false)
 {
-       _scale_amplitude = 1.0;
-
-       set_default_fades ();
-       set_default_envelope ();
-
-       listen_to_my_curves ();
+       init ();
 }
 
 
@@ -308,24 +314,21 @@ AudioRegion::read_peaks (PeakData *buf, nframes_t npeaks, nframes_t offset, nfra
 }
 
 ARDOUR::nframes_t
-AudioRegion::read_at (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, nframes_t position, 
-                     nframes_t cnt, 
-                     uint32_t chan_n, nframes_t read_frames, nframes_t skip_frames) const
+AudioRegion::read_at (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, nframes_t position, nframes_t cnt, uint32_t chan_n) const
 {
-       return _read_at (_sources, buf, mixdown_buffer, gain_buffer, position, cnt, chan_n, read_frames, skip_frames);
+       return _read_at (_sources, buf, mixdown_buffer, gain_buffer, position, cnt, chan_n);
 }
 
 ARDOUR::nframes_t
 AudioRegion::master_read_at (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, nframes_t position, 
                             nframes_t cnt, uint32_t chan_n) const
 {
-       return _read_at (_master_sources, buf, mixdown_buffer, gain_buffer, position, cnt, chan_n, 0, 0);
+       return _read_at (_master_sources, buf, mixdown_buffer, gain_buffer, position, cnt, chan_n);
 }
 
 ARDOUR::nframes_t
 AudioRegion::_read_at (const SourceList& srcs, Sample *buf, Sample *mixdown_buffer, float *gain_buffer,
-                      nframes_t position, nframes_t cnt, 
-                      uint32_t chan_n, nframes_t read_frames, nframes_t skip_frames) const
+                      nframes_t position, nframes_t cnt, uint32_t chan_n) const
 {
        // cerr << _name << "._read_at(" << position << ") - " << _position << endl;
 
index f142d57628a1c1bbbb0df231a1be0cf5717aab3d..847741832d6045a1cd89bca507f6d22a3e4f0847 100644 (file)
@@ -28,6 +28,7 @@
 #include <ardour/playlist.h>
 #include <ardour/utils.h>
 #include <ardour/session.h>
+#include <ardour/source.h>
 
 #include "i18n.h"
 #include <locale.h>
@@ -76,26 +77,26 @@ Crossfade::Crossfade (boost::shared_ptr<AudioRegion> in, boost::shared_ptr<Audio
                      nframes_t length,
                      nframes_t position,
                      AnchorPoint ap)
-       : _fade_in (0.0, 2.0, 1.0), // linear (gain coefficient) => -inf..+6dB
+       : AudioRegion (position, length, "foobar"),
+         _fade_in (0.0, 2.0, 1.0), // linear (gain coefficient) => -inf..+6dB
          _fade_out (0.0, 2.0, 1.0) // linear (gain coefficient) => -inf..+6dB
+
 {
        _in = in;
        _out = out;
        
-       _length = length;
-       _position = position;
        _anchor_point = ap;
-
        _follow_overlap = false;
 
        _active = Config->get_xfades_active ();
        _fixed = true;
-               
+
        initialize ();
 }
 
 Crossfade::Crossfade (boost::shared_ptr<AudioRegion> a, boost::shared_ptr<AudioRegion> b, CrossfadeModel model, bool act)
-       : _fade_in (0.0, 2.0, 1.0), // linear (gain coefficient) => -inf..+6dB
+       : AudioRegion (0, 0, "foobar"),
+         _fade_in (0.0, 2.0, 1.0), // linear (gain coefficient) => -inf..+6dB
          _fade_out (0.0, 2.0, 1.0) // linear (gain coefficient) => -inf..+6dB
 {
        _in_update = false;
@@ -108,11 +109,15 @@ Crossfade::Crossfade (boost::shared_ptr<AudioRegion> a, boost::shared_ptr<AudioR
        _active = act;
 
        initialize ();
+
+
 }
 
 Crossfade::Crossfade (const Playlist& playlist, XMLNode& node)
-       :  _fade_in (0.0, 2.0, 1.0), // linear (gain coefficient) => -inf..+6dB
-          _fade_out (0.0, 2.0, 1.0) // linear (gain coefficient) => -inf..+6dB
+       : AudioRegion (0, 0, "foobar"),
+         _fade_in (0.0, 2.0, 1.0), // linear (gain coefficient) => -inf..+6dB
+         _fade_out (0.0, 2.0, 1.0) // linear (gain coefficient) => -inf..+6dB
+
 {
        boost::shared_ptr<Region> r;
        XMLProperty* prop;
@@ -162,17 +167,16 @@ Crossfade::Crossfade (const Playlist& playlist, XMLNode& node)
        }
 }
 
-Crossfade::Crossfade (const Crossfade &orig, boost::shared_ptr<AudioRegion> newin, boost::shared_ptr<AudioRegion> newout)
-       : _fade_in(orig._fade_in),
-         _fade_out(orig._fade_out)
+Crossfade::Crossfade (boost::shared_ptr<Crossfade> orig, boost::shared_ptr<AudioRegion> newin, boost::shared_ptr<AudioRegion> newout)
+       : AudioRegion (boost::dynamic_pointer_cast<const AudioRegion> (orig)),
+         _fade_in (orig->_fade_in),
+         _fade_out (orig->_fade_out)
 {
-       _active           = orig._active;
-       _in_update        = orig._in_update;
-       _length           = orig._length;
-       _position         = orig._position;
-       _anchor_point     = orig._anchor_point;
-       _follow_overlap   = orig._follow_overlap;
-       _fixed            = orig._fixed;
+       _active           = orig->_active;
+       _in_update        = orig->_in_update;
+       _anchor_point     = orig->_anchor_point;
+       _follow_overlap   = orig->_follow_overlap;
+       _fixed            = orig->_fixed;
        
        _in = newin;
        _out = newout;
@@ -199,6 +203,13 @@ Crossfade::~Crossfade ()
 void
 Crossfade::initialize ()
 {
+       /* merge source lists from regions */
+
+       _sources = _in->sources();
+       _sources.insert (_sources.end(), _out->sources().begin(), _out->sources().end());
+       _master_sources = _in->master_sources();
+       _master_sources.insert(_master_sources.end(), _out->master_sources().begin(), _out->master_sources().end());
+       
        _in_update = false;
        
        _out->suspend_fade_out ();
@@ -228,10 +239,27 @@ Crossfade::initialize ()
        layer_relation = (int32_t) (_in->layer() - _out->layer());
 }      
 
+nframes_t 
+Crossfade::read_raw_internal (Sample* buf, nframes_t start, nframes_t cnt) const
+{
+#if 0
+       Sample* mixdown = new Sample[cnt];
+       float* gain = new float[cnt];
+       nframes_t ret;
+
+       ret = read_at (buf, mixdown, gain, start, cnt, chan_n, cnt);
+
+       delete [] mixdown;
+       delete [] gain;
+
+       return ret;
+#endif
+       return cnt;
+}
+
 nframes_t 
 Crossfade::read_at (Sample *buf, Sample *mixdown_buffer, 
-                   float *gain_buffer, nframes_t start, nframes_t cnt, uint32_t chan_n,
-                   nframes_t read_frames, nframes_t skip_frames)
+                   float *gain_buffer, nframes_t start, nframes_t cnt, uint32_t chan_n) const
 {
        nframes_t offset;
        nframes_t to_write;
@@ -266,8 +294,8 @@ Crossfade::read_at (Sample *buf, Sample *mixdown_buffer,
 
        offset = start - _position;
 
-       _out->read_at (crossfade_buffer_out, mixdown_buffer, gain_buffer, start, to_write, chan_n, read_frames, skip_frames);
-       _in->read_at (crossfade_buffer_in, mixdown_buffer, gain_buffer, start, to_write, chan_n, read_frames, skip_frames);
+       _out->read_at (crossfade_buffer_out, mixdown_buffer, gain_buffer, start, to_write, chan_n);
+       _in->read_at (crossfade_buffer_in, mixdown_buffer, gain_buffer, start, to_write, chan_n);
 
        float* fiv = new float[to_write];
        float* fov = new float[to_write];
@@ -326,7 +354,7 @@ Crossfade::refresh ()
        /* crossfades must be between non-muted regions */
        
        if (_out->muted() || _in->muted()) {
-               Invalidated (shared_from_this());
+               Invalidated (shared_from_this ());
                return false;
        }
 
@@ -335,14 +363,14 @@ Crossfade::refresh ()
        int32_t new_layer_relation = (int32_t) (_in->layer() - _out->layer());
 
        if (new_layer_relation * layer_relation < 0) { // different sign, layers rotated 
-               Invalidated (shared_from_this());
+               Invalidated (shared_from_this ());
                return false;
        }
 
        OverlapType ot = _in->coverage (_out->first_frame(), _out->last_frame());
 
        if (ot == OverlapNone) {
-               Invalidated (shared_from_this());
+               Invalidated (shared_from_this ());
                return false;
        } 
 
@@ -357,7 +385,7 @@ Crossfade::refresh ()
                        } 
 
                        catch (NoCrossfadeHere& err) {
-                               Invalidated (shared_from_this());
+                               Invalidated (shared_from_this ());
                                return false;
                        }
 
@@ -365,7 +393,7 @@ Crossfade::refresh ()
 
                } else {
 
-                       Invalidated (shared_from_this());
+                       Invalidated (shared_from_this ());
                        return false;
                }
 
@@ -395,7 +423,7 @@ Crossfade::update ()
        }
        
        if (newlen == 0) {
-               Invalidated (shared_from_this());
+               Invalidated (shared_from_this ());
                return false;
        }
        
@@ -856,5 +884,5 @@ Crossfade::set_short_xfade_length (nframes_t n)
 void
 Crossfade::invalidate ()
 {
-       Invalidated (shared_from_this()); /* EMIT SIGNAL */
+       Invalidated (shared_from_this ()); /* EMIT SIGNAL */
 }
index d1b2a58e8219dbe9d3a1f9d900dd16aa1a5a7b95..2e36e34e437a3aa403237e2d6ba9c53bc3d8ba3c 100644 (file)
@@ -130,8 +130,6 @@ MidiPlaylist::read (MidiRingBuffer& dst, nframes_t start,
 
        nframes_t ret         = 0;
        nframes_t end         = start + dur - 1;
-       //nframes_t read_frames = 0;
-       //nframes_t skip_frames = 0;
 
        //_read_data_count = 0;
 
@@ -151,7 +149,7 @@ MidiPlaylist::read (MidiRingBuffer& dst, nframes_t start,
        for (vector<boost::shared_ptr<Region> >::iterator i = regs.begin(); i != regs.end(); ++i) {
                // FIXME: ensure time is monotonic here
                boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion>(*i);
-               mr->read_at (dst, start, dur, chan_n, 0, 0);// FIXME read_frames, skip_frames);
+               mr->read_at (dst, start, dur, chan_n);
                ret += mr->read_data_count();
        }
 
index 78c238233e031fa2fcc6070a4958e91eceb96bb3..16972c37ebcb0c50f371e0eea7c9d717e7da7c8c 100644 (file)
@@ -109,24 +109,19 @@ MidiRegion::~MidiRegion ()
 }
 
 nframes_t
-MidiRegion::read_at (MidiRingBuffer& out, nframes_t position, 
-                     nframes_t dur, 
-                     uint32_t chan_n, nframes_t read_frames, nframes_t skip_frames) const
+MidiRegion::read_at (MidiRingBuffer& out, nframes_t position, nframes_t dur, uint32_t chan_n) const
 {
-       return _read_at (_sources, out, position, dur, chan_n, read_frames, skip_frames);
+       return _read_at (_sources, out, position, dur, chan_n);
 }
 
 nframes_t
-MidiRegion::master_read_at (MidiRingBuffer& out, nframes_t position, 
-                            nframes_t dur, uint32_t chan_n) const
+MidiRegion::master_read_at (MidiRingBuffer& out, nframes_t position, nframes_t dur, uint32_t chan_n) const
 {
-       return _read_at (_master_sources, out, position, dur, chan_n, 0, 0);
+       return _read_at (_master_sources, out, position, dur, chan_n);
 }
 
 nframes_t
-MidiRegion::_read_at (const SourceList& srcs, MidiRingBuffer& dst, 
-                      nframes_t position, nframes_t dur, 
-                      uint32_t chan_n, nframes_t read_frames, nframes_t skip_frames) const
+MidiRegion::_read_at (const SourceList& srcs, MidiRingBuffer& dst, nframes_t position, nframes_t dur, uint32_t chan_n) const
 {
        // cerr << _name << "._read_at(" << position << ") - " << _position << endl;
 
index 306f933f26f87652307082415ff3e90f9cf35ef5..92e0503bb48b3c4c76b29f8fd66c7ec238df8004 100644 (file)
@@ -1598,12 +1598,17 @@ Playlist::relayer ()
        /* we want to go through regions from desired lowest to desired highest layer,
           which depends on the layer model
        */
+
        RegionList copy = regions;
+
+       /* sort according to the model */
+
        if (Config->get_layer_model() == MoveAddHigher || Config->get_layer_model() == AddHigher) {
                RegionSortByLastLayerOp cmp;
                copy.sort (cmp);
        }
        
+       
        for (RegionList::iterator i = copy.begin(); i != copy.end(); ++i) {
 
                /* find the lowest layer that this region can go on */
@@ -1636,7 +1641,7 @@ Playlist::relayer ()
                layers[j].push_back (*i);
        }
 
-       /* set up the layer numbers in the regions */
+       /* first pass: set up the layer numbers in the regions */
        for (size_t j = 0; j < layers.size(); ++j) {
                for (RegionList::iterator i = layers[j].begin(); i != layers[j].end(); ++i) {
                        (*i)->set_layer (j);
index 4e4b1c91afb9b78b99151fd4e8d8605a83e5927c..8ac101282d3f09732c6becfc905550e9a8c4fdad 100644 (file)
@@ -49,6 +49,27 @@ Change Region::LockChanged       = ARDOUR::new_change ();
 Change Region::LayerChanged      = ARDOUR::new_change ();
 Change Region::HiddenChanged     = ARDOUR::new_change ();
 
+
+/* derived-from-derived constructor (no sources in constructor) */
+Region::Region (nframes_t start, nframes_t length, const string& name, DataType type, layer_t layer, Region::Flag flags)
+       : _name(name)
+       , _type(type)
+       , _flags(flags)
+       , _start(start) 
+       , _length(length) 
+       , _position(0) 
+       , _sync_position(_start)
+       , _layer(layer)
+       , _first_edit(EditChangesNothing)
+       , _frozen(0)
+       , _read_data_count(0)
+       , _pending_changed(Change (0))
+       , _last_layer_op(0)
+{
+       /* no sources at this point */
+}
+
+
 /** Basic Region constructor (single source) */
 Region::Region (boost::shared_ptr<Source> src, nframes_t start, nframes_t length, const string& name, DataType type, layer_t layer, Region::Flag flags)
        : _name(name)
@@ -67,6 +88,7 @@ Region::Region (boost::shared_ptr<Source> src, nframes_t start, nframes_t length
 {
        _sources.push_back (src);
        _master_sources.push_back (src);
+
        src->GoingAway.connect (bind (mem_fun (*this, &Region::source_deleted), src));
 
        assert(_sources.size() > 0);
@@ -245,7 +267,6 @@ Region::Region (boost::shared_ptr<Source> src, const XMLNode& node)
 {
        _sources.push_back (src);
 
-
        if (set_state (node)) {
                throw failed_constructor();
        }
@@ -909,7 +930,6 @@ Region::state (bool full_state)
                fe = X_("id");
                break;
        default: /* should be unreachable but makes g++ happy */
-               cerr << "Odd region property found\n";
                fe = X_("nothing");
                break;
        }