commit:     76367ed3e2d0c4915db59bfa604f67c60d740001
Author:     Miroslav Šulc <fordfrog <AT> gentoo <DOT> org>
AuthorDate: Mon Nov  4 19:27:59 2024 +0000
Commit:     Miroslav Šulc <fordfrog <AT> gentoo <DOT> org>
CommitDate: Mon Nov  4 19:28:10 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=76367ed3

media-sound/ardour: applied patch to 8.10-r2 to prevent crash on startup when 
compiled with clang + dropped old c++11 flag

Signed-off-by: Miroslav Šulc <fordfrog <AT> gentoo.org>

 ...ardour-8.10-r1.ebuild => ardour-8.10-r2.ebuild} |   8 +-
 .../files/ardour-9.0.0-fix-clang-crash.patch       | 123 +++++++++++++++++++++
 2 files changed, 124 insertions(+), 7 deletions(-)

diff --git a/media-sound/ardour/ardour-8.10-r1.ebuild 
b/media-sound/ardour/ardour-8.10-r2.ebuild
similarity index 97%
rename from media-sound/ardour/ardour-8.10-r1.ebuild
rename to media-sound/ardour/ardour-8.10-r2.ebuild
index 0f3b1f15c091..bb6ece851b94 100644
--- a/media-sound/ardour/ardour-8.10-r1.ebuild
+++ b/media-sound/ardour/ardour-8.10-r2.ebuild
@@ -71,6 +71,7 @@ DEPEND="${RDEPEND}
 
 PATCHES=(
        "${FILESDIR}/${PN}-6.8-metadata.patch"
+       "${FILESDIR}/${PN}-9.0.0-fix-clang-crash.patch"
 )
 
 pkg_pretend() {
@@ -78,13 +79,6 @@ pkg_pretend() {
                ewarn "Linking with gold linker might produce broken 
executable, see bug #733972"
 }
 
-pkg_setup() {
-       if has_version \>=dev-libs/libsigc++-2.6 ; then
-               append-cxxflags -std=c++11
-       fi
-       python-any-r1_pkg_setup
-}
-
 src_prepare() {
        default
 

diff --git a/media-sound/ardour/files/ardour-9.0.0-fix-clang-crash.patch 
b/media-sound/ardour/files/ardour-9.0.0-fix-clang-crash.patch
new file mode 100644
index 000000000000..6162782d91f5
--- /dev/null
+++ b/media-sound/ardour/files/ardour-9.0.0-fix-clang-crash.patch
@@ -0,0 +1,123 @@
+From f17a6562174ccf658eb35ba7a425d3ac340c1607 Mon Sep 17 00:00:00 2001
+From: Robin Gareus <[email protected]>
+Date: Mon, 4 Nov 2024 18:46:21 +0100
+Subject: [PATCH] use modern C++ for snprintf (#9841)
+
+This replaces vector<char>::operator[] (which now
+a constexpr since C++20). We could use &vector::data(),
+but a unique_ptr seems more appropriate for the case at hand.
+--- a/libs/ardour/broadcast_info.cc
++++ b/libs/ardour/broadcast_info.cc
+@@ -39,15 +39,15 @@ namespace ARDOUR
+ static void
+ snprintf_bounded_null_filled (char* target, size_t target_size, char const * 
fmt, ...)
+ {
+-      std::vector<char> buf(target_size+1);
++      std::unique_ptr<char[]> buf (new char [target_size + 1]);
+       va_list ap;
+ 
+       va_start (ap, fmt);
+-      vsnprintf (&buf[0], target_size+1, fmt, ap);
++      vsnprintf (buf.get (), target_size+1, fmt, ap);
+       va_end (ap);
+ 
+       memset (target, 0, target_size);
+-      memcpy (target, &buf[0], target_size);
++      memcpy (target, buf.get (), target_size);
+ 
+ }
+ 
+--- a/libs/ardour/export_graph_builder.cc
++++ b/libs/ardour/export_graph_builder.cc
+@@ -796,9 +796,9 @@ ExportGraphBuilder::Intermediate::Intermediate 
(ExportGraphBuilder & parent, Fil
+       int format = ExportFormatBase::F_RAW | ExportFormatBase::SF_Float;
+ 
+       if (parent._realtime) {
+-              tmp_file.reset (new TmpFileRt<float> (&tmpfile_path_buf[0], 
format, channels, config.format->sample_rate()));
++              tmp_file.reset (new TmpFileRt<float> (tmpfile_path_buf.data (), 
format, channels, config.format->sample_rate()));
+       } else {
+-              tmp_file.reset (new TmpFileSync<float> (&tmpfile_path_buf[0], 
format, channels, config.format->sample_rate()));
++              tmp_file.reset (new TmpFileSync<float> (tmpfile_path_buf.data 
(), format, channels, config.format->sample_rate()));
+       }
+ 
+       tmp_file->FileWritten.connect_same_thread (post_processing_connection,
+--- a/libs/ardour/io.cc
++++ b/libs/ardour/io.cc
+@@ -1338,7 +1338,6 @@ IO::bundle_changed (Bundle::Change /*c*/)
+ string
+ IO::build_legal_port_name (std::shared_ptr<PortSet const> ports, DataType 
type)
+ {
+-      const int name_size = AudioEngine::instance()->port_name_size();
+       int limit;
+       string suffix;
+ 
+@@ -1372,21 +1371,24 @@ IO::build_legal_port_name (std::shared_ptr<PortSet 
const> ports, DataType type)
+ 
+       // allow up to 4 digits for the output port number, plus the slash, 
suffix and extra space
+ 
++      uint32_t name_size = AudioEngine::instance()->port_name_size();
+       limit = name_size - AudioEngine::instance()->my_name().length() - 
(suffix.length() + 5);
+ 
+-      std::vector<char> buf1(name_size+1);
+-      std::vector<char> buf2(name_size+1);
++      ++name_size; // allow for \0
++
++      std::unique_ptr<char[]> buf1 (new char[name_size]);
++      std::unique_ptr<char[]> buf2 (new char[name_size]);
+ 
+       /* colons are illegal in port names, so fix that */
+ 
+       string nom = legalize_io_name (_name.val());
+ 
+-      snprintf (&buf1[0], name_size+1, ("%.*s/%s"), limit, nom.c_str(), 
suffix.c_str());
++      std::snprintf (buf1.get(), name_size, ("%.*s/%s"), limit, nom.c_str(), 
suffix.c_str());
+ 
+-      int port_number = find_port_hole (ports, &buf1[0]);
+-      snprintf (&buf2[0], name_size+1, "%s %d", &buf1[0], port_number);
++      int port_number = find_port_hole (ports, buf1.get ());
++      std::snprintf (buf2.get(), name_size, "%s %d", buf1.get (), 
port_number);
+ 
+-      return string (&buf2[0]);
++      return string (buf2.get ());
+ }
+ 
+ int32_t
+@@ -1400,17 +1402,17 @@ IO::find_port_hole (std::shared_ptr<PortSet const> 
ports, const char* base)
+               return 1;
+       }
+ 
+-      /* we only allow up to 4 characters for the port number
+-       */
++      uint32_t const name_size = AudioEngine::instance()->port_name_size() + 
1;
+ 
++      /* we only allow up to 4 characters for the port number */
+       for (n = 1; n < 9999; ++n) {
+-              std::vector<char> buf 
(AudioEngine::instance()->port_name_size());
+               PortSet::const_iterator i = ports->begin ();
+ 
+-              snprintf (&buf[0], buf.size()+1, _("%s %u"), base, n);
++              std::unique_ptr<char[]> buf (new char[name_size]);
++              std::snprintf (buf.get (), name_size, "%s %u", base, n);
+ 
+               for ( ; i != ports->end (); ++i) {
+-                      if (string (i->name()) == string (&buf[0])) {
++                      if (string (i->name()) == string (buf.get ())) {
+                               break;
+                       }
+               }
+@@ -1526,13 +1528,13 @@ IO::bundle_channel_name (uint32_t c, uint32_t n, 
DataType t) const
+               case 2:
+                       return c == 0 ? _("L") : _("R");
+               default:
+-                      snprintf (buf, sizeof(buf), "%d", (c + 1));
++                      std::snprintf (buf, sizeof(buf), "%d", (c + 1));
+                       return buf;
+               }
+ 
+       } else {
+ 
+-              snprintf (buf, sizeof(buf), "%d", (c + 1));
++              std::snprintf (buf, sizeof(buf), "%d", (c + 1));
+               return buf;
+ 
+       }

Reply via email to