[beast: 71/95] BSE: use C++ inheritance instead of nesting for GObject struct derivation



commit 1604e0566d62078cb74631917279a4e38edb55f8
Author: Tim Janik <timj gnu org>
Date:   Fri Mar 22 01:17:28 2013 +0100

    BSE: use C++ inheritance instead of nesting for GObject struct derivation

 bse/bsebiquadfilter.hh     |   15 +++----
 bse/bsebus.hh              |   11 ++---
 bse/bseconstant.hh         |   15 +++----
 bse/bsecontainer.hh        |    8 +---
 bse/bsecontextmerger.hh    |   12 ++---
 bse/bsecsynth.hh           |   13 ++---
 bse/bsedatapocket.hh       |   22 ++++-----
 bse/bsedefs.hh             |  107 +++++++++++++++++++++----------------------
 bse/bsedevice.hh           |   15 ++----
 bse/bseeditablesample.hh   |   10 +---
 bse/bseinstrumentinput.hh  |   18 +++-----
 bse/bseinstrumentoutput.hh |   18 +++-----
 bse/bseitem.hh             |   11 ++---
 bse/bsejanitor.hh          |   15 +++----
 bse/bseladspa.hh           |   21 ++++-----
 bse/bseladspamodule.hh     |   10 +---
 bse/bseloader.hh           |    6 +--
 bse/bsemidicontroller.hh   |   16 ++-----
 bse/bsemididecoder.hh      |    5 +-
 bse/bsemididevice-null.hh  |   17 +++-----
 bse/bsemididevice-oss.hh   |   15 ++----
 bse/bsemididevice.hh       |   19 +++-----
 bse/bsemidiinput.hh        |   16 ++-----
 bse/bsemidinotifier.hh     |   15 ++----
 bse/bsemidireceiver.cc     |    4 +-
 bse/bsemidisynth.hh        |   13 ++---
 bse/bsemidivoice.hh        |   24 ++++------
 bse/bseobject.hh           |    9 +---
 bse/bseparasite.cc         |    2 +-
 bse/bsepart.hh             |   42 ++++++++---------
 bse/bsepcmdevice-null.hh   |   16 +++----
 bse/bsepcmdevice-oss.hh    |   15 ++----
 bse/bsepcmdevice.hh        |   21 +++------
 bse/bsepcminput.hh         |   14 ++----
 bse/bsepcmoutput.hh        |   16 ++-----
 bse/bsepcmwriter.hh        |   12 ++---
 bse/bseplugin.hh           |   14 ++----
 bse/bseproject.hh          |   13 ++---
 bse/bseserver.hh           |   14 ++----
 bse/bsesnet.hh             |   25 +++++------
 bse/bsesnooper.hh          |   13 +++---
 bse/bsesong.hh             |   18 +++----
 bse/bsesource.hh           |   42 +++++++----------
 bse/bsestandardosc.hh      |   20 +++-----
 bse/bsestorage.hh          |   11 ++---
 bse/bsesubiport.hh         |   18 +++-----
 bse/bsesuboport.hh         |   18 +++-----
 bse/bsesubsynth.hh         |   16 +++----
 bse/bsesuper.hh            |   13 ++---
 bse/bsetrack.hh            |   17 +++----
 bse/bsewave.hh             |   23 ++++------
 bse/bsewaveosc.hh          |   16 ++-----
 bse/bsewaverepo.hh         |   15 +++----
 plugins/bsesequencer.hh    |   12 ++---
 54 files changed, 362 insertions(+), 574 deletions(-)
---
diff --git a/bse/bsebiquadfilter.hh b/bse/bsebiquadfilter.hh
index d5dd135..05b91a3 100644
--- a/bse/bsebiquadfilter.hh
+++ b/bse/bsebiquadfilter.hh
@@ -26,11 +26,9 @@ typedef enum    /* skip */
   BSE_BIQUAD_FILTER_NORM_PEAK_GAIN     = GSL_BIQUAD_NORMALIZE_PEAK_GAIN
 } BseBiquadFilterNorm;
 /* --- BseBiquadFilter source --- */
