Re: [tim-janik/beast] Bus properties ported to C++ - redone with APPLY_IDL_PROPERTY() macro (#105)



@tim-janik requested changes on this pull request.

Please fix review comments I left for you and remove:
a) the commit introducing the block/unblock API,
b) the float64 workaround.
If that means you updated PR is broken, point out the bugs you're runing into and I'll give you a hand with the fixes. In particualy, I'm not even sure you can trigger buggy behaviour due to not blocking undo, if you find a way to trigger that, that'd be really helpful. As for fixing the float parsing, I looked into that earlier and am quite confident I can fix parse_paren_rest. I just needed an actual test case that triggered breakage, which I didn't have at the time.


In bse/bsebus.cc:

> @@ -1003,6 +993,25 @@ BusImpl::BusImpl (BseObject *bobj) :
 BusImpl::~BusImpl ()
 {}
 
+bool
+BusImpl::mute() const
+{
+  BseBus *self = const_cast<BusImpl*> (this)->as<BseBus*>();
+
+  return self->muted;
+}
+
+void
+BusImpl::mute (bool val)
+{
+  BseBus *self = const_cast<BusImpl*> (this)->as<BseBus*>();
+
+  if (APPLY_IDL_PROPERTY (self->muted, val))
+    {

Please avoid excessive newlines and braces. This function has 3 lines of code but is pumped up to 6 lines in total. The following is prefectly readable:

  BseBus *self = const_cast<BusImpl*> (this)->as<BseBus*>();
  if (APPLY_IDL_PROPERTY (self->muted, val))
    bus_volume_changed (self);

In beast-gtk/bstbuseditor.cc:

> @@ -89,8 +89,24 @@ bus_build_param (BstBusEditor *self,
                  const gchar  *editor,
                  const gchar  *label)
 {
-  GParamSpec *pspec = bse_proxy_get_pspec (self->item, property);
-  self->params = sfi_ring_prepend (self->params, bst_param_new_proxy (pspec, self->item));
+  GxkParam *gxk_param = nullptr;

This should be moved down to be closest to the site of use.


In beast-gtk/bstbuseditor.cc:

> @@ -89,8 +89,24 @@ bus_build_param (BstBusEditor *self,
                  const gchar  *editor,
                  const gchar  *label)
 {
-  GParamSpec *pspec = bse_proxy_get_pspec (self->item, property);
-  self->params = sfi_ring_prepend (self->params, bst_param_new_proxy (pspec, self->item));
+  GxkParam *gxk_param = nullptr;
+
+  /* aida property? */
+  Bse::BusH bus = Bse::BusH::__cast__ (bse_server.from_proxy (self->item));

There is only a single caller for this function, so the cast should be moved up into the caller and avoided here.


In beast-gtk/bstbuseditor.cc:

> @@ -89,8 +89,24 @@ bus_build_param (BstBusEditor *self,
                  const gchar  *editor,
                  const gchar  *label)
 {
-  GParamSpec *pspec = bse_proxy_get_pspec (self->item, property);
-  self->params = sfi_ring_prepend (self->params, bst_param_new_proxy (pspec, self->item));
+  GxkParam *gxk_param = nullptr;
+
+  /* aida property? */
+  Bse::BusH bus = Bse::BusH::__cast__ (bse_server.from_proxy (self->item));
+  const Bse::StringSeq meta = bus.find_prop (property);

Instead of meta we've been using kvlist elsewhere.
The following lines should be wrapped into if (!meta.empty()) { ...pspec_from_key_value_list }
And bse_proxy_get_pspec should only be called if meta (kvlist) was empty.


In bse/bsebus.cc:

> +  if (BSE_IS_SONG (parent))
+    {
+      BseSong *song = BSE_SONG (parent);
+      return song->solo_bus == self;
+    }
+  return false;
+}
+
+void
+BusImpl::solo (bool is_solo)
+{
+  BseBus *self = as<BseBus*>();
+
+  if (solo() != is_solo)
+    {
+      auto prop = "solo";

This can be const.


In bse/bsebus.cc:

> @@ -842,9 +824,10 @@ bus_restore_finish (BseObject *object,
 {
   BseBus *self = BSE_BUS (object);
   /* restore real sync setting */
-  g_object_set (self, /* no undo */
-                "sync", self->saved_sync,
-                NULL);
+  auto impl = self->as<Bse::BusImpl*>();
+  impl->block_property_undo();
+  impl->sync (self->saved_sync);
+  impl->unblock_property_undo();

Please get rid of the block/unblock calls here, I think we need to handle that elsewhere.
This code is only called during restore(), and the result of the undo stack during restore is thrown away anyway (in ProjectImpl::restore_from_file(): bse_project_clear_undo). Actually we should be using bse_undo_stack_dummy during restore anyway.


In beast-gtk/bstbuseditor.cc:

> @@ -82,22 +82,28 @@ bus_editor_release_item (SfiProxy      item,
   bst_bus_editor_set_bus (self, 0);
 }
 
+static GxkParam *
+get_property_param (BstBusEditor *self,
+                    const gchar  *property)
+{
+  Bse::BusH bus = Bse::BusH::__cast__ (bse_server.from_proxy (self->item));
+  const Bse::StringSeq meta = bus.find_prop (property);
+
+  GParamSpec *cxxpspec = Bse::pspec_from_key_value_list (property, meta);

Use kvlist.


In beast-gtk/bstbuseditor.cc:

> @@ -82,22 +82,28 @@ bus_editor_release_item (SfiProxy      item,
   bst_bus_editor_set_bus (self, 0);
 }
 
+static GxkParam *
+get_property_param (BstBusEditor *self,
+                    const gchar  *property)
+{
+  Bse::BusH bus = Bse::BusH::__cast__ (bse_server.from_proxy (self->item));

We are moving to Aida handles everywhre, so always use ItemH, BusH, etc instead of proxies, i.e. simply pass a handle into this function.


In bse/bsebus.cc:

> +    {
+      BseSong *song = BSE_SONG (parent);
+      BseBus *master = bse_song_find_master (song);
+      return (self == master);
+    }
+  return false;
+}
+
+void
+BusImpl::master_output (bool val)
+{
+  BseBus *self = as<BseBus*>();
+
+  if (val != master_output())
+    {
+      auto prop = "master_output";

Add const


In bse/bsestorage.cc:

> @@ -741,6 +741,16 @@ storage_parse_property_value (BseStorage *self, const std::string &name, Bse::An
 {
   assert_return (BSE_IS_STORAGE (self), G_TOKEN_ERROR);
   GScanner *scanner = bse_storage_get_scanner (self);
+  if (any.kind() == Aida::FLOAT64) /* float format cannot be handled by scanner_parse_paren_rest */

I don't think any.kind() will always hold the desired type here for all code paths.
This is more a workaround than a fix, I think scanner_parse_paren_rest should be fixed instead.


In bse/bsebus.cc:

>    if (BSE_IS_SONG (parent))
     {
       BseSong *song = BSE_SONG (parent);
       BseBus *master = bse_song_find_master (song);
-      return (self == master);
+      return self == master;

Code like this can be merged down into the culprit of your current branch. Here's how you do that:

  1. Use git blame HEAD -- bsebus.cc to find the faulty commit:
aaabbbccc   bse/bsebus.c swesterfeld     return (self == master);
  1. Commit the fix as in:
git commit -m '+++ fix commit aaabbbccc' 
111222333
  1. Assuming your current branch started from master, merge this down with: git rebase -i master
  2. Move pick 111222333 +++ fix commit aaabbbccc into a squash or fixup following the culprit:
pick aaabbbccc BSE: introduce buggy code
squash 111222333 +++ fix commit aaabbbccc

In bse/bsesong.cc:

>        Bse::BusImpl *bus = child->as<Bse::BusImpl*>();
+      bus->block_property_undo();

Get rid of the block/unblock here, I'd like this to be handled elsewhere.


In bse/bsesong.cc:

> @@ -681,7 +683,7 @@ SongImpl::remove_bus (BusIface &bus_iface)
   BseItem *child = bus.as<BseItem*>();
   BseUndoStack *ustack = bse_item_undo_open (self, __func__);
   // reset ::master-output property undoable

The comment about undoable here can be removed.


In bse/bseitem.cc:

> @@ -1335,4 +1337,16 @@ ItemImpl::apply_idl_property_need_undo (const StringVector &kvlist)
   return !Aida::aux_vector_check_options (kvlist, "", "hints", "skip-undo");
 }
 
+void
+ItemImpl::block_property_undo()
+{

I really don't want to introduce these. We already have other mechanism that check if undo steps should be recorded at all, and we have a dummy undo stack bse_undo_stack_dummy that could be used if we'd want to temporarily ignore undo steps. Also, the C++ developer shouldn't be bothered with having to use block/unblock in pairs, so for the future, similar API should make use of ctor/dtor pairs like std::lock_guard does.

Assuming your branch starts off from master, you can get rid of this commit with git rebase -i and then remove the pick ... line that refers to this commit.

—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub, or mute the thread.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]