$Id$

* existing gstreamer interfaces
  ./gstreamer/gst/gsttaginterface.c
  ./gstreamer/gst/gstinterface.c
  ./gstreamer/gst/gsturi.c
  ./gst-plugins/gst-libs/gst/propertyprobe/propertyprobe.c
  ./gst-plugins/gst-libs/gst/mixer/mixer.c
  ./gst-plugins/gst-libs/gst/tuner/tuner.c
  ./gst-plugins/gst-libs/gst/xoverlay/xoverlay.c
  ./gst-plugins/gst-libs/gst/colorbalance/colorbalance.c
  ./gst-plugins/gst-libs/gst/navigation/navigation.c
* new general interfaces
  * GST_TYPE_UI_HINT
    - add hints to generate 'good' looking interfaces to elements
    - API:
      GList *get_group_list();
      struct ui_hint_group {
        gchar *label;
        gachr *role;
        GList *entries;
      }
      struct ui_hint_group_entry {
        enum UiHintGroupEntryType type={PARAM,DPARAM};
        gchar *name;
      }
      roles {
        /* graphics */
        "color_selection/rgb",
        "color_selection/hsv",
        "aspect_ratio",
        /* audio */
        "envelope/adsr",
      }
    - features
      - grouping of parameters, each group has:
        - a label: giving a title to the group
        - a role:
          - this can give the UI a hint about the purpose of the controls
          - this only makes sense, if we dont make this a thousand templates
        - a list of dparams or properties
    - question
      - should this be aware of instruments (voice-groups)
        - no, instruments should auto-generate those
  * GST_TYPE_QUALITY_VS_SPEED
    - get the name of a property that can be used to switch between
      - a fast version for e.g. realtime usage
      - a slower version with higher precission that can be used for off-line
        rendering
* new interfaces for audio applications
  * GST_TYPE_MULTI_VOICE
    - control interface for elements that support multiple voices (in one output-pad)
    - API:
      gulong number_of_voices;
      void add_voice();
      void remove_last_voice();
      gulong get_number_of_voices();
    - features
      - plugin will initially have one voice and that one can not be deleted
  * GST_TYPE_MUSIC_GENERATOR
    - add hints so that application can use a element as an instrument
    - API:
      // param types
      DParam *get_note_dparam();
      GList *get_trigger_dparams();
      // -- or
      DParamType get_dparam_type(DParam *);
      dparamtype = { NOTE, TRIGGER, OTHER }
      // voices
      char *get_number_of_voices_property();
      GList *get_global_param_names();
      GList *get_voice_param_names();
    - features
      - find out which params to use to play notes/trigger sounds
        - these params will not appear in a control-ui
        - notes involve a key to frequency translation
      - find out if the element has a number_of_voices property
        - if yes, we can find out about the max by looking at the gparamspec
        - setting the property, adds/removes voices
        - if the element supports it, it needs to:
          - register voice-dparams as e.g. note_XXX, where XXX is the voice-number
          - run the voice-loop in the chain/loop function
            each voice processes the same input, if at all
            the outputs of all voices are mixed together