-typedef struct _BseBiquadFilter      BseBiquadFilter;
-typedef struct _BseBiquadFilterClass BseBiquadFilterClass;
-struct _BseBiquadFilter
-{
-  BseSource    parent_object;
+struct BseBiquadFilter;
+struct BseBiquadFilterClass;
+struct BseBiquadFilter : BseSource {
   BseBiquadFilterType filter_type;
   guint                      type_change : 1;
   guint                      exponential_fm : 1;
@@ -41,10 +39,9 @@ struct _BseBiquadFilter
   gfloat             gain;
   gfloat             gain_strength;
 };
-struct _BseBiquadFilterClass
-{
-  BseSourceClass parent_class;
-};
+struct BseBiquadFilterClass : BseSourceClass
+{};
+
 /* --- channels --- */
 enum
 {
diff --git a/bse/bsebus.hh b/bse/bsebus.hh
index ec31893..9003f45 100644
--- a/bse/bsebus.hh
+++ b/bse/bsebus.hh
@@ -11,9 +11,7 @@ G_BEGIN_DECLS
 #define BSE_IS_BUS_CLASS(class)    (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_BUS))
 #define BSE_BUS_GET_CLASS(object)  (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_BUS, BseBusClass))
 /* --- BseBus source --- */
-struct _BseBus
-{
-  BseSubSynth   parent_object;
+struct BseBus : BseSubSynth {
   SfiRing      *inputs;
   double        left_volume;
   double        right_volume;
@@ -28,10 +26,9 @@ struct _BseBus
   BseSource   **effects;        /* slot maybe NULL */
   SfiRing      *bus_outputs;    /* maintained by bsebus.[hc] */
 };
-struct _BseBusClass
-{
-  BseSubSynthClass parent_class;
-};
+struct BseBusClass : BseSubSynthClass
+{};
+
 /* --- API --- */
 BseErrorType    bse_bus_connect                 (BseBus         *self,
                                                  BseItem        *item);
diff --git a/bse/bseconstant.hh b/bse/bseconstant.hh
index 1a9e27d..4eb7be6 100644
--- a/bse/bseconstant.hh
+++ b/bse/bseconstant.hh
@@ -14,17 +14,14 @@ extern "C" {
 #define BSE_CONSTANT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_CONSTANT, 
BseConstantClass))
 #define        BSE_CONSTANT_N_OUTPUTS  (4)
 /* --- BseConstant source --- */
-typedef struct _BseConstant      BseConstant;
-typedef struct _BseConstantClass BseConstantClass;
-struct _BseConstant
-{
-  BseSource       parent_object;
+struct BseConstant;
+struct BseConstantClass;
+struct BseConstant : BseSource {
   gfloat         constants[BSE_CONSTANT_N_OUTPUTS];
 };
-struct _BseConstantClass
-{
-  BseSourceClass parent_class;
-};
+struct BseConstantClass : BseSourceClass
+{};
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
diff --git a/bse/bsecontainer.hh b/bse/bsecontainer.hh
index 8b4fe9a..fa33d48 100644
--- a/bse/bsecontainer.hh
+++ b/bse/bsecontainer.hh
@@ -18,14 +18,10 @@ typedef gboolean (*BseForallItemsFunc) (BseItem      *item,
 typedef gboolean (*BseForallCrossFunc) (BseItem         *owner,
                                        BseItem  *link,
                                        gpointer  data);
-struct _BseContainer
-{
-  BseSource    parent_instance;
+struct BseContainer : BseSource {
   guint                n_items;        /* paranoid checks */
 };
-struct _BseContainerClass
-{
-  BseSourceClass  parent_class;
+struct BseContainerClass : BseSourceClass {
   void         (*add_item)             (BseContainer           *container,
                                         BseItem                *item);
   void         (*remove_item)          (BseContainer           *container,
diff --git a/bse/bsecontextmerger.hh b/bse/bsecontextmerger.hh
index 468bf8d..e504b58 100644
--- a/bse/bsecontextmerger.hh
+++ b/bse/bsecontextmerger.hh
@@ -12,16 +12,12 @@ G_BEGIN_DECLS
 #define BSE_CONTEXT_MERGER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_CONTEXT_MERGER, 
BseContextMergerClass))
 #define BSE_CONTEXT_MERGER_N_IOPORTS (8)
 /* --- object structures --- */
-struct _BseContextMerger
-{
-  BseSource parent_instance;
+struct BseContextMerger : BseSource {
   guint merge_context;
 };
-struct _BseContextMergerClass
-{
-  BseSourceClass parent_class;
-};
-/* --- API --- */
+struct BseContextMergerClass : BseSourceClass
+{};
+
 void   bse_context_merger_set_merge_context    (BseContextMerger       *self,
                                                 guint                   merge_context);
 G_END_DECLS
diff --git a/bse/bsecsynth.hh b/bse/bsecsynth.hh
index 9293d21..be777c6 100644
--- a/bse/bsecsynth.hh
+++ b/bse/bsecsynth.hh
@@ -12,14 +12,11 @@ G_BEGIN_DECLS
 #define BSE_CSYNTH_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_CSYNTH, BseCSynthClass))
 #define BSE_CSYNTH_USER_SYNTH(src)   ((BSE_OBJECT_FLAGS (src) & BSE_CSYNTH_FLAG_USER_SYNTH) != 0)
 /* --- BseCSynth object --- */
-struct _BseCSynth
-{
-  BseSNet       parent_object;
-};
-struct _BseCSynthClass
-{
-  BseSNetClass parent_class;
-};
+struct BseCSynth : BseSNet
+{};
+struct BseCSynthClass : BseSNetClass
+{};
+
 /* --- prototypes --- */
 G_END_DECLS
 #endif /* __BSE_CSYNTH_H__ */
diff --git a/bse/bsedatapocket.hh b/bse/bsedatapocket.hh
index ac0e75d..91137f9 100644
--- a/bse/bsedatapocket.hh
+++ b/bse/bsedatapocket.hh
@@ -21,17 +21,16 @@ typedef enum        /*< skip >*/
   BSE_DATA_POCKET_OBJECT       = 'o'
 } BseDataPocketType;
 /* --- BseDataPocket structs --- */
-typedef struct _BseDataPocket          BseDataPocket;
-typedef struct _BseDataPocketClass     BseDataPocketClass;
-typedef union {
+struct BseDataPocket;
+struct BseDataPocketClass;
+union BseDataPocketValue {
   guint64  v_int64;
   guint    v_int;
   gfloat   v_float;
   gchar   *v_string;
   BseItem *v_object;
-} BseDataPocketValue;
-typedef struct
-{
+};
+struct BseDataPocketEntry {
   guint                       id;
   guint                       n_items;
   struct Item {
@@ -39,19 +38,15 @@ typedef struct
     gchar              type;
     BseDataPocketValue value;
   }                  *items;
-} BseDataPocketEntry;
-struct _BseDataPocket
-{
-  BseItem            parent_object;
+};
+struct BseDataPocket : BseItem {
   guint                      need_store;       /* for BSE_ITEM_FLAG_AGGREGATE */
   GSList            *cr_items;
   guint                      free_id;
   guint                      n_entries;
   BseDataPocketEntry *entries;
 };
-struct _BseDataPocketClass
-{
-  BseItemClass parent_class;
+struct BseDataPocketClass : BseItemClass {
   void (*entry_added)   (BseDataPocket *pocket,
                          guint          entry_id);
   void (*entry_removed) (BseDataPocket *pocket,
@@ -59,6 +54,7 @@ struct _BseDataPocketClass
   void (*entry_changed) (BseDataPocket *pocket,
                          guint          entry_id);
 };
+
 /* --- prototypes --- */
 guint   _bse_data_pocket_create_entry  (BseDataPocket     *pocket);
 gboolean _bse_data_pocket_delete_entry (BseDataPocket     *pocket,
diff --git a/bse/bsedefs.hh b/bse/bsedefs.hh
index d6c41fd..a4e26fe 100644
--- a/bse/bsedefs.hh
+++ b/bse/bsedefs.hh
@@ -17,69 +17,67 @@ G_BEGIN_DECLS
 /* --- BSE objects, classes & interfaces --- */
 typedef struct  _BseBinData                BseBinData;
 typedef struct  _BseBinDataClass           BseBinDataClass;
-typedef struct  _BseBus                    BseBus;
-typedef struct  _BseBusClass               BseBusClass;
+struct BseBus;
+struct BseBusClass;
 typedef struct  _BseCapture                BseCapture;
 typedef struct  _BseCaptureClass           BseCaptureClass;
-typedef struct  _BseContainer              BseContainer;
-typedef struct  _BseContainerClass         BseContainerClass;
-typedef struct  _BseContextMerger          BseContextMerger;
-typedef struct  _BseContextMergerClass     BseContextMergerClass;
-typedef struct  _BseCSynth                 BseCSynth;
-typedef struct  _BseCSynthClass            BseCSynthClass;
-typedef struct  _BseEditableSample         BseEditableSample;
-typedef struct  _BseEditableSampleClass    BseEditableSampleClass;
-typedef struct  _BseEffect                 BseEffect;
-typedef struct  _BseEffectClass            BseEffectClass;
-typedef struct  _BseItem                   BseItem;
-typedef struct  _BseItemClass              BseItemClass;
-typedef struct  _BseJanitor                BseJanitor;
-typedef struct  _BseJanitorClass           BseJanitorClass;
-typedef struct _BseMidiDecoder            BseMidiDecoder;
-typedef struct  _BseMidiNotifier           BseMidiNotifier;
-typedef struct  _BseMidiNotifierClass      BseMidiNotifierClass;
-typedef struct  _BseMidiReceiver           BseMidiReceiver;
-typedef struct  _BseMidiSynth              BseMidiSynth;
-typedef struct  _BseMidiSynthClass         BseMidiSynthClass;
-typedef struct  _BseMidiContext            BseMidiContext;
-typedef struct  _BseObject                 BseObject;
-typedef struct  _BseObjectClass            BseObjectClass;
-typedef struct  _BseParasite              BseParasite;
-typedef struct  _BsePart                  BsePart;
-typedef struct  _BsePartClass             BsePartClass;
-typedef struct  _BsePcmWriter              BsePcmWriter;
-typedef struct  _BsePcmWriterClass         BsePcmWriterClass;
+struct BseContainer;
+struct BseContainerClass;
+struct BseContextMerger;
+struct BseContextMergerClass;
+struct BseCSynth;
+struct BseCSynthClass;
+struct BseEditableSample;
+struct BseEditableSampleClass;
+struct BseItem;
+struct BseItemClass;
+struct BseJanitor;
+struct BseJanitorClass;
+struct BseMidiDecoder;
+struct BseMidiNotifier;
+struct BseMidiNotifierClass;
+struct BseMidiReceiver;
+struct BseMidiSynth;
+struct BseMidiSynthClass;
+struct BseMidiContext;
+struct BseObject;
+struct BseObjectClass;
+struct BseParasite;
+struct BsePart;
+struct BsePartClass;
+struct BsePcmWriter;
+struct BsePcmWriterClass;
 typedef struct  _BseProcedureClass         BseProcedureClass;
-typedef struct  _BseProject                BseProject;
-typedef struct  _BseProjectClass           BseProjectClass;
+struct BseProject;
+struct BseProjectClass;
 typedef struct  _BseScriptControl          BseScriptControl;
 typedef struct  _BseScriptControlClass     BseScriptControlClass;
-typedef struct  _BseServer                 BseServer;
-typedef struct  _BseServerClass            BseServerClass;
-typedef struct  _BseSNet                   BseSNet;
-typedef struct  _BseSNetClass              BseSNetClass;
-typedef struct  _BseSong                   BseSong;
-typedef struct  _BseSongClass              BseSongClass;
+struct BseServer;
+struct BseServerClass;
+struct BseSNet;
+struct BseSNetClass;
+struct BseSong;
+struct BseSongClass;
 typedef struct  _BseSongSequencer          BseSongSequencer;
-typedef struct  _BseSource                 BseSource;
-typedef struct  _BseSourceClass            BseSourceClass;
-typedef struct  _BseStorage                BseStorage;
-typedef struct  _BseStorageClass           BseStorageClass;
-typedef struct  _BseSubSynth               BseSubSynth;
-typedef struct  _BseSubSynthClass          BseSubSynthClass;
-typedef struct  _BseSuper                  BseSuper;
-typedef struct  _BseSuperClass             BseSuperClass;
-typedef struct  _BseTrack                  BseTrack;
-typedef struct  _BseTrackClass             BseTrackClass;
+struct BseSource;
+struct BseSourceClass;
+struct BseStorage;
+struct BseStorageClass;
+struct BseSubSynth;
+struct BseSubSynthClass;
+struct BseSuper;
+struct BseSuperClass;
+struct BseTrack;
+struct BseTrackClass;
 typedef struct  _BseTrans                  BseTrans;
 typedef struct  _BseUndoStack             BseUndoStack;
 typedef struct  _BseUndoStep               BseUndoStep;
 typedef struct  _BseVirtualThroughput      BseVirtualThroughput;
 typedef struct  _BseVirtualThroughputClass BseVirtualThroughputClass;
 typedef struct  _BseVoice                 BseVoice;
-typedef struct  _BseWave                   BseWave;
-typedef struct  _BseWaveRepo               BseWaveRepo;
-typedef struct  _BseWaveRepoClass          BseWaveRepoClass;
+struct BseWave;
+struct BseWaveRepo;
+struct BseWaveRepoClass;
 /* --- BseModule special handling --- */
 typedef struct _BseModule                  BseModule;
 typedef struct _BseModuleClass             BseModuleClass;
@@ -92,16 +90,15 @@ typedef struct _BseOStream                 BseOStream;
 #define        BSE_MODULE_GET_JSTREAMSP(bsemodule)     (((gpointer*) bsemodule)[3])
 #define        BSE_MODULE_GET_OSTREAMSP(bsemodule)     (((gpointer*) bsemodule)[4])
 /* --- Bse Loader --- */
-typedef struct _BseLoader               BseLoader;
-typedef struct _BseWaveFileInfo         BseWaveFileInfo;
+struct BseLoader;
 typedef struct _BseWaveDsc              BseWaveDsc;
 typedef struct _BseWaveChunkDsc         BseWaveChunkDsc;
 /* --- BSE aux structures --- */
 typedef struct  _BseExportNode          BseExportNode;
 typedef struct  _BseExportNodeBoxed    BseExportNodeBoxed;
 typedef struct  _BseGlobals             BseGlobals;
-typedef struct  _BsePlugin              BsePlugin;
-typedef struct  _BsePluginClass         BsePluginClass;
+struct BsePlugin;
+struct BsePluginClass;
 /* --- BSE function types --- */
 typedef void          (*BseFunc)             (void);
 typedef void          (*BseFreeFunc)         (gpointer           data);
diff --git a/bse/bsedevice.hh b/bse/bsedevice.hh
index b5f3911..3a9a265 100644
--- a/bse/bsedevice.hh
+++ b/bse/bsedevice.hh
@@ -23,18 +23,12 @@ typedef enum    /*< skip >*/
 } BseDeviceFlags;
 #define BSE_DEVICE_FLAGS_USHIFT (BSE_OBJECT_FLAGS_USHIFT + 3)
 /* --- BseDevice structs --- */
-typedef struct _BseDevice       BseDevice;
-typedef struct _BseDeviceClass  BseDeviceClass;
-struct _BseDevice
-{
-  BseObject              parent_object;
+struct BseDevice : BseObject {
   /* valid while BSE_DEVICE_OPEN() */
   gchar                 *open_device_name;
   gchar                 *open_device_args;
 };
-struct _BseDeviceClass
-{
-  BseObjectClass        parent_class;
+struct BseDeviceClass : BseObjectClass {
   gint                  driver_rating;
   const gchar          *driver_name;
   const gchar          *driver_syntax;
@@ -49,13 +43,14 @@ struct _BseDeviceClass
   void                (*pre_close)     (BseDevice    *device);
   void                (*close)         (BseDevice    *device);
 };
-typedef struct {
+struct BseDeviceEntry {
   BseDevice      *device;
   gchar          *device_args;
   gchar          *device_blurb;
   gchar          *device_group; /* usually NULL */
   gchar          *device_error; /* if device_name == NULL */
-} BseDeviceEntry;
+};
+
 /* --- prototypes --- */
 void            bse_device_class_setup     (gpointer        klass,
                                             gint            rating,
diff --git a/bse/bseeditablesample.hh b/bse/bseeditablesample.hh
index aae7b64..b23c612 100644
--- a/bse/bseeditablesample.hh
+++ b/bse/bseeditablesample.hh
@@ -16,16 +16,12 @@ extern "C" {
 /* --- object flagss --- */
 #define BSE_EDITABLE_SAMPLE_OPENED(obj)       (BSE_EDITABLE_SAMPLE (obj)->open_count > 0)
 #define BSE_EDITABLE_SAMPLE_FLAGS_USHIFT       (BSE_ITEM_FLAGS_USHIFT + 0)
-/* --- structures --- */
-struct _BseEditableSample
-{
-  BseItem       parent_object;
+
+struct BseEditableSample : BseItem {
   guint                 open_count;
   GslWaveChunk *wchunk;
 };
-struct _BseEditableSampleClass
-{
-  BseItemClass parent_class;
+struct BseEditableSampleClass : BseItemClass {
   void (*changed) (BseEditableSample   *sample);
 };
 void   bse_editable_sample_set_wchunk  (BseEditableSample      *self,
diff --git a/bse/bseinstrumentinput.hh b/bse/bseinstrumentinput.hh
index 1f0d15a..05d116c 100644
--- a/bse/bseinstrumentinput.hh
+++ b/bse/bseinstrumentinput.hh
@@ -11,17 +11,12 @@ G_BEGIN_DECLS
 #define BSE_IS_INPUT_CLASS(class)             (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_INSTRUMENT_INPUT))
 #define BSE_INSTRUMENT_INPUT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), 
BSE_TYPE_INSTRUMENT_INPUT, BseInstrumentInputClass))
 /* --- BseInstrumentInput source --- */
-typedef struct _BseInstrumentInput      BseInstrumentInput;
-typedef struct _BseInstrumentInputClass BseInstrumentInputClass;
-struct _BseInstrumentInput
-{
-  BseSubIPort parent_object;
-};
-struct _BseInstrumentInputClass
-{
-  BseSubIPortClass parent_class;
-};
-/* --- channels --- */
+
+struct BseInstrumentInput : BseSubIPort
+{};
+struct BseInstrumentInputClass : BseSubIPortClass
+{};
+
 enum
 {
   BSE_INSTRUMENT_INPUT_OCHANNEL_FREQUENCY,
@@ -29,5 +24,6 @@ enum
   BSE_INSTRUMENT_INPUT_OCHANNEL_VELOCITY,
   BSE_INSTRUMENT_INPUT_OCHANNEL_AFTERTOUCH
 };
+
 G_END_DECLS
 #endif /* __BSE_INSTRUMENT_INPUT_H__ */
diff --git a/bse/bseinstrumentoutput.hh b/bse/bseinstrumentoutput.hh
index 62d8fb0..dd52fc6 100644
--- a/bse/bseinstrumentoutput.hh
+++ b/bse/bseinstrumentoutput.hh
@@ -10,18 +10,12 @@ G_BEGIN_DECLS
 #define BSE_IS_OUTPUT(object)                  (G_TYPE_CHECK_INSTANCE_TYPE ((object), 
BSE_TYPE_INSTRUMENT_OUTPUT))
 #define BSE_IS_OUTPUT_CLASS(class)             (G_TYPE_CHECK_CLASS_TYPE ((class), 
BSE_TYPE_INSTRUMENT_OUTPUT))
 #define BSE_INSTRUMENT_OUTPUT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), 
BSE_TYPE_INSTRUMENT_OUTPUT, BseInstrumentOutputClass))
-/* --- BseInstrumentOutput source --- */
-typedef struct _BseInstrumentOutput      BseInstrumentOutput;
-typedef struct _BseInstrumentOutputClass BseInstrumentOutputClass;
-struct _BseInstrumentOutput
-{
-  BseSubOPort parent_object;
-};
-struct _BseInstrumentOutputClass
-{
-  BseSubOPortClass parent_class;
-};
-/* --- channels --- */
+
+struct BseInstrumentOutput : BseSubOPort
+{};
+struct BseInstrumentOutputClass : BseSubOPortClass
+{};
+
 enum
 {
   BSE_INSTRUMENT_OUTPUT_ICHANNEL_LEFT,
diff --git a/bse/bseitem.hh b/bse/bseitem.hh
index bb7f76b..0b01e58 100644
--- a/bse/bseitem.hh
+++ b/bse/bseitem.hh
@@ -21,17 +21,14 @@ typedef enum                            /*< skip >*/
   BSE_ITEM_FLAG_INTERN_BRANCH   = 1 << (BSE_OBJECT_FLAGS_USHIFT + 2)
 } BseItemFlags;
 #define BSE_ITEM_FLAGS_USHIFT          (BSE_OBJECT_FLAGS_USHIFT + 3)
-/* --- BseItem object --- */
-struct _BseItem
-{
-  BseObject     parent_object;
+
+struct BseItem : BseObject {
   guint         use_count;
   BseItem      *parent;
   BseParasite  *parasite;
 };
-struct _BseItemClass
-{
-  BseObjectClass parent_class;
+
+struct BseItemClass : BseObjectClass {
   void          (*get_candidates) (BseItem               *item,
                                    guint                  param_id,
                                    BsePropertyCandidates *pc,
diff --git a/bse/bsejanitor.hh b/bse/bsejanitor.hh
index ab6b0b9..50679c2 100644
--- a/bse/bsejanitor.hh
+++ b/bse/bsejanitor.hh
@@ -11,9 +11,7 @@ G_BEGIN_DECLS
 #define BSE_IS_JANITOR_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_JANITOR))
 #define BSE_JANITOR_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_JANITOR, 
BseJanitorClass))
 /* --- object structures --- */
-struct _BseJanitor
-{
-  BseItem         parent_instance;
+struct BseJanitor : BseItem {
   guint                  port_closed : 1;
   guint                  force_kill : 1;
   guint                  force_normal_exit : 1;
@@ -29,15 +27,14 @@ struct _BseJanitor
   gint           exit_code;
   gchar         *exit_reason;
 };
-struct _BseJanitorClass
-{
-  BseItemClass parent_class;
-};
-typedef struct {
+struct BseJanitorClass : BseItemClass
+{};
+struct BseJanitorAction {
   GQuark action;
   gchar *name;
   gchar *blurb;
-} BseJanitorAction;
+};
+
 /* --- prototypes --- */
 BseJanitor*  bse_janitor_new           (SfiComPort     *port);
 void        bse_janitor_kill           (BseJanitor     *self);
diff --git a/bse/bseladspa.hh b/bse/bseladspa.hh
index 2839e81..22e3372 100644
--- a/bse/bseladspa.hh
+++ b/bse/bseladspa.hh
@@ -12,23 +12,21 @@ G_BEGIN_DECLS
 #define BSE_IS_LADSPA_PLUGIN_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_LADSPA_PLUGIN))
 #define BSE_LADSPA_PLUGIN_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_LADSPA_PLUGIN, 
BseLadspaPluginClass))
 /* --- BseLadspaPlugin --- */
-typedef struct _BseLadspaInfo        BseLadspaInfo;
+struct BseLadspaInfo;
 typedef struct {
   GType          type;
   BseLadspaInfo *info;
 } BseLadspaTypeInfo;
-typedef struct {
-  GObject            parent_instance;
+struct BseLadspaPlugin : GObject {
   gchar             *fname;
   GModule           *gmodule;
   guint                     use_count;
   guint              n_types;
   BseLadspaTypeInfo *types;
-} BseLadspaPlugin;
-typedef struct {
-  GObjectClass parent_class;
-} BseLadspaPluginClass;
-typedef struct {
+};
+struct BseLadspaPluginClass : GObjectClass
+{};
+struct BseLadspaPort {
   gchar        *ident;
   const gchar  *name;
   gfloat       minimum;
@@ -44,9 +42,8 @@ typedef struct {
   guint                frequency : 1;          /* provide logarithmic frequency slider */
   guint                logarithmic : 1;
   guint                concert_a : 1;          /* default to 440Hz concert A */
-} BseLadspaPort;
-struct _BseLadspaInfo
-{
+};
+struct BseLadspaInfo {
   gchar         *file_path;            /* fully qualified file path and name */
   gchar                *ident;                 /* unique identifier */
   guint          plugin_id;            /* unique plugin type ID */
@@ -72,7 +69,7 @@ struct _BseLadspaInfo
   void        (*deactivate)    (gpointer       instance);
   void        (*cleanup)       (gpointer       instance);
 };
-/* --- public API --- */
+
 BseLadspaInfo* bse_ladspa_info_assemble          (const gchar          *file_path,
                                                   gconstpointer         ladspa_descriptor);
 void           bse_ladspa_info_free              (BseLadspaInfo        *bli);
diff --git a/bse/bseladspamodule.hh b/bse/bseladspamodule.hh
index e8cec96..2e61579 100644
--- a/bse/bseladspamodule.hh
+++ b/bse/bseladspamodule.hh
@@ -12,16 +12,10 @@ G_BEGIN_DECLS
 #define BSE_IS_LADSPA_MODULE_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_LADSPA_MODULE))
 #define BSE_LADSPA_MODULE_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_LADSPA_MODULE, 
BseLadspaModuleClass))
 /* --- BseLadspaModule --- */
-typedef struct _BseLadspaModule      BseLadspaModule;
-typedef struct _BseLadspaModuleClass BseLadspaModuleClass;
-struct _BseLadspaModule
-{
-  BseSource  parent_instance;
+struct BseLadspaModule : BseSource {
   gfloat    *cvalues;
 };
-struct _BseLadspaModuleClass
-{
-  BseSourceClass parent_class;
+struct BseLadspaModuleClass : BseSourceClass {
   BseLadspaInfo *bli;
   BseModuleClass *gsl_class;
 };
diff --git a/bse/bseloader.hh b/bse/bseloader.hh
index 1032b0d..0131f08 100644
--- a/bse/bseloader.hh
+++ b/bse/bseloader.hh
@@ -5,8 +5,7 @@
 #include <bse/gslwavechunk.hh>
 G_BEGIN_DECLS
 /* --- structures --- */
-struct _BseWaveFileInfo
-{
+struct BseWaveFileInfo {
   guint           n_waves;
   struct Wave {
     gchar *name;
@@ -62,8 +61,7 @@ typedef enum /*< skip >*/
   BSE_LOADER_NO_FLAGS              = 0,
   BSE_LOADER_SKIP_PRECEEDING_NULLS = 1 << 0
 } BseLoaderFlags;
-struct _BseLoader
-{
+struct BseLoader {
   const gchar *name;           /* format/loader name, e.g. "BseWave" or "WAVE audio, RIFF (little-endian)" */
   /* at least one of the
    * following three must
diff --git a/bse/bsemidicontroller.hh b/bse/bsemidicontroller.hh
index 9c033c8..2b43188 100644
--- a/bse/bsemidicontroller.hh
+++ b/bse/bsemidicontroller.hh
@@ -11,20 +11,14 @@ G_BEGIN_DECLS
 #define BSE_IS_CONTROLLER(object)            (G_TYPE_CHECK_INSTANCE_TYPE ((object), 
BSE_TYPE_MIDI_CONTROLLER))
 #define BSE_IS_CONTROLLER_CLASS(class)       (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_MIDI_CONTROLLER))
 #define BSE_MIDI_CONTROLLER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), 
BSE_TYPE_MIDI_CONTROLLER, BseMidiControllerClassOut))
-/* --- BseMidiController source --- */
-typedef struct _BseMidiController      BseMidiController;
-typedef struct _BseMidiControllerClass BseMidiControllerClass;
-struct _BseMidiController
-{
-  BseSource          parent_object;
+
+struct BseMidiController : BseSource {
   guint                     midi_channel;
   BseMidiSignalType  controls[4];
 };
-struct _BseMidiControllerClass
-{
-  BseSourceClass  parent_class;
-};
-/* --- channels --- */
+struct BseMidiControllerClass : BseSourceClass
+{};
+
 enum
 {
   BSE_MIDI_CONTROLLER_OCHANNEL_CONTROL1,
diff --git a/bse/bsemididecoder.hh b/bse/bsemididecoder.hh
index 22e00fe..898836b 100644
--- a/bse/bsemididecoder.hh
+++ b/bse/bsemididecoder.hh
@@ -15,9 +15,8 @@ typedef enum {
   BSE_MIDI_DECODER_DATA,        /* left_bytes != 0 */
   BSE_MIDI_DECODER_DONE,
 } BseMidiDecoderState;
-struct _BseMidiDecoder
-{
-  SfiRing         *events;      /* BseMidiEvent* */
+struct BseMidiDecoder {
+  SfiRing             *events;      /* BseMidiEvent* */
   /* configuration */
   BseMusicalTuningType musical_tuning;
   uint                 auto_queue : 1;
diff --git a/bse/bsemididevice-null.hh b/bse/bsemididevice-null.hh
index 6f8ec4e..fd34b07 100644
--- a/bse/bsemididevice-null.hh
+++ b/bse/bsemididevice-null.hh
@@ -10,16 +10,11 @@ G_BEGIN_DECLS
 #define BSE_IS_MIDI_DEVICE_NULL(object)                (G_TYPE_CHECK_INSTANCE_TYPE ((object), 
BSE_TYPE_MIDI_DEVICE_NULL))
 #define BSE_IS_MIDI_DEVICE_NULL_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_MIDI_DEVICE_NULL))
 #define BSE_MIDI_DEVICE_NULL_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), 
BSE_TYPE_MIDI_DEVICE_NULL, BseMidiDeviceNULLClass))
-/* --- BseMidiDeviceNULL object --- */
-typedef        struct _BseMidiDeviceNULL      BseMidiDeviceNULL;
-typedef        struct _BseMidiDeviceNULLClass BseMidiDeviceNULLClass;
-struct _BseMidiDeviceNULL
-{
-  BseMidiDevice parent_object;
-};
-struct _BseMidiDeviceNULLClass
-{
-  BseMidiDeviceClass parent_class;
-};
+
+struct BseMidiDeviceNULL : BseMidiDevice
+{};
+struct BseMidiDeviceNULLClass : BseMidiDeviceClass
+{};
+
 G_END_DECLS
 #endif /* __BSE_MIDI_DEVICE_NULL_H__ */
diff --git a/bse/bsemididevice-oss.hh b/bse/bsemididevice-oss.hh
index 0899708..28d44f0 100644
--- a/bse/bsemididevice-oss.hh
+++ b/bse/bsemididevice-oss.hh
@@ -10,17 +10,12 @@ G_BEGIN_DECLS
 #define BSE_IS_MIDI_DEVICE_OSS(object)         (G_TYPE_CHECK_INSTANCE_TYPE ((object), 
BSE_TYPE_MIDI_DEVICE_OSS))
 #define BSE_IS_MIDI_DEVICE_OSS_CLASS(class)    (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_MIDI_DEVICE_OSS))
 #define BSE_MIDI_DEVICE_OSS_GET_CLASS(object)  (G_TYPE_INSTANCE_GET_CLASS ((object), 
BSE_TYPE_MIDI_DEVICE_OSS, BseMidiDeviceOSSClass))
-/* --- BseMidiDeviceOSS object --- */
-typedef        struct _BseMidiDeviceOSS      BseMidiDeviceOSS;
-typedef        struct _BseMidiDeviceOSSClass BseMidiDeviceOSSClass;
-struct _BseMidiDeviceOSS
-{
-  BseMidiDevice parent_object;
+
+struct BseMidiDeviceOSS : BseMidiDevice {
   gchar       *device_name;
 };
-struct _BseMidiDeviceOSSClass
-{
-  BseMidiDeviceClass parent_class;
-};
+struct BseMidiDeviceOSSClass : BseMidiDeviceClass
+{};
+
 G_END_DECLS
 #endif /* __BSE_MIDI_DEVICE_OSS_H__ */
diff --git a/bse/bsemididevice.hh b/bse/bsemididevice.hh
index 4c8f1bd..68132f6 100644
--- a/bse/bsemididevice.hh
+++ b/bse/bsemididevice.hh
@@ -11,29 +11,22 @@ G_BEGIN_DECLS
 #define BSE_IS_MIDI_DEVICE(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_MIDI_DEVICE))
 #define BSE_IS_MIDI_DEVICE_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_MIDI_DEVICE))
 #define BSE_MIDI_DEVICE_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_MIDI_DEVICE, 
BseMidiDeviceClass))
-/* --- BseMidiDevice structs --- */
-typedef struct _BseMidiHandle          BseMidiHandle;
-typedef struct _BseMidiDevice          BseMidiDevice;
-typedef struct _BseMidiDeviceClass     BseMidiDeviceClass;
-struct _BseMidiHandle  /* this should be nuked, it's useless */
+
+struct BseMidiHandle   /* this should be nuked, it's useless */
 {
   guint                         readable : 1;
   guint                         writable : 1;
   guint                         running_thread : 1;
   BseMidiDecoder       *midi_decoder;
 };
-struct _BseMidiDevice
-{
-  BseDevice              parent_object;
+struct BseMidiDevice : BseDevice {
   BseMidiDecoder       *midi_decoder;
   /* operational handle */
   BseMidiHandle                *handle;
 };
-struct _BseMidiDeviceClass
-{
-  BseDeviceClass       parent_class;
-};
-/* --- internal utils --- */
+struct BseMidiDeviceClass : BseDeviceClass
+{};
+
 void           bse_midi_handle_init            (BseMidiHandle          *handle);
 G_END_DECLS
 #endif /* __BSE_MIDI_DEVICE_H__ */
diff --git a/bse/bsemidiinput.hh b/bse/bsemidiinput.hh
index 6932af1..0cb925a 100644
--- a/bse/bsemidiinput.hh
+++ b/bse/bsemidiinput.hh
@@ -11,19 +11,13 @@ G_BEGIN_DECLS
 #define BSE_IS_INPUT(object)            (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_MIDI_INPUT))
 #define BSE_IS_INPUT_CLASS(class)       (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_MIDI_INPUT))
 #define BSE_MIDI_INPUT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_MIDI_INPUT, 
BseMidiInputClassOut))
-/* --- BseMidiInput source --- */
-typedef struct _BseMidiInput      BseMidiInput;
-typedef struct _BseMidiInputClass BseMidiInputClass;
-struct _BseMidiInput
-{
-  BseSource          parent_object;
+
+struct BseMidiInput : BseSource {
   guint                     midi_channel;
 };
-struct _BseMidiInputClass
-{
-  BseSourceClass  parent_class;
-};
-/* --- channels --- */
+struct BseMidiInputClass : BseSourceClass
+{};
+
 enum
 {
   BSE_MIDI_INPUT_OCHANNEL_FREQUENCY,
diff --git a/bse/bsemidinotifier.hh b/bse/bsemidinotifier.hh
index 593fe8b..aeabc20 100644
--- a/bse/bsemidinotifier.hh
+++ b/bse/bsemidinotifier.hh
@@ -11,19 +11,14 @@ G_BEGIN_DECLS
 #define BSE_IS_MIDI_NOTIFIER(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_MIDI_NOTIFIER))
 #define BSE_IS_MIDI_NOTIFIER_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_MIDI_NOTIFIER))
 #define BSE_MIDI_NOTIFIER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_MIDI_NOTIFIER, 
BseMidiNotifierClass))
-/* --- BseMidiNotifier structs --- */
-struct _BseMidiNotifier
-{
-  BseItem         parent_instance;
+
+struct BseMidiNotifier : BseItem {
   BseMidiReceiver *midi_receiver;
 };
-struct _BseMidiNotifierClass
-{
-  BseItemClass parent_class;
-  void (*midi_event)   (BseMidiNotifier        *self,
-                        BseMidiEvent           *event);
+struct BseMidiNotifierClass : BseItemClass {
+  void (*midi_event)   (BseMidiNotifier *self, BseMidiEvent *event);
 };
-/* --- prototypes --- */
+
 void bse_midi_notifier_set_receiver     (BseMidiNotifier      *self,
                                          BseMidiReceiver      *midi_receiver);
 void bse_midi_notifier_dispatch         (BseMidiNotifier      *self);
diff --git a/bse/bsemidireceiver.cc b/bse/bsemidireceiver.cc
index 2e88ef7..4c6d0ea 100644
--- a/bse/bsemidireceiver.cc
+++ b/bse/bsemidireceiver.cc
@@ -1082,8 +1082,8 @@ MidiChannel::debug_notes (guint64          tick_stamp,
 } // namespace anon
 /* --- BseMidiReceiver C API --- */
 extern "C" {
-struct _BseMidiReceiver : public MidiReceiver {
-  explicit _BseMidiReceiver () :
+struct BseMidiReceiver : public MidiReceiver {
+  explicit BseMidiReceiver () :
     MidiReceiver () {}
 };
 /* --- prototypes --- */
diff --git a/bse/bsemidisynth.hh b/bse/bsemidisynth.hh
index 8585471..633543f 100644
--- a/bse/bsemidisynth.hh
+++ b/bse/bsemidisynth.hh
@@ -11,10 +11,8 @@ G_BEGIN_DECLS
 #define BSE_IS_MIDI_SYNTH(object)       (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_MIDI_SYNTH))
 #define BSE_IS_MIDI_SYNTH_CLASS(class)  (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_MIDI_SYNTH))
 #define BSE_MIDI_SYNTH_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_MIDI_SYNTH, 
BseMidiSynthClass))
-/* --- BseMidiSynth object --- */
-struct _BseMidiSynth
-{
-  BseSNet       parent_object;
+
+struct BseMidiSynth : BseSNet {
   guint                 midi_channel_id;
   guint                 n_voices;
   gfloat        volume_factor;         /* 1-based factor */
@@ -27,9 +25,8 @@ struct _BseMidiSynth
   BseSource    *output;
   BseSource    *sub_synth;
 };
-struct _BseMidiSynthClass
-{
-  BseSNetClass parent_class;
-};
+struct BseMidiSynthClass : BseSNetClass
+{};
+
 G_END_DECLS
 #endif /* __BSE_MIDI_SYNTH_H__ */
diff --git a/bse/bsemidivoice.hh b/bse/bsemidivoice.hh
index f919eee..becec94 100644
--- a/bse/bsemidivoice.hh
+++ b/bse/bsemidivoice.hh
@@ -17,23 +17,19 @@ G_BEGIN_DECLS
 #define BSE_IS_MIDI_VOICE_SWITCH(object)       (G_TYPE_CHECK_INSTANCE_TYPE ((object), 
BSE_TYPE_MIDI_VOICE_SWITCH))
 #define BSE_IS_MIDI_VOICE_SWITCH_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), 
BSE_TYPE_MIDI_VOICE_SWITCH))
 #define BSE_MIDI_VOICE_SWITCH_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), 
BSE_TYPE_MIDI_VOICE_SWITCH, BseMidiVoiceSwitchClass))
-/* --- object structures --- */
-typedef struct _BseMidiVoiceInput  BseMidiVoiceInput;
-typedef struct _BseMidiVoiceSwitch BseMidiVoiceSwitch;
-typedef struct _BseSourceClass     BseMidiVoiceInputClass;
-typedef struct _BseSourceClass     BseMidiVoiceSwitchClass;
-struct _BseMidiVoiceInput
-{
-  BseSource    parent_object;
-  BseMidiVoiceSwitch *voice_switch;
-};
-struct _BseMidiVoiceSwitch
-{
-  BseSource      parent_object;
+
+struct BseMidiVoiceSwitch : BseSource {
   guint                 midi_channel;
   GSList        *midi_voices;
 };
-/* --- prototypes --- */
+struct BseMidiVoiceSwitchClass : BseSourceClass
+{};
+struct BseMidiVoiceInput : BseSource {
+  BseMidiVoiceSwitch *voice_switch;
+};
+struct BseMidiVoiceInputClass : BseSourceClass
+{};
+
 void           bse_midi_voice_switch_set_midi_channel (BseMidiVoiceSwitch *self,
                                                        guint               midi_channel);
 BseMidiContext bse_midi_voice_switch_ref_poly_voice   (BseMidiVoiceSwitch *self,
diff --git a/bse/bseobject.hh b/bse/bseobject.hh
index 928fea8..883dd91 100644
--- a/bse/bseobject.hh
+++ b/bse/bseobject.hh
@@ -31,17 +31,12 @@ typedef enum                                /*< skip >*/
 #define BSE_OBJECT_FLAGS_USHIFT            (3)
 #define BSE_OBJECT_FLAGS_MAX_SHIFT  (16)
 /* --- typedefs & structures --- */
-struct _BseObject
-{
-  GObject               parent_instance;
-  /* pack into one guint */
+struct BseObject : GObject {
   guint16               flags;
   guint16               lock_count;
   guint                         unique_id;
 };
-struct _BseObjectClass
-{
-  GObjectClass          parent_class;
+struct BseObjectClass : GObjectClass {
   gboolean              (*editable_property)    (BseObject      *object, /* for set_property/get_property 
implementations */
                                                  guint           param_id,
                                                  GParamSpec     *pspec);
diff --git a/bse/bseparasite.cc b/bse/bseparasite.cc
index 8cb2f53..a63fc57 100644
--- a/bse/bseparasite.cc
+++ b/bse/bseparasite.cc
@@ -12,7 +12,7 @@ typedef struct {
   BseItem *link;
   GSList  *paths; /* contains ref-counted const gchar* */
 } CRef;
-struct _BseParasite {
+struct BseParasite {
   GBSearchArray *nodes;
   GBSearchArray *crefs;
 };
diff --git a/bse/bsepart.hh b/bse/bsepart.hh
index df5cc05..80de4dc 100644
--- a/bse/bsepart.hh
+++ b/bse/bsepart.hh
@@ -12,15 +12,13 @@ G_BEGIN_DECLS
 #define BSE_IS_PART_CLASS(class)        (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_PART))
 #define BSE_PART_GET_CLASS(object)      (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_PART, BsePartClass))
 /* --- typedefs & structures --- */
-typedef struct {
+struct BsePartControls {
   GBSearchArray *bsa;
-} BsePartControls;
-typedef struct {
+};
+struct BsePartNoteChannel {
   GBSearchArray *bsa;
-} BsePartNoteChannel;
-struct _BsePart
-{
-  BseItem             parent_instance;
+};
+struct BsePart : BseItem {
   const double       *semitone_table; // [-132..+132] only updated when not playing
   /* id -> tick lookups */
   guint               n_ids;
@@ -41,9 +39,7 @@ struct _BsePart
   gint                range_min_note;
   gint                range_max_note;
 };
-struct _BsePartClass
-{
-  BseItemClass parent_class;
+struct BsePartClass : BseItemClass {
   void  (*range_changed)        (BsePart        *part,
                                  guint           tick,
                                  guint           duration,
@@ -56,7 +52,7 @@ typedef enum    /*< skip >*/
   BSE_PART_EVENT_CONTROL,
   BSE_PART_EVENT_NOTE
 } BsePartEventType;
-/* --- functions --- */
+
 #define            bse_part_transpose_factor(          part, index /* -132..+132*/)     
((part)->semitone_table[index])
 void               bse_part_set_semitone_table        (BsePart           *self,
                                                        const double      *semitone_table);
@@ -141,7 +137,7 @@ gboolean           bse_part_set_note_selected         (BsePart           *self,
 gboolean           bse_part_set_control_selected      (BsePart           *self,
                                                        guint              id,
                                                        gboolean           selected);
-typedef struct {
+struct BsePartQueryEvent {
   guint             id;
   BsePartEventType  event_type;
   guint             channel;
@@ -158,7 +154,8 @@ typedef struct {
   /* control */
   BseMidiSignalType control_type;
   gfloat            control_value;
-} BsePartQueryEvent;
+};
+
 BsePartEventType   bse_part_query_event         (BsePart           *self,
                                                  guint              id,
                                                  BsePartQueryEvent *equery);
@@ -169,20 +166,19 @@ BsePartEventType   bse_part_query_event         (BsePart           *self,
 #define BSE_PART_NOTE_CONTROL(ctype)    ((ctype) == BSE_MIDI_SIGNAL_VELOCITY || \
                                          (ctype) == BSE_MIDI_SIGNAL_FINE_TUNE)
 /* --- BsePartControlChannel --- */
-typedef struct _BsePartEventControl BsePartEventControl;
-typedef struct
-{
+struct BsePartEventControl;
+struct BsePartTickNode {
   guint                tick;
   BsePartEventControl *events;
-} BsePartTickNode;
-struct _BsePartEventControl
-{
+};
+struct BsePartEventControl {
   BsePartEventControl   *next;
   guint                  id : 31;
   guint                  selected : 1;
   guint                  ctype; /* BseMidiSignalType */
   gfloat                 value;         /* -1 .. 1 */
 };
+
 void                 bse_part_controls_init            (BsePartControls     *self);
 BsePartTickNode*     bse_part_controls_lookup          (BsePartControls     *self,
                                                         guint                tick);
@@ -218,10 +214,8 @@ void                 bse_part_controls_remove          (BsePartControls     *sel
                                                         guint                tick,
                                                         BsePartEventControl *cev);
 void                 bse_part_controls_destroy         (BsePartControls     *self);
-/* --- BsePartNoteChannel --- */
-typedef struct _BsePartEventNote BsePartEventNote;
-struct _BsePartEventNote
-{
+
+struct BsePartEventNote {
   guint                  tick;
   guint                  id : 31;
   guint                  selected : 1;
@@ -260,5 +254,7 @@ void              bse_part_note_channel_change_note   (BsePartNoteChannel *self,
 void              bse_part_note_channel_remove        (BsePartNoteChannel *self,
                                                        guint               tick);
 void              bse_part_note_channel_destroy       (BsePartNoteChannel *self);
+
 G_END_DECLS
+
 #endif /* __BSE_PART_H__ */
diff --git a/bse/bsepcmdevice-null.hh b/bse/bsepcmdevice-null.hh
index 6302685..4ef50aa 100644
--- a/bse/bsepcmdevice-null.hh
+++ b/bse/bsepcmdevice-null.hh
@@ -11,15 +11,11 @@ G_BEGIN_DECLS
 #define BSE_IS_PCM_DEVICE_NULL_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_PCM_DEVICE_NULL))
 #define BSE_PCM_DEVICE_NULL_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), 
BSE_TYPE_PCM_DEVICE_NULL, BsePcmDeviceNullClass))
 /* --- BsePcmDeviceNull object --- */
-typedef struct _BsePcmDeviceNull      BsePcmDeviceNull;
-typedef struct _BsePcmDeviceNullClass BsePcmDeviceNullClass;
-struct _BsePcmDeviceNull
-{
-  BsePcmDevice parent_object;
-};
-struct _BsePcmDeviceNullClass
-{
-  BsePcmDeviceClass parent_class;
-};
+
+struct BsePcmDeviceNull : BsePcmDevice
+{};
+struct BsePcmDeviceNullClass : BsePcmDeviceClass
+{};
+
 G_END_DECLS
 #endif /* __BSE_PCM_DEVICE_NULL_H__ */
diff --git a/bse/bsepcmdevice-oss.hh b/bse/bsepcmdevice-oss.hh
index 97b20c9..638fd09 100644
--- a/bse/bsepcmdevice-oss.hh
+++ b/bse/bsepcmdevice-oss.hh
@@ -10,17 +10,12 @@ G_BEGIN_DECLS
 #define BSE_IS_PCM_DEVICE_OSS(object)       (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_PCM_DEVICE_OSS))
 #define BSE_IS_PCM_DEVICE_OSS_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_PCM_DEVICE_OSS))
 #define BSE_PCM_DEVICE_OSS_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_PCM_DEVICE_OSS, 
BsePcmDeviceOSSClass))
-/* --- BsePcmDeviceOSS object --- */
-typedef        struct _BsePcmDeviceOSS      BsePcmDeviceOSS;
-typedef        struct _BsePcmDeviceOSSClass BsePcmDeviceOSSClass;
-struct _BsePcmDeviceOSS
-{
-  BsePcmDevice parent_object;
+
+struct BsePcmDeviceOSS : BsePcmDevice {
   gchar       *device_name;
 };
-struct _BsePcmDeviceOSSClass
-{
-  BsePcmDeviceClass parent_class;
-};
+struct BsePcmDeviceOSSClass : BsePcmDeviceClass
+{};
+
 G_END_DECLS
 #endif /* __BSE_PCM_DEVICE_OSS_H__ */
diff --git a/bse/bsepcmdevice.hh b/bse/bsepcmdevice.hh
index 17241dd..e5f1022 100644
--- a/bse/bsepcmdevice.hh
+++ b/bse/bsepcmdevice.hh
@@ -18,13 +18,8 @@ typedef enum /*< skip >*/
   BSE_PCM_CMODE_MONO   = 1,
   BSE_PCM_CMODE_STEREO
 } BsePcmChannelMode;
-/* --- BsePcmDevice structs --- */
-typedef struct _BsePcmStatus           BsePcmStatus;
-typedef struct _BsePcmHandle           BsePcmHandle;
-typedef struct _BsePcmDevice           BsePcmDevice;
-typedef struct _BsePcmDeviceClass      BsePcmDeviceClass;
-struct _BsePcmHandle
-{
+
+struct BsePcmHandle {
   guint                         readable : 1;
   guint                         writable : 1;
   guint                         n_channels;    /* should be req_n_channels */
@@ -39,9 +34,7 @@ struct _BsePcmHandle
                          glong                  *timeoutp);
   guint    (*latency)   (BsePcmHandle           *handle);
 };
-struct _BsePcmDevice
-{
-  BseDevice            parent_instance;
+struct BsePcmDevice : BseDevice {
   /* requested caps */
   guint                        req_n_channels;
   guint                 req_mix_freq;
@@ -50,11 +43,9 @@ struct _BsePcmDevice
   /* operational handle */
   BsePcmHandle        *handle;
 };
-struct _BsePcmDeviceClass
-{
-  BseDeviceClass       parent_class;
-};
-/* --- prototypes --- */
+struct BsePcmDeviceClass : BseDeviceClass
+{};
+
 void           bse_pcm_device_request          (BsePcmDevice           *pdev,
                                                 guint                   n_channels,
                                                  guint                   mix_freq,
diff --git a/bse/bsepcminput.hh b/bse/bsepcminput.hh
index 1aa8304..84e388a 100644
--- a/bse/bsepcminput.hh
+++ b/bse/bsepcminput.hh
@@ -11,20 +11,16 @@ G_BEGIN_DECLS
 #define BSE_IS_PCM_INPUT_CLASS(class)  (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_PCM_INPUT))
 #define BSE_PCM_INPUT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_PCM_INPUT, 
BsePcmInputClass))
 /* --- BsePcmInput source --- */
-typedef struct _BsePcmInput      BsePcmInput;
-typedef struct _BsePcmInputClass BsePcmInputClass;
-struct _BsePcmInput
+
+struct BsePcmInput : BseSource
 {
-  BseSource       parent_object;
   gfloat         volume_factor;
   /* PREPARED */
   BseModule     *uplink;
 };
-struct _BsePcmInputClass
-{
-  BseSourceClass     parent_class;
-};
-/* --- channels --- */
+struct BsePcmInputClass : BseSourceClass
+{};
+
 enum
 {
   BSE_PCM_INPUT_OCHANNEL_LEFT,
diff --git a/bse/bsepcmoutput.hh b/bse/bsepcmoutput.hh
index 114b33f..f6ecb15 100644
--- a/bse/bsepcmoutput.hh
+++ b/bse/bsepcmoutput.hh
@@ -12,21 +12,15 @@ extern "C" {
 #define BSE_IS_PCM_OUTPUT(object)       (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_PCM_OUTPUT))
 #define BSE_IS_PCM_OUTPUT_CLASS(class)  (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_PCM_OUTPUT))
 #define BSE_PCM_OUTPUT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_PCM_OUTPUT, 
BsePcmOutputClass))
-/* --- BsePcmOutput source --- */
-typedef struct _BsePcmOutput      BsePcmOutput;
-typedef struct _BsePcmOutputClass BsePcmOutputClass;
-struct _BsePcmOutput
-{
-  BseSource       parent_object;
+
+struct BsePcmOutput : BseSource {
   gfloat         volume_factor;
   /* PREPARED */
   BseModule     *uplink;
 };
-struct _BsePcmOutputClass
-{
-  BseSourceClass     parent_class;
-};
-/* --- channels --- */
+struct BsePcmOutputClass : BseSourceClass
+{};
+
 enum
 {
   BSE_PCM_OUTPUT_ICHANNEL_LEFT,
diff --git a/bse/bsepcmwriter.hh b/bse/bsepcmwriter.hh
index 5def768..0c9faf0 100644
--- a/bse/bsepcmwriter.hh
+++ b/bse/bsepcmwriter.hh
@@ -11,9 +11,7 @@ G_BEGIN_DECLS
 #define BSE_IS_PCM_WRITER_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_PCM_WRITER))
 #define BSE_PCM_WRITER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_PCM_WRITER, 
BsePcmWriterClass))
 /* --- BsePcmWriter  --- */
-struct _BsePcmWriter
-{
-  BseItem      parent_instance;
+struct BsePcmWriter : BseItem {
   Bse::Mutex   mutex;
   guint                open : 1;
   guint                broken : 1;
@@ -21,11 +19,9 @@ struct _BsePcmWriter
   uint64       n_bytes;
   uint64        recorded_maximum;
 };
-struct _BsePcmWriterClass
-{
-  BseItemClass         parent_class;
-};
-/* --- prototypes --- */
+struct BsePcmWriterClass : BseItemClass
+{};
+
 BseErrorType   bse_pcm_writer_open             (BsePcmWriter           *pdev,
                                                 const gchar            *file,
                                                 guint                   n_channels,
diff --git a/bse/bseplugin.hh b/bse/bseplugin.hh
index a042fc1..0661180 100644
--- a/bse/bseplugin.hh
+++ b/bse/bseplugin.hh
@@ -11,10 +11,8 @@ G_BEGIN_DECLS
 #define BSE_IS_PLUGIN(plugin)        (G_TYPE_CHECK_INSTANCE_TYPE ((plugin), BSE_TYPE_PLUGIN))
 #define BSE_IS_PLUGIN_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_PLUGIN))
 #define BSE_PLUGIN_GET_CLASS(plugin) (G_TYPE_INSTANCE_GET_CLASS ((plugin), BSE_TYPE_PLUGIN, BsePluginClass))
-/* --- BsePlugin --- */
-struct _BsePlugin
-{
-  GObject       parent_instance;
+
+struct BsePlugin : GObject {
   gchar                *fname;
   gpointer      gmodule;
   guint64        missing_export_flags;
@@ -26,11 +24,9 @@ struct _BsePlugin
   guint                 n_types;
   GType        *types;
 };
-struct _BsePluginClass
-{
-  GObjectClass parent_class;
-};
-/* --- prototypes --- */
+struct BsePluginClass : GObjectClass
+{};
+
 SfiRing*       bse_plugin_path_list_files      (gboolean        include_drivers,
                                                  gboolean        include_plugins);
 const gchar*   bse_plugin_check_load           (const gchar    *file_name);
diff --git a/bse/bseproject.hh b/bse/bseproject.hh
index f0e9af7..9e4d887 100644
--- a/bse/bseproject.hh
+++ b/bse/bseproject.hh
@@ -16,9 +16,8 @@ typedef enum {
   BSE_PROJECT_ACTIVE,
   BSE_PROJECT_PLAYING
 } BseProjectState;
-struct _BseProject
-{
-  BseContainer       parent_object;
+
+struct BseProject : BseContainer {
   GSList            *supers;
   GSList            *items;
   guint               in_undo : 1;
@@ -31,11 +30,9 @@ struct _BseProject
   guint64            deactivate_min_tick;
   BseMidiReceiver    *midi_receiver;
 };
-struct _BseProjectClass
-{
-  BseContainerClass parent_class;
-};
-/* --- prototypes --- */
+struct BseProjectClass : BseContainerClass
+{};
+
 BseErrorType   bse_project_activate            (BseProject     *project);
 void           bse_project_start_playback      (BseProject     *project);
 void           bse_project_stop_playback       (BseProject     *project);
diff --git a/bse/bseserver.hh b/bse/bseserver.hh
index ed3eabb..6674aa3 100644
--- a/bse/bseserver.hh
+++ b/bse/bseserver.hh
@@ -12,10 +12,8 @@ G_BEGIN_DECLS
 #define BSE_IS_SERVER(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_SERVER))
 #define BSE_IS_SERVER_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_SERVER))
 #define BSE_SERVER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_SERVER, BseServerClass))
-/* --- BseServer object --- */
-struct _BseServer
-{
-  BseContainer     parent_object;
+
+struct BseServer : BseContainer {
   GSource        *engine_source;
   GList                  *projects;
   GSList         *children;
@@ -31,11 +29,9 @@ struct _BseServer
   BseMidiDevice          *midi_device;
   GSList         *watch_list;
 };
-struct _BseServerClass
-{
-  BseContainerClass parent_class;
-};
-/* --- prototypes --- */
+struct BseServerClass : BseContainerClass
+{};
+
 BseServer*     bse_server_get                          (void);
 BseProject*    bse_server_create_project               (BseServer      *server,
                                                         const gchar    *name);
diff --git a/bse/bsesnet.hh b/bse/bsesnet.hh
index deb5a3f..5b428d4 100644
--- a/bse/bsesnet.hh
+++ b/bse/bsesnet.hh
@@ -12,15 +12,14 @@ G_BEGIN_DECLS
 #define BSE_IS_SNET_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_SNET))
 #define BSE_SNET_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_SNET, BseSNetClass))
 #define BSE_SNET_USER_SYNTH(src)   ((BSE_OBJECT_FLAGS (src) & BSE_SNET_FLAG_USER_SYNTH) != 0)
-/* --- BseSNet flags --- */
+
 typedef enum   /*< skip >*/
 {
   BSE_SNET_FLAG_USER_SYNTH     = 1 << (BSE_SUPER_FLAGS_USHIFT + 0)
 } BseSNetFlags;
 #define BSE_SNET_FLAGS_USHIFT  (BSE_SUPER_FLAGS_USHIFT + 1)
-/* --- BseSNet object --- */
-typedef struct
-{
+
+struct BseSNetPort {
   gchar     *name;
   guint      context : 31;
   guint             input : 1;
@@ -28,10 +27,9 @@ typedef struct
   guint             src_ostream;
   BseModule *dest_imodule;     /* input */
   guint             dest_istream;
-} BseSNetPort;
-struct _BseSNet
-{
-  BseSuper      parent_object;
+};
+
+struct BseSNet : BseSuper {
   SfiRing      *sources;       /* of type BseSource* */
   SfiRing      *isources;      /* internal (protected) sources */
   GSList       *iport_names;
@@ -40,16 +38,15 @@ struct _BseSNet
   GSList       *tmp_context_children;
   guint                 port_unregistered_id;
 };
-struct _BseSNetClass
-{
-  BseSuperClass parent_class;
-};
-struct _BseMidiContext {
+struct BseSNetClass : BseSuperClass
+{};
+
+struct BseMidiContext {
   BseMidiReceiver *midi_receiver;
   guint            midi_channel;
   guint            voice_id;
 };
-/* --- prototypes --- */
+
 guint            bse_snet_create_context        (BseSNet         *snet,
                                                  BseMidiContext   mcontext,
                                                  BseTrans        *trans);
diff --git a/bse/bsesnooper.hh b/bse/bsesnooper.hh
index b2737b9..5bc1198 100644
--- a/bse/bsesnooper.hh
+++ b/bse/bsesnooper.hh
@@ -11,18 +11,19 @@ G_BEGIN_DECLS
 #define BSE_IS_SNOOPER_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_SNOOPER))
 #define BSE_SNOOPER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_SNOOPER, 
BseSnooperClass))
 /* --- BseSnooper source --- */
-typedef struct _BseSnooper     BseSnooper;
-typedef struct _BseSourceClass BseSnooperClass;
-struct _BseSnooper
-{
-  BseSource       parent_object;
+
+struct BseSnooper : BseSource {
   volatile guint  active_context_id;
 };
-/* --- channels --- */
+
+struct BseSnooperClass : BseSourceClass
+{};
+
 enum
 {
   BSE_SNOOPER_ICHANNEL_MONO,
   BSE_SNOOPER_N_ICHANNELS
 };
+
 G_END_DECLS
 #endif /* __BSE_SNOOPER_H__ */
diff --git a/bse/bsesong.hh b/bse/bsesong.hh
index eb1d83b..f631f79 100644
--- a/bse/bsesong.hh
+++ b/bse/bsesong.hh
@@ -11,13 +11,11 @@ G_BEGIN_DECLS
 #define BSE_IS_SONG_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_SONG))
 #define BSE_SONG_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_SONG, BseSongClass))
 /* --- BseSong object --- */
-typedef struct {
+struct BseSongVoice {
   BseSource *constant;
   BseSource *sub_synth;
-} BseSongVoice;
-struct _BseSong
-{
-  BseSNet           parent_instance;
+};
+struct BseSong : BseSNet {
   guint                    tpqn;               /* ticks per querter note */
   guint                    numerator;
   guint                    denominator;
@@ -48,11 +46,9 @@ struct _BseSong
   SfiInt           loop_left_SL;       /* left loop tick */
   SfiInt           loop_right_SL;      /* left loop tick */
 };
-struct _BseSongClass
-{
-  BseSNetClass parent_class;
-};
-/* --- prototypes --- */
+struct BseSongClass : BseSNetClass
+{};
+
 BseSong*       bse_song_lookup                 (BseProject     *project,
                                                 const gchar    *name);
 void           bse_song_stop_sequencing_SL     (BseSong        *self);
@@ -65,5 +61,7 @@ BseBus*         bse_song_find_master            (BseSong        *self);
 BseSource*      bse_song_ensure_master          (BseSong        *self);
 void            bse_song_set_solo_bus           (BseSong        *self,
                                                  BseBus         *bus);
+
 G_END_DECLS
+
 #endif /* __BSE_SONG_H__ */
diff --git a/bse/bsesource.hh b/bse/bsesource.hh
index 527314f..479ef66 100644
--- a/bse/bsesource.hh
+++ b/bse/bsesource.hh
@@ -4,7 +4,9 @@
 #include <bse/bseitem.hh>
 #include <bse/gsldefs.hh>
 #include <sfi/gbsearcharray.hh>
+
 G_BEGIN_DECLS
+
 /* --- BseSource type macros --- */
 #define BSE_TYPE_SOURCE              (BSE_TYPE_ID (BseSource))
 #define BSE_SOURCE(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), BSE_TYPE_SOURCE, BseSource))
@@ -41,7 +43,7 @@ G_BEGIN_DECLS
                                            0xffffffff)
 #define        BSE_SOURCE_JSTREAM_FLAG           ((guint) 1 << 31)
 #define BSE_SOURCE_PRIVATE_INPUTS(src)    ((BSE_OBJECT_FLAGS (src) & BSE_SOURCE_FLAG_PRIVATE_INPUTS) != 0)
-/* --- BseSource flags --- */
+
 typedef enum   /*< skip >*/
 {
   BSE_SOURCE_FLAG_PRIVATE_INPUTS       = 1 << (BSE_ITEM_FLAGS_USHIFT + 0),
@@ -49,39 +51,23 @@ typedef enum        /*< skip >*/
   BSE_SOURCE_FLAG_COLLECTED            = 1 << (BSE_ITEM_FLAGS_USHIFT + 2)
 } BseSourceFlags;
 #define BSE_SOURCE_FLAGS_USHIFT        (BSE_ITEM_FLAGS_USHIFT + 3)
-/* --- typedefs & structures --- */
-typedef union  _BseSourceInput         BseSourceInput;
-typedef struct _BseSourceOutput                BseSourceOutput;
-typedef struct _BseSourceChannelDefs   BseSourceChannelDefs;
+
 typedef struct _BseSourceProbes                BseSourceProbes;
 typedef void (*BseSourceFreeContextData) (BseSource *source,
                                          gpointer   data,
                                          BseTrans  *trans);
-struct _BseSourceOutput
-{
+struct BseSourceOutput {
   BseSource *osource;
   guint      ochannel;
 };
-union _BseSourceInput
-{
+union BseSourceInput {
   BseSourceOutput    idata;
   struct {
     guint           n_joints;
     BseSourceOutput *joints;
   }                  jdata;
 };
-struct _BseSource
-{
-  BseItem               parent_object;
-  BseSourceChannelDefs *channel_defs;
-  BseSourceInput       *inputs;        /* [n_ichannels] */
-  GSList              *outputs;
-  GBSearchArray        *contexts; /* bsearch array of type BseSourceContext */
-  SfiReal              pos_x, pos_y;
-  BseSourceProbes      *probes;
-};
-struct _BseSourceChannelDefs
-{
+struct BseSourceChannelDefs {
   guint   n_ichannels;
   gchar **ichannel_idents;
   gchar **ichannel_labels;
@@ -93,9 +79,15 @@ struct _BseSourceChannelDefs
   gchar **ochannel_labels;
   gchar **ochannel_blurbs;
 };
-struct _BseSourceClass
-{
-  BseItemClass          parent_class;
+struct BseSource : BseItem {
+  BseSourceChannelDefs *channel_defs;
+  BseSourceInput       *inputs;        /* [n_ichannels] */
+  GSList              *outputs;
+  GBSearchArray        *contexts; /* bsearch array of type BseSourceContext */
+  SfiReal              pos_x, pos_y;
+  BseSourceProbes      *probes;
+};
+struct BseSourceClass : BseItemClass {
   BseSourceChannelDefs  channel_defs;
   void          (*property_updated)     (BseSource      *source,        /* overridable method */
                                          guint           property_id,
@@ -127,7 +119,7 @@ struct _BseSourceClass
   SfiRing        *unprepared_properties;
   SfiRing        *automation_properties;
 };
-/* --- prototypes -- */
+
 guint          bse_source_find_ichannel        (BseSource      *source,
                                                 const gchar    *ichannel_ident);
 guint          bse_source_find_ochannel        (BseSource      *source,
diff --git a/bse/bsestandardosc.hh b/bse/bsestandardosc.hh
index eb230ba..c016702 100644
--- a/bse/bsestandardosc.hh
+++ b/bse/bsestandardosc.hh
@@ -4,14 +4,14 @@
 #include <bse/bsesource.hh>
 #include <bse/gsloscillator.hh>
 G_BEGIN_DECLS
-/* --- object type macros --- */
+
 #define BSE_TYPE_STANDARD_OSC              (BSE_TYPE_ID (BseStandardOsc))
 #define BSE_STANDARD_OSC(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), BSE_TYPE_STANDARD_OSC, 
BseStandardOsc))
 #define BSE_STANDARD_OSC_CLASS(class)      (G_TYPE_CHECK_CLASS_CAST ((class), BSE_TYPE_STANDARD_OSC, 
BseStandardOscClass))
 #define BSE_IS_STANDARD_OSC(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_STANDARD_OSC))
 #define BSE_IS_STANDARD_OSC_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_STANDARD_OSC))
 #define BSE_STANDARD_OSC_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_STANDARD_OSC, 
BseStandardOscClass))
-/* --- wave forms --- */
+
 typedef enum
 {
   BSE_STANDARD_OSC_SINE                = GSL_OSC_WAVE_SINE,            /*< nick=Sine >*/
@@ -24,23 +24,17 @@ typedef enum
   BSE_STANDARD_OSC_SQUARE      = GSL_OSC_WAVE_SQUARE,          /*< nick=Square >*/
   BSE_STANDARD_OSC_PULSE       = GSL_OSC_WAVE_PULSE_SAW        /*< nick=Pulse >*/
 } BseStandardOscWaveType;
-/* --- BseStandardOsc source --- */
-typedef struct _BseStandardOsc      BseStandardOsc;
-typedef struct _BseStandardOscClass BseStandardOscClass;
-struct _BseStandardOsc
-{
-  BseSource             parent_object;
+
+struct BseStandardOsc : BseSource {
   BseStandardOscWaveType wave;
   GslOscConfig          config;
   int                    transpose;
   gfloat                 fm_strength;
   gfloat                 n_octaves;
 };
-struct _BseStandardOscClass
-{
-  BseSourceClass parent_class;
-};
-/* --- channels --- */
+struct BseStandardOscClass : BseSourceClass
+{};
+
 enum
 {
   BSE_STANDARD_OSC_ICHANNEL_FREQ,
diff --git a/bse/bsestorage.hh b/bse/bsestorage.hh
index 7714667..f791c31 100644
--- a/bse/bsestorage.hh
+++ b/bse/bsestorage.hh
@@ -37,9 +37,7 @@ typedef void (*BseStorageRestoreLink)   (gpointer        data,
                                          BseItem        *from_item,
                                          BseItem        *to_item,
                                          const gchar    *error);
-struct _BseStorage
-{
-  BseObject              parent_instance;
+struct BseStorage : BseObject {
   /* writing */
   SfiWStore             *wstore;
   SfiPPool              *stored_items;
@@ -61,10 +59,9 @@ struct _BseStorage
   gfloat                 osc_freq;
   guint                  n_channels;
 };
-struct _BseStorageClass
-{
-  BseObjectClass parent_class;
-};
+struct BseStorageClass : BseObjectClass
+{};
+
 /* --- compatibility file parsing --- */
 void         bse_storage_compat_dhreset         (BseStorage             *self);
 void         bse_storage_compat_dhmixf          (BseStorage             *self,
diff --git a/bse/bsesubiport.hh b/bse/bsesubiport.hh
index c67ca67..c720a34 100644
--- a/bse/bsesubiport.hh
+++ b/bse/bsesubiport.hh
@@ -4,7 +4,7 @@
 #include <bse/bsesource.hh>
 #include <bse/bseengine.hh>
 G_BEGIN_DECLS
-/* --- object type macros --- */
+
 #define BSE_TYPE_SUB_IPORT             (BSE_TYPE_ID (BseSubIPort))
 #define BSE_SUB_IPORT(object)          (G_TYPE_CHECK_INSTANCE_CAST ((object), BSE_TYPE_SUB_IPORT, 
BseSubIPort))
 #define BSE_SUB_IPORT_CLASS(class)     (G_TYPE_CHECK_CLASS_CAST ((class), BSE_TYPE_SUB_IPORT, 
BseSubIPortClass))
@@ -12,17 +12,13 @@ G_BEGIN_DECLS
 #define BSE_IS_IPORT_CLASS(class)      (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_SUB_IPORT))
 #define BSE_SUB_IPORT_GET_CLASS(object)        (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_SUB_IPORT, 
BseSubIPortClass))
 #define BSE_SUB_IPORT_N_PORTS           (4)
-/* --- BseSubIPort module --- */
-typedef struct _BseSubIPort      BseSubIPort;
-typedef struct _BseSubIPortClass BseSubIPortClass;
-struct _BseSubIPort
-{
-  BseSource     parent_object;
+
+struct BseSubIPort : BseSource {
   gchar               **input_ports;
 };
-struct _BseSubIPortClass
-{
-  BseSourceClass parent_class;
-};
+struct BseSubIPortClass : BseSourceClass
+{};
+
 G_END_DECLS
+
 #endif /* __BSE_SUB_IPORT_H__ */
diff --git a/bse/bsesuboport.hh b/bse/bsesuboport.hh
index e3b0efc..a801c91 100644
--- a/bse/bsesuboport.hh
+++ b/bse/bsesuboport.hh
@@ -4,7 +4,7 @@
 #include <bse/bsesource.hh>
 #include <bse/bseengine.hh>
 G_BEGIN_DECLS
-/* --- object type macros --- */
+
 #define BSE_TYPE_SUB_OPORT             (BSE_TYPE_ID (BseSubOPort))
 #define BSE_SUB_OPORT(object)          (G_TYPE_CHECK_INSTANCE_CAST ((object), BSE_TYPE_SUB_OPORT, 
BseSubOPort))
 #define BSE_SUB_OPORT_CLASS(class)     (G_TYPE_CHECK_CLASS_CAST ((class), BSE_TYPE_SUB_OPORT, 
BseSubOPortClass))
@@ -12,17 +12,13 @@ G_BEGIN_DECLS
 #define BSE_IS_OPORT_CLASS(class)      (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_SUB_OPORT))
 #define BSE_SUB_OPORT_GET_CLASS(object)        (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_SUB_OPORT, 
BseSubOPortClass))
 #define        BSE_SUB_OPORT_N_PORTS   (4)
-/* --- BseSubOPort module --- */
-typedef struct _BseSubOPort      BseSubOPort;
-typedef struct _BseSubOPortClass BseSubOPortClass;
-struct _BseSubOPort
-{
-  BseSource     parent_object;
+
+struct BseSubOPort : BseSource {
   gchar               **output_ports;
 };
-struct _BseSubOPortClass
-{
-  BseSourceClass parent_class;
-};
+struct BseSubOPortClass : BseSourceClass
+{};
+
 G_END_DECLS
+
 #endif /* __BSE_SUB_OPORT_H__ */
diff --git a/bse/bsesubsynth.hh b/bse/bsesubsynth.hh
index 47ab7a2..6054d3c 100644
--- a/bse/bsesubsynth.hh
+++ b/bse/bsesubsynth.hh
@@ -3,28 +3,24 @@
 #define __BSE_SUB_SYNTH_H__
 #include <bse/bsesource.hh>
 G_BEGIN_DECLS
-/* --- object type macros --- */
+
 #define BSE_TYPE_SUB_SYNTH             (BSE_TYPE_ID (BseSubSynth))
 #define BSE_SUB_SYNTH(object)          (G_TYPE_CHECK_INSTANCE_CAST ((object), BSE_TYPE_SUB_SYNTH, 
BseSubSynth))
 #define BSE_SUB_SYNTH_CLASS(class)     (G_TYPE_CHECK_CLASS_CAST ((class), BSE_TYPE_SUB_SYNTH, 
BseSubSynthClass))
 #define BSE_IS_SUB_SYNTH(object)       (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_SUB_SYNTH))
 #define BSE_IS_SUB_SYNTH_CLASS(class)  (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_SUB_SYNTH))
 #define BSE_SUB_SYNTH_GET_CLASS(object)        (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_SUB_SYNTH, 
BseSubSynthClass))
-/* --- BseSubSynth source --- */
-struct _BseSubSynth
-{
-  BseSource        parent_object;
+
+struct BseSubSynth : BseSource {
   BseSNet        *snet;
   gchar                 **input_ports;
   gchar                 **output_ports;
   guint            midi_channel;
   guint            null_shortcut : 1;
 };
-struct _BseSubSynthClass
-{
-  BseSourceClass     parent_class;
-};
-/* --- prototypes --- */
+struct BseSubSynthClass : BseSourceClass
+{};
+
 /* whether to shortcut inputs with outputs for snet==NULL */
 void    bse_sub_synth_set_null_shortcut  (BseSubSynth     *self,
                                           gboolean         enabled);
diff --git a/bse/bsesuper.hh b/bse/bsesuper.hh
index 5362496..820f2db 100644
--- a/bse/bsesuper.hh
+++ b/bse/bsesuper.hh
@@ -12,24 +12,20 @@ G_BEGIN_DECLS
 #define BSE_SUPER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_SUPER, BseSuperClass))
 /* --- BseSuper member macros --- */
 #define BSE_SUPER_NEEDS_CONTEXT(object)                  ((BSE_OBJECT_FLAGS (object) & 
BSE_SUPER_FLAG_NEEDS_CONTEXT) != 0)
-/* --- bse super flags --- */
+
 typedef enum                            /*< skip >*/
 {
   BSE_SUPER_FLAG_NEEDS_CONTEXT          = 1 << (BSE_CONTAINER_FLAGS_USHIFT + 0),
 } BseSuperFlags;
 #define BSE_SUPER_FLAGS_USHIFT        (BSE_CONTAINER_FLAGS_USHIFT + 1)
-/* --- BseSuper object --- */
-struct _BseSuper
-{
-  BseContainer  parent_object;
+
+struct BseSuper : BseContainer {
   SfiTime       creation_time;
   SfiTime       mod_time;
   /* for BseProject */
   guint          context_handle;
 };
-struct _BseSuperClass
-{
-  BseContainerClass parent_class;
+struct BseSuperClass : BseContainerClass {
   void         (*modified)             (BseSuper       *super,
                                         SfiTime         stamp);
   void          (*compat_finish)        (BseSuper       *super,
@@ -37,5 +33,6 @@ struct _BseSuperClass
                                          guint           vminor,
                                          guint           vmicro);
 };
+
 G_END_DECLS
 #endif /* __BSE_SUPER_H__ */
diff --git a/bse/bsetrack.hh b/bse/bsetrack.hh
index df2ee8c..d7a4450 100644
--- a/bse/bsetrack.hh
+++ b/bse/bsetrack.hh
@@ -12,15 +12,13 @@ G_BEGIN_DECLS
 #define BSE_IS_TRACK(object)       (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_TRACK))
 #define BSE_IS_TRACK_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_TRACK))
 #define BSE_TRACK_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_TRACK, BseTrackClass))
-/* --- BseTrack --- */
-typedef struct {
+
+struct BseTrackEntry {
   guint    tick;
   guint    id;
   BsePart *part;
-} BseTrackEntry;
-struct _BseTrack
-{
-  BseContextMerger parent_instance;
+};
+struct BseTrack : BseContextMerger {
   guint            channel_id;
   guint                   max_voices;
   BseSNet        *snet;
@@ -41,10 +39,9 @@ struct _BseTrack
   guint            midi_channel_SL;
   gboolean        track_done_SL;
 };
-struct _BseTrackClass
-{
-  BseContextMergerClass parent_class;
-};
+struct BseTrackClass : BseContextMergerClass
+{};
+
 /* --- prototypes -- */
 void   bse_track_add_modules           (BseTrack               *self,
                                         BseContainer           *container,
diff --git a/bse/bsewave.hh b/bse/bsewave.hh
index e5e1057..967ed53 100644
--- a/bse/bsewave.hh
+++ b/bse/bsewave.hh
@@ -10,20 +10,17 @@ G_BEGIN_DECLS
 #define BSE_IS_WAVE(object)       (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_WAVE))
 #define BSE_IS_WAVE_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_WAVE))
 #define BSE_WAVE_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_WAVE, BseWaveClass))
-/* --- BseWave --- */
-typedef struct _BseWaveClass      BseWaveClass;
-typedef struct {
+
+struct BseWaveEntry {
   GslWaveChunk *wchunk;
   gfloat        osc_freq;
   gfloat        velocity; /* 0..1 */
-} BseWaveEntry;
-typedef struct {
+};
+struct BseWaveIndex {
   guint                n_entries;
   BseWaveEntry  entries[1];     /* flexible array */
-} BseWaveIndex;
-struct _BseWave
-{
-  BseSource         parent_object;
+};
+struct BseWave : BseSource {
   /* requested BseModule indices */
   guint                     request_count;
   GSList           *index_list;
@@ -39,11 +36,9 @@ struct _BseWave
   SfiRing           *wave_chunks;       /* data=GslWaveChunk* */
   SfiRing           *open_handles;      /* data=GslDataHandle* */
 };
-struct _BseWaveClass
-{
-  BseSourceClass parent_class;
-};
-/* --- prototypes -- */
+struct BseWaveClass : BseSourceClass
+{};
+
 void           bse_wave_clear                  (BseWave        *wave);
 BseErrorType   bse_wave_load_wave_file         (BseWave        *wave,
                                                 const gchar    *file_name,
diff --git a/bse/bsewaveosc.hh b/bse/bsewaveosc.hh
index cf40032..011b5e8 100644
--- a/bse/bsewaveosc.hh
+++ b/bse/bsewaveosc.hh
@@ -12,23 +12,17 @@ G_BEGIN_DECLS
 #define BSE_IS_WAVE_OSC(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_WAVE_OSC))
 #define BSE_IS_WAVE_OSC_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_WAVE_OSC))
 #define BSE_WAVE_OSC_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_WAVE_OSC, 
BseWaveOscClass))
-/* --- BseWaveOsc source --- */
-typedef struct _BseWaveOsc      BseWaveOsc;
-typedef struct _BseWaveOscClass BseWaveOscClass;
-struct _BseWaveOsc
-{
-  BseSource          parent_object;
+
+struct BseWaveOsc : BseSource {
   BseWave           *wave;
   GslWaveChunk      *esample_wchunk;
   GslWaveOscConfig   config;
   gfloat             fm_strength;
   gfloat             n_octaves;
 };
-struct _BseWaveOscClass
-{
-  BseSourceClass parent_class;
-};
-/* --- prototypes --- */
+struct BseWaveOscClass : BseSourceClass
+{};
+
 void    bse_wave_osc_request_pcm_position       (BseWaveOsc        *self);
 void    bse_wave_osc_mass_seek                  (guint              n_woscs,
                                                  BseWaveOsc       **woscs,
diff --git a/bse/bsewaverepo.hh b/bse/bsewaverepo.hh
index b97932e..7a18444 100644
--- a/bse/bsewaverepo.hh
+++ b/bse/bsewaverepo.hh
@@ -10,16 +10,13 @@ G_BEGIN_DECLS
 #define BSE_IS_WAVE_REPO(object)       (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_WAVE_REPO))
 #define BSE_IS_WAVE_REPO_CLASS(class)  (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_WAVE_REPO))
 #define BSE_WAVE_REPO_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_WAVE_REPO, 
BseWaveRepoClass))
-/* --- BseWaveRepo object --- */
-struct _BseWaveRepo
-{
-  BseSuper      parent_object;
+
+struct BseWaveRepo : BseSuper {
   GList                *waves;
 };
-struct _BseWaveRepoClass
-{
-  BseSuperClass parent_class;
-};
-/* --- prototypes --- */
+struct BseWaveRepoClass : BseSuperClass
+{};
+
 G_END_DECLS
+
 #endif /* __BSE_WAVE_REPO_H__ */
diff --git a/plugins/bsesequencer.hh b/plugins/bsesequencer.hh
index 2866a99..ccc486b 100644
--- a/plugins/bsesequencer.hh
+++ b/plugins/bsesequencer.hh
@@ -13,19 +13,17 @@ extern "C" {
 #define BSE_IS_SEQUENCER(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_SEQUENCER))
 #define BSE_IS_SEQUENCER_CLASS(class)   (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_SEQUENCER))
 #define BSE_SEQUENCER_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_SEQUENCER, 
BseSequencerClass))
-/* --- BseSequencer source --- */
-typedef struct _BseSequencer   BseSequencer;
-typedef struct _BseSourceClass BseSequencerClass;
-struct _BseSequencer
-{
-  BseSource        parent_object;
+
+struct BseSequencer : BseSource {
   gfloat          counter;
   gint            transpose;
   BseNoteSequence *sdata;
   guint                   n_freq_values;
   gfloat         *freq_values;
 };
-/* --- channels --- */
+struct BseSequencerClass : BseSourceClass
+{};
+
 enum
 {
   BSE_SEQUENCER_OCHANNEL_FREQ,


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