<?xml version="1.0"?>
<!-- This file was automatically generated from C sources - DO NOT EDIT!
To affect the contents of this file, edit the original C definitions,
and/or use gtk-doc annotations.  -->
<repository version="1.2"
            xmlns="http://www.gtk.org/introspection/core/1.0"
            xmlns:c="http://www.gtk.org/introspection/c/1.0"
            xmlns:glib="http://www.gtk.org/introspection/glib/1.0">
  <include name="Atk" version="1.0"/>
  <include name="GLib" version="2.0"/>
  <include name="GModule" version="2.0"/>
  <include name="GObject" version="2.0"/>
  <include name="Gdk" version="3.0"/>
  <include name="GdkPixbuf" version="2.0"/>
  <include name="Gio" version="2.0"/>
  <include name="Gst" version="0.10"/>
  <include name="GstPbutils" version="0.10"/>
  <include name="Gtk" version="3.0"/>
  <include name="MPID" version="3.0"/>
  <include name="Pango" version="1.0"/>
  <include name="cairo" version="1.0"/>
  <include name="libxml2" version="2.0"/>
  <include name="xlib" version="2.0"/>
  <package name="gio-2.0"/>
  <package name="gobject-2.0"/>
  <package name="gstreamer-0.10"/>
  <package name="gtk+-3.0"/>
  <package name="libxml-2.0"/>
  <c:include name="rhythmbox.h"/>
  <namespace name="RB"
             version="3.0"
             shared-library="librhythmbox-core.so.0.0"
             c:identifier-prefixes="RB"
             c:symbol-prefixes="rb_">
    <alias name="RhythmDBQuery" c:type="RhythmDBQuery">
      <type name="GLib.PtrArray" c:type="GPtrArray"/>
    </alias>
    <class name="AutoPlaylistSource"
           c:symbol-prefix="auto_playlist_source"
           c:type="RBAutoPlaylistSource"
           parent="PlaylistSource"
           glib:type-name="RBAutoPlaylistSource"
           glib:get-type="rb_auto_playlist_source_get_type"
           glib:type-struct="AutoPlaylistSourceClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <implements name="Gtk.Orientable"/>
      <constructor name="new" c:identifier="rb_auto_playlist_source_new">
        <doc xml:whitespace="preserve">Creates a new automatic playlist source, initially with an empty query.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the new source</doc>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShell instance</doc>
            <type name="Shell" c:type="RBShell*"/>
          </parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">the name of the new playlist</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="local" transfer-ownership="none">
            <doc xml:whitespace="preserve">if TRUE, the playlist will be considered local</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_from_xml"
                   c:identifier="rb_auto_playlist_source_new_from_xml">
        <doc xml:whitespace="preserve">Creates a new auto playlist source by parsing an XML-encoded query.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the new source</doc>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShell instance</doc>
            <type name="Shell" c:type="RBShell*"/>
          </parameter>
          <parameter name="node" transfer-ownership="none">
            <doc xml:whitespace="preserve">libxml node containing the playlist</doc>
            <type name="libxml2.NodePtr" c:type="xmlNodePtr"/>
          </parameter>
        </parameters>
      </constructor>
      <function name="create_actions"
                c:identifier="rb_auto_playlist_source_create_actions">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <type name="Shell" c:type="RBShell*"/>
          </parameter>
        </parameters>
      </function>
      <method name="get_query"
              c:identifier="rb_auto_playlist_source_get_query">
        <doc xml:whitespace="preserve">Extracts the current query, playlist limit, and sorting settings for the playlist.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="query"
                     direction="out"
                     caller-allocates="1"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns the database query for the playlist</doc>
            <array name="GLib.PtrArray" c:type="GPtrArray**">
              <type name="gpointer" c:type="gpointer"/>
            </array>
          </parameter>
          <parameter name="limit_type"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns the playlist limit type</doc>
            <type name="RhythmDBQueryModelLimitType"
                  c:type="RhythmDBQueryModelLimitType*"/>
          </parameter>
          <parameter name="limit_value"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns the playlist limit value</doc>
            <type name="GObject.ValueArray" c:type="GValueArray**"/>
          </parameter>
          <parameter name="sort_key"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns the playlist sorting key</doc>
            <type name="utf8" c:type="char**"/>
          </parameter>
          <parameter name="sort_order"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns the playlist sorting direction (as a #GtkSortType)</doc>
            <type name="gint" c:type="gint*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_query"
              c:identifier="rb_auto_playlist_source_set_query">
        <doc xml:whitespace="preserve">Sets the database query used to populate the playlist, and also the limit on
playlist size, and the sorting type used.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new database query</doc>
            <array name="GLib.PtrArray" c:type="GPtrArray*">
              <type name="gpointer" c:type="gpointer"/>
            </array>
          </parameter>
          <parameter name="limit_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the playlist limit type</doc>
            <type name="RhythmDBQueryModelLimitType"
                  c:type="RhythmDBQueryModelLimitType"/>
          </parameter>
          <parameter name="limit_value" transfer-ownership="none">
            <doc xml:whitespace="preserve">the playlist limit value</doc>
            <type name="GObject.ValueArray" c:type="GValueArray*"/>
          </parameter>
          <parameter name="sort_key" transfer-ownership="none">
            <doc xml:whitespace="preserve">the sorting key</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="sort_order" transfer-ownership="none">
            <doc xml:whitespace="preserve">the sorting direction (as a #GtkSortType)</doc>
            <type name="gint" c:type="gint"/>
          </parameter>
        </parameters>
      </method>
      <field name="parent">
        <type name="PlaylistSource" c:type="RBPlaylistSource"/>
      </field>
    </class>
    <record name="AutoPlaylistSourceClass"
            c:type="RBAutoPlaylistSourceClass"
            glib:is-gtype-struct-for="AutoPlaylistSource">
      <field name="parent">
        <type name="PlaylistSourceClass" c:type="RBPlaylistSourceClass"/>
      </field>
      <field name="action_group">
        <type name="Gtk.ActionGroup" c:type="GtkActionGroup*"/>
      </field>
    </record>
    <class name="BrowserSource"
           c:symbol-prefix="browser_source"
           c:type="RBBrowserSource"
           parent="Source"
           abstract="1"
           glib:type-name="RBBrowserSource"
           glib:get-type="rb_browser_source_get_type"
           glib:type-struct="BrowserSourceClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <implements name="Gtk.Orientable"/>
      <virtual-method name="has_drop_support" invoker="has_drop_support">
        <doc xml:whitespace="preserve">This is a virtual method that should be implemented by subclasses.  It returns %TRUE
if drag and drop target support for the source should be activated.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if drop support should be activated</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="pack_content">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="content" transfer-ownership="none">
            <type name="Gtk.Widget" c:type="GtkWidget*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="show_entry_popup">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <method name="has_drop_support"
              c:identifier="rb_browser_source_has_drop_support">
        <doc xml:whitespace="preserve">This is a virtual method that should be implemented by subclasses.  It returns %TRUE
if drag and drop target support for the source should be activated.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if drop support should be activated</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <property name="populate"
                writable="1"
                construct="1"
                transfer-ownership="none">
        <type name="gboolean"/>
      </property>
      <field name="parent">
        <type name="Source" c:type="RBSource"/>
      </field>
      <field name="priv">
        <type name="BrowserSourcePrivate" c:type="RBBrowserSourcePrivate*"/>
      </field>
    </class>
    <record name="BrowserSourceClass"
            c:type="RBBrowserSourceClass"
            glib:is-gtype-struct-for="BrowserSource">
      <field name="parent">
        <type name="SourceClass" c:type="RBSourceClass"/>
      </field>
      <field name="pack_content">
        <callback name="pack_content">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="BrowserSource" c:type="RBBrowserSource*"/>
            </parameter>
            <parameter name="content" transfer-ownership="none">
              <type name="Gtk.Widget" c:type="GtkWidget*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="has_drop_support">
        <callback name="has_drop_support">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">%TRUE if drop support should be activated</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="BrowserSource" c:type="RBBrowserSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="show_entry_popup">
        <callback name="show_entry_popup">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="BrowserSource" c:type="RBBrowserSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <callback name="BrowserSourceFeatureFunc"
              c:type="RBBrowserSourceFeatureFunc">
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <type name="BrowserSource" c:type="RBBrowserSource*"/>
        </parameter>
      </parameters>
    </callback>
    <record name="BrowserSourcePrivate"
            c:type="RBBrowserSourcePrivate"
            disguised="1">
    </record>
    <callback name="BrowserSourceStringFunc"
              c:type="RBBrowserSourceStringFunc">
      <return-value transfer-ownership="full">
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <type name="BrowserSource" c:type="RBBrowserSource*"/>
        </parameter>
      </parameters>
    </callback>
    <class name="CellRendererPixbuf"
           c:symbol-prefix="cell_renderer_pixbuf"
           c:type="RBCellRendererPixbuf"
           parent="Gtk.CellRendererPixbuf"
           glib:type-name="RBCellRendererPixbuf"
           glib:get-type="rb_cell_renderer_pixbuf_get_type"
           glib:type-struct="CellRendererPixbufClass">
      <constructor name="new" c:identifier="rb_cell_renderer_pixbuf_new">
        <doc xml:whitespace="preserve">Creates a new #RBCellRendererPixbuf.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the new cell renderer</doc>
          <type name="Gtk.CellRenderer" c:type="GtkCellRenderer*"/>
        </return-value>
      </constructor>
      <virtual-method name="pixbuf_clicked">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="path" transfer-ownership="none">
            <type name="Gtk.TreePath" c:type="GtkTreePath*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <field name="parent">
        <type name="Gtk.CellRendererPixbuf" c:type="GtkCellRendererPixbuf"/>
      </field>
      <glib:signal name="pixbuf-clicked" when="first">
        <doc xml:whitespace="preserve">Emitted when the user clicks on the pixbuf cell.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="path" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GtkTreePath to the row that was clicked</doc>
            <type name="utf8"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="CellRendererPixbufClass"
            c:type="RBCellRendererPixbufClass"
            glib:is-gtype-struct-for="CellRendererPixbuf">
      <field name="parent_class">
        <type name="Gtk.CellRendererPixbufClass"
              c:type="GtkCellRendererPixbufClass"/>
      </field>
      <field name="pixbuf_clicked">
        <callback name="pixbuf_clicked">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="renderer" transfer-ownership="none">
              <type name="CellRendererPixbuf" c:type="RBCellRendererPixbuf*"/>
            </parameter>
            <parameter name="path" transfer-ownership="none">
              <type name="Gtk.TreePath" c:type="GtkTreePath*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <class name="CellRendererRating"
           c:symbol-prefix="cell_renderer_rating"
           c:type="RBCellRendererRating"
           parent="Gtk.CellRenderer"
           glib:type-name="RBCellRendererRating"
           glib:get-type="rb_cell_renderer_rating_get_type"
           glib:type-struct="CellRendererRatingClass">
      <constructor name="new" c:identifier="rb_cell_renderer_rating_new">
        <doc xml:whitespace="preserve">create a cell renderer that will
display some pixbufs for representing the rating of a song.
It is also able to update the rating.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the new cell renderer</doc>
          <type name="Gtk.CellRenderer" c:type="GtkCellRenderer*"/>
        </return-value>
      </constructor>
      <virtual-method name="rated">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="path" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="rating" transfer-ownership="none">
            <type name="gdouble" c:type="double"/>
          </parameter>
        </parameters>
      </virtual-method>
      <property name="rating" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The rating displayed by the renderer, as a floating point value
between 0.0 and 5.0.</doc>
        <type name="gdouble"/>
      </property>
      <field name="parent">
        <type name="Gtk.CellRenderer" c:type="GtkCellRenderer"/>
      </field>
      <field name="priv">
        <type name="CellRendererRatingPrivate"
              c:type="RBCellRendererRatingPrivate*"/>
      </field>
      <glib:signal name="rated" when="last">
        <doc xml:whitespace="preserve">Emitted when the user changes the rating.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="score" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new rating</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="path" transfer-ownership="none">
            <doc xml:whitespace="preserve">string form of the #GtkTreePath to the row that was changed</doc>
            <type name="gdouble"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="CellRendererRatingClass"
            c:type="RBCellRendererRatingClass"
            glib:is-gtype-struct-for="CellRendererRating">
      <field name="parent_class">
        <type name="Gtk.CellRendererClass" c:type="GtkCellRendererClass"/>
      </field>
      <field name="rated">
        <callback name="rated">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="renderer" transfer-ownership="none">
              <type name="CellRendererRating" c:type="RBCellRendererRating*"/>
            </parameter>
            <parameter name="path" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="rating" transfer-ownership="none">
              <type name="gdouble" c:type="double"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="priv">
        <type name="CellRendererRatingClassPrivate"
              c:type="RBCellRendererRatingClassPrivate*"/>
      </field>
    </record>
    <record name="CellRendererRatingClassPrivate"
            c:type="RBCellRendererRatingClassPrivate"
            disguised="1">
    </record>
    <record name="CellRendererRatingPrivate"
            c:type="RBCellRendererRatingPrivate"
            disguised="1">
    </record>
    <callback name="DelayedSyncFunc" c:type="RBDelayedSyncFunc">
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="settings" transfer-ownership="none">
          <type name="Gio.Settings" c:type="GSettings*"/>
        </parameter>
        <parameter name="data" transfer-ownership="none">
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </callback>
    <interface name="DeviceSource"
               c:symbol-prefix="device_source"
               c:type="RBDeviceSource"
               glib:type-name="RBDeviceSource"
               glib:get-type="rb_device_source_get_type"
               glib:type-struct="DeviceSourceInterface">
      <virtual-method name="can_eject" invoker="can_eject">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="eject" invoker="eject">
        <doc xml:whitespace="preserve">Ejects the device that the source represents.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <method name="can_eject" c:identifier="rb_device_source_can_eject">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="eject" c:identifier="rb_device_source_eject">
        <doc xml:whitespace="preserve">Ejects the device that the source represents.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="set_display_details"
              c:identifier="rb_device_source_set_display_details">
        <doc xml:whitespace="preserve">Sets the icon and display name for a device-based source.
The details come from the mount and/or volume.  This should
be called in the source's constructed method.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="uri_is_source"
              c:identifier="rb_device_source_uri_is_source">
        <doc xml:whitespace="preserve">Returns %TRUE if @uri matches @source.  This should be
used to implement the impl_uri_is_source #RBSource method.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if @uri matches @source</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">a URI to check</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="want_uri" c:identifier="rb_device_source_want_uri">
        <doc xml:whitespace="preserve">Checks whether @uri identifies a path underneath the
device's mount point.  Should be used to implement
the #RBSource impl_want_uri method.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">URI match strength</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">a URI to consider</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
    </interface>
    <record name="DeviceSourceInterface"
            c:type="RBDeviceSourceInterface"
            glib:is-gtype-struct-for="DeviceSource">
      <field name="g_iface">
        <type name="GObject.TypeInterface" c:type="GTypeInterface"/>
      </field>
      <field name="can_eject">
        <callback name="can_eject">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="DeviceSource" c:type="RBDeviceSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="eject">
        <callback name="eject">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="DeviceSource" c:type="RBDeviceSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <class name="DisplayPage"
           c:symbol-prefix="display_page"
           c:type="RBDisplayPage"
           parent="Gtk.HBox"
           abstract="1"
           glib:type-name="RBDisplayPage"
           glib:get-type="rb_display_page_get_type"
           glib:type-struct="DisplayPageClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <implements name="Gtk.Orientable"/>
      <virtual-method name="activate" invoker="activate">
        <doc xml:whitespace="preserve">Called when the page is activated (double clicked, etc.) in the page tree.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="delete_thyself" invoker="delete_thyself">
        <doc xml:whitespace="preserve">This is called when the page should delete itself.
The 'deleted' signal will be emitted, which removes the page
from the page model.  This will not actually dispose of the
page object, so reference counting must still be handled
correctly.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="deleted">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="deselected" invoker="deselected">
        <doc xml:whitespace="preserve">Called when the page is deselected in the page tree.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="get_config_widget" invoker="get_config_widget">
        <doc xml:whitespace="preserve">Source implementations can use this to return an optional
configuration widget. The widget will be displayed in a
page in the preferences dialog.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">configuration widget</doc>
          <type name="Gtk.Widget" c:type="GtkWidget*"/>
        </return-value>
        <parameters>
          <parameter name="prefs" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShellPreferences object</doc>
            <type name="ShellPreferences" c:type="RBShellPreferences*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="get_status" invoker="get_status">
        <doc xml:whitespace="preserve">Retrieves the details to display in the status bar for the page.
If the progress value returned is less than zero, the progress bar
will pulse.  If the progress value is greater than or equal to 1,
the progress bar will be hidden.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="text"
                     direction="inout"
                     caller-allocates="0"
                     transfer-ownership="full"
                     allow-none="1">
            <doc xml:whitespace="preserve">holds the returned status text</doc>
            <type name="utf8" c:type="char**"/>
          </parameter>
          <parameter name="progress_text"
                     direction="inout"
                     caller-allocates="0"
                     transfer-ownership="full"
                     allow-none="1">
            <doc xml:whitespace="preserve">holds the returned text for the progress bar</doc>
            <type name="utf8" c:type="char**"/>
          </parameter>
          <parameter name="progress"
                     direction="inout"
                     caller-allocates="0"
                     transfer-ownership="full"
                     allow-none="1">
            <doc xml:whitespace="preserve">holds the progress value</doc>
            <type name="gfloat" c:type="float*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="receive_drag" invoker="receive_drag">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="data" transfer-ownership="none">
            <type name="Gtk.SelectionData" c:type="GtkSelectionData*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="selectable" invoker="selectable">
        <doc xml:whitespace="preserve">Checks if @page can be selected</doc>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="selected" invoker="selected">
        <doc xml:whitespace="preserve">Called when the page is selected in the page tree.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="show_popup" invoker="show_popup">
        <doc xml:whitespace="preserve">Called when the user performs an action (such as right-clicking)
that should result in a popup menu being displayed for the page.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the page managed to display a popup</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="status_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <method name="activate" c:identifier="rb_display_page_activate">
        <doc xml:whitespace="preserve">Called when the page is activated (double clicked, etc.) in the page tree.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="delete_thyself"
              c:identifier="rb_display_page_delete_thyself">
        <doc xml:whitespace="preserve">This is called when the page should delete itself.
The 'deleted' signal will be emitted, which removes the page
from the page model.  This will not actually dispose of the
page object, so reference counting must still be handled
correctly.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="deselected" c:identifier="rb_display_page_deselected">
        <doc xml:whitespace="preserve">Called when the page is deselected in the page tree.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="get_config_widget"
              c:identifier="rb_display_page_get_config_widget">
        <doc xml:whitespace="preserve">Source implementations can use this to return an optional
configuration widget. The widget will be displayed in a
page in the preferences dialog.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">configuration widget</doc>
          <type name="Gtk.Widget" c:type="GtkWidget*"/>
        </return-value>
        <parameters>
          <parameter name="prefs" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShellPreferences object</doc>
            <type name="ShellPreferences" c:type="RBShellPreferences*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_status" c:identifier="rb_display_page_get_status">
        <doc xml:whitespace="preserve">Retrieves the details to display in the status bar for the page.
If the progress value returned is less than zero, the progress bar
will pulse.  If the progress value is greater than or equal to 1,
the progress bar will be hidden.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="text"
                     direction="inout"
                     caller-allocates="0"
                     transfer-ownership="full"
                     allow-none="1">
            <doc xml:whitespace="preserve">holds the returned status text</doc>
            <type name="utf8" c:type="char**"/>
          </parameter>
          <parameter name="progress_text"
                     direction="inout"
                     caller-allocates="0"
                     transfer-ownership="full"
                     allow-none="1">
            <doc xml:whitespace="preserve">holds the returned text for the progress bar</doc>
            <type name="utf8" c:type="char**"/>
          </parameter>
          <parameter name="progress"
                     direction="inout"
                     caller-allocates="0"
                     transfer-ownership="full"
                     allow-none="1">
            <doc xml:whitespace="preserve">holds the progress value</doc>
            <type name="gfloat" c:type="float*"/>
          </parameter>
        </parameters>
      </method>
      <method name="notify_status_changed"
              c:identifier="rb_display_page_notify_status_changed">
        <doc xml:whitespace="preserve">Page implementations call this when their status bar information
changes.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="receive_drag" c:identifier="rb_display_page_receive_drag">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="data" transfer-ownership="none">
            <type name="Gtk.SelectionData" c:type="GtkSelectionData*"/>
          </parameter>
        </parameters>
      </method>
      <method name="selectable" c:identifier="rb_display_page_selectable">
        <doc xml:whitespace="preserve">Checks if @page can be selected</doc>
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="selected" c:identifier="rb_display_page_selected">
        <doc xml:whitespace="preserve">Called when the page is selected in the page tree.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="show_popup" c:identifier="rb_display_page_show_popup">
        <doc xml:whitespace="preserve">Called when the user performs an action (such as right-clicking)
that should result in a popup menu being displayed for the page.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the page managed to display a popup</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <property name="name" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">Page name as displayed in the tree</doc>
        <type name="utf8"/>
      </property>
      <property name="parent"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The parent page in the tree (may be NULL)</doc>
        <type name="DisplayPage"/>
      </property>
      <property name="pixbuf" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">Pixbuf to display in the page tree</doc>
        <type name="GdkPixbuf.Pixbuf"/>
      </property>
      <property name="plugin"
                writable="1"
                construct="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The plugin that created this page.</doc>
        <type name="GObject.Object"/>
      </property>
      <property name="selected" transfer-ownership="none">
        <doc xml:whitespace="preserve">TRUE when the page is selected in the page tree.</doc>
        <type name="gboolean"/>
      </property>
      <property name="shell"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The rhythmbox shell object</doc>
        <type name="Shell"/>
      </property>
      <property name="ui-manager" transfer-ownership="none">
        <doc xml:whitespace="preserve">The Gtk UIManager object</doc>
        <type name="Gtk.UIManager"/>
      </property>
      <property name="visibility" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">If FALSE, the page will not be displayed in the tree</doc>
        <type name="gboolean"/>
      </property>
      <field name="parent">
        <type name="Gtk.HBox" c:type="GtkHBox"/>
      </field>
      <field name="priv">
        <type name="DisplayPagePrivate" c:type="RBDisplayPagePrivate*"/>
      </field>
      <glib:signal name="deleted" when="last">
        <doc xml:whitespace="preserve">Emitted when the page is being deleted.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
      <glib:signal name="status-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when the page's status changes.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
    </class>
    <record name="DisplayPageClass"
            c:type="RBDisplayPageClass"
            glib:is-gtype-struct-for="DisplayPage">
      <field name="parent_class">
        <type name="Gtk.HBoxClass" c:type="GtkHBoxClass"/>
      </field>
      <field name="status_changed">
        <callback name="status_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="page" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="deleted">
        <callback name="deleted">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="page" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="selectable">
        <callback name="selectable">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="page" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="selected">
        <callback name="selected">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="page" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="deselected">
        <callback name="deselected">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="page" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="activate">
        <callback name="activate">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="page" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="get_config_widget">
        <callback name="get_config_widget">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">configuration widget</doc>
            <type name="Gtk.Widget" c:type="GtkWidget*"/>
          </return-value>
          <parameters>
            <parameter name="page" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
            <parameter name="prefs" transfer-ownership="none">
              <doc xml:whitespace="preserve">the #RBShellPreferences object</doc>
              <type name="ShellPreferences" c:type="RBShellPreferences*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="get_status">
        <callback name="get_status">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="page" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
            <parameter name="text"
                       direction="inout"
                       caller-allocates="0"
                       transfer-ownership="full"
                       allow-none="1">
              <doc xml:whitespace="preserve">holds the returned status text</doc>
              <type name="utf8" c:type="char**"/>
            </parameter>
            <parameter name="progress_text"
                       direction="inout"
                       caller-allocates="0"
                       transfer-ownership="full"
                       allow-none="1">
              <doc xml:whitespace="preserve">holds the returned text for the progress bar</doc>
              <type name="utf8" c:type="char**"/>
            </parameter>
            <parameter name="progress"
                       direction="inout"
                       caller-allocates="0"
                       transfer-ownership="full"
                       allow-none="1">
              <doc xml:whitespace="preserve">holds the progress value</doc>
              <type name="gfloat" c:type="float*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="receive_drag">
        <callback name="receive_drag">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="page" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
            <parameter name="data" transfer-ownership="none">
              <type name="Gtk.SelectionData" c:type="GtkSelectionData*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="show_popup">
        <callback name="show_popup">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">TRUE if the page managed to display a popup</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="page" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="delete_thyself">
        <callback name="delete_thyself">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="page" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <class name="DisplayPageGroup"
           c:symbol-prefix="display_page_group"
           c:type="RBDisplayPageGroup"
           parent="DisplayPage"
           glib:type-name="RBDisplayPageGroup"
           glib:get-type="rb_display_page_group_get_type"
           glib:type-struct="DisplayPageGroupClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <implements name="Gtk.Orientable"/>
      <constructor name="new" c:identifier="rb_display_page_group_new">
        <doc xml:whitespace="preserve">Creates a new page group object.  The group will be registered
before it is returned.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">new page group</doc>
          <type name="DisplayPageGroup" c:type="RBDisplayPageGroup*"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShell</doc>
            <type name="GObject.Object" c:type="GObject*"/>
          </parameter>
          <parameter name="id" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of the page group (untranslated, used in code)</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">display name of the page group (translated)</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="category" transfer-ownership="none">
            <doc xml:whitespace="preserve">category for the page group</doc>
            <type name="DisplayPageGroupCategory"
                  c:type="RBDisplayPageGroupCategory"/>
          </parameter>
        </parameters>
      </constructor>
      <function name="add_core_groups"
                c:identifier="rb_display_page_group_add_core_groups">
        <doc xml:whitespace="preserve">Registers core page groups.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShell</doc>
            <type name="GObject.Object" c:type="GObject*"/>
          </parameter>
          <parameter name="page_model" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBDisplayPageModel</doc>
            <type name="DisplayPageModel" c:type="RBDisplayPageModel*"/>
          </parameter>
        </parameters>
      </function>
      <function name="get_by_id"
                c:identifier="rb_display_page_group_get_by_id">
        <doc xml:whitespace="preserve">Locates a page group by name.  If the page group has not been registered yet,
returns NULL instead.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">existing page group, or NULL.</doc>
          <type name="DisplayPageGroup" c:type="RBDisplayPageGroup*"/>
        </return-value>
        <parameters>
          <parameter name="id" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of page group to find</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </function>
      <method name="loaded" c:identifier="rb_display_page_group_loaded">
        <doc xml:whitespace="preserve">Called when the page group is fully loaded, that is, all initial pages have
been added.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <property name="category"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">Page group category that the group falls into</doc>
        <type name="DisplayPageGroupType"/>
      </property>
      <property name="id"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">Internal (untranslated) name for the page group</doc>
        <type name="utf8"/>
      </property>
      <property name="loaded" transfer-ownership="none">
        <type name="gboolean"/>
      </property>
      <field name="parent">
        <type name="DisplayPage" c:type="RBDisplayPage"/>
      </field>
      <field name="priv">
        <type name="DisplayPageGroupPrivate"
              c:type="RBDisplayPageGroupPrivate*"/>
      </field>
    </class>
    <enumeration name="DisplayPageGroupCategory"
                 c:type="RBDisplayPageGroupCategory">
      <member name="fixed"
              value="0"
              c:identifier="RB_DISPLAY_PAGE_GROUP_CATEGORY_FIXED"/>
      <member name="removable"
              value="1"
              c:identifier="RB_DISPLAY_PAGE_GROUP_CATEGORY_REMOVABLE"/>
      <member name="persistent"
              value="2"
              c:identifier="RB_DISPLAY_PAGE_GROUP_CATEGORY_PERSISTENT"/>
      <member name="transient"
              value="3"
              c:identifier="RB_DISPLAY_PAGE_GROUP_CATEGORY_TRANSIENT"/>
      <member name="tools"
              value="4"
              c:identifier="RB_DISPLAY_PAGE_GROUP_CATEGORY_TOOLS"/>
      <member name="last"
              value="5"
              c:identifier="RB_DISPLAY_PAGE_GROUP_CATEGORY_LAST"/>
    </enumeration>
    <record name="DisplayPageGroupClass"
            c:type="RBDisplayPageGroupClass"
            glib:is-gtype-struct-for="DisplayPageGroup">
      <field name="parent_class">
        <type name="DisplayPageClass" c:type="RBDisplayPageClass"/>
      </field>
    </record>
    <record name="DisplayPageGroupPrivate"
            c:type="RBDisplayPageGroupPrivate"
            disguised="1">
    </record>
    <enumeration name="DisplayPageGroupType"
                 glib:type-name="RBDisplayPageGroupType"
                 glib:get-type="rb_display_page_group_category_get_type"
                 c:type="RBDisplayPageGroupType">
      <doc xml:whitespace="preserve">Predefined categories of page group. The order they're defined here is the order they
appear in the page tree.</doc>
      <member name="fixed"
              value="0"
              c:identifier="RB_DISPLAY_PAGE_GROUP_CATEGORY_FIXED"
              glib:nick="fixed"/>
      <member name="persistent"
              value="2"
              c:identifier="RB_DISPLAY_PAGE_GROUP_CATEGORY_PERSISTENT"
              glib:nick="persistent"/>
      <member name="removable"
              value="1"
              c:identifier="RB_DISPLAY_PAGE_GROUP_CATEGORY_REMOVABLE"
              glib:nick="removable"/>
      <member name="transient"
              value="3"
              c:identifier="RB_DISPLAY_PAGE_GROUP_CATEGORY_TRANSIENT"
              glib:nick="transient"/>
      <member name="tools"
              value="4"
              c:identifier="RB_DISPLAY_PAGE_GROUP_CATEGORY_TOOLS"
              glib:nick="tools"/>
    </enumeration>
    <class name="DisplayPageModel"
           c:symbol-prefix="display_page_model"
           c:type="RBDisplayPageModel"
           parent="Gtk.TreeModelFilter"
           glib:type-name="RBDisplayPageModel"
           glib:get-type="rb_display_page_model_get_type"
           glib:type-struct="DisplayPageModelClass">
      <implements name="Gtk.TreeDragSource"/>
      <implements name="Gtk.TreeModel"/>
      <constructor name="new" c:identifier="rb_display_page_model_new">
        <doc xml:whitespace="preserve">This constructs both the GtkTreeStore holding the display page
data and the filter model that hides invisible pages.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the #RBDisplayPageModel</doc>
          <type name="DisplayPageModel" c:type="RBDisplayPageModel*"/>
        </return-value>
      </constructor>
      <virtual-method name="drop_received">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="target" transfer-ownership="none">
            <type name="DisplayPage" c:type="RBDisplayPage*"/>
          </parameter>
          <parameter name="pos" transfer-ownership="none">
            <type name="Gtk.TreeViewDropPosition"
                  c:type="GtkTreeViewDropPosition"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <type name="Gtk.SelectionData" c:type="GtkSelectionData*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="add_page" c:identifier="rb_display_page_model_add_page">
        <doc xml:whitespace="preserve">Adds a page to the model, either below a specified page (if it's a source or
something else) or at the top level (if it's a group)</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="page" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBDisplayPage to add</doc>
            <type name="DisplayPage" c:type="RBDisplayPage*"/>
          </parameter>
          <parameter name="parent" transfer-ownership="none">
            <doc xml:whitespace="preserve">the parent under which to add @page</doc>
            <type name="DisplayPage" c:type="RBDisplayPage*"/>
          </parameter>
        </parameters>
      </method>
      <method name="find_page" c:identifier="rb_display_page_model_find_page">
        <doc xml:whitespace="preserve">Finds a #GtkTreeIter for a specified page in the model.  This will only
find pages that are currently visible.  The returned #GtkTreeIter can be used
with the #RBDisplayPageModel.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the page was found</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="page" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBDisplayPage to find</doc>
            <type name="DisplayPage" c:type="RBDisplayPage*"/>
          </parameter>
          <parameter name="iter" transfer-ownership="none">
            <doc xml:whitespace="preserve">returns a #GtkTreeIter for the page</doc>
            <type name="Gtk.TreeIter" c:type="GtkTreeIter*"/>
          </parameter>
        </parameters>
      </method>
      <method name="remove_page"
              c:identifier="rb_display_page_model_remove_page">
        <doc xml:whitespace="preserve">Removes a page from the model.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="page" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBDisplayPage to remove</doc>
            <type name="DisplayPage" c:type="RBDisplayPage*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_dnd_targets"
              c:identifier="rb_display_page_model_set_dnd_targets">
        <doc xml:whitespace="preserve">Sets up the drag and drop targets for the display page tree.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="treeview" transfer-ownership="none">
            <doc xml:whitespace="preserve">the sourcel ist #GtkTreeView</doc>
            <type name="Gtk.TreeView" c:type="GtkTreeView*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_playing_source"
              c:identifier="rb_display_page_model_set_playing_source">
        <doc xml:whitespace="preserve">Updates the model with the new playing source.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new playing #RBSource (as a #RBDisplayPage)</doc>
            <type name="DisplayPage" c:type="RBDisplayPage*"/>
          </parameter>
        </parameters>
      </method>
      <field name="parent">
        <type name="Gtk.TreeModelFilter" c:type="GtkTreeModelFilter"/>
      </field>
      <glib:signal name="drop-received" when="last">
        <doc xml:whitespace="preserve">Emitted when a drag and drop operation to the display page tree completes.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="target" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBSource receiving the drop</doc>
            <type name="DisplayPage"/>
          </parameter>
          <parameter name="pos" transfer-ownership="none">
            <doc xml:whitespace="preserve">the drop position</doc>
            <type name="gint"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">the drop data</doc>
            <type name="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="DisplayPageModelClass"
            c:type="RBDisplayPageModelClass"
            glib:is-gtype-struct-for="DisplayPageModel">
      <field name="parent_class">
        <type name="Gtk.TreeModelFilterClass"
              c:type="GtkTreeModelFilterClass"/>
      </field>
      <field name="drop_received">
        <callback name="drop_received">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="model" transfer-ownership="none">
              <type name="DisplayPageModel" c:type="RBDisplayPageModel*"/>
            </parameter>
            <parameter name="target" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
            <parameter name="pos" transfer-ownership="none">
              <type name="Gtk.TreeViewDropPosition"
                    c:type="GtkTreeViewDropPosition"/>
            </parameter>
            <parameter name="data" transfer-ownership="none">
              <type name="Gtk.SelectionData" c:type="GtkSelectionData*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <enumeration name="DisplayPageModelColumn"
                 glib:type-name="RBDisplayPageModelColumn"
                 glib:get-type="rb_display_page_model_column_get_type"
                 c:type="RBDisplayPageModelColumn">
      <doc xml:whitespace="preserve">Columns present in the display page model.</doc>
      <member name="playing"
              value="0"
              c:identifier="RB_DISPLAY_PAGE_MODEL_COLUMN_PLAYING"
              glib:nick="playing"/>
      <member name="page"
              value="1"
              c:identifier="RB_DISPLAY_PAGE_MODEL_COLUMN_PAGE"
              glib:nick="page"/>
    </enumeration>
    <record name="DisplayPagePrivate"
            c:type="RBDisplayPagePrivate"
            disguised="1">
    </record>
    <class name="DisplayPageTree"
           c:symbol-prefix="display_page_tree"
           c:type="RBDisplayPageTree"
           parent="Gtk.ScrolledWindow"
           glib:type-name="RBDisplayPageTree"
           glib:get-type="rb_display_page_tree_get_type"
           glib:type-struct="DisplayPageTreeClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <constructor name="new" c:identifier="rb_display_page_tree_new">
        <doc xml:whitespace="preserve">Creates the display page tree widget.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the display page tree widget.</doc>
          <type name="DisplayPageTree" c:type="RBDisplayPageTree*"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShell instance</doc>
            <type name="Shell" c:type="RBShell*"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="drop_received">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="page" transfer-ownership="none">
            <type name="DisplayPage" c:type="RBDisplayPage*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <type name="Gtk.SelectionData" c:type="GtkSelectionData*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="selected">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="page" transfer-ownership="none">
            <type name="DisplayPage" c:type="RBDisplayPage*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="edit_source_name"
              c:identifier="rb_display_page_tree_edit_source_name">
        <doc xml:whitespace="preserve">Initiates editing of the name of the specified source.  The row for the source
is selected and given input focus, allowing the user to edit the name.
source_name_edited_cb is called when the user finishes editing.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBSource to edit</doc>
            <type name="Source" c:type="RBSource*"/>
          </parameter>
        </parameters>
      </method>
      <method name="select" c:identifier="rb_display_page_tree_select">
        <doc xml:whitespace="preserve">Selects the specified page in the tree.  This will result in the 'selected'
signal being emitted.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="page" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBDisplayPage to select</doc>
            <type name="DisplayPage" c:type="RBDisplayPage*"/>
          </parameter>
        </parameters>
      </method>
      <method name="toggle_expanded"
              c:identifier="rb_display_page_tree_toggle_expanded">
        <doc xml:whitespace="preserve">If @page is expanded (children visible), collapses it, otherwise expands it.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="page" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBDisplayPage to toggle</doc>
            <type name="DisplayPage" c:type="RBDisplayPage*"/>
          </parameter>
        </parameters>
      </method>
      <property name="model" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #GtkTreeModel for the display page tree</doc>
        <type name="Gtk.TreeModel"/>
      </property>
      <property name="shell"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBShell instance</doc>
        <type name="Shell"/>
      </property>
      <field name="parent">
        <type name="Gtk.ScrolledWindow" c:type="GtkScrolledWindow"/>
      </field>
      <field name="priv">
        <type name="DisplayPageTreePrivate"
              c:type="RBDisplayPageTreePrivate*"/>
      </field>
      <glib:signal name="drop-received" when="last">
        <doc xml:whitespace="preserve">Emitted when a drag and drop to the tree completes.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="page" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBDisplagePage receiving the drop</doc>
            <type name="gpointer"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">the drop data</doc>
            <type name="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="selected" when="last">
        <doc xml:whitespace="preserve">Emitted when a page is selected from the tree</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="page" transfer-ownership="none">
            <doc xml:whitespace="preserve">the newly selected #RBDisplayPage</doc>
            <type name="GObject.Object"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="DisplayPageTreeClass"
            c:type="RBDisplayPageTreeClass"
            glib:is-gtype-struct-for="DisplayPageTree">
      <field name="parent_class">
        <type name="Gtk.ScrolledWindowClass" c:type="GtkScrolledWindowClass"/>
      </field>
      <field name="selected">
        <callback name="selected">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="tree" transfer-ownership="none">
              <type name="DisplayPageTree" c:type="RBDisplayPageTree*"/>
            </parameter>
            <parameter name="page" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="drop_received">
        <callback name="drop_received">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="tree" transfer-ownership="none">
              <type name="DisplayPageTree" c:type="RBDisplayPageTree*"/>
            </parameter>
            <parameter name="page" transfer-ownership="none">
              <type name="DisplayPage" c:type="RBDisplayPage*"/>
            </parameter>
            <parameter name="data" transfer-ownership="none">
              <type name="Gtk.SelectionData" c:type="GtkSelectionData*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="DisplayPageTreePrivate"
            c:type="RBDisplayPageTreePrivate"
            disguised="1">
    </record>
    <constant name="ENABLE_PROFILING" value="1" c:type="ENABLE_PROFILING">
      <type name="gint" c:type="gint"/>
    </constant>
    <interface name="Encoder"
               c:symbol-prefix="encoder"
               c:type="RBEncoder"
               glib:type-name="RBEncoder"
               glib:get-type="rb_encoder_get_type"
               glib:type-struct="EncoderIface">
      <function name="new" c:identifier="rb_encoder_new">
        <doc xml:whitespace="preserve">Creates a new #RBEncoder instance.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the new #RBEncoder</doc>
          <type name="Encoder" c:type="RBEncoder*"/>
        </return-value>
      </function>
      <virtual-method name="cancel" invoker="cancel">
        <doc xml:whitespace="preserve">Attempts to cancel any in progress encoding.  The encoder should
delete the destination file, if it created one, and emit the
'completed' signal.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="completed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="dest_size" transfer-ownership="none">
            <type name="guint64" c:type="guint64"/>
          </parameter>
          <parameter name="mediatype" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="error" transfer-ownership="none">
            <type name="GLib.Error" c:type="GError*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="encode" invoker="encode">
        <doc xml:whitespace="preserve">Initiates encoding, transcoding to the specified profile if specified.

Encoding and error reporting takes place asynchronously.  The caller should wait
for the 'completed' signal which indicates it has either completed or failed.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry to transcode</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="dest" transfer-ownership="none">
            <doc xml:whitespace="preserve">destination file URI</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="profile" transfer-ownership="none">
            <doc xml:whitespace="preserve">encoding profile to use, or NULL to just copy</doc>
            <type name="GstPbutils.EncodingProfile"
                  c:type="GstEncodingProfile*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="get_missing_plugins" invoker="get_missing_plugins">
        <doc xml:whitespace="preserve">Retrieves the plugin installer detail strings and descriptions
for any missing plugins required to use the specified encoding profile.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if some detail strings are returned, %FALSE otherwise</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="profile" transfer-ownership="none">
            <doc xml:whitespace="preserve">an encoding profile</doc>
            <type name="GstPbutils.EncodingProfile"
                  c:type="GstEncodingProfile*"/>
          </parameter>
          <parameter name="details"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns plugin installer detail strings</doc>
            <type name="utf8" c:type="char***"/>
          </parameter>
          <parameter name="descriptions"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns plugin descriptions</doc>
            <type name="utf8" c:type="char***"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="overwrite">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="file" transfer-ownership="none">
            <type name="Gio.File" c:type="GFile*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="progress">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="fraction" transfer-ownership="none">
            <type name="gdouble" c:type="double"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="cancel" c:identifier="rb_encoder_cancel">
        <doc xml:whitespace="preserve">Attempts to cancel any in progress encoding.  The encoder should
delete the destination file, if it created one, and emit the
'completed' signal.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="encode" c:identifier="rb_encoder_encode">
        <doc xml:whitespace="preserve">Initiates encoding, transcoding to the specified profile if specified.

Encoding and error reporting takes place asynchronously.  The caller should wait
for the 'completed' signal which indicates it has either completed or failed.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry to transcode</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="dest" transfer-ownership="none">
            <doc xml:whitespace="preserve">destination file URI</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="profile" transfer-ownership="none">
            <doc xml:whitespace="preserve">encoding profile to use, or NULL to just copy</doc>
            <type name="GstPbutils.EncodingProfile"
                  c:type="GstEncodingProfile*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_missing_plugins"
              c:identifier="rb_encoder_get_missing_plugins">
        <doc xml:whitespace="preserve">Retrieves the plugin installer detail strings and descriptions
for any missing plugins required to use the specified encoding profile.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if some detail strings are returned, %FALSE otherwise</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="profile" transfer-ownership="none">
            <doc xml:whitespace="preserve">an encoding profile</doc>
            <type name="GstPbutils.EncodingProfile"
                  c:type="GstEncodingProfile*"/>
          </parameter>
          <parameter name="details"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns plugin installer detail strings</doc>
            <type name="utf8" c:type="char***"/>
          </parameter>
          <parameter name="descriptions"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns plugin descriptions</doc>
            <type name="utf8" c:type="char***"/>
          </parameter>
        </parameters>
      </method>
      <glib:signal name="completed" when="last">
        <doc xml:whitespace="preserve">Emitted when the encoding process is complete, or when a fatal error
has occurred.  The destination file, if one exists,  will be closed
and flushed to disk before this signal is emitted.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="dest_size" transfer-ownership="none">
            <doc xml:whitespace="preserve">size of the output file</doc>
            <type name="guint64"/>
          </parameter>
          <parameter name="mediatype" transfer-ownership="none">
            <doc xml:whitespace="preserve">output media type</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="error" transfer-ownership="none">
            <doc xml:whitespace="preserve">encoding error, or NULL if successful</doc>
            <type name="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="overwrite" when="last">
        <doc xml:whitespace="preserve">Emitted when a destination file already exists.  If the
return value if %TRUE, the file will be overwritten, otherwise
the transfer will be aborted.</doc>
        <return-value transfer-ownership="none">
          <type name="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="file" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GFile that may be overwritten</doc>
            <type name="GObject.Object"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="progress" when="last">
        <doc xml:whitespace="preserve">Emitted regularly during the encoding process to provide progress updates.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="fraction" transfer-ownership="none">
            <doc xml:whitespace="preserve">progress as a fraction (0..1)</doc>
            <type name="gdouble"/>
          </parameter>
        </parameters>
      </glib:signal>
    </interface>
    <enumeration name="EncoderError"
                 glib:type-name="RBEncoderError"
                 glib:get-type="rb_encoder_error_get_type"
                 c:type="RBEncoderError">
      <member name="format_unsupported"
              value="0"
              c:identifier="RB_ENCODER_ERROR_FORMAT_UNSUPPORTED"
              glib:nick="format-unsupported"/>
      <member name="internal_error"
              value="1"
              c:identifier="RB_ENCODER_ERROR_INTERNAL"
              glib:nick="internal-error"/>
      <member name="file_access_error"
              value="2"
              c:identifier="RB_ENCODER_ERROR_FILE_ACCESS"
              glib:nick="file-access-error"/>
      <member name="out_of_space"
              value="3"
              c:identifier="RB_ENCODER_ERROR_OUT_OF_SPACE"
              glib:nick="out-of-space"/>
      <member name="destination_read_only"
              value="4"
              c:identifier="RB_ENCODER_ERROR_DEST_READ_ONLY"
              glib:nick="destination-read-only"/>
      <function name="quark" c:identifier="rb_encoder_error_quark">
        <return-value transfer-ownership="none">
          <type name="GLib.Quark" c:type="GQuark"/>
        </return-value>
      </function>
    </enumeration>
    <class name="EncoderFactory"
           c:symbol-prefix="encoder_factory"
           c:type="RBEncoderFactory"
           parent="GObject.Object"
           glib:type-name="RBEncoderFactory"
           glib:get-type="rb_encoder_factory_get_type"
           glib:type-struct="EncoderFactoryClass">
      <function name="get" c:identifier="rb_encoder_factory_get">
        <doc xml:whitespace="preserve">Returns the #RBEncoderFactory instance.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the #RBEncoderFactory</doc>
          <type name="EncoderFactory" c:type="RBEncoderFactory*"/>
        </return-value>
      </function>
      <virtual-method name="prepare_sink">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="sink" transfer-ownership="none">
            <type name="GObject.Object" c:type="GObject*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="prepare_source">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="source" transfer-ownership="none">
            <type name="GObject.Object" c:type="GObject*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <field name="obj">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <glib:signal name="prepare-sink" when="last">
        <doc xml:whitespace="preserve">Emitted when creating a sink to write to the specified URI.
Plugins can use this when just creating a GStreamer element from the URI
isn't enough.  Typically this happens when there's no way to pass device
information through the URI format.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI for the sink</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="sink" transfer-ownership="none">
            <doc xml:whitespace="preserve">the sink object (a GstElement in fact)</doc>
            <type name="GObject.Object"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="prepare-source" when="last">
        <doc xml:whitespace="preserve">Emitted when creating a source to read the specified URI.
Plugins can use this when just creating a GStreamer element from the URI
isn't enough.  Typically this happens when there's no way to pass device
information through the URI format.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI for the source</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">the source object (a GstElement in fact)</doc>
            <type name="GObject.Object"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="EncoderFactoryClass"
            c:type="RBEncoderFactoryClass"
            glib:is-gtype-struct-for="EncoderFactory">
      <field name="obj_class">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="prepare_source">
        <callback name="prepare_source">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="factory" transfer-ownership="none">
              <type name="EncoderFactory" c:type="RBEncoderFactory*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="source" transfer-ownership="none">
              <type name="GObject.Object" c:type="GObject*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="prepare_sink">
        <callback name="prepare_sink">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="factory" transfer-ownership="none">
              <type name="EncoderFactory" c:type="RBEncoderFactory*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="sink" transfer-ownership="none">
              <type name="GObject.Object" c:type="GObject*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="EncoderIface"
            c:type="RBEncoderIface"
            glib:is-gtype-struct-for="Encoder">
      <field name="g_iface">
        <type name="GObject.TypeInterface" c:type="GTypeInterface"/>
      </field>
      <field name="encode">
        <callback name="encode">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="encoder" transfer-ownership="none">
              <type name="Encoder" c:type="RBEncoder*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <doc xml:whitespace="preserve">the #RhythmDBEntry to transcode</doc>
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="dest" transfer-ownership="none">
              <doc xml:whitespace="preserve">destination file URI</doc>
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="profile" transfer-ownership="none">
              <doc xml:whitespace="preserve">encoding profile to use, or NULL to just copy</doc>
              <type name="GstPbutils.EncodingProfile"
                    c:type="GstEncodingProfile*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="cancel">
        <callback name="cancel">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="encoder" transfer-ownership="none">
              <type name="Encoder" c:type="RBEncoder*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="get_missing_plugins">
        <callback name="get_missing_plugins">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">%TRUE if some detail strings are returned, %FALSE otherwise</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="encoder" transfer-ownership="none">
              <type name="Encoder" c:type="RBEncoder*"/>
            </parameter>
            <parameter name="profile" transfer-ownership="none">
              <doc xml:whitespace="preserve">an encoding profile</doc>
              <type name="GstPbutils.EncodingProfile"
                    c:type="GstEncodingProfile*"/>
            </parameter>
            <parameter name="details"
                       direction="out"
                       caller-allocates="0"
                       transfer-ownership="full">
              <doc xml:whitespace="preserve">returns plugin installer detail strings</doc>
              <type name="utf8" c:type="char***"/>
            </parameter>
            <parameter name="descriptions"
                       direction="out"
                       caller-allocates="0"
                       transfer-ownership="full">
              <doc xml:whitespace="preserve">returns plugin descriptions</doc>
              <type name="utf8" c:type="char***"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="progress">
        <callback name="progress">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="encoder" transfer-ownership="none">
              <type name="Encoder" c:type="RBEncoder*"/>
            </parameter>
            <parameter name="fraction" transfer-ownership="none">
              <type name="gdouble" c:type="double"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="overwrite">
        <callback name="overwrite">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="encoder" transfer-ownership="none">
              <type name="Encoder" c:type="RBEncoder*"/>
            </parameter>
            <parameter name="file" transfer-ownership="none">
              <type name="Gio.File" c:type="GFile*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="completed">
        <callback name="completed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="encoder" transfer-ownership="none">
              <type name="Encoder" c:type="RBEncoder*"/>
            </parameter>
            <parameter name="dest_size" transfer-ownership="none">
              <type name="guint64" c:type="guint64"/>
            </parameter>
            <parameter name="mediatype" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="error" transfer-ownership="none">
              <type name="GLib.Error" c:type="GError*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <class name="EntryView"
           c:symbol-prefix="entry_view"
           c:type="RBEntryView"
           parent="Gtk.ScrolledWindow"
           glib:type-name="RBEntryView"
           glib:get-type="rb_entry_view_get_type"
           glib:type-struct="EntryViewClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <constructor name="new" c:identifier="rb_entry_view_new">
        <doc xml:whitespace="preserve">Creates a new entry view.  If it makes sense to allow the user to drag entries
from this entry view to other sources, @is_drag_source should be TRUE.  If it
makes sense to allow the user to drag entries from other sources to this view,
@is_drag_dest should be TRUE.  Drag and drop in this sense is used for two purposes:
to transfer tracks between the filesystem and removable devices, and to add tracks
to playlists.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the new entry view</doc>
          <type name="EntryView" c:type="RBEntryView*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDB instance</doc>
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="shell_player" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShellPlayer instance</doc>
            <type name="GObject.Object" c:type="GObject*"/>
          </parameter>
          <parameter name="is_drag_source" transfer-ownership="none">
            <doc xml:whitespace="preserve">if TRUE, the view should act as a drag and drop data source</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
          <parameter name="is_drag_dest" transfer-ownership="none">
            <doc xml:whitespace="preserve">if TRUE, the view should act as a drag and drop destination</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </constructor>
      <function name="get_time_date_column_sample"
                c:identifier="rb_entry_view_get_time_date_column_sample">
        <doc xml:whitespace="preserve">Returns a sample string for use in columns displaying times
and dates in 'friendly' form (see @rb_utf_friendly_time).
For use with @rb_entry_view_set_fixed_column_width.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">sample date string</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
      </function>
      <virtual-method name="entries_replaced">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="entry_activated">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_added">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_deleted">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="have_selection_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="have_selection" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="selection_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="show_popup">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="over_entry" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="append_column" c:identifier="rb_entry_view_append_column">
        <doc xml:whitespace="preserve">Appends a predefined column type to the set of columns already present
in the entry view.  If @always_visible is TRUE, the column will ignore
the user's coulmn visibility settings and will always be visible.
This should only be used when it is vital for the purpose of the 
source that the column be visible.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="coltype" transfer-ownership="none">
            <doc xml:whitespace="preserve">type of column to append</doc>
            <type name="EntryViewColumn" c:type="RBEntryViewColumn"/>
          </parameter>
          <parameter name="always_visible" transfer-ownership="none">
            <doc xml:whitespace="preserve">if TRUE, ignore the user's column visibility settings</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="append_column_custom"
              c:identifier="rb_entry_view_append_column_custom">
        <doc xml:whitespace="preserve">Appends a custom column to the entry view.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="column" transfer-ownership="full">
            <doc xml:whitespace="preserve">a #GtkTreeViewColumn to append</doc>
            <type name="Gtk.TreeViewColumn" c:type="GtkTreeViewColumn*"/>
          </parameter>
          <parameter name="title" transfer-ownership="none">
            <doc xml:whitespace="preserve">title for the column (translated)</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="key" transfer-ownership="none">
            <doc xml:whitespace="preserve">sort key for the column (not translated)</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="sort_func"
                     transfer-ownership="none"
                     scope="notified"
                     closure="4"
                     destroy="5">
            <doc xml:whitespace="preserve">comparison function to use for sorting on the column</doc>
            <type name="GLib.CompareDataFunc" c:type="GCompareDataFunc"/>
          </parameter>
          <parameter name="data" transfer-ownership="none" scope="notified">
            <doc xml:whitespace="preserve">data to pass to the sort function</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="data_destroy"
                     transfer-ownership="none"
                     scope="async">
            <doc xml:whitespace="preserve">function to use to destroy the sort data</doc>
            <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
          </parameter>
        </parameters>
      </method>
      <method name="enable_drag_source"
              c:identifier="rb_entry_view_enable_drag_source">
        <doc xml:whitespace="preserve">Enables the entry view to act as a data source for drag an drop operations,
using a specified set of data targets.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="targets" transfer-ownership="none">
            <doc xml:whitespace="preserve">an array of #GtkTargetEntry structures defining the drag data targets</doc>
            <type name="Gtk.TargetEntry" c:type="GtkTargetEntry*"/>
          </parameter>
          <parameter name="n_targets" transfer-ownership="none">
            <doc xml:whitespace="preserve">the number of entries in the target array</doc>
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_column" c:identifier="rb_entry_view_get_column">
        <doc xml:whitespace="preserve">Retrieves a predefined column from the entry view.  This can be used
to insert additional cell renderers into the column.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">a #GtkTreeViewColumn instance, or NULL</doc>
          <type name="Gtk.TreeViewColumn" c:type="GtkTreeViewColumn*"/>
        </return-value>
        <parameters>
          <parameter name="coltype" transfer-ownership="none">
            <doc xml:whitespace="preserve">type of column to retrieve</doc>
            <type name="EntryViewColumn" c:type="RBEntryViewColumn"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_entry_contained"
              c:identifier="rb_entry_view_get_entry_contained">
        <doc xml:whitespace="preserve">Determines whether a specified entry is present in the view.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the entry is present in the view</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry to check</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_entry_visible"
              c:identifier="rb_entry_view_get_entry_visible">
        <doc xml:whitespace="preserve">Determines whether a specified entry is present in the view
and is currently visible.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the entry is visible</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry to check</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_selected_entries"
              c:identifier="rb_entry_view_get_selected_entries">
        <doc xml:whitespace="preserve">Gathers the selected entries from the view.

selected entries in the view.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">a #GList of</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="RhythmDBEntry"/>
          </type>
        </return-value>
      </method>
      <method name="get_sorting_order"
              c:identifier="rb_entry_view_get_sorting_order">
        <doc xml:whitespace="preserve">Retrieves the sort settings for the view.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="column_name"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full"
                     allow-none="1">
            <doc xml:whitespace="preserve">returns the sort column name</doc>
            <type name="utf8" c:type="char**"/>
          </parameter>
          <parameter name="sort_order" transfer-ownership="none">
            <doc xml:whitespace="preserve">(out) (allow-none) returns the sort ordering as a #GtkSortType value</doc>
            <type name="gint" c:type="gint*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_sorting_type"
              c:identifier="rb_entry_view_get_sorting_type">
        <doc xml:whitespace="preserve">Constructs a string that describes the sort settings for the entry view.
This consists of a column name and an order ('ascending' or 'descending')
separated by a comma.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">sort order description</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
      </method>
      <method name="have_complete_selection"
              c:identifier="rb_entry_view_have_complete_selection">
        <doc xml:whitespace="preserve">Determines whether all entries in the view are selected.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if all rows in the view are selected</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="have_selection"
              c:identifier="rb_entry_view_have_selection">
        <doc xml:whitespace="preserve">Determines whether there is an active selection in the view.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if one or more rows are selected</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="insert_column_custom"
              c:identifier="rb_entry_view_insert_column_custom">
        <doc xml:whitespace="preserve">Inserts a custom column at the specified position.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="column" transfer-ownership="full">
            <doc xml:whitespace="preserve">a #GtkTreeViewColumn to append</doc>
            <type name="Gtk.TreeViewColumn" c:type="GtkTreeViewColumn*"/>
          </parameter>
          <parameter name="title" transfer-ownership="none">
            <doc xml:whitespace="preserve">title for the column (translated)</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="key" transfer-ownership="none">
            <doc xml:whitespace="preserve">sort key for the column (not translated)</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="sort_func"
                     transfer-ownership="none"
                     scope="notified"
                     closure="4"
                     destroy="5">
            <doc xml:whitespace="preserve">comparison function to use for sorting on the column</doc>
            <type name="GLib.CompareDataFunc" c:type="GCompareDataFunc"/>
          </parameter>
          <parameter name="data" transfer-ownership="none" scope="notified">
            <doc xml:whitespace="preserve">data to pass to the sort function</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="data_destroy"
                     transfer-ownership="none"
                     scope="async">
            <doc xml:whitespace="preserve">function to use to destroy the sort data</doc>
            <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
          </parameter>
          <parameter name="position" transfer-ownership="none">
            <doc xml:whitespace="preserve">position at which to insert the column (-1 to insert at the end)</doc>
            <type name="gint" c:type="gint"/>
          </parameter>
        </parameters>
      </method>
      <method name="resort_model" c:identifier="rb_entry_view_resort_model">
        <doc xml:whitespace="preserve">Resorts the entries in the entry view.  Mostly to be used
when a new model is associated with the view.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="scroll_to_entry"
              c:identifier="rb_entry_view_scroll_to_entry">
        <doc xml:whitespace="preserve">If the specified entry is present in the view, the view will be
scrolled so that the entry is visible.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry to scroll to</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="select_all" c:identifier="rb_entry_view_select_all">
        <doc xml:whitespace="preserve">Selects all rows in the view</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="select_entry" c:identifier="rb_entry_view_select_entry">
        <doc xml:whitespace="preserve">If the specified entry is present in the view, it is added
to the selection.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry to select</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="select_none" c:identifier="rb_entry_view_select_none">
        <doc xml:whitespace="preserve">Deselects all rows in the view.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="set_column_editable"
              c:identifier="rb_entry_view_set_column_editable">
        <doc xml:whitespace="preserve">Enables in-place editing of the values in a column.
The underlying %RhythmDBEntry is updated when editing is complete.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="column" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RBEntryViewColumn to update</doc>
            <type name="EntryViewColumn" c:type="RBEntryViewColumn"/>
          </parameter>
          <parameter name="editable" transfer-ownership="none">
            <doc xml:whitespace="preserve">%TRUE to make the column editable, %FALSE otherwise</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_columns_clickable"
              c:identifier="rb_entry_view_set_columns_clickable">
        <doc xml:whitespace="preserve">Makes the headers for sortable columns (those for which a sort function was
provided) clickable, so the user can set the sort order.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="clickable" transfer-ownership="none">
            <doc xml:whitespace="preserve">if TRUE, sortable columns will be made clickable</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_fixed_column_width"
              c:identifier="rb_entry_view_set_fixed_column_width">
        <doc xml:whitespace="preserve">Helper function for calling @rb_set_tree_view_column_fixed_width on
a column.  This is important for performance reasons, as having the
tree view measure the strings in each of 20000 rows is very slow.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="column" transfer-ownership="none">
            <doc xml:whitespace="preserve">the column to set the width for</doc>
            <type name="Gtk.TreeViewColumn" c:type="GtkTreeViewColumn*"/>
          </parameter>
          <parameter name="renderer" transfer-ownership="none">
            <doc xml:whitespace="preserve">a temporary cell renderer to use</doc>
            <type name="Gtk.CellRenderer" c:type="GtkCellRenderer*"/>
          </parameter>
          <parameter name="strings" transfer-ownership="none">
            <doc xml:whitespace="preserve">a NULL-terminated array of strings that will be displayed in the column</doc>
            <array c:type="gchar**">
              <type name="utf8" c:type="gchar*"/>
            </array>
          </parameter>
        </parameters>
      </method>
      <method name="set_model" c:identifier="rb_entry_view_set_model">
        <doc xml:whitespace="preserve">Replaces the model backing the entry view.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="model" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new #RhythmDBQueryModel to use for the view</doc>
            <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_sorting_order"
              c:identifier="rb_entry_view_set_sorting_order">
        <doc xml:whitespace="preserve">Sets the sort order for the entry view.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="column_name" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of the column to sort on</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="sort_order" transfer-ownership="none">
            <doc xml:whitespace="preserve">order to sort in, as a #GtkSortType</doc>
            <type name="gint" c:type="gint"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_sorting_type"
              c:identifier="rb_entry_view_set_sorting_type">
        <doc xml:whitespace="preserve">Changes the sort order for the entry view.  The sort order
description must be a column name, followed by a comma, followed
by an order description ('ascending' or 'descending').</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="sorttype" transfer-ownership="none">
            <doc xml:whitespace="preserve">sort order description</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_state" c:identifier="rb_entry_view_set_state">
        <doc xml:whitespace="preserve">Sets the icon to be drawn in the 'playing' column next to the
current playing entry.  RB_ENTRY_VIEW_PLAYING and RB_ENTRY_VIEW_PAUSED
should be used when the source containing the entry view is playing,
and RB_ENTRY_VIEW_NOT_PLAYING otherwise.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="state" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new playing entry state</doc>
            <type name="EntryViewState" c:type="RBEntryViewState"/>
          </parameter>
        </parameters>
      </method>
      <property name="db"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">#RhythmDB instance</doc>
        <type name="RhythmDB"/>
      </property>
      <property name="is-drag-dest"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">If TRUE, the view acts as a destination for drag and drop operations.</doc>
        <type name="gboolean"/>
      </property>
      <property name="is-drag-source"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">If TRUE, the view acts as a data source for drag and drop operations.</doc>
        <type name="gboolean"/>
      </property>
      <property name="model" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RhythmDBQueryModel backing the view</doc>
        <type name="RhythmDBQueryModel"/>
      </property>
      <property name="playing-state" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">Determines the icon to show in the 'playing' column next to the current
playing entry.</doc>
        <type name="gint"/>
      </property>
      <property name="shell-player"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">#RBShellPlayer instance</doc>
        <type name="ShellPlayer"/>
      </property>
      <property name="sort-order" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The sort order for the track listing.</doc>
        <type name="utf8"/>
      </property>
      <property name="visible-columns" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">An array containing the names of the visible columns.</doc>
        <array>
          <type name="utf8"/>
        </array>
      </property>
      <field name="parent">
        <type name="Gtk.ScrolledWindow" c:type="GtkScrolledWindow"/>
      </field>
      <field name="priv">
        <type name="EntryViewPrivate" c:type="RBEntryViewPrivate*"/>
      </field>
      <glib:signal name="entries-replaced" when="last">
        <doc xml:whitespace="preserve">Emitted when the model backing the entry view is replaced.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
      <glib:signal name="entry-activated" when="last">
        <doc xml:whitespace="preserve">Emitted when an entry in the view is activated (by double clicking
or by various key presses)</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry that was activated</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="entry-added" when="last">
        <doc xml:whitespace="preserve">Emitted when an entry is added to the view</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry that was added</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="entry-deleted" when="last">
        <doc xml:whitespace="preserve">Emitted when an entry has been removed from the view</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry that was removed</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="have-selection-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when the user first selects a row, or when no rows are selected
any more.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="have_selection" transfer-ownership="none">
            <doc xml:whitespace="preserve">TRUE if one or more rows are selected</doc>
            <type name="gboolean"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="selection-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when the set of selected entries changes</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
      <glib:signal name="show-popup" when="last">
        <doc xml:whitespace="preserve">Emitted when the user performs an action that should result in a
popup menu appearing.  If the action was a mouse button click, 
over_entry is FALSE if the mouse pointer was in the blank space after
the last row in the view.  If the action was a key press, over_entry
is FALSE if no rows in the view are selected.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="over_entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">if TRUE, the popup request was made while pointing at an entry in the view</doc>
            <type name="gboolean"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="EntryViewClass"
            c:type="RBEntryViewClass"
            glib:is-gtype-struct-for="EntryView">
      <field name="parent">
        <type name="Gtk.ScrolledWindowClass" c:type="GtkScrolledWindowClass"/>
      </field>
      <field name="entry_added">
        <callback name="entry_added">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="view" transfer-ownership="none">
              <type name="EntryView" c:type="RBEntryView*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entry_deleted">
        <callback name="entry_deleted">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="view" transfer-ownership="none">
              <type name="EntryView" c:type="RBEntryView*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entries_replaced">
        <callback name="entries_replaced">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="view" transfer-ownership="none">
              <type name="EntryView" c:type="RBEntryView*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entry_activated">
        <callback name="entry_activated">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="view" transfer-ownership="none">
              <type name="EntryView" c:type="RBEntryView*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="have_selection_changed">
        <callback name="have_selection_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="view" transfer-ownership="none">
              <type name="EntryView" c:type="RBEntryView*"/>
            </parameter>
            <parameter name="have_selection" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="selection_changed">
        <callback name="selection_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="view" transfer-ownership="none">
              <type name="EntryView" c:type="RBEntryView*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="show_popup">
        <callback name="show_popup">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="view" transfer-ownership="none">
              <type name="EntryView" c:type="RBEntryView*"/>
            </parameter>
            <parameter name="over_entry" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <enumeration name="EntryViewColumn"
                 glib:type-name="RBEntryViewColumn"
                 glib:get-type="rb_entry_view_column_get_type"
                 c:type="RBEntryViewColumn">
      <doc xml:whitespace="preserve">Predefined column types to use in #RBEntryView&lt;!-- --&gt;s.  Use
#rb_entry_view_append_column to add these to an entry view.
The predefined column names map directly to the #RhythmDBEntry properties
the columns display.</doc>
      <member name="track_number"
              value="0"
              c:identifier="RB_ENTRY_VIEW_COL_TRACK_NUMBER"
              glib:nick="track-number"/>
      <member name="title"
              value="1"
              c:identifier="RB_ENTRY_VIEW_COL_TITLE"
              glib:nick="title"/>
      <member name="artist"
              value="2"
              c:identifier="RB_ENTRY_VIEW_COL_ARTIST"
              glib:nick="artist"/>
      <member name="album"
              value="3"
              c:identifier="RB_ENTRY_VIEW_COL_ALBUM"
              glib:nick="album"/>
      <member name="genre"
              value="4"
              c:identifier="RB_ENTRY_VIEW_COL_GENRE"
              glib:nick="genre"/>
      <member name="comment"
              value="5"
              c:identifier="RB_ENTRY_VIEW_COL_COMMENT"
              glib:nick="comment"/>
      <member name="duration"
              value="6"
              c:identifier="RB_ENTRY_VIEW_COL_DURATION"
              glib:nick="duration"/>
      <member name="quality"
              value="7"
              c:identifier="RB_ENTRY_VIEW_COL_QUALITY"
              glib:nick="quality"/>
      <member name="rating"
              value="8"
              c:identifier="RB_ENTRY_VIEW_COL_RATING"
              glib:nick="rating"/>
      <member name="play_count"
              value="9"
              c:identifier="RB_ENTRY_VIEW_COL_PLAY_COUNT"
              glib:nick="play-count"/>
      <member name="year"
              value="10"
              c:identifier="RB_ENTRY_VIEW_COL_YEAR"
              glib:nick="year"/>
      <member name="last_played"
              value="11"
              c:identifier="RB_ENTRY_VIEW_COL_LAST_PLAYED"
              glib:nick="last-played"/>
      <member name="first_seen"
              value="12"
              c:identifier="RB_ENTRY_VIEW_COL_FIRST_SEEN"
              glib:nick="first-seen"/>
      <member name="last_seen"
              value="13"
              c:identifier="RB_ENTRY_VIEW_COL_LAST_SEEN"
              glib:nick="last-seen"/>
      <member name="location"
              value="14"
              c:identifier="RB_ENTRY_VIEW_COL_LOCATION"
              glib:nick="location"/>
      <member name="bpm"
              value="15"
              c:identifier="RB_ENTRY_VIEW_COL_BPM"
              glib:nick="bpm"/>
      <member name="error"
              value="16"
              c:identifier="RB_ENTRY_VIEW_COL_ERROR"
              glib:nick="error"/>
    </enumeration>
    <record name="EntryViewPrivate" c:type="RBEntryViewPrivate" disguised="1">
    </record>
    <enumeration name="EntryViewState"
                 glib:type-name="RBEntryViewState"
                 glib:get-type="rb_entry_view_state_get_type"
                 c:type="RBEntryViewState">
      <member name="not_playing"
              value="0"
              c:identifier="RB_ENTRY_VIEW_NOT_PLAYING"
              glib:nick="not-playing"/>
      <member name="playing"
              value="1"
              c:identifier="RB_ENTRY_VIEW_PLAYING"
              glib:nick="playing"/>
      <member name="paused"
              value="2"
              c:identifier="RB_ENTRY_VIEW_PAUSED"
              glib:nick="paused"/>
    </enumeration>
    <class name="ExtDB"
           c:symbol-prefix="ext_db"
           c:type="RBExtDB"
           parent="GObject.Object"
           glib:type-name="RBExtDB"
           glib:get-type="rb_ext_db_get_type"
           glib:type-struct="ExtDBClass">
      <constructor name="new" c:identifier="rb_ext_db_new">
        <doc xml:whitespace="preserve">Provides access to a metadata store instance.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">named metadata store instance</doc>
          <type name="ExtDB" c:type="RBExtDB*"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of the metadata store</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="added">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="key" transfer-ownership="none">
            <type name="ExtDBKey" c:type="RBExtDBKey*"/>
          </parameter>
          <parameter name="filename" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="load">
        <return-value transfer-ownership="full">
          <type name="GObject.Value" c:type="GValue*"/>
        </return-value>
        <parameters>
          <parameter name="data" transfer-ownership="none">
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="request">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="key" transfer-ownership="none">
            <type name="ExtDBKey" c:type="RBExtDBKey*"/>
          </parameter>
          <parameter name="last_time" transfer-ownership="none">
            <type name="guint64" c:type="guint64"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="store">
        <return-value transfer-ownership="full">
          <type name="GObject.Value" c:type="GValue*"/>
        </return-value>
        <parameters>
          <parameter name="data" transfer-ownership="none">
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="lookup" c:identifier="rb_ext_db_lookup">
        <doc xml:whitespace="preserve">Looks up a cached metadata item.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">name of the file storing the cached metadata item</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
        <parameters>
          <parameter name="key" transfer-ownership="none">
            <doc xml:whitespace="preserve">metadata lookup key</doc>
            <type name="ExtDBKey" c:type="RBExtDBKey*"/>
          </parameter>
        </parameters>
      </method>
      <method name="request" c:identifier="rb_ext_db_request">
        <doc xml:whitespace="preserve">Requests a metadata item.  If the item is cached, the callback will be called
synchronously.  Otherwise, metadata providers will provide results asynchronously.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if results may be provided after returning</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="key" transfer-ownership="none">
            <doc xml:whitespace="preserve">metadata lookup key</doc>
            <type name="ExtDBKey" c:type="RBExtDBKey*"/>
          </parameter>
          <parameter name="callback"
                     transfer-ownership="none"
                     scope="notified"
                     closure="2"
                     destroy="3">
            <doc xml:whitespace="preserve">callback to call with results</doc>
            <type name="ExtDBRequestCallback" c:type="RBExtDBRequestCallback"/>
          </parameter>
          <parameter name="user_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">user data to pass to the callback</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="destroy" transfer-ownership="none" scope="async">
            <doc xml:whitespace="preserve">destroy function for @user_data</doc>
            <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
          </parameter>
        </parameters>
      </method>
      <method name="store" c:identifier="rb_ext_db_store">
        <doc xml:whitespace="preserve">Stores an item in the metadata store so that lookups matching @key will
return it.  @data should contain an object that must be transformed using
the RBExtDB::store signal before being stored.  For example,
the album art cache expects #GdkPixbuf objects here, rather than buffers
containing JPEG encoded files.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="key" transfer-ownership="none">
            <doc xml:whitespace="preserve">metadata storage key</doc>
            <type name="ExtDBKey" c:type="RBExtDBKey*"/>
          </parameter>
          <parameter name="source_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">metadata source type</doc>
            <type name="ExtDBSourceType" c:type="RBExtDBSourceType"/>
          </parameter>
          <parameter name="data" transfer-ownership="none" allow-none="1">
            <doc xml:whitespace="preserve">data to store</doc>
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </method>
      <method name="store_raw" c:identifier="rb_ext_db_store_raw">
        <doc xml:whitespace="preserve">Stores an item in the metadata store so that lookpus matching @key
will return it.  @data should contain the data to be written to the
store, either as a string or as a #GByteArray.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="key" transfer-ownership="none">
            <doc xml:whitespace="preserve">metadata storage key</doc>
            <type name="ExtDBKey" c:type="RBExtDBKey*"/>
          </parameter>
          <parameter name="source_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">metadata source type</doc>
            <type name="ExtDBSourceType" c:type="RBExtDBSourceType"/>
          </parameter>
          <parameter name="data" transfer-ownership="none" allow-none="1">
            <doc xml:whitespace="preserve">data to store</doc>
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </method>
      <method name="store_uri" c:identifier="rb_ext_db_store_uri">
        <doc xml:whitespace="preserve">Stores an item identified by @uri in the metadata store so that
lookups matching @key will return it.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="key" transfer-ownership="none">
            <doc xml:whitespace="preserve">metadata storage key</doc>
            <type name="ExtDBKey" c:type="RBExtDBKey*"/>
          </parameter>
          <parameter name="source_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">metadata source type</doc>
            <type name="ExtDBSourceType" c:type="RBExtDBSourceType"/>
          </parameter>
          <parameter name="uri" transfer-ownership="none" allow-none="1">
            <doc xml:whitespace="preserve">URI of the item to store</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <property name="name"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">Name of the metadata store.  Used to locate instances.</doc>
        <type name="utf8"/>
      </property>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="ExtDBPrivate" c:type="RBExtDBPrivate*"/>
      </field>
      <glib:signal name="added" when="last">
        <doc xml:whitespace="preserve">Emitted when metadata is added to the store.  Metadata consumers
can use this to process metadata they did not specifically
request, for example to update album art stored on an attached
media player.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="ExtDBKey"/>
          </parameter>
          <parameter name="p0" transfer-ownership="none">
            <type name="utf8"/>
          </parameter>
          <parameter name="p1" transfer-ownership="none">
            <type name="GObject.Value"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="load" when="last">
        <doc xml:whitespace="preserve">Emitted when loading a metadata item from a local file or from a
URI.</doc>
        <return-value transfer-ownership="full">
          <type name="GObject.Value"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="GObject.Value"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="request" when="last">
        <doc xml:whitespace="preserve">Emitted when a metadata request cannot be satisfied from the local
store.  Metadata providers initiate searches in response to this
signal.</doc>
        <return-value transfer-ownership="none">
          <type name="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="ExtDBKey"/>
          </parameter>
          <parameter name="p0" transfer-ownership="none">
            <type name="gulong"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="store" when="last">
        <doc xml:whitespace="preserve">Emitted when a metadata item needs to be written to a local file.
This only needs to be used for metadata that needs to be encoded
or compressed, such as images.</doc>
        <return-value transfer-ownership="full">
          <type name="GObject.Value"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="GObject.Value"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="ExtDBClass"
            c:type="RBExtDBClass"
            glib:is-gtype-struct-for="ExtDB">
      <field name="parent">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="added">
        <callback name="added">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="store" transfer-ownership="none">
              <type name="ExtDB" c:type="RBExtDB*"/>
            </parameter>
            <parameter name="key" transfer-ownership="none">
              <type name="ExtDBKey" c:type="RBExtDBKey*"/>
            </parameter>
            <parameter name="filename" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="data" transfer-ownership="none">
              <type name="GObject.Value" c:type="GValue*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="request">
        <callback name="request">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="store" transfer-ownership="none">
              <type name="ExtDB" c:type="RBExtDB*"/>
            </parameter>
            <parameter name="key" transfer-ownership="none">
              <type name="ExtDBKey" c:type="RBExtDBKey*"/>
            </parameter>
            <parameter name="last_time" transfer-ownership="none">
              <type name="guint64" c:type="guint64"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="store">
        <callback name="store">
          <return-value transfer-ownership="full">
            <type name="GObject.Value" c:type="GValue*"/>
          </return-value>
          <parameters>
            <parameter name="store" transfer-ownership="none">
              <type name="ExtDB" c:type="RBExtDB*"/>
            </parameter>
            <parameter name="data" transfer-ownership="none">
              <type name="GObject.Value" c:type="GValue*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="load">
        <callback name="load">
          <return-value transfer-ownership="full">
            <type name="GObject.Value" c:type="GValue*"/>
          </return-value>
          <parameters>
            <parameter name="store" transfer-ownership="none">
              <type name="ExtDB" c:type="RBExtDB*"/>
            </parameter>
            <parameter name="data" transfer-ownership="none">
              <type name="GObject.Value" c:type="GValue*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="ExtDBKey"
            c:type="RBExtDBKey"
            glib:type-name="RBExtDBKey"
            glib:get-type="rb_ext_db_key_get_type"
            c:symbol-prefix="ext_db_key">
      <method name="add_field" c:identifier="rb_ext_db_key_add_field">
        <doc xml:whitespace="preserve">Adds a field to the key, or an additional value to an existing field.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="field" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of the field to add</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <doc xml:whitespace="preserve">field value</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="add_info" c:identifier="rb_ext_db_key_add_info">
        <doc xml:whitespace="preserve">Adds an information field to the key.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <doc xml:whitespace="preserve">field value</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="copy" c:identifier="rb_ext_db_key_copy">
        <doc xml:whitespace="preserve">Copies a key.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">copied key</doc>
          <type name="ExtDBKey" c:type="RBExtDBKey*"/>
        </return-value>
      </method>
      <method name="field_matches" c:identifier="rb_ext_db_key_field_matches">
        <doc xml:whitespace="preserve">Checks whether a specified field in @key matches a value.
This can be used to match keys against other types of data.
To match keys against each other, use @rb_ext_db_key_matches.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the field matches the value</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="field" transfer-ownership="none">
            <doc xml:whitespace="preserve">a field to check</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <doc xml:whitespace="preserve">a value to match against</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="free" c:identifier="rb_ext_db_key_free">
        <doc xml:whitespace="preserve">Frees a key</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="get_field" c:identifier="rb_ext_db_key_get_field">
        <doc xml:whitespace="preserve">Extracts the value for a single-valued field.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">field value, or NULL</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
        <parameters>
          <parameter name="field" transfer-ownership="none">
            <doc xml:whitespace="preserve">field to retrieve</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_field_names"
              c:identifier="rb_ext_db_key_get_field_names">
        <doc xml:whitespace="preserve">Returns a NULL-terminated array containing the names of the fields
present in the key.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">array of field names</doc>
          <array c:type="char**">
            <type name="utf8"/>
          </array>
        </return-value>
      </method>
      <method name="get_field_values"
              c:identifier="rb_ext_db_key_get_field_values">
        <doc xml:whitespace="preserve">Extracts the values for the specified field.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">field values, or NULL</doc>
          <array c:type="char**">
            <type name="utf8"/>
          </array>
        </return-value>
        <parameters>
          <parameter name="field" transfer-ownership="none">
            <doc xml:whitespace="preserve">field to retrieve</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_info" c:identifier="rb_ext_db_key_get_info">
        <doc xml:whitespace="preserve">Extracts the value for the specified info field.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">field value, or NULL</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">info field to retrieve</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_info_names"
              c:identifier="rb_ext_db_key_get_info_names">
        <doc xml:whitespace="preserve">Returns a NULL-terminated array containing the names of the info
fields * present in the key.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">array of info field names</doc>
          <array c:type="char**">
            <type name="utf8"/>
          </array>
        </return-value>
      </method>
      <method name="is_lookup" c:identifier="rb_ext_db_key_is_lookup">
        <doc xml:whitespace="preserve">Returns %TRUE if the key is a lookup key</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">whether the key is a lookup key</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="lookups"
              c:identifier="rb_ext_db_key_lookups"
              introspectable="0">
        <doc xml:whitespace="preserve">Generates the set of possible lookup keys for @key and
passes them to @callback in order.  If the callback returns
%FALSE, processing will stop.

This should only be used by the metadata store itself.
Metadata providers and consumers shouldn't need to do this.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="callback" transfer-ownership="none" closure="1">
            <doc xml:whitespace="preserve">a callback to process lookup keys</doc>
            <type name="ExtDBKeyLookupCallback"
                  c:type="RBExtDBKeyLookupCallback"/>
          </parameter>
          <parameter name="user_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">data to pass to @callback</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </method>
      <method name="matches" c:identifier="rb_ext_db_key_matches">
        <doc xml:whitespace="preserve">Checks whether the fields specified in @a match @b.
For keys to match, they must have the same set of required fields,
and the values for all must match.  Optional fields must have the
same values if present in both.  Informational fields are ignored.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the keys match</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="b" transfer-ownership="none">
            <doc xml:whitespace="preserve">second #RBExtDBKey</doc>
            <type name="ExtDBKey" c:type="RBExtDBKey*"/>
          </parameter>
        </parameters>
      </method>
      <method name="to_store_key"
              c:identifier="rb_ext_db_key_to_store_key"
              introspectable="0">
        <doc xml:whitespace="preserve">Generates the storage key for @key.  This is the value that should
be used to store an item identified by this key in the store.
The storage key includes all optional fields, so keys passed to
this function should be constructed using only the optional fields
that were used to locate the item.  The caller must free the data
pointer inside @data.

This should only be used by the metadata store itself.
Metadata providers and consumers shouldn't need to do this.</doc>
        <return-value>
          <doc xml:whitespace="preserve">TDB_DATA structure containing storage key</doc>
          <type c:type="TDB_DATA"/>
        </return-value>
      </method>
      <function name="create_lookup"
                c:identifier="rb_ext_db_key_create_lookup">
        <doc xml:whitespace="preserve">Creates a new metadata lookup key with a single field.
Use @rb_ext_db_key_add_field to add more.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the new key</doc>
          <type name="ExtDBKey" c:type="RBExtDBKey*"/>
        </return-value>
        <parameters>
          <parameter name="field" transfer-ownership="none">
            <doc xml:whitespace="preserve">required field name</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <doc xml:whitespace="preserve">value for field</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </function>
      <function name="create_storage"
                c:identifier="rb_ext_db_key_create_storage">
        <doc xml:whitespace="preserve">Creates a new metadata storage key with a single field.
Use @rb_ext_db_key_add_field to add more.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the new key</doc>
          <type name="ExtDBKey" c:type="RBExtDBKey*"/>
        </return-value>
        <parameters>
          <parameter name="field" transfer-ownership="none">
            <doc xml:whitespace="preserve">required field name</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <doc xml:whitespace="preserve">value for field</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </function>
    </record>
    <callback name="ExtDBKeyLookupCallback"
              c:type="RBExtDBKeyLookupCallback"
              introspectable="0">
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="data" transfer-ownership="none">
          <type c:type="TDB_DATA"/>
        </parameter>
        <parameter name="user_data" transfer-ownership="none" closure="1">
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </callback>
    <record name="ExtDBPrivate" c:type="RBExtDBPrivate" disguised="1">
    </record>
    <callback name="ExtDBRequestCallback" c:type="RBExtDBRequestCallback">
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="key" transfer-ownership="none">
          <type name="ExtDBKey" c:type="RBExtDBKey*"/>
        </parameter>
        <parameter name="filename" transfer-ownership="none">
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="data" transfer-ownership="none">
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="user_data" transfer-ownership="none" closure="3">
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </callback>
    <enumeration name="ExtDBSourceType"
                 glib:type-name="RBExtDBSourceType"
                 glib:get-type="rb_ext_db_source_type_get_type"
                 c:type="RBExtDBSourceType">
      <member name="none"
              value="0"
              c:identifier="RB_EXT_DB_SOURCE_NONE"
              glib:nick="none"/>
      <member name="search"
              value="1"
              c:identifier="RB_EXT_DB_SOURCE_SEARCH"
              glib:nick="search"/>
      <member name="embedded"
              value="2"
              c:identifier="RB_EXT_DB_SOURCE_EMBEDDED"
              glib:nick="embedded"/>
      <member name="user"
              value="3"
              c:identifier="RB_EXT_DB_SOURCE_USER"
              glib:nick="user"/>
      <member name="user_explicit"
              value="4"
              c:identifier="RB_EXT_DB_SOURCE_USER_EXPLICIT"
              glib:nick="user-explicit"/>
    </enumeration>
    <constant name="FFWD_OFFSET" value="20" c:type="FFWD_OFFSET">
      <type name="gint" c:type="gint"/>
    </constant>
    <class name="History"
           c:symbol-prefix="history"
           c:type="RBHistory"
           parent="GObject.Object"
           glib:type-name="RBHistory"
           glib:get-type="rb_history_get_type"
           glib:type-struct="HistoryClass">
      <constructor name="new" c:identifier="rb_history_new">
        <doc xml:whitespace="preserve">Creates a new history instance.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">a new #RBHistory</doc>
          <type name="History" c:type="RBHistory*"/>
        </return-value>
        <parameters>
          <parameter name="truncate_on_play" transfer-ownership="none">
            <doc xml:whitespace="preserve">Whether rb_history_set_playing() should truncate the history</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
          <parameter name="destroyer"
                     transfer-ownership="none"
                     scope="async"
                     closure="2">
            <doc xml:whitespace="preserve">function to call when removing an entry from the history</doc>
            <type name="GLib.Func" c:type="GFunc"/>
          </parameter>
          <parameter name="destroy_userdata" transfer-ownership="none">
            <doc xml:whitespace="preserve">data to pass to @destroyer</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </constructor>
      <method name="append" c:identifier="rb_history_append">
        <doc xml:whitespace="preserve">Adds a new entry to the end of the history list.
If a size limit is set, an entry may be removed from the start to
keep the history list within the limit.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry to append</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="clear" c:identifier="rb_history_clear">
        <doc xml:whitespace="preserve">Empties the history list.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="contains_entry" c:identifier="rb_history_contains_entry">
        <doc xml:whitespace="preserve">Returns %TRUE if the entry is present in the history list.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if found</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry to check for</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="current" c:identifier="rb_history_current">
        <doc xml:whitespace="preserve">Returns the current #RhythmDBEntry, or NULL if there is no current position</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">current entry or NULL</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
      </method>
      <method name="dump" c:identifier="rb_history_dump">
        <doc xml:whitespace="preserve">Constructs a copy of the whole history in order. Caller must free the result.
The caller does not own any references on the entries in the returned array.
Takes O(Nlog(N)) time.</doc>
        <return-value transfer-ownership="container">
          <doc xml:whitespace="preserve">a copy of the history list</doc>
          <array name="GLib.PtrArray" c:type="GPtrArray*">
            <type name="RhythmDBEntry"/>
          </array>
        </return-value>
      </method>
      <method name="first" c:identifier="rb_history_first">
        <doc xml:whitespace="preserve">Returns the first entry in the history.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">first entry</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
      </method>
      <method name="get_current_index"
              c:identifier="rb_history_get_current_index">
        <doc xml:whitespace="preserve">Gets the index of the current entry. This is guaranteed to be &lt; the
history's size, so if the history is empty, it returns -1.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">index of the current entry</doc>
          <type name="gint" c:type="gint"/>
        </return-value>
      </method>
      <method name="go_first" c:identifier="rb_history_go_first">
        <doc xml:whitespace="preserve">Moves the current position to the first entry in the history</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="go_last" c:identifier="rb_history_go_last">
        <doc xml:whitespace="preserve">Moves the current position to the last entry in the history</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="go_next" c:identifier="rb_history_go_next">
        <doc xml:whitespace="preserve">Moves the current position to the next entry.  If the current position is
already at the end of the history, nothing happens.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="go_previous" c:identifier="rb_history_go_previous">
        <doc xml:whitespace="preserve">Moves the current position to the previous entry.  If the current position is
already at the start of the history, nothing happens.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="insert_at_index" c:identifier="rb_history_insert_at_index">
        <doc xml:whitespace="preserve">Inserts @entry at @index within the history list. 0&lt;=@index&lt;=size</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry to insert</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="index" transfer-ownership="none">
            <doc xml:whitespace="preserve">position at which to insert @entry</doc>
            <type name="guint" c:type="guint"/>
          </parameter>
        </parameters>
      </method>
      <method name="last" c:identifier="rb_history_last">
        <doc xml:whitespace="preserve">Returns the last #RhythmDBEntry in the history</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">last entry</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
      </method>
      <method name="length" c:identifier="rb_history_length">
        <doc xml:whitespace="preserve">Returns the number of entries in the history.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">number of entries</doc>
          <type name="guint" c:type="guint"/>
        </return-value>
      </method>
      <method name="next" c:identifier="rb_history_next">
        <doc xml:whitespace="preserve">Returns the #RhythmDBEntry after the current position</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">next entry</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
      </method>
      <method name="previous" c:identifier="rb_history_previous">
        <doc xml:whitespace="preserve">Returns the #RhythmDBEntry before the current position.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">previous entry</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
      </method>
      <method name="remove_entry" c:identifier="rb_history_remove_entry">
        <doc xml:whitespace="preserve">Removes the specified entry from the history list.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry to remove</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_destroy_notify"
              c:identifier="rb_history_set_destroy_notify">
        <doc xml:whitespace="preserve">Sets a new function to call when removing entries from the history.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="destroyer"
                     transfer-ownership="none"
                     scope="async"
                     closure="1">
            <doc xml:whitespace="preserve">function to call when removing an entry from the history</doc>
            <type name="GLib.Func" c:type="GFunc"/>
          </parameter>
          <parameter name="destroy_userdata" transfer-ownership="none">
            <doc xml:whitespace="preserve">data to pass to @destroyer</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_maximum_size"
              c:identifier="rb_history_set_maximum_size">
        <doc xml:whitespace="preserve">Sets the maximum-size property</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="maximum_size" transfer-ownership="none">
            <doc xml:whitespace="preserve">new maximum size of the history (or 0 for no limit)</doc>
            <type name="guint" c:type="guint"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_playing" c:identifier="rb_history_set_playing">
        <doc xml:whitespace="preserve">Updates the current position to point to the specified entry.
If the truncate-on-play property is set, this will remove all entries
after that.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new playing #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_truncate_on_play"
              c:identifier="rb_history_set_truncate_on_play">
        <doc xml:whitespace="preserve">Sets the 'truncate-on-play' property.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="truncate_on_play" transfer-ownership="none">
            <doc xml:whitespace="preserve">Whether rb_history_set_playing() should truncate the history</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <property name="maximum-size" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">Maximum number of entries to store in the history.  If 0, no limit is applied.</doc>
        <type name="guint"/>
      </property>
      <property name="truncate-on-play"
                writable="1"
                construct="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">If set, rb_history_set_playing() truncates the rest of the history</doc>
        <type name="gboolean"/>
      </property>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="HistoryPrivate" c:type="RBHistoryPrivate*"/>
      </field>
    </class>
    <record name="HistoryClass"
            c:type="RBHistoryClass"
            glib:is-gtype-struct-for="History">
      <field name="parent_class">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
    </record>
    <record name="HistoryPrivate" c:type="RBHistoryPrivate" disguised="1">
    </record>
    <class name="LibraryBrowser"
           c:symbol-prefix="library_browser"
           c:type="RBLibraryBrowser"
           parent="Gtk.HBox"
           glib:type-name="RBLibraryBrowser"
           glib:get-type="rb_library_browser_get_type"
           glib:type-struct="LibraryBrowserClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <implements name="Gtk.Orientable"/>
      <constructor name="new" c:identifier="rb_library_browser_new">
        <doc xml:whitespace="preserve">Creates a new library browser.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">a new RBLibraryBrowser</doc>
          <type name="LibraryBrowser" c:type="RBLibraryBrowser*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDB instance</doc>
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="entry_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the entry type to use in the browser</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
        </parameters>
      </constructor>
      <method name="construct_query"
              c:identifier="rb_library_browser_construct_query">
        <doc xml:whitespace="preserve">Constructs a #RhythmDBQuery from the current selections in the browser.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">a #RhythmDBQuery constructed from the current selection.</doc>
          <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
        </return-value>
      </method>
      <method name="get_property_view"
              c:identifier="rb_library_browser_get_property_view">
        <doc xml:whitespace="preserve">Retrieves the property view widget for the specified property,
if there is one.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">#RBPropertyView widget, or NULL</doc>
          <type name="PropertyView" c:type="RBPropertyView*"/>
        </return-value>
        <parameters>
          <parameter name="type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the property</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_property_views"
              c:identifier="rb_library_browser_get_property_views">
        <doc xml:whitespace="preserve">Retrieves the property view widgets from the browser.

containing the #RBPropertyView widgets in the browser.</doc>
        <return-value transfer-ownership="container">
          <doc xml:whitespace="preserve">a #GList</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="PropertyView"/>
          </type>
        </return-value>
      </method>
      <method name="has_selection"
              c:identifier="rb_library_browser_has_selection">
        <doc xml:whitespace="preserve">Determines whether the browser has an active selection.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if any items in the browser are selected.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="reset" c:identifier="rb_library_browser_reset">
        <doc xml:whitespace="preserve">Clears all selections in the browser.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if anything was changed</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="set_model" c:identifier="rb_library_browser_set_model">
        <doc xml:whitespace="preserve">Specifies a new input query model for the browser.
This should be the query model constructed from the 
current search text, or the basic query model for the 
source if there is no search text.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="model" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new input #RhythmDBQueryModel</doc>
            <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
          </parameter>
          <parameter name="query_pending" transfer-ownership="none">
            <doc xml:whitespace="preserve">if TRUE, the caller promises to run a query to populate the input query model.</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_selection"
              c:identifier="rb_library_browser_set_selection">
        <doc xml:whitespace="preserve">Replaces any current selection for the specified property.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the property for which to set the selection</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
          <parameter name="selection" transfer-ownership="none">
            <doc xml:whitespace="preserve">a list of strings to select</doc>
            <type name="GLib.List" c:type="GList*">
              <type name="utf8"/>
            </type>
          </parameter>
        </parameters>
      </method>
      <property name="browser-views"
                writable="1"
                construct="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The set of browsers to display.</doc>
        <type name="utf8"/>
      </property>
      <property name="db"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">#RhythmDB instance</doc>
        <type name="RhythmDB"/>
      </property>
      <property name="entry-type"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The type of entries to use in the browser.</doc>
        <type name="RhythmDBEntryType"/>
      </property>
      <property name="input-model" transfer-ownership="none">
        <doc xml:whitespace="preserve">This #RhythmDBQueryModel defines the set of entries that
the browser filters.  This property is not writeable.
To set a new input query model, use 
#rb_library_browser_set_model.</doc>
        <type name="RhythmDBQueryModel"/>
      </property>
      <property name="output-model" transfer-ownership="none">
        <doc xml:whitespace="preserve">This #RhythmDBQueryModel contains the filtered set of
entries.  It is a subset of the entries contained in the
input model.  This should be used as the model backing
the source's entry view.

Sources using this widget should connect to the notify
signal for this property, updating their entry view when
it changes.</doc>
        <type name="RhythmDBQueryModel"/>
      </property>
      <field name="parent">
        <type name="Gtk.HBox" c:type="GtkHBox"/>
      </field>
    </class>
    <record name="LibraryBrowserClass"
            c:type="RBLibraryBrowserClass"
            glib:is-gtype-struct-for="LibraryBrowser">
      <field name="parent">
        <type name="Gtk.HBoxClass" c:type="GtkHBoxClass"/>
      </field>
    </record>
    <class name="MediaPlayerSource"
           c:symbol-prefix="media_player_source"
           c:type="RBMediaPlayerSource"
           parent="BrowserSource"
           glib:type-name="RBMediaPlayerSource"
           glib:get-type="rb_media_player_source_get_type"
           glib:type-struct="MediaPlayerSourceClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <implements name="Gtk.Orientable"/>
      <function name="init_actions"
                c:identifier="rb_media_player_source_init_actions">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <type name="Shell" c:type="RBShell*"/>
          </parameter>
        </parameters>
      </function>
      <virtual-method name="impl_add_playlist" introspectable="0">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <type name="utf8" c:type="gchar*"/>
          </parameter>
          <parameter name="entries" transfer-ownership="none">
            <type name="GLib.List" c:type="GList*">
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_delete_entries" introspectable="0">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entries" transfer-ownership="none">
            <type name="GLib.List" c:type="GList*">
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </parameter>
          <parameter name="callback"
                     transfer-ownership="none"
                     scope="notified"
                     closure="2"
                     destroy="3">
            <type name="MediaPlayerSourceDeleteCallback"
                  c:type="RBMediaPlayerSourceDeleteCallback"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="destroy_data"
                     transfer-ownership="none"
                     scope="async">
            <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_get_capacity">
        <return-value transfer-ownership="none">
          <type name="guint64" c:type="guint64"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_get_entries">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="category" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="map" transfer-ownership="none">
            <type name="GLib.HashTable" c:type="GHashTable*">
              <type name="gpointer" c:type="gpointer"/>
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_get_free_space">
        <return-value transfer-ownership="none">
          <type name="guint64" c:type="guint64"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_remove_playlists">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_show_properties">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="info_box" transfer-ownership="none">
            <type name="Gtk.Widget" c:type="GtkWidget*"/>
          </parameter>
          <parameter name="notebook" transfer-ownership="none">
            <type name="Gtk.Widget" c:type="GtkWidget*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="delete_entries"
              c:identifier="rb_media_player_source_delete_entries">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entries" transfer-ownership="full">
            <doc xml:whitespace="preserve">list of entries to delete</doc>
            <type name="GLib.List" c:type="GList*">
              <type name="RhythmDBEntry"/>
            </type>
          </parameter>
          <parameter name="callback"
                     transfer-ownership="none"
                     scope="notified"
                     closure="2"
                     destroy="3">
            <doc xml:whitespace="preserve">callback to call on completion</doc>
            <type name="MediaPlayerSourceDeleteCallback"
                  c:type="RBMediaPlayerSourceDeleteCallback"/>
          </parameter>
          <parameter name="user_data"
                     transfer-ownership="none"
                     scope="notified">
            <doc xml:whitespace="preserve">data for callback</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="destroy_data"
                     transfer-ownership="none"
                     scope="async">
            <doc xml:whitespace="preserve">callback to free the callback data</doc>
            <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_capacity"
              c:identifier="rb_media_player_source_get_capacity">
        <return-value transfer-ownership="none">
          <type name="guint64" c:type="guint64"/>
        </return-value>
      </method>
      <method name="get_entries"
              c:identifier="rb_media_player_source_get_entries">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="category" transfer-ownership="none">
            <doc xml:whitespace="preserve">the sync category name</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="entries" transfer-ownership="none">
            <doc xml:whitespace="preserve">map to hold the entries</doc>
            <type name="GLib.HashTable" c:type="GHashTable*">
              <type name="utf8"/>
              <type name="RhythmDBEntry"/>
            </type>
          </parameter>
        </parameters>
      </method>
      <method name="get_free_space"
              c:identifier="rb_media_player_source_get_free_space">
        <return-value transfer-ownership="none">
          <type name="guint64" c:type="guint64"/>
        </return-value>
      </method>
      <method name="load" c:identifier="rb_media_player_source_load">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="show_properties"
              c:identifier="rb_media_player_source_show_properties">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="sync" c:identifier="rb_media_player_source_sync">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <property name="encoding-target" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #GstEncodingTarget for this device</doc>
        <type name="GstPbutils.EncodingTarget"/>
      </property>
      <property name="serial" transfer-ownership="none">
        <type name="utf8"/>
      </property>
      <field name="parent_instance">
        <type name="BrowserSource" c:type="RBBrowserSource"/>
      </field>
    </class>
    <record name="MediaPlayerSourceClass"
            c:type="RBMediaPlayerSourceClass"
            glib:is-gtype-struct-for="MediaPlayerSource">
      <field name="parent_class">
        <type name="BrowserSourceClass" c:type="RBBrowserSourceClass"/>
      </field>
      <field name="impl_get_entries">
        <callback name="impl_get_entries">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="MediaPlayerSource" c:type="RBMediaPlayerSource*"/>
            </parameter>
            <parameter name="category" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="map" transfer-ownership="none">
              <type name="GLib.HashTable" c:type="GHashTable*">
                <type name="gpointer" c:type="gpointer"/>
                <type name="gpointer" c:type="gpointer"/>
              </type>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_get_capacity">
        <callback name="impl_get_capacity">
          <return-value transfer-ownership="none">
            <type name="guint64" c:type="guint64"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="MediaPlayerSource" c:type="RBMediaPlayerSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_get_free_space">
        <callback name="impl_get_free_space">
          <return-value transfer-ownership="none">
            <type name="guint64" c:type="guint64"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="MediaPlayerSource" c:type="RBMediaPlayerSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_delete_entries" introspectable="0">
        <callback name="impl_delete_entries" introspectable="0">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="MediaPlayerSource" c:type="RBMediaPlayerSource*"/>
            </parameter>
            <parameter name="entries" transfer-ownership="none">
              <type name="GLib.List" c:type="GList*">
                <type name="gpointer" c:type="gpointer"/>
              </type>
            </parameter>
            <parameter name="callback"
                       transfer-ownership="none"
                       scope="notified"
                       closure="3"
                       destroy="4">
              <type name="MediaPlayerSourceDeleteCallback"
                    c:type="RBMediaPlayerSourceDeleteCallback"/>
            </parameter>
            <parameter name="data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
            <parameter name="destroy_data"
                       transfer-ownership="none"
                       scope="async">
              <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_add_playlist" introspectable="0">
        <callback name="impl_add_playlist" introspectable="0">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="MediaPlayerSource" c:type="RBMediaPlayerSource*"/>
            </parameter>
            <parameter name="name" transfer-ownership="none">
              <type name="utf8" c:type="gchar*"/>
            </parameter>
            <parameter name="entries" transfer-ownership="none">
              <type name="GLib.List" c:type="GList*">
                <type name="gpointer" c:type="gpointer"/>
              </type>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_remove_playlists">
        <callback name="impl_remove_playlists">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="MediaPlayerSource" c:type="RBMediaPlayerSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_show_properties">
        <callback name="impl_show_properties">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="MediaPlayerSource" c:type="RBMediaPlayerSource*"/>
            </parameter>
            <parameter name="info_box" transfer-ownership="none">
              <type name="Gtk.Widget" c:type="GtkWidget*"/>
            </parameter>
            <parameter name="notebook" transfer-ownership="none">
              <type name="Gtk.Widget" c:type="GtkWidget*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <callback name="MediaPlayerSourceDeleteCallback"
              c:type="RBMediaPlayerSourceDeleteCallback">
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <type name="MediaPlayerSource" c:type="RBMediaPlayerSource*"/>
        </parameter>
        <parameter name="data" transfer-ownership="none">
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </callback>
    <class name="MetaData"
           c:symbol-prefix="metadata"
           c:type="RBMetaData"
           parent="GObject.Object"
           glib:type-name="RBMetaData"
           glib:get-type="rb_metadata_get_type"
           glib:type-struct="MetaDataClass">
      <constructor name="new" c:identifier="rb_metadata_new">
        <doc xml:whitespace="preserve">Creates a new metadata backend instance.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">new #RBMetaData instance</doc>
          <type name="MetaData" c:type="RBMetaData*"/>
        </return-value>
      </constructor>
      <function name="get_field_name"
                c:identifier="rb_metadata_get_field_name">
        <return-value transfer-ownership="none">
          <type name="utf8" c:type="char*"/>
        </return-value>
        <parameters>
          <parameter name="field" transfer-ownership="none">
            <type name="MetaDataField" c:type="RBMetaDataField"/>
          </parameter>
        </parameters>
      </function>
      <function name="get_field_type"
                c:identifier="rb_metadata_get_field_type">
        <return-value transfer-ownership="none">
          <type name="GType" c:type="GType"/>
        </return-value>
        <parameters>
          <parameter name="field" transfer-ownership="none">
            <type name="MetaDataField" c:type="RBMetaDataField"/>
          </parameter>
        </parameters>
      </function>
      <method name="can_save" c:identifier="rb_metadata_can_save">
        <doc xml:whitespace="preserve">Checks if the metadata writer is capable of updating file metadata
for a given media type.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the file metadata for the given media type can be updated</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="media_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the media type string to check</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get" c:identifier="rb_metadata_get">
        <doc xml:whitespace="preserve">Retrieves the value of a metadata field extracted from the target URI.
If the target URI contained no value for the field, returns FALSE.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if a value was returned</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="field" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBMetaDataField to retrieve</doc>
            <type name="MetaDataField" c:type="RBMetaDataField"/>
          </parameter>
          <parameter name="val"
                     direction="out"
                     caller-allocates="1"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns the field value</doc>
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_media_type" c:identifier="rb_metadata_get_media_type">
        <doc xml:whitespace="preserve">Returns the type of the file from which metadata was read.
This may look like a MIME type, but it isn't.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">media type string</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
      </method>
      <method name="get_missing_plugins"
              c:identifier="rb_metadata_get_missing_plugins">
        <doc xml:whitespace="preserve">This function returns the information used to request automatic
installation of media framework plugins required to decode the target URI.
Use g_strfreev() to free the returned information arrays.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if missing plugin information was returned</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="missing_plugins"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns machine-readable missing plugin information</doc>
            <array c:type="char***">
              <type name="utf8" c:type="char**"/>
            </array>
          </parameter>
          <parameter name="plugin_descriptions"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns human-readable missing plugin descriptions</doc>
            <array c:type="char***">
              <type name="utf8" c:type="char**"/>
            </array>
          </parameter>
        </parameters>
      </method>
      <method name="get_saveable_types"
              c:identifier="rb_metadata_get_saveable_types">
        <doc xml:whitespace="preserve">Constructs a list of the media types for which the metadata backend
implements tag saving.

array of media type strings.  Use g_strfreev to free it.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">a NULL-terminated</doc>
          <array c:type="char**">
            <type name="utf8"/>
          </array>
        </return-value>
      </method>
      <method name="has_audio" c:identifier="rb_metadata_has_audio">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="has_missing_plugins"
              c:identifier="rb_metadata_has_missing_plugins">
        <doc xml:whitespace="preserve">If the metadata reader could not decode the file it was asked to
because one or more media framework plugins (specifically, for the
existing implementations, GStreamer plugins) required are missing,
this will return TRUE.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if required plugins are missing</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="has_other_data" c:identifier="rb_metadata_has_other_data">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="has_video" c:identifier="rb_metadata_has_video">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="load" c:identifier="rb_metadata_load" throws="1">
        <doc xml:whitespace="preserve">Reads metadata information from the specified URI.
Once this has returned successfully (with *error == NULL),
rb_metadata_get, rb_metadata_get_media_type, rb_metadata_has_missing_plugins,
and rb_metadata_get_missing_plugins can usefully be called.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">URI from which to load metadata</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="reset" c:identifier="rb_metadata_reset">
        <doc xml:whitespace="preserve">Resets the state of the metadata interface.  Call this before
setting tags to be written to a file.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="save" c:identifier="rb_metadata_save" throws="1">
        <doc xml:whitespace="preserve">Saves all metadata changes made with rb_metadata_set to the
target URI.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the target URI</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set" c:identifier="rb_metadata_set">
        <doc xml:whitespace="preserve">Sets a metadata field value.  The value is only stored inside the
#RBMetaData object until rb_metadata_save is called.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the field is valid</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="field" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBMetaDataField to set</doc>
            <type name="MetaDataField" c:type="RBMetaDataField"/>
          </parameter>
          <parameter name="val" transfer-ownership="none">
            <doc xml:whitespace="preserve">the value to set</doc>
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </method>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="MetaDataPrivate" c:type="RBMetaDataPrivate*"/>
      </field>
    </class>
    <record name="MetaDataClass"
            c:type="RBMetaDataClass"
            glib:is-gtype-struct-for="MetaData">
      <field name="parent_class">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
    </record>
    <enumeration name="MetaDataError" c:type="RBMetaDataError">
      <member name="io" value="0" c:identifier="RB_METADATA_ERROR_IO"/>
      <member name="missing_plugin"
              value="1"
              c:identifier="RB_METADATA_ERROR_MISSING_PLUGIN"/>
      <member name="unrecognized"
              value="2"
              c:identifier="RB_METADATA_ERROR_UNRECOGNIZED"/>
      <member name="unsupported"
              value="3"
              c:identifier="RB_METADATA_ERROR_UNSUPPORTED"/>
      <member name="general"
              value="4"
              c:identifier="RB_METADATA_ERROR_GENERAL"/>
      <member name="internal"
              value="5"
              c:identifier="RB_METADATA_ERROR_INTERNAL"/>
      <member name="empty_file"
              value="6"
              c:identifier="RB_METADATA_ERROR_EMPTY_FILE"/>
    </enumeration>
    <enumeration name="MetaDataField" c:type="RBMetaDataField">
      <member name="title" value="0" c:identifier="RB_METADATA_FIELD_TITLE"/>
      <member name="artist" value="1" c:identifier="RB_METADATA_FIELD_ARTIST"/>
      <member name="album" value="2" c:identifier="RB_METADATA_FIELD_ALBUM"/>
      <member name="date" value="3" c:identifier="RB_METADATA_FIELD_DATE"/>
      <member name="genre" value="4" c:identifier="RB_METADATA_FIELD_GENRE"/>
      <member name="comment"
              value="5"
              c:identifier="RB_METADATA_FIELD_COMMENT"/>
      <member name="track_number"
              value="6"
              c:identifier="RB_METADATA_FIELD_TRACK_NUMBER"/>
      <member name="max_track_number"
              value="7"
              c:identifier="RB_METADATA_FIELD_MAX_TRACK_NUMBER"/>
      <member name="disc_number"
              value="8"
              c:identifier="RB_METADATA_FIELD_DISC_NUMBER"/>
      <member name="max_disc_number"
              value="9"
              c:identifier="RB_METADATA_FIELD_MAX_DISC_NUMBER"/>
      <member name="description"
              value="10"
              c:identifier="RB_METADATA_FIELD_DESCRIPTION"/>
      <member name="version"
              value="11"
              c:identifier="RB_METADATA_FIELD_VERSION"/>
      <member name="isrc" value="12" c:identifier="RB_METADATA_FIELD_ISRC"/>
      <member name="organization"
              value="13"
              c:identifier="RB_METADATA_FIELD_ORGANIZATION"/>
      <member name="copyright"
              value="14"
              c:identifier="RB_METADATA_FIELD_COPYRIGHT"/>
      <member name="contact"
              value="15"
              c:identifier="RB_METADATA_FIELD_CONTACT"/>
      <member name="license"
              value="16"
              c:identifier="RB_METADATA_FIELD_LICENSE"/>
      <member name="performer"
              value="17"
              c:identifier="RB_METADATA_FIELD_PERFORMER"/>
      <member name="duration"
              value="18"
              c:identifier="RB_METADATA_FIELD_DURATION"/>
      <member name="codec" value="19" c:identifier="RB_METADATA_FIELD_CODEC"/>
      <member name="bitrate"
              value="20"
              c:identifier="RB_METADATA_FIELD_BITRATE"/>
      <member name="track_gain"
              value="21"
              c:identifier="RB_METADATA_FIELD_TRACK_GAIN"/>
      <member name="track_peak"
              value="22"
              c:identifier="RB_METADATA_FIELD_TRACK_PEAK"/>
      <member name="album_gain"
              value="23"
              c:identifier="RB_METADATA_FIELD_ALBUM_GAIN"/>
      <member name="album_peak"
              value="24"
              c:identifier="RB_METADATA_FIELD_ALBUM_PEAK"/>
      <member name="language_code"
              value="25"
              c:identifier="RB_METADATA_FIELD_LANGUAGE_CODE"/>
      <member name="bpm" value="26" c:identifier="RB_METADATA_FIELD_BPM"/>
      <member name="musicbrainz_trackid"
              value="27"
              c:identifier="RB_METADATA_FIELD_MUSICBRAINZ_TRACKID"/>
      <member name="musicbrainz_artistid"
              value="28"
              c:identifier="RB_METADATA_FIELD_MUSICBRAINZ_ARTISTID"/>
      <member name="musicbrainz_albumid"
              value="29"
              c:identifier="RB_METADATA_FIELD_MUSICBRAINZ_ALBUMID"/>
      <member name="musicbrainz_albumartistid"
              value="30"
              c:identifier="RB_METADATA_FIELD_MUSICBRAINZ_ALBUMARTISTID"/>
      <member name="artist_sortname"
              value="31"
              c:identifier="RB_METADATA_FIELD_ARTIST_SORTNAME"/>
      <member name="album_sortname"
              value="32"
              c:identifier="RB_METADATA_FIELD_ALBUM_SORTNAME"/>
      <member name="album_artist"
              value="33"
              c:identifier="RB_METADATA_FIELD_ALBUM_ARTIST"/>
      <member name="album_artist_sortname"
              value="34"
              c:identifier="RB_METADATA_FIELD_ALBUM_ARTIST_SORTNAME"/>
      <member name="last" value="35" c:identifier="RB_METADATA_FIELD_LAST"/>
    </enumeration>
    <record name="MetaDataPrivate" c:type="RBMetaDataPrivate" disguised="1">
    </record>
    <enumeration name="MetadataErrorType"
                 glib:type-name="RBMetadataErrorType"
                 glib:get-type="rb_metadata_error_get_type"
                 c:type="RBMetadataErrorType">
      <member name="io_error"
              value="0"
              c:identifier="RB_METADATA_ERROR_IO"
              glib:nick="io-error"/>
      <member name="missing_plugins"
              value="1"
              c:identifier="RB_METADATA_ERROR_MISSING_PLUGIN"
              glib:nick="missing-plugins"/>
      <member name="identify_failed"
              value="2"
              c:identifier="RB_METADATA_ERROR_UNRECOGNIZED"
              glib:nick="identify-failed"/>
      <member name="unsupported_filetype"
              value="3"
              c:identifier="RB_METADATA_ERROR_UNSUPPORTED"
              glib:nick="unsupported-filetype"/>
      <member name="general_error"
              value="4"
              c:identifier="RB_METADATA_ERROR_GENERAL"
              glib:nick="general-error"/>
      <member name="internal_error"
              value="5"
              c:identifier="RB_METADATA_ERROR_INTERNAL"
              glib:nick="internal-error"/>
      <member name="empty_file"
              value="6"
              c:identifier="RB_METADATA_ERROR_EMPTY_FILE"
              glib:nick="empty-file"/>
      <function name="quark" c:identifier="rb_metadata_error_quark">
        <return-value transfer-ownership="none">
          <type name="GLib.Quark" c:type="GQuark"/>
        </return-value>
      </function>
    </enumeration>
    <enumeration name="MetadataFieldType"
                 glib:type-name="RBMetadataFieldType"
                 glib:get-type="rb_metadata_field_get_type"
                 c:type="RBMetadataFieldType">
      <member name="title"
              value="0"
              c:identifier="RB_METADATA_FIELD_TITLE"
              glib:nick="title"/>
      <member name="artist"
              value="1"
              c:identifier="RB_METADATA_FIELD_ARTIST"
              glib:nick="artist"/>
      <member name="album"
              value="2"
              c:identifier="RB_METADATA_FIELD_ALBUM"
              glib:nick="album"/>
      <member name="date"
              value="3"
              c:identifier="RB_METADATA_FIELD_DATE"
              glib:nick="date"/>
      <member name="genre"
              value="4"
              c:identifier="RB_METADATA_FIELD_GENRE"
              glib:nick="genre"/>
      <member name="comment"
              value="5"
              c:identifier="RB_METADATA_FIELD_COMMENT"
              glib:nick="comment"/>
      <member name="track_number"
              value="6"
              c:identifier="RB_METADATA_FIELD_TRACK_NUMBER"
              glib:nick="track-number"/>
      <member name="track_count"
              value="7"
              c:identifier="RB_METADATA_FIELD_MAX_TRACK_NUMBER"
              glib:nick="track-count"/>
      <member name="album_disc_number"
              value="8"
              c:identifier="RB_METADATA_FIELD_DISC_NUMBER"
              glib:nick="album-disc-number"/>
      <member name="album_disc_count"
              value="9"
              c:identifier="RB_METADATA_FIELD_MAX_DISC_NUMBER"
              glib:nick="album-disc-count"/>
      <member name="description"
              value="10"
              c:identifier="RB_METADATA_FIELD_DESCRIPTION"
              glib:nick="description"/>
      <member name="version"
              value="11"
              c:identifier="RB_METADATA_FIELD_VERSION"
              glib:nick="version"/>
      <member name="isrc"
              value="12"
              c:identifier="RB_METADATA_FIELD_ISRC"
              glib:nick="isrc"/>
      <member name="organization"
              value="13"
              c:identifier="RB_METADATA_FIELD_ORGANIZATION"
              glib:nick="organization"/>
      <member name="copyright"
              value="14"
              c:identifier="RB_METADATA_FIELD_COPYRIGHT"
              glib:nick="copyright"/>
      <member name="contact"
              value="15"
              c:identifier="RB_METADATA_FIELD_CONTACT"
              glib:nick="contact"/>
      <member name="license"
              value="16"
              c:identifier="RB_METADATA_FIELD_LICENSE"
              glib:nick="license"/>
      <member name="performer"
              value="17"
              c:identifier="RB_METADATA_FIELD_PERFORMER"
              glib:nick="performer"/>
      <member name="duration"
              value="18"
              c:identifier="RB_METADATA_FIELD_DURATION"
              glib:nick="duration"/>
      <member name="codec"
              value="19"
              c:identifier="RB_METADATA_FIELD_CODEC"
              glib:nick="codec"/>
      <member name="bitrate"
              value="20"
              c:identifier="RB_METADATA_FIELD_BITRATE"
              glib:nick="bitrate"/>
      <member name="replaygain_track_gain"
              value="21"
              c:identifier="RB_METADATA_FIELD_TRACK_GAIN"
              glib:nick="replaygain-track-gain"/>
      <member name="replaygain_track_peak"
              value="22"
              c:identifier="RB_METADATA_FIELD_TRACK_PEAK"
              glib:nick="replaygain-track-peak"/>
      <member name="replaygain_album_gain"
              value="23"
              c:identifier="RB_METADATA_FIELD_ALBUM_GAIN"
              glib:nick="replaygain-album-gain"/>
      <member name="replaygain_album_peak"
              value="24"
              c:identifier="RB_METADATA_FIELD_ALBUM_PEAK"
              glib:nick="replaygain-album-peak"/>
      <member name="beats_per_minute"
              value="26"
              c:identifier="RB_METADATA_FIELD_BPM"
              glib:nick="beats-per-minute"/>
      <member name="language_code"
              value="25"
              c:identifier="RB_METADATA_FIELD_LANGUAGE_CODE"
              glib:nick="language-code"/>
      <member name="musicbrainz_trackid"
              value="27"
              c:identifier="RB_METADATA_FIELD_MUSICBRAINZ_TRACKID"
              glib:nick="musicbrainz-trackid"/>
      <member name="musicbrainz_artistid"
              value="28"
              c:identifier="RB_METADATA_FIELD_MUSICBRAINZ_ARTISTID"
              glib:nick="musicbrainz-artistid"/>
      <member name="musicbrainz_albumid"
              value="29"
              c:identifier="RB_METADATA_FIELD_MUSICBRAINZ_ALBUMID"
              glib:nick="musicbrainz-albumid"/>
      <member name="musicbrainz_albumartistid"
              value="30"
              c:identifier="RB_METADATA_FIELD_MUSICBRAINZ_ALBUMARTISTID"
              glib:nick="musicbrainz-albumartistid"/>
      <member name="musicbrainz_sortname"
              value="31"
              c:identifier="RB_METADATA_FIELD_ARTIST_SORTNAME"
              glib:nick="musicbrainz-sortname"/>
      <member name="album_sortname"
              value="32"
              c:identifier="RB_METADATA_FIELD_ALBUM_SORTNAME"
              glib:nick="album-sortname"/>
      <member name="album_artist"
              value="33"
              c:identifier="RB_METADATA_FIELD_ALBUM_ARTIST"
              glib:nick="album-artist"/>
      <member name="album_artist_sortname"
              value="34"
              c:identifier="RB_METADATA_FIELD_ALBUM_ARTIST_SORTNAME"
              glib:nick="album-artist-sortname"/>
    </enumeration>
    <constant name="PLAYER_SECOND" value="0" c:type="RB_PLAYER_SECOND">
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="PLAYLIST_XML_VERSION"
              value="1.0"
              c:type="RB_PLAYLIST_XML_VERSION">
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="PROFILE_INDENTATION"
              value="4"
              c:type="RB_PROFILE_INDENTATION">
      <type name="gint" c:type="gint"/>
    </constant>
    <class name="PlayOrder"
           c:symbol-prefix="play_order"
           c:type="RBPlayOrder"
           parent="GObject.Object"
           glib:type-name="RBPlayOrder"
           glib:get-type="rb_play_order_get_type"
           glib:type-struct="PlayOrderClass">
      <virtual-method name="db_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="new_db" transfer-ownership="none">
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="db_entry_deleted">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_added">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_removed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="get_next" invoker="get_next">
        <doc xml:whitespace="preserve">Returns the next entry in the play order, or the first if not currently playing.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">next entry to play</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
      </virtual-method>
      <virtual-method name="get_previous" invoker="get_previous">
        <doc xml:whitespace="preserve">Returns the previous entry in the play order, or NULL if not currently playing.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">previous entry</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
      </virtual-method>
      <virtual-method name="go_next" invoker="go_next">
        <doc xml:whitespace="preserve">Moves to the next entry in the play order.  If not currently playing, sets the
first entry in the play order as the playing entry.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="go_previous" invoker="go_previous">
        <doc xml:whitespace="preserve">Moves to the previous entry in the play order.  If not currently playing, does nothing.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="has_next" invoker="has_next">
        <doc xml:whitespace="preserve">If there is no current playing entry, returns true if the play order is non-empty.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">true if there is an entry after the current playing entry in the play order.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="has_previous" invoker="has_previous">
        <doc xml:whitespace="preserve">Returns %TRUE if there is an entry before the current entry in the play order.
If not currently playing, returns %FALSE.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if previous entry exists</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="have_next_previous_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="have_next" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
          <parameter name="have_previous" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="playing_entry_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="old_entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="new_entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="playing_entry_removed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="playing_source_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="query_model_changed" invoker="query_model_changed">
        <doc xml:whitespace="preserve">Updates the #RhythmDBQueryModel instance for the play order.
Called from the #RBSource notify signal handler, and also from
#rb_play_order_source_changed.  Subclasses should implement
query_model_changed() to make any necessary adjustments if they
store any state based on the contents of the #RhythmDBQueryModel.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <method name="get_db" c:identifier="rb_play_order_get_db">
        <doc xml:whitespace="preserve">Only for use by #RBPlayOrder subclasses.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the #RhythmDB instance.</doc>
          <type name="RhythmDB" c:type="RhythmDB*"/>
        </return-value>
      </method>
      <method name="get_next" c:identifier="rb_play_order_get_next">
        <doc xml:whitespace="preserve">Returns the next entry in the play order, or the first if not currently playing.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">next entry to play</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
      </method>
      <method name="get_player" c:identifier="rb_play_order_get_player">
        <doc xml:whitespace="preserve">Only for use by #RBPlayOrder subclasses.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">#RBShellPlayer instance</doc>
          <type name="ShellPlayer" c:type="RBShellPlayer*"/>
        </return-value>
      </method>
      <method name="get_playing_entry"
              c:identifier="rb_play_order_get_playing_entry">
        <doc xml:whitespace="preserve">Returns the current playing entry in the play order.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">(transfer full) playing entry</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
      </method>
      <method name="get_previous" c:identifier="rb_play_order_get_previous">
        <doc xml:whitespace="preserve">Returns the previous entry in the play order, or NULL if not currently playing.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">previous entry</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
      </method>
      <method name="get_query_model"
              c:identifier="rb_play_order_get_query_model">
        <doc xml:whitespace="preserve">Only for use by #RBPlayOrder subclasses.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the active #RhythmDBQueryModel for the playing source.</doc>
          <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
        </return-value>
      </method>
      <method name="get_source" c:identifier="rb_play_order_get_source">
        <doc xml:whitespace="preserve">Only for use by #RBPlayOrder subclasses.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the playing #RBSource instance.</doc>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
      </method>
      <method name="go_next" c:identifier="rb_play_order_go_next">
        <doc xml:whitespace="preserve">Moves to the next entry in the play order.  If not currently playing, sets the
first entry in the play order as the playing entry.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="go_previous" c:identifier="rb_play_order_go_previous">
        <doc xml:whitespace="preserve">Moves to the previous entry in the play order.  If not currently playing, does nothing.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="has_next" c:identifier="rb_play_order_has_next">
        <doc xml:whitespace="preserve">If there is no current playing entry, returns true if the play order is non-empty.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">true if there is an entry after the current playing entry in the play order.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="has_previous" c:identifier="rb_play_order_has_previous">
        <doc xml:whitespace="preserve">Returns %TRUE if there is an entry before the current entry in the play order.
If not currently playing, returns %FALSE.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if previous entry exists</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="model_not_empty"
              c:identifier="rb_play_order_model_not_empty">
        <doc xml:whitespace="preserve">Returns %TRUE if the #RhythmDBQueryModel is not empty.
Can be used to implement has_next and has_previous for play orders
that have no beginning or end.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if not empty</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="player_is_playing"
              c:identifier="rb_play_order_player_is_playing">
        <doc xml:whitespace="preserve">Returns %TRUE if there is a current playing entry in the play order.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if playing</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="playing_source_changed"
              c:identifier="rb_play_order_playing_source_changed">
        <doc xml:whitespace="preserve">Sets the playing #RBSource for the play order.  Should be called
by #RBShellPlayer when the active source changes.  Subclasses
should implement playing_source_changed() to make any necessary
changes.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">New playing #RBSource</doc>
            <type name="Source" c:type="RBSource*"/>
          </parameter>
        </parameters>
      </method>
      <method name="query_model_changed"
              c:identifier="rb_play_order_query_model_changed">
        <doc xml:whitespace="preserve">Updates the #RhythmDBQueryModel instance for the play order.
Called from the #RBSource notify signal handler, and also from
#rb_play_order_source_changed.  Subclasses should implement
query_model_changed() to make any necessary adjustments if they
store any state based on the contents of the #RhythmDBQueryModel.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="set_playing_entry"
              c:identifier="rb_play_order_set_playing_entry">
        <doc xml:whitespace="preserve">Sets the playing entry in the play order.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none" allow-none="1">
            <doc xml:whitespace="preserve">The new playing entry (or NULL for none)</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <property name="player"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBShellPlayer instance</doc>
        <type name="ShellPlayer"/>
      </property>
      <property name="playing-entry" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The current playing #RhythmDBEntry</doc>
        <type name="RhythmDBEntry"/>
      </property>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="PlayOrderPrivate" c:type="RBPlayOrderPrivate*"/>
      </field>
      <glib:signal name="have-next-previous-changed" when="last">
        <doc xml:whitespace="preserve">Emitted as a hint to suggest that the sensitivity of next/previous
buttons may need to be updated.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="have_next" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %TRUE, the play order has at least one more entry</doc>
            <type name="gboolean"/>
          </parameter>
          <parameter name="have_previous" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %TRUE, the play order has at least one entry before the current entry</doc>
            <type name="gboolean"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="PlayOrderClass"
            c:type="RBPlayOrderClass"
            glib:is-gtype-struct-for="PlayOrder">
      <field name="parent_class">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="playing_source_changed">
        <callback name="playing_source_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="db_changed">
        <callback name="db_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
            <parameter name="new_db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="playing_entry_changed">
        <callback name="playing_entry_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
            <parameter name="old_entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="new_entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entry_added">
        <callback name="entry_added">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entry_removed">
        <callback name="entry_removed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="query_model_changed">
        <callback name="query_model_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="db_entry_deleted">
        <callback name="db_entry_deleted">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="playing_entry_removed">
        <callback name="playing_entry_removed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="has_next">
        <callback name="has_next">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">true if there is an entry after the current playing entry in the play order.</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="get_next">
        <callback name="get_next">
          <return-value transfer-ownership="full">
            <doc xml:whitespace="preserve">next entry to play</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="go_next">
        <callback name="go_next">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="has_previous">
        <callback name="has_previous">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">%TRUE if previous entry exists</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="get_previous">
        <callback name="get_previous">
          <return-value transfer-ownership="full">
            <doc xml:whitespace="preserve">previous entry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="go_previous">
        <callback name="go_previous">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="have_next_previous_changed">
        <callback name="have_next_previous_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="porder" transfer-ownership="none">
              <type name="PlayOrder" c:type="RBPlayOrder*"/>
            </parameter>
            <parameter name="have_next" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean"/>
            </parameter>
            <parameter name="have_previous" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="PlayOrderPrivate" c:type="RBPlayOrderPrivate" disguised="1">
    </record>
    <callback name="PlayOrderQueryFunc" c:type="RBPlayOrderQueryFunc">
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="porder" transfer-ownership="none">
          <type name="PlayOrder" c:type="RBPlayOrder*"/>
        </parameter>
      </parameters>
    </callback>
    <interface name="Player"
               c:symbol-prefix="player"
               c:type="RBPlayer"
               glib:type-name="RBPlayer"
               glib:get-type="rb_player_get_type"
               glib:type-struct="PlayerIface">
      <function name="new" c:identifier="rb_player_new" throws="1">
        <doc xml:whitespace="preserve">Creates a new player object.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">new player object.</doc>
          <type name="Player" c:type="RBPlayer*"/>
        </return-value>
        <parameters>
          <parameter name="want_crossfade" transfer-ownership="none">
            <doc xml:whitespace="preserve">if TRUE, try to use a backend that supports crossfading and other track transitions.</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </function>
      <virtual-method name="buffering">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="progress" transfer-ownership="none">
            <type name="guint" c:type="guint"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="close" invoker="close" throws="1">
        <doc xml:whitespace="preserve">If a URI is specified, this will close the stream corresponding
to that URI and free any resources related resources.  If @uri
is NULL, this will close all streams.

If no streams remain open after this call, the audio device will
be released.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if a stream was found and closed</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="eos">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="early" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="error">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="error" transfer-ownership="none">
            <type name="GLib.Error" c:type="GError*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="event">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="get_time" invoker="get_time">
        <doc xml:whitespace="preserve">Returns the current playback for the current stream in nanoseconds.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">playback position</doc>
          <type name="gint64" c:type="gint64"/>
        </return-value>
      </virtual-method>
      <virtual-method name="get_volume" invoker="get_volume">
        <doc xml:whitespace="preserve">Returns the current volume level, between 0.0 and 1.0.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">current output volume level</doc>
          <type name="gfloat" c:type="float"/>
        </return-value>
      </virtual-method>
      <virtual-method name="image">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="image" transfer-ownership="none">
            <type name="GdkPixbuf.Pixbuf" c:type="GdkPixbuf*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="info">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="field" transfer-ownership="none">
            <type name="MetaDataField" c:type="RBMetaDataField"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="multiple_open" invoker="multiple_open">
        <doc xml:whitespace="preserve">Determines whether the player supports multiple open streams.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if multiple open is supported</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="open" invoker="open" throws="1">
        <doc xml:whitespace="preserve">Prepares a stream for playback.  Depending on the player
implementation, this may stop any existing stream being
played.  The stream preparation process may continue
asynchronously, in which case errors may be reported from
#rb_player_play or using the 'error' signal.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the stream preparation was not unsuccessful</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="stream_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">arbitrary data to associate with the stream</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="stream_data_destroy"
                     transfer-ownership="none"
                     scope="async">
            <doc xml:whitespace="preserve">function to call to destroy the stream data</doc>
            <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="opened" invoker="opened">
        <doc xml:whitespace="preserve">Determines whether a stream has been prepared for playback.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if a stream is prepared for playback</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="pause" invoker="pause">
        <doc xml:whitespace="preserve">Pauses playback of the most recently started stream.  Any
streams being faded out may continue until the fade is
complete.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="play" invoker="play" throws="1">
        <doc xml:whitespace="preserve">Starts playback of the most recently opened stream.
if @play_type is #RB_PLAYER_PLAY_CROSSFADE, the player
may attempt to crossfade the new stream with any existing
streams.  If it does this, the it will use @crossfade as the
duration of the fade.

If @play_type is #RB_PLAYER_PLAY_AFTER_EOS, the player may
attempt to start the stream immediately after the current
playing stream reaches EOS.  This may or may not result in
the phenomemon known as 'gapless playback'.

If @play_type is #RB_PLAYER_PLAY_REPLACE, the player will stop any
existing stream before starting the new stream. It may do
this anyway, regardless of the value of @play_type.

The 'playing-stream' signal will be emitted when the new stream
is actually playing. This may be before or after control returns
to the caller.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if playback started successfully</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="play_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">requested playback start type</doc>
            <type name="PlayerPlayType" c:type="RBPlayerPlayType"/>
          </parameter>
          <parameter name="crossfade" transfer-ownership="none">
            <type name="gint64" c:type="gint64"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="playing" invoker="playing">
        <doc xml:whitespace="preserve">Determines whether the player is currently playing a stream.
A stream is playing if it's not paused or being faded out.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if playing</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="playing_stream">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="redirect">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="gchar*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="seekable" invoker="seekable">
        <doc xml:whitespace="preserve">Determines whether seeking is supported for the current stream.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the current stream is seekable</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="set_time" invoker="set_time">
        <doc xml:whitespace="preserve">Attempts to seek in the current stream.  The player
may ignore this if the stream is not seekable.
The seek may take place asynchronously.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="newtime" transfer-ownership="none">
            <type name="gint64" c:type="gint64"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="set_volume" invoker="set_volume">
        <doc xml:whitespace="preserve">Adjusts the output volume level.  This affects all streams.
The player may use a hardware volume control to implement
this volume adjustment.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="volume" transfer-ownership="none">
            <type name="gfloat" c:type="float"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="tick">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="elapsed" transfer-ownership="none">
            <type name="gint64" c:type="gint64"/>
          </parameter>
          <parameter name="duration" transfer-ownership="none">
            <type name="gint64" c:type="gint64"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="volume_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="volume" transfer-ownership="none">
            <type name="gfloat" c:type="float"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="close" c:identifier="rb_player_close" throws="1">
        <doc xml:whitespace="preserve">If a URI is specified, this will close the stream corresponding
to that URI and free any resources related resources.  If @uri
is NULL, this will close all streams.

If no streams remain open after this call, the audio device will
be released.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if a stream was found and closed</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_time" c:identifier="rb_player_get_time">
        <doc xml:whitespace="preserve">Returns the current playback for the current stream in nanoseconds.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">playback position</doc>
          <type name="gint64" c:type="gint64"/>
        </return-value>
      </method>
      <method name="get_volume" c:identifier="rb_player_get_volume">
        <doc xml:whitespace="preserve">Returns the current volume level, between 0.0 and 1.0.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">current output volume level</doc>
          <type name="gfloat" c:type="float"/>
        </return-value>
      </method>
      <method name="multiple_open" c:identifier="rb_player_multiple_open">
        <doc xml:whitespace="preserve">Determines whether the player supports multiple open streams.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if multiple open is supported</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="open" c:identifier="rb_player_open" throws="1">
        <doc xml:whitespace="preserve">Prepares a stream for playback.  Depending on the player
implementation, this may stop any existing stream being
played.  The stream preparation process may continue
asynchronously, in which case errors may be reported from
#rb_player_play or using the 'error' signal.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the stream preparation was not unsuccessful</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="stream_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">arbitrary data to associate with the stream</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="stream_data_destroy"
                     transfer-ownership="none"
                     scope="async">
            <doc xml:whitespace="preserve">function to call to destroy the stream data</doc>
            <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
          </parameter>
        </parameters>
      </method>
      <method name="opened" c:identifier="rb_player_opened">
        <doc xml:whitespace="preserve">Determines whether a stream has been prepared for playback.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if a stream is prepared for playback</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="pause" c:identifier="rb_player_pause">
        <doc xml:whitespace="preserve">Pauses playback of the most recently started stream.  Any
streams being faded out may continue until the fade is
complete.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="play" c:identifier="rb_player_play" throws="1">
        <doc xml:whitespace="preserve">Starts playback of the most recently opened stream.
if @play_type is #RB_PLAYER_PLAY_CROSSFADE, the player
may attempt to crossfade the new stream with any existing
streams.  If it does this, the it will use @crossfade as the
duration of the fade.

If @play_type is #RB_PLAYER_PLAY_AFTER_EOS, the player may
attempt to start the stream immediately after the current
playing stream reaches EOS.  This may or may not result in
the phenomemon known as 'gapless playback'.

If @play_type is #RB_PLAYER_PLAY_REPLACE, the player will stop any
existing stream before starting the new stream. It may do
this anyway, regardless of the value of @play_type.

The 'playing-stream' signal will be emitted when the new stream
is actually playing. This may be before or after control returns
to the caller.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if playback started successfully</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="play_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">requested playback start type</doc>
            <type name="PlayerPlayType" c:type="RBPlayerPlayType"/>
          </parameter>
          <parameter name="crossfade" transfer-ownership="none">
            <type name="gint64" c:type="gint64"/>
          </parameter>
        </parameters>
      </method>
      <method name="playing" c:identifier="rb_player_playing">
        <doc xml:whitespace="preserve">Determines whether the player is currently playing a stream.
A stream is playing if it's not paused or being faded out.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if playing</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="seekable" c:identifier="rb_player_seekable">
        <doc xml:whitespace="preserve">Determines whether seeking is supported for the current stream.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the current stream is seekable</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="set_time" c:identifier="rb_player_set_time">
        <doc xml:whitespace="preserve">Attempts to seek in the current stream.  The player
may ignore this if the stream is not seekable.
The seek may take place asynchronously.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="newtime" transfer-ownership="none">
            <type name="gint64" c:type="gint64"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_volume" c:identifier="rb_player_set_volume">
        <doc xml:whitespace="preserve">Adjusts the output volume level.  This affects all streams.
The player may use a hardware volume control to implement
this volume adjustment.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="volume" transfer-ownership="none">
            <type name="gfloat" c:type="float"/>
          </parameter>
        </parameters>
      </method>
      <glib:signal name="buffering" when="last">
        <doc xml:whitespace="preserve">The 'buffering' signal is emitted while a stream is paused so
that a buffer can be filled.  The progress value typically varies
from 0 to 100, and once it reaches 100, playback resumes.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">the data associated with the buffering stream</doc>
            <type name="gpointer"/>
          </parameter>
          <parameter name="progress" transfer-ownership="none">
            <doc xml:whitespace="preserve">buffering percentage</doc>
            <type name="guint"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="eos" when="last" no-recurse="1">
        <doc xml:whitespace="preserve">The 'eos' signal is emitted when a stream finishes, or in some cases, when it
is about to finish (with @early set to %TRUE) to allow for a new track to be
played immediately afterwards.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">the data associated with the stream that finished</doc>
            <type name="gpointer"/>
          </parameter>
          <parameter name="early" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %TRUE, the EOS notification should only be used for track changes.</doc>
            <type name="gboolean"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="error" when="last" no-recurse="1">
        <doc xml:whitespace="preserve">The 'error' signal is emitted when an error is encountered
while opening or playing a stream.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">the data associated with the stream</doc>
            <type name="gpointer"/>
          </parameter>
          <parameter name="error" transfer-ownership="none">
            <doc xml:whitespace="preserve">description of the error</doc>
            <type name="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="event" when="last" detailed="1">
        <doc xml:whitespace="preserve">The 'event' signal provides a means for custom GStreamer
elements to communicate events back to the rest of the
application.  The GStreamer element posts an application
message on the GStreamer bus, which is translated into an
event signal with the detail of the signal set to the name
of the structure found in the message.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">data associated with the stream</doc>
            <type name="gpointer"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">event data</doc>
            <type name="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="image" when="last">
        <doc xml:whitespace="preserve">The 'image' signal is emitted to provide access to images extracted
from the stream.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">data associated with the stream</doc>
            <type name="gpointer"/>
          </parameter>
          <parameter name="image" transfer-ownership="none">
            <doc xml:whitespace="preserve">the image extracted from the stream</doc>
            <type name="GdkPixbuf.Pixbuf"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="info" when="last">
        <doc xml:whitespace="preserve">The 'info' signal is emitted when a metadata value is found in
the stream.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">the data associated with the stream</doc>
            <type name="gpointer"/>
          </parameter>
          <parameter name="field" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBMetaDataField corresponding to the stream info</doc>
            <type name="gint"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <doc xml:whitespace="preserve">the value of the stream info field</doc>
            <type name="GObject.Value"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="playing-stream" when="last">
        <doc xml:whitespace="preserve">The 'playing-stream' signal is emitted when the main playing stream
changes. It should be used to update the UI to show the new
stream. It can either be emitted before or after #rb_player_play returns,
depending on the player backend.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">data associated with the stream</doc>
            <type name="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="redirect" when="last">
        <doc xml:whitespace="preserve">The 'redirect' signal is emitted to indicate when a stream has change URI.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">data associated with the stream</doc>
            <type name="gpointer"/>
          </parameter>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">URI to redirect to</doc>
            <type name="utf8"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="tick" when="last">
        <doc xml:whitespace="preserve">The 'tick' signal is emitted repeatedly while the stream is
playing. Signal handlers can use this to update UI and to
prepare new streams for crossfade or gapless playback.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="stream_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">the data associated with the stream</doc>
            <type name="gpointer"/>
          </parameter>
          <parameter name="elapsed" transfer-ownership="none">
            <doc xml:whitespace="preserve">playback position in the stream (in nanoseconds)</doc>
            <type name="gint64"/>
          </parameter>
          <parameter name="duration" transfer-ownership="none">
            <doc xml:whitespace="preserve">current estimate of the duration of the stream (in nanoseconds)</doc>
            <type name="gint64"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="volume-changed" when="last">
        <doc xml:whitespace="preserve">The 'volume-changed' signal is emitted when the output stream volume is
changed externally.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="volume" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new volume level</doc>
            <type name="gfloat"/>
          </parameter>
        </parameters>
      </glib:signal>
    </interface>
    <enumeration name="PlayerError"
                 glib:type-name="RBPlayerError"
                 glib:get-type="rb_player_error_get_type"
                 c:type="RBPlayerError">
      <member name="no_audio"
              value="0"
              c:identifier="RB_PLAYER_ERROR_NO_AUDIO"
              glib:nick="no-audio"/>
      <member name="general_error"
              value="1"
              c:identifier="RB_PLAYER_ERROR_GENERAL"
              glib:nick="general-error"/>
      <member name="internal_error"
              value="2"
              c:identifier="RB_PLAYER_ERROR_INTERNAL"
              glib:nick="internal-error"/>
      <member name="not_found"
              value="3"
              c:identifier="RB_PLAYER_ERROR_NOT_FOUND"
              glib:nick="not-found"/>
      <function name="quark" c:identifier="rb_player_error_quark">
        <return-value transfer-ownership="none">
          <type name="GLib.Quark" c:type="GQuark"/>
        </return-value>
      </function>
    </enumeration>
    <callback name="PlayerFeatureFunc" c:type="RBPlayerFeatureFunc">
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="player" transfer-ownership="none">
          <type name="Player" c:type="RBPlayer*"/>
        </parameter>
      </parameters>
    </callback>
    <interface name="PlayerGstFilter"
               c:symbol-prefix="player_gst_filter"
               c:type="RBPlayerGstFilter"
               glib:type-name="RBPlayerGstFilter"
               glib:get-type="rb_player_gst_filter_get_type"
               glib:type-struct="PlayerGstFilterIface">
      <virtual-method name="add_filter" invoker="add_filter">
        <doc xml:whitespace="preserve">Adds a new filter to the playback pipeline.  The filter may not be
inserted immediately.  The 'filter-inserted' signal will be emitted
when this actually happens.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the filter will be added</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="element" transfer-ownership="none">
            <doc xml:whitespace="preserve">new filter element (or bin) to add</doc>
            <type name="Gst.Element" c:type="GstElement*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="filter_inserted">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="filter" transfer-ownership="none">
            <type name="Gst.Element" c:type="GstElement*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="filter_pre_remove">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="filter" transfer-ownership="none">
            <type name="Gst.Element" c:type="GstElement*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="remove_filter" invoker="remove_filter">
        <doc xml:whitespace="preserve">Removes a filter from the playback pipeline.  The filter may not be
removed immediately.  The 'filter-pre-remove' signal will be emitted
immediately before this actually happens.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the filter was found and will be removed</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="element" transfer-ownership="none">
            <doc xml:whitespace="preserve">the filter element (or bin) to remove</doc>
            <type name="Gst.Element" c:type="GstElement*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="add_filter" c:identifier="rb_player_gst_filter_add_filter">
        <doc xml:whitespace="preserve">Adds a new filter to the playback pipeline.  The filter may not be
inserted immediately.  The 'filter-inserted' signal will be emitted
when this actually happens.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the filter will be added</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="element" transfer-ownership="none">
            <doc xml:whitespace="preserve">new filter element (or bin) to add</doc>
            <type name="Gst.Element" c:type="GstElement*"/>
          </parameter>
        </parameters>
      </method>
      <method name="remove_filter"
              c:identifier="rb_player_gst_filter_remove_filter">
        <doc xml:whitespace="preserve">Removes a filter from the playback pipeline.  The filter may not be
removed immediately.  The 'filter-pre-remove' signal will be emitted
immediately before this actually happens.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the filter was found and will be removed</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="element" transfer-ownership="none">
            <doc xml:whitespace="preserve">the filter element (or bin) to remove</doc>
            <type name="Gst.Element" c:type="GstElement*"/>
          </parameter>
        </parameters>
      </method>
      <glib:signal name="filter-inserted" when="last" no-recurse="1">
        <doc xml:whitespace="preserve">The 'filter-inserted' signal is emitted when the tee element has been
inserted into the pipeline and fully linked</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="filter" transfer-ownership="none">
            <doc xml:whitespace="preserve">the element which has been inserted</doc>
            <type name="GObject.Object"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="filter-pre-remove" when="last" no-recurse="1">
        <doc xml:whitespace="preserve">The 'filter-pre-remove' signal is emitted immediately before the element
is unlinked and removed from the pipeline</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="filter" transfer-ownership="none">
            <doc xml:whitespace="preserve">the element which is about to be removed</doc>
            <type name="GObject.Object"/>
          </parameter>
        </parameters>
      </glib:signal>
    </interface>
    <record name="PlayerGstFilterIface"
            c:type="RBPlayerGstFilterIface"
            glib:is-gtype-struct-for="PlayerGstFilter">
      <field name="g_iface">
        <type name="GObject.TypeInterface" c:type="GTypeInterface"/>
      </field>
      <field name="add_filter">
        <callback name="add_filter">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">TRUE if the filter will be added</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="PlayerGstFilter" c:type="RBPlayerGstFilter*"/>
            </parameter>
            <parameter name="element" transfer-ownership="none">
              <doc xml:whitespace="preserve">new filter element (or bin) to add</doc>
              <type name="Gst.Element" c:type="GstElement*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="remove_filter">
        <callback name="remove_filter">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">TRUE if the filter was found and will be removed</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="PlayerGstFilter" c:type="RBPlayerGstFilter*"/>
            </parameter>
            <parameter name="element" transfer-ownership="none">
              <doc xml:whitespace="preserve">the filter element (or bin) to remove</doc>
              <type name="Gst.Element" c:type="GstElement*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="filter_inserted">
        <callback name="filter_inserted">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="PlayerGstFilter" c:type="RBPlayerGstFilter*"/>
            </parameter>
            <parameter name="filter" transfer-ownership="none">
              <type name="Gst.Element" c:type="GstElement*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="filter_pre_remove">
        <callback name="filter_pre_remove">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="PlayerGstFilter" c:type="RBPlayerGstFilter*"/>
            </parameter>
            <parameter name="filter" transfer-ownership="none">
              <type name="Gst.Element" c:type="GstElement*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <interface name="PlayerGstTee"
               c:symbol-prefix="player_gst_tee"
               c:type="RBPlayerGstTee"
               glib:type-name="RBPlayerGstTee"
               glib:get-type="rb_player_gst_tee_get_type"
               glib:type-struct="PlayerGstTeeIface">
      <virtual-method name="add_tee" invoker="add_tee">
        <doc xml:whitespace="preserve">Adds a new sink to the playback pipeline.  The sink may not be
inserted immediately.  The 'tee-inserted' signal will be emitted
when this actually happens.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the sink will be added</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="element" transfer-ownership="none">
            <doc xml:whitespace="preserve">new sink element (or bin) to add</doc>
            <type name="Gst.Element" c:type="GstElement*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="remove_tee" invoker="remove_tee">
        <doc xml:whitespace="preserve">Removes a sink from the playback pipeline.  The sink may not be
removed immediately.  The 'tee-pre-remove' signal will be emitted
immediately before this actually happens.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the sink was found and will be removed</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="element" transfer-ownership="none">
            <doc xml:whitespace="preserve">the sink element (or bin) to remove</doc>
            <type name="Gst.Element" c:type="GstElement*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="tee_inserted">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="tee" transfer-ownership="none">
            <type name="Gst.Element" c:type="GstElement*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="tee_pre_remove">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="tee" transfer-ownership="none">
            <type name="Gst.Element" c:type="GstElement*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="add_tee" c:identifier="rb_player_gst_tee_add_tee">
        <doc xml:whitespace="preserve">Adds a new sink to the playback pipeline.  The sink may not be
inserted immediately.  The 'tee-inserted' signal will be emitted
when this actually happens.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the sink will be added</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="element" transfer-ownership="none">
            <doc xml:whitespace="preserve">new sink element (or bin) to add</doc>
            <type name="Gst.Element" c:type="GstElement*"/>
          </parameter>
        </parameters>
      </method>
      <method name="remove_tee" c:identifier="rb_player_gst_tee_remove_tee">
        <doc xml:whitespace="preserve">Removes a sink from the playback pipeline.  The sink may not be
removed immediately.  The 'tee-pre-remove' signal will be emitted
immediately before this actually happens.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the sink was found and will be removed</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="element" transfer-ownership="none">
            <doc xml:whitespace="preserve">the sink element (or bin) to remove</doc>
            <type name="Gst.Element" c:type="GstElement*"/>
          </parameter>
        </parameters>
      </method>
      <glib:signal name="tee-inserted" when="last" no-recurse="1">
        <doc xml:whitespace="preserve">The 'tee-inserted' signal is emitted when the tee element has been
inserted into the pipeline and fully linked</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="tee" transfer-ownership="none">
            <doc xml:whitespace="preserve">the element which has been inserted</doc>
            <type name="GObject.Object"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="tee-pre-remove" when="last" no-recurse="1">
        <doc xml:whitespace="preserve">The 'tee-pre-remove' signal is emitted immediately before the element
is unlinked and removed from the pipeline</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="tee" transfer-ownership="none">
            <doc xml:whitespace="preserve">the element which is about to be removed</doc>
            <type name="GObject.Object"/>
          </parameter>
        </parameters>
      </glib:signal>
    </interface>
    <record name="PlayerGstTeeIface"
            c:type="RBPlayerGstTeeIface"
            glib:is-gtype-struct-for="PlayerGstTee">
      <field name="g_iface">
        <type name="GObject.TypeInterface" c:type="GTypeInterface"/>
      </field>
      <field name="add_tee">
        <callback name="add_tee">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">TRUE if the sink will be added</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="PlayerGstTee" c:type="RBPlayerGstTee*"/>
            </parameter>
            <parameter name="element" transfer-ownership="none">
              <doc xml:whitespace="preserve">new sink element (or bin) to add</doc>
              <type name="Gst.Element" c:type="GstElement*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="remove_tee">
        <callback name="remove_tee">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">TRUE if the sink was found and will be removed</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="PlayerGstTee" c:type="RBPlayerGstTee*"/>
            </parameter>
            <parameter name="element" transfer-ownership="none">
              <doc xml:whitespace="preserve">the sink element (or bin) to remove</doc>
              <type name="Gst.Element" c:type="GstElement*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="tee_inserted">
        <callback name="tee_inserted">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="PlayerGstTee" c:type="RBPlayerGstTee*"/>
            </parameter>
            <parameter name="tee" transfer-ownership="none">
              <type name="Gst.Element" c:type="GstElement*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="tee_pre_remove">
        <callback name="tee_pre_remove">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="PlayerGstTee" c:type="RBPlayerGstTee*"/>
            </parameter>
            <parameter name="tee" transfer-ownership="none">
              <type name="Gst.Element" c:type="GstElement*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="PlayerIface"
            c:type="RBPlayerIface"
            glib:is-gtype-struct-for="Player">
      <field name="g_iface">
        <type name="GObject.TypeInterface" c:type="GTypeInterface"/>
      </field>
      <field name="open">
        <callback name="open" throws="1">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">TRUE if the stream preparation was not unsuccessful</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="stream_data" transfer-ownership="none">
              <doc xml:whitespace="preserve">arbitrary data to associate with the stream</doc>
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
            <parameter name="stream_data_destroy"
                       transfer-ownership="none"
                       scope="async">
              <doc xml:whitespace="preserve">function to call to destroy the stream data</doc>
              <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="opened">
        <callback name="opened">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">TRUE if a stream is prepared for playback</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="close">
        <callback name="close" throws="1">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">TRUE if a stream was found and closed</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="play">
        <callback name="play" throws="1">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">%TRUE if playback started successfully</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="play_type" transfer-ownership="none">
              <doc xml:whitespace="preserve">requested playback start type</doc>
              <type name="PlayerPlayType" c:type="RBPlayerPlayType"/>
            </parameter>
            <parameter name="crossfade" transfer-ownership="none">
              <type name="gint64" c:type="gint64"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="pause">
        <callback name="pause">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="playing">
        <callback name="playing">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">TRUE if playing</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="set_volume">
        <callback name="set_volume">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="volume" transfer-ownership="none">
              <type name="gfloat" c:type="float"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="get_volume">
        <callback name="get_volume">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">current output volume level</doc>
            <type name="gfloat" c:type="float"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="seekable">
        <callback name="seekable">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">TRUE if the current stream is seekable</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="set_time">
        <callback name="set_time">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="newtime" transfer-ownership="none">
              <type name="gint64" c:type="gint64"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="get_time">
        <callback name="get_time">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">playback position</doc>
            <type name="gint64" c:type="gint64"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="multiple_open">
        <callback name="multiple_open">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">TRUE if multiple open is supported</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="playing_stream">
        <callback name="playing_stream">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="stream_data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="eos">
        <callback name="eos">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="stream_data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
            <parameter name="early" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="info">
        <callback name="info">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="stream_data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
            <parameter name="field" transfer-ownership="none">
              <type name="MetaDataField" c:type="RBMetaDataField"/>
            </parameter>
            <parameter name="value" transfer-ownership="none">
              <type name="GObject.Value" c:type="GValue*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="buffering">
        <callback name="buffering">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="stream_data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
            <parameter name="progress" transfer-ownership="none">
              <type name="guint" c:type="guint"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="error">
        <callback name="error">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="stream_data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
            <parameter name="error" transfer-ownership="none">
              <type name="GLib.Error" c:type="GError*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="tick">
        <callback name="tick">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="stream_data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
            <parameter name="elapsed" transfer-ownership="none">
              <type name="gint64" c:type="gint64"/>
            </parameter>
            <parameter name="duration" transfer-ownership="none">
              <type name="gint64" c:type="gint64"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="event">
        <callback name="event">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="stream_data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
            <parameter name="data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="volume_changed">
        <callback name="volume_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="volume" transfer-ownership="none">
              <type name="gfloat" c:type="float"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="image">
        <callback name="image">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="stream_data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
            <parameter name="image" transfer-ownership="none">
              <type name="GdkPixbuf.Pixbuf" c:type="GdkPixbuf*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="redirect">
        <callback name="redirect">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="Player" c:type="RBPlayer*"/>
            </parameter>
            <parameter name="stream_data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="gchar*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <enumeration name="PlayerPlayType"
                 glib:type-name="RBPlayerPlayType"
                 glib:get-type="rb_player_play_type_get_type"
                 c:type="RBPlayerPlayType">
      <member name="replace"
              value="0"
              c:identifier="RB_PLAYER_PLAY_REPLACE"
              glib:nick="replace"/>
      <member name="start_after_eos"
              value="1"
              c:identifier="RB_PLAYER_PLAY_AFTER_EOS"
              glib:nick="start-after-eos"/>
      <member name="crossfade"
              value="2"
              c:identifier="RB_PLAYER_PLAY_CROSSFADE"
              glib:nick="crossfade"/>
    </enumeration>
    <enumeration name="PlaylistExportType" c:type="RBPlaylistExportType">
      <member name="unknown"
              value="0"
              c:identifier="RB_PLAYLIST_EXPORT_TYPE_UNKNOWN"/>
      <member name="m3u" value="1" c:identifier="RB_PLAYLIST_EXPORT_TYPE_M3U"/>
      <member name="pls" value="2" c:identifier="RB_PLAYLIST_EXPORT_TYPE_PLS"/>
      <member name="xspf"
              value="3"
              c:identifier="RB_PLAYLIST_EXPORT_TYPE_XSPF"/>
    </enumeration>
    <class name="PlaylistManager"
           c:symbol-prefix="playlist_manager"
           c:type="RBPlaylistManager"
           parent="GObject.Object"
           glib:type-name="RBPlaylistManager"
           glib:get-type="rb_playlist_manager_get_type"
           glib:type-struct="PlaylistManagerClass">
      <constructor name="new" c:identifier="rb_playlist_manager_new">
        <doc xml:whitespace="preserve">Creates the #RBPlaylistManager instance</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the #RBPlaylistManager</doc>
          <type name="PlaylistManager" c:type="RBPlaylistManager*"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShell</doc>
            <type name="Shell" c:type="RBShell*"/>
          </parameter>
          <parameter name="page_model" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBDisplayPageModel</doc>
            <type name="DisplayPageModel" c:type="RBDisplayPageModel*"/>
          </parameter>
          <parameter name="page_tree" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBDisplayPageTree</doc>
            <type name="DisplayPageTree" c:type="RBDisplayPageTree*"/>
          </parameter>
          <parameter name="playlists_file" transfer-ownership="none">
            <doc xml:whitespace="preserve">the full path to the playlist file to load</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </constructor>
      <function name="error_quark"
                c:identifier="rb_playlist_manager_error_quark">
        <return-value transfer-ownership="none">
          <type name="GLib.Quark" c:type="GQuark"/>
        </return-value>
      </function>
      <virtual-method name="load_finish">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="load_start">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="playlist_added">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <type name="Source" c:type="RBSource*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="playlist_created">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <type name="Source" c:type="RBSource*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="add_to_playlist"
              c:identifier="rb_playlist_manager_add_to_playlist"
              throws="1">
        <doc xml:whitespace="preserve">Adds an entry to the specified playlist.
Fails if no playlist with that name exists.
This is part of the playlist manager dbus interface.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if successful.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of the playlist to add to</doc>
            <type name="utf8" c:type="gchar*"/>
          </parameter>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">URI of the entry to add to the playlist</doc>
            <type name="utf8" c:type="gchar*"/>
          </parameter>
        </parameters>
      </method>
      <method name="create_static_playlist"
              c:identifier="rb_playlist_manager_create_static_playlist"
              throws="1">
        <doc xml:whitespace="preserve">Creates a new static playlist source with the given name.
Will fail if a playlist with that name already exists.
This is part of the playlist manager dbus interface.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if successful.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of the new playlist</doc>
            <type name="utf8" c:type="gchar*"/>
          </parameter>
        </parameters>
      </method>
      <method name="delete_playlist"
              c:identifier="rb_playlist_manager_delete_playlist"
              throws="1">
        <doc xml:whitespace="preserve">Deletes the specified playlist.  Will fail if no playlist with
that name exists. This is part of the playlist manager dbus interface.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if successful.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of the playlist to delete</doc>
            <type name="utf8" c:type="gchar*"/>
          </parameter>
        </parameters>
      </method>
      <method name="export_playlist"
              c:identifier="rb_playlist_manager_export_playlist"
              throws="1">
        <doc xml:whitespace="preserve">Saves the specified playlist to a file in either M3U or PLS format.
This is part of the playlist manager dbus interface.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if successful.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of the playlist to export</doc>
            <type name="utf8" c:type="gchar*"/>
          </parameter>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">playlist save location</doc>
            <type name="utf8" c:type="gchar*"/>
          </parameter>
          <parameter name="m3u_format" transfer-ownership="none">
            <doc xml:whitespace="preserve">if TRUE, save in M3U format, otherwise save in PLS format</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_playlist_names"
              c:identifier="rb_playlist_manager_get_playlist_names"
              throws="1">
        <doc xml:whitespace="preserve">Allocates and returns an array containing the names of all local
playlists.  This is part of the playlist manager dbus interface.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if successful.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="playlists"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">holds the array of playlist names on reutrn</doc>
            <type name="utf8" c:type="gchar***"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_playlists"
              c:identifier="rb_playlist_manager_get_playlists">
        <doc xml:whitespace="preserve">Returns a #GList containing all local playlist source objects.</doc>
        <return-value transfer-ownership="container">
          <doc xml:whitespace="preserve">list of playlists</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="Source"/>
          </type>
        </return-value>
      </method>
      <method name="load_playlists"
              c:identifier="rb_playlist_manager_load_playlists">
        <doc xml:whitespace="preserve">Loads the user's playlists, or if the playlist file does not exists,
reads the default playlist file.  Should be called only once on startup.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="new_playlist"
              c:identifier="rb_playlist_manager_new_playlist">
        <doc xml:whitespace="preserve">Creates a new playlist and adds it to the source list.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the new playlist object.</doc>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
        <parameters>
          <parameter name="suggested_name" transfer-ownership="none">
            <doc xml:whitespace="preserve">optional name to use for the new playlist</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="automatic" transfer-ownership="none">
            <doc xml:whitespace="preserve">if TRUE, create an auto playlist</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="new_playlist_from_selection_data"
              c:identifier="rb_playlist_manager_new_playlist_from_selection_data">
        <doc xml:whitespace="preserve">Creates a new playlist based on selection data from gtk.
Used to implement playlist creation through drag and drop
to the source list.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the new playlist.</doc>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
        <parameters>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GtkSelectionData from which to create a playlist</doc>
            <type name="Gtk.SelectionData" c:type="GtkSelectionData*"/>
          </parameter>
        </parameters>
      </method>
      <method name="parse_file"
              c:identifier="rb_playlist_manager_parse_file"
              throws="1">
        <doc xml:whitespace="preserve">Parses a playlist file, adding entries to the database and to a new
static playlist.  If the playlist file includes a title, the static
playlist created will have the same title.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE on success</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">URI of the playlist to load</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="remove_from_playlist"
              c:identifier="rb_playlist_manager_remove_from_playlist"
              throws="1">
        <doc xml:whitespace="preserve">Removes an entry from the specified playlist.
Fails if no playlist with that name exists.
This is part of the playlist manager dbus interface.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if successful.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of the playlist to remove from</doc>
            <type name="utf8" c:type="gchar*"/>
          </parameter>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">URI of the entry to remove from the playlist</doc>
            <type name="utf8" c:type="gchar*"/>
          </parameter>
        </parameters>
      </method>
      <method name="save_playlists"
              c:identifier="rb_playlist_manager_save_playlists">
        <doc xml:whitespace="preserve">Saves the user's playlists.  If the force flag is
TRUE, the playlists will always be saved.  Otherwise, the playlists
will only be saved if a playlist has been created, modified, or deleted
since the last time the playlists were saved, and no save operation is
currently taking place.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if a playlist save operation has been started</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="force" transfer-ownership="none">
            <doc xml:whitespace="preserve">if TRUE, save playlists synchronously and unconditionally</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="shutdown" c:identifier="rb_playlist_manager_shutdown">
        <doc xml:whitespace="preserve">Shuts down the playlist manager, making sure any outstanding playlist save
operation finishes.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <property name="display-page-model"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <type name="DisplayPageModel"/>
      </property>
      <property name="display-page-tree"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <type name="DisplayPageTree"/>
      </property>
      <property name="playlists-file" writable="1" transfer-ownership="none">
        <type name="utf8"/>
      </property>
      <property name="shell" writable="1" transfer-ownership="none">
        <type name="Shell"/>
      </property>
      <property name="source" writable="1" transfer-ownership="none">
        <type name="Source"/>
      </property>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="PlaylistManagerPrivate"
              c:type="RBPlaylistManagerPrivate*"/>
      </field>
      <glib:signal name="load-finish" when="last">
        <doc xml:whitespace="preserve">Emitted when the playlist manager finishes loading the user's
playlist file.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
      <glib:signal name="load-start" when="last">
        <doc xml:whitespace="preserve">Emitted when the playlist manager starts loading the user's
playlist file.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
      <glib:signal name="playlist-added" when="last">
        <doc xml:whitespace="preserve">Emitted when a playlist is added, including when being loaded
from the user's playlist file.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new #RBSource</doc>
            <type name="GObject.Object"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="playlist-created" when="last">
        <doc xml:whitespace="preserve">Emitted when a new playlist is created.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">the newly created playlist #RBSource</doc>
            <type name="GObject.Object"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="PlaylistManagerClass"
            c:type="RBPlaylistManagerClass"
            glib:is-gtype-struct-for="PlaylistManager">
      <field name="parent_class">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="playlist_added">
        <callback name="playlist_added">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="manager" transfer-ownership="none">
              <type name="PlaylistManager" c:type="RBPlaylistManager*"/>
            </parameter>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="playlist_created">
        <callback name="playlist_created">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="manager" transfer-ownership="none">
              <type name="PlaylistManager" c:type="RBPlaylistManager*"/>
            </parameter>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="load_start">
        <callback name="load_start">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="manager" transfer-ownership="none">
              <type name="PlaylistManager" c:type="RBPlaylistManager*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="load_finish">
        <callback name="load_finish">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="manager" transfer-ownership="none">
              <type name="PlaylistManager" c:type="RBPlaylistManager*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <enumeration name="PlaylistManagerError" c:type="RBPlaylistManagerError">
      <member name="parse"
              value="0"
              c:identifier="RB_PLAYLIST_MANAGER_ERROR_PARSE"/>
      <member name="playlist_exists"
              value="1"
              c:identifier="RB_PLAYLIST_MANAGER_ERROR_PLAYLIST_EXISTS"/>
      <member name="playlist_not_found"
              value="2"
              c:identifier="RB_PLAYLIST_MANAGER_ERROR_PLAYLIST_NOT_FOUND"/>
    </enumeration>
    <record name="PlaylistManagerPrivate"
            c:type="RBPlaylistManagerPrivate"
            disguised="1">
    </record>
    <class name="PlaylistSource"
           c:symbol-prefix="playlist_source"
           c:type="RBPlaylistSource"
           parent="Source"
           abstract="1"
           glib:type-name="RBPlaylistSource"
           glib:get-type="rb_playlist_source_get_type"
           glib:type-struct="PlaylistSourceClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <implements name="Gtk.Orientable"/>
      <constructor name="new_from_xml"
                   c:identifier="rb_playlist_source_new_from_xml">
        <doc xml:whitespace="preserve">Constructs a playlist source instance from the XML serialized
format.  This function knows about all the playlist types that
can be saved to disk, and it hands off the XML node to the
appropriate constructor based on the 'type' attribute of
the root node of the playlist.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the playlist</doc>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShell instance</doc>
            <type name="Shell" c:type="RBShell*"/>
          </parameter>
          <parameter name="node" transfer-ownership="none">
            <doc xml:whitespace="preserve">libxml node containing the playlist</doc>
            <type name="libxml2.NodePtr" c:type="xmlNodePtr"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="impl_mark_dirty">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_save_contents_to_xml">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="node" transfer-ownership="none">
            <type name="libxml2.NodePtr" c:type="xmlNodePtr"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_show_entry_view_popup">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="view" transfer-ownership="none">
            <type name="EntryView" c:type="RBEntryView*"/>
          </parameter>
          <parameter name="over_entry" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="add_to_map" c:identifier="rb_playlist_source_add_to_map">
        <doc xml:whitespace="preserve">Adds a URI to the playlist's entry map.  This is useful when the
URI is being added to the database, but no entry exists for it yet.
When the entry is created, it will be added to the query model.

FALSE if it was already there.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the URI was added to the entry map,</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="location" transfer-ownership="none">
            <doc xml:whitespace="preserve">a URI to add</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_db" c:identifier="rb_playlist_source_get_db">
        <doc xml:whitespace="preserve">Returns the #RhythmDB instance.  The caller must not
unref the object once finished with it.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the #RhythmDB instance</doc>
          <type name="RhythmDB" c:type="RhythmDB*"/>
        </return-value>
      </method>
      <method name="get_query_model"
              c:identifier="rb_playlist_source_get_query_model">
        <doc xml:whitespace="preserve">Returns the current #RhythmDBQueryModel for the playlist.
The caller must not unref the object once finished with it.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the current #RhythmDBQueryModel</doc>
          <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
        </return-value>
      </method>
      <method name="location_in_map"
              c:identifier="rb_playlist_source_location_in_map">
        <doc xml:whitespace="preserve">Returns TRUE if the specified URI is in the playlist entry map</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the URI is present</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="location" transfer-ownership="none">
            <doc xml:whitespace="preserve">a URI to check</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="mark_dirty" c:identifier="rb_playlist_source_mark_dirty">
        <doc xml:whitespace="preserve">Marks the playlist dirty.  This generally means that the playlist
will be saved to disk fairly soon, but the exact meaning can vary
between playlist types.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="save_playlist"
              c:identifier="rb_playlist_source_save_playlist">
        <doc xml:whitespace="preserve">Saves the playlist to an external file in a standard
format (M3U, PLS, or XSPF).</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">destination URI</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="export_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">format to save in</doc>
            <type name="PlaylistExportType" c:type="RBPlaylistExportType"/>
          </parameter>
        </parameters>
      </method>
      <method name="save_to_xml" c:identifier="rb_playlist_source_save_to_xml">
        <doc xml:whitespace="preserve">Converts the playlist to XML format, below the specified
parent node.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="parent_node" transfer-ownership="none">
            <doc xml:whitespace="preserve">libxml node below which to save the playlist</doc>
            <type name="libxml2.NodePtr" c:type="xmlNodePtr"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_query_model"
              c:identifier="rb_playlist_source_set_query_model">
        <doc xml:whitespace="preserve">Sets a new query model for the playlist.  This updates the
entry view to use the new query model and also updates the
source query-model property.

This needs to be called when the playlist subclass
creates a new query model.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="model" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new #RhythmDBQueryModel</doc>
            <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
          </parameter>
        </parameters>
      </method>
      <method name="setup_entry_view"
              c:identifier="rb_playlist_source_setup_entry_view">
        <doc xml:whitespace="preserve">Connects signal handlers and sets up drag and drop support for
an entry view to be used by a playlist source.  This only needs
to be called if the playlist subclass is creating a new entry view.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry_view" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new #RBEntryView to set up</doc>
            <type name="EntryView" c:type="RBEntryView*"/>
          </parameter>
        </parameters>
      </method>
      <property name="db" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RhythmDB instance</doc>
        <type name="RhythmDB"/>
      </property>
      <property name="dirty" transfer-ownership="none">
        <doc xml:whitespace="preserve">Whether the playlist has been changed since it was last saved
to disk.</doc>
        <type name="gboolean"/>
      </property>
      <property name="is-local"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">Whether the playlist is attached to the local library.
Remote DAAP playlists, for example, are not local.</doc>
        <type name="gboolean"/>
      </property>
      <field name="parent">
        <type name="Source" c:type="RBSource"/>
      </field>
      <field name="priv">
        <type name="PlaylistSourcePrivate" c:type="RBPlaylistSourcePrivate*"/>
      </field>
    </class>
    <record name="PlaylistSourceClass"
            c:type="RBPlaylistSourceClass"
            glib:is-gtype-struct-for="PlaylistSource">
      <field name="parent">
        <type name="SourceClass" c:type="RBSourceClass"/>
      </field>
      <field name="impl_show_entry_view_popup">
        <callback name="impl_show_entry_view_popup">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="PlaylistSource" c:type="RBPlaylistSource*"/>
            </parameter>
            <parameter name="view" transfer-ownership="none">
              <type name="EntryView" c:type="RBEntryView*"/>
            </parameter>
            <parameter name="over_entry" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_save_contents_to_xml">
        <callback name="impl_save_contents_to_xml">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="PlaylistSource" c:type="RBPlaylistSource*"/>
            </parameter>
            <parameter name="node" transfer-ownership="none">
              <type name="libxml2.NodePtr" c:type="xmlNodePtr"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_mark_dirty">
        <callback name="impl_mark_dirty">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="PlaylistSource" c:type="RBPlaylistSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="PlaylistSourcePrivate"
            c:type="RBPlaylistSourcePrivate"
            disguised="1">
    </record>
    <record name="PodcastChannel" c:type="RBPodcastChannel">
      <field name="url" writable="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="title" writable="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="lang" writable="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="description" writable="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="author" writable="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="contact" writable="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="img" writable="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="pub_date" writable="1">
        <type name="guint64" c:type="guint64"/>
      </field>
      <field name="copyright" writable="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="is_opml" writable="1">
        <type name="gboolean" c:type="gboolean"/>
      </field>
      <field name="posts" writable="1">
        <type name="GLib.List" c:type="GList*">
          <type name="gpointer" c:type="gpointer"/>
        </type>
      </field>
    </record>
    <record name="PodcastItem" c:type="RBPodcastItem">
      <field name="title" writable="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="url" writable="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="description" writable="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="author" writable="1">
        <type name="utf8" c:type="char*"/>
      </field>
      <field name="pub_date" writable="1">
        <type name="guint64" c:type="guint64"/>
      </field>
      <field name="duration" writable="1">
        <type name="gulong" c:type="gulong"/>
      </field>
      <field name="filesize" writable="1">
        <type name="guint64" c:type="guint64"/>
      </field>
    </record>
    <class name="PodcastManager"
           c:symbol-prefix="podcast_manager"
           c:type="RBPodcastManager"
           parent="GObject.Object"
           glib:type-name="RBPodcastManager"
           glib:get-type="rb_podcast_manager_get_type"
           glib:type-struct="PodcastManagerClass">
      <constructor name="new" c:identifier="rb_podcast_manager_new">
        <return-value transfer-ownership="full">
          <type name="PodcastManager" c:type="RBPodcastManager*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
        </parameters>
      </constructor>
      <function name="add_post" c:identifier="rb_podcast_manager_add_post">
        <return-value transfer-ownership="full">
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="name" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="title" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="subtitle" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="generator" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="description" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="date" transfer-ownership="none">
            <type name="gulong" c:type="gulong"/>
          </parameter>
          <parameter name="duration" transfer-ownership="none">
            <type name="gulong" c:type="gulong"/>
          </parameter>
          <parameter name="filesize" transfer-ownership="none">
            <type name="guint64" c:type="guint64"/>
          </parameter>
        </parameters>
      </function>
      <function name="entry_downloaded"
                c:identifier="rb_podcast_manager_entry_downloaded">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </function>
      <function name="unsubscribe_feed"
                c:identifier="rb_podcast_manager_unsubscribe_feed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="url" transfer-ownership="none">
            <type name="utf8" c:type="gchar*"/>
          </parameter>
        </parameters>
      </function>
      <virtual-method name="feed_updates_available">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="finish_download">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="process_error">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="error" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="existing" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="start_download">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="status_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <type name="glong" c:type="glong"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="cancel_download"
              c:identifier="rb_podcast_manager_cancel_download">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="delete_download"
              c:identifier="rb_podcast_manager_delete_download">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="download_entry"
              c:identifier="rb_podcast_manager_download_entry">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_in_download_queue"
              c:identifier="rb_podcast_manager_entry_in_download_queue">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_podcast_dir"
              c:identifier="rb_podcast_manager_get_podcast_dir">
        <return-value transfer-ownership="full">
          <type name="utf8" c:type="gchar*"/>
        </return-value>
      </method>
      <method name="remove_feed" c:identifier="rb_podcast_manager_remove_feed">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="url" transfer-ownership="none">
            <type name="utf8" c:type="gchar*"/>
          </parameter>
          <parameter name="remove_files" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="shutdown" c:identifier="rb_podcast_manager_shutdown">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="start_sync" c:identifier="rb_podcast_manager_start_sync">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="subscribe_feed"
              c:identifier="rb_podcast_manager_subscribe_feed">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="url" transfer-ownership="none">
            <type name="utf8" c:type="gchar*"/>
          </parameter>
          <parameter name="automatic" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="update_feeds"
              c:identifier="rb_podcast_manager_update_feeds">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <property name="db" writable="1" transfer-ownership="none">
        <type name="RhythmDB"/>
      </property>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="PodcastManagerPrivate" c:type="RBPodcastManagerPrivate*"/>
      </field>
      <glib:signal name="feed-updates-available" when="last">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="finish-download" when="last">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="process-error" when="last">
        <return-value transfer-ownership="none">
          <type name="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="utf8"/>
          </parameter>
          <parameter name="p0" transfer-ownership="none">
            <type name="gboolean"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="start-download" when="last">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="status-changed" when="last">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="RhythmDBEntry"/>
          </parameter>
          <parameter name="p0" transfer-ownership="none">
            <type name="gulong"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="PodcastManagerClass"
            c:type="RBPodcastManagerClass"
            glib:is-gtype-struct-for="PodcastManager">
      <field name="parent_class">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="status_changed">
        <callback name="status_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="pd" transfer-ownership="none">
              <type name="PodcastManager" c:type="RBPodcastManager*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="value" transfer-ownership="none">
              <type name="glong" c:type="glong"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="start_download">
        <callback name="start_download">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="pd" transfer-ownership="none">
              <type name="PodcastManager" c:type="RBPodcastManager*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="finish_download">
        <callback name="finish_download">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="pd" transfer-ownership="none">
              <type name="PodcastManager" c:type="RBPodcastManager*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="feed_updates_available">
        <callback name="feed_updates_available">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="pd" transfer-ownership="none">
              <type name="PodcastManager" c:type="RBPodcastManager*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="process_error">
        <callback name="process_error">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="pd" transfer-ownership="none">
              <type name="PodcastManager" c:type="RBPodcastManager*"/>
            </parameter>
            <parameter name="error" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="existing" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="PodcastManagerPrivate"
            c:type="RBPodcastManagerPrivate"
            disguised="1">
    </record>
    <enumeration name="PodcastParseError" c:type="RBPodcastParseError">
      <member name="file_info"
              value="0"
              c:identifier="RB_PODCAST_PARSE_ERROR_FILE_INFO"/>
      <member name="mime_type"
              value="1"
              c:identifier="RB_PODCAST_PARSE_ERROR_MIME_TYPE"/>
      <member name="xml_parse"
              value="2"
              c:identifier="RB_PODCAST_PARSE_ERROR_XML_PARSE"/>
      <member name="no_items"
              value="3"
              c:identifier="RB_PODCAST_PARSE_ERROR_NO_ITEMS"/>
    </enumeration>
    <record name="Profiler" c:type="RBProfiler" disguised="1">
      <method name="dump" c:identifier="rb_profiler_dump" introspectable="0">
        <doc xml:whitespace="preserve">Produces debug output for the profiler instance,
showing the elapsed time.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="free" c:identifier="rb_profiler_free" introspectable="0">
        <doc xml:whitespace="preserve">Frees the memory associated with a profiler instance.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="reset" c:identifier="rb_profiler_reset" introspectable="0">
        <doc xml:whitespace="preserve">Resets the elapsed time for the profiler</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <function name="new" c:identifier="rb_profiler_new" introspectable="0">
        <doc xml:whitespace="preserve">Creates a new profiler instance.  This can be used to
time certain sections of code.</doc>
        <return-value>
          <doc xml:whitespace="preserve">profiler instance</doc>
          <type name="Profiler" c:type="RBProfiler*"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">profiler name</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </function>
    </record>
    <class name="PropertyView"
           c:symbol-prefix="property_view"
           c:type="RBPropertyView"
           parent="Gtk.ScrolledWindow"
           glib:type-name="RBPropertyView"
           glib:get-type="rb_property_view_get_type"
           glib:type-struct="PropertyViewClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <constructor name="new" c:identifier="rb_property_view_new">
        <doc xml:whitespace="preserve">Creates a new #RBPropertyView displaying the specified property.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">new property view instance</doc>
          <type name="PropertyView" c:type="RBPropertyView*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <doc xml:whitespace="preserve">#RhythmDB instance</doc>
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="propid" transfer-ownership="none">
            <doc xml:whitespace="preserve">property ID to be displayed in the property view</doc>
            <type name="guint" c:type="guint"/>
          </parameter>
          <parameter name="title" transfer-ownership="none">
            <doc xml:whitespace="preserve">title of the property view</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="properties_selected" introspectable="0">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="properties" transfer-ownership="none">
            <type name="GLib.List" c:type="GList*">
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="property_activated">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="property_selected">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="selection_reset">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="show_popup">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <method name="append_column_custom"
              c:identifier="rb_property_view_append_column_custom">
        <doc xml:whitespace="preserve">Appends a custom created column to the view.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="column" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #GtkTreeViewColumn to append to the view</doc>
            <type name="Gtk.TreeViewColumn" c:type="GtkTreeViewColumn*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_model" c:identifier="rb_property_view_get_model">
        <doc xml:whitespace="preserve">Returns the #RhythmDBPropertyModel backing the view; no reference is taken</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">property model</doc>
          <type name="RhythmDBPropertyModel" c:type="RhythmDBPropertyModel*"/>
        </return-value>
      </method>
      <method name="get_num_properties"
              c:identifier="rb_property_view_get_num_properties">
        <doc xml:whitespace="preserve">Returns the number of property values present in the view.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">number of properties</doc>
          <type name="guint" c:type="guint"/>
        </return-value>
      </method>
      <method name="get_selection"
              c:identifier="rb_property_view_get_selection">
        <doc xml:whitespace="preserve">Returns a #GList containing the selected property values.  The list must
be freed by the caller.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">list of selected values</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="utf8"/>
          </type>
        </return-value>
      </method>
      <method name="reset" c:identifier="rb_property_view_reset">
        <doc xml:whitespace="preserve">Clears the selection in the property view.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="set_model" c:identifier="rb_property_view_set_model">
        <doc xml:whitespace="preserve">Replaces the model backing the property view.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="model" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new #RhythmDBPropertyModel for the property view</doc>
            <type name="RhythmDBPropertyModel"
                  c:type="RhythmDBPropertyModel*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_search_func"
              c:identifier="rb_property_view_set_search_func">
        <doc xml:whitespace="preserve">Sets the compare function for the interactive search capabilities.
The function must return FALSE when the search key string matches
the row it is passed.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="func"
                     transfer-ownership="none"
                     scope="notified"
                     closure="1"
                     destroy="2">
            <doc xml:whitespace="preserve">tree view search function to use for this view</doc>
            <type name="Gtk.TreeViewSearchEqualFunc"
                  c:type="GtkTreeViewSearchEqualFunc"/>
          </parameter>
          <parameter name="func_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">data to pass to the search function</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="notify" transfer-ownership="none" scope="async">
            <doc xml:whitespace="preserve">function to call to dispose of the data</doc>
            <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_selection"
              c:identifier="rb_property_view_set_selection">
        <doc xml:whitespace="preserve">Replaces the selection in the property view.  All values in the list
that are present in the view will be selected, and the view will be
scrolled to show the last value selected.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="vals" transfer-ownership="none">
            <doc xml:whitespace="preserve">the values to be selected</doc>
            <type name="GLib.List" c:type="GList*">
              <type name="utf8"/>
            </type>
          </parameter>
        </parameters>
      </method>
      <method name="set_selection_mode"
              c:identifier="rb_property_view_set_selection_mode">
        <doc xml:whitespace="preserve">Sets the selection mode (single or multiple) for the property view&gt;
The default selection mode is single.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="mode" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new #GtkSelectionMode for the property view</doc>
            <type name="Gtk.SelectionMode" c:type="GtkSelectionMode"/>
          </parameter>
        </parameters>
      </method>
      <property name="db"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">#RhythmDB instance</doc>
        <type name="RhythmDB"/>
      </property>
      <property name="draggable"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">Whether the property view acts as a data source for drag and drop operations.</doc>
        <type name="gboolean"/>
      </property>
      <property name="prop"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The property that is displayed in this view</doc>
        <type name="RhythmDBPropType"/>
      </property>
      <property name="property-model" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RhythmDBPropertyModel backing the view.</doc>
        <type name="RhythmDBPropertyModel"/>
      </property>
      <property name="title"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The title displayed in the header of the property view</doc>
        <type name="utf8"/>
      </property>
      <field name="parent">
        <type name="Gtk.ScrolledWindow" c:type="GtkScrolledWindow"/>
      </field>
      <field name="priv">
        <type name="PropertyViewPrivate" c:type="RBPropertyViewPrivate*"/>
      </field>
      <glib:signal name="properties-selected" when="last">
        <doc xml:whitespace="preserve">Emitted when the set of selected property values changes.  This is only
emitted for multiple selection property views.  For single-selection views,
use the property-selected signal.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="properties" transfer-ownership="none">
            <doc xml:whitespace="preserve">a list containing the selected property values</doc>
            <type name="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="property-activated" when="last">
        <doc xml:whitespace="preserve">Emitted when a row in a property view is activated by double clicking.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">the property value that was activated</doc>
            <type name="utf8"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="property-selected" when="last">
        <doc xml:whitespace="preserve">Emitted when an individual property value becomes selected.  This is only
emitted for single-selection property views.  For multiple-selection views,
use the properties-selected signal.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">the property value that has been selected</doc>
            <type name="utf8"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="property-selection-reset" when="last">
        <doc xml:whitespace="preserve">Emitted when the selection is reset.  At this point, no property values
are selected.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
      <glib:signal name="show-popup" when="last">
        <doc xml:whitespace="preserve">Emitted when a popup menu should be displayed for the property view.
The source containing the property view should connect a handler to
this signal that * displays an appropriate popup.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
    </class>
    <record name="PropertyViewClass"
            c:type="RBPropertyViewClass"
            glib:is-gtype-struct-for="PropertyView">
      <field name="parent">
        <type name="Gtk.ScrolledWindowClass" c:type="GtkScrolledWindowClass"/>
      </field>
      <field name="property_selected">
        <callback name="property_selected">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="view" transfer-ownership="none">
              <type name="PropertyView" c:type="RBPropertyView*"/>
            </parameter>
            <parameter name="name" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="properties_selected" introspectable="0">
        <callback name="properties_selected" introspectable="0">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="view" transfer-ownership="none">
              <type name="PropertyView" c:type="RBPropertyView*"/>
            </parameter>
            <parameter name="properties" transfer-ownership="none">
              <type name="GLib.List" c:type="GList*">
                <type name="gpointer" c:type="gpointer"/>
              </type>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="property_activated">
        <callback name="property_activated">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="view" transfer-ownership="none">
              <type name="PropertyView" c:type="RBPropertyView*"/>
            </parameter>
            <parameter name="name" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="selection_reset">
        <callback name="selection_reset">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="view" transfer-ownership="none">
              <type name="PropertyView" c:type="RBPropertyView*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="show_popup">
        <callback name="show_popup">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="view" transfer-ownership="none">
              <type name="PropertyView" c:type="RBPropertyView*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="PropertyViewPrivate"
            c:type="RBPropertyViewPrivate"
            disguised="1">
    </record>
    <constant name="RHYTHMDB_PROP_COVER_ART"
              value="rb:coverArt"
              c:type="RHYTHMDB_PROP_COVER_ART">
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="RHYTHMDB_PROP_COVER_ART_URI"
              value="rb:coverArt-uri"
              c:type="RHYTHMDB_PROP_COVER_ART_URI">
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="RHYTHMDB_PROP_STREAM_SONG_ALBUM"
              value="rb:stream-song-album"
              c:type="RHYTHMDB_PROP_STREAM_SONG_ALBUM">
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="RHYTHMDB_PROP_STREAM_SONG_ARTIST"
              value="rb:stream-song-artist"
              c:type="RHYTHMDB_PROP_STREAM_SONG_ARTIST">
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="RHYTHMDB_PROP_STREAM_SONG_TITLE"
              value="rb:stream-song-title"
              c:type="RHYTHMDB_PROP_STREAM_SONG_TITLE">
      <type name="utf8" c:type="gchar*"/>
    </constant>
    <constant name="RHYTHMDB_QUERY_MODEL_SUGGESTED_UPDATE_CHUNK"
              value="1024"
              c:type="RHYTHMDB_QUERY_MODEL_SUGGESTED_UPDATE_CHUNK">
      <type name="gint" c:type="gint"/>
    </constant>
    <constant name="RWD_OFFSET" value="10" c:type="RWD_OFFSET">
      <type name="gint" c:type="gint"/>
    </constant>
    <class name="Rating"
           c:symbol-prefix="rating"
           c:type="RBRating"
           parent="Gtk.Widget"
           glib:type-name="RBRating"
           glib:get-type="rb_rating_get_type"
           glib:type-struct="RatingClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <constructor name="new" c:identifier="rb_rating_new">
        <doc xml:whitespace="preserve">Creates a new rating widget</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">a new #RBRating widget.</doc>
          <type name="Rating" c:type="RBRating*"/>
        </return-value>
      </constructor>
      <virtual-method name="adjust_rating">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="adjust" transfer-ownership="none">
            <type name="gdouble" c:type="double"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="rated">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="score" transfer-ownership="none">
            <type name="gdouble" c:type="double"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="set_rating">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="score" transfer-ownership="none">
            <type name="gdouble" c:type="double"/>
          </parameter>
        </parameters>
      </virtual-method>
      <property name="rating" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The rating displayed in the widget, as a floating point value
between 0.0 and 5.0.</doc>
        <type name="gdouble"/>
      </property>
      <field name="parent">
        <type name="Gtk.Widget" c:type="GtkWidget"/>
      </field>
      <field name="priv">
        <type name="RatingPrivate" c:type="RBRatingPrivate*"/>
      </field>
      <glib:signal name="adjust-rating" when="last" action="1">
        <doc xml:whitespace="preserve">Action signal used to make a relative adjustment to the
rating.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="adjust" transfer-ownership="none">
            <doc xml:whitespace="preserve">value to add to the rating</doc>
            <type name="gdouble"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="rated" when="last">
        <doc xml:whitespace="preserve">Emitted when the user changes the rating.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="score" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new rating</doc>
            <type name="gdouble"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="set-rating" when="last" action="1">
        <doc xml:whitespace="preserve">Action signal used to change the rating.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="score" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new rating</doc>
            <type name="gdouble"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="RatingClass"
            c:type="RBRatingClass"
            glib:is-gtype-struct-for="Rating">
      <field name="parent">
        <type name="Gtk.WidgetClass" c:type="GtkWidgetClass"/>
      </field>
      <field name="rated">
        <callback name="rated">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="rating" transfer-ownership="none">
              <type name="Rating" c:type="RBRating*"/>
            </parameter>
            <parameter name="score" transfer-ownership="none">
              <type name="gdouble" c:type="double"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="set_rating">
        <callback name="set_rating">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="rating" transfer-ownership="none">
              <type name="Rating" c:type="RBRating*"/>
            </parameter>
            <parameter name="score" transfer-ownership="none">
              <type name="gdouble" c:type="double"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="adjust_rating">
        <callback name="adjust_rating">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="rating" transfer-ownership="none">
              <type name="Rating" c:type="RBRating*"/>
            </parameter>
            <parameter name="adjust" transfer-ownership="none">
              <type name="gdouble" c:type="double"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="RatingPrivate" c:type="RBRatingPrivate" disguised="1">
    </record>
    <record name="RefString"
            c:type="RBRefString"
            glib:type-name="RBRefString"
            glib:get-type="rb_refstring_get_type"
            c:symbol-prefix="refstring">
      <constructor name="new" c:identifier="rb_refstring_new">
        <doc xml:whitespace="preserve">Returns an #RBRefString for the specified string.
If one already exists, its reference count is incremented and it is
returned.  Otherwise, a new #RBRefString is created and returned.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">#RBRefString for @init</doc>
          <type name="RefString" c:type="RBRefString*"/>
        </return-value>
        <parameters>
          <parameter name="init" transfer-ownership="none">
            <doc xml:whitespace="preserve">string to intern</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </constructor>
      <method name="get" c:identifier="rb_refstring_get">
        <doc xml:whitespace="preserve">Returns the actual string for a #RBRefString.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">underlying string, must not be freed</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
      </method>
      <method name="get_folded" c:identifier="rb_refstring_get_folded">
        <doc xml:whitespace="preserve">Returns the case-folded version of the string underlying @val.
The case-folded string is cached inside the #RBRefString for
speed.  See @rb_search_fold for information on case-folding
strings.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">case-folded string, must not be freed</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
      </method>
      <method name="get_sort_key" c:identifier="rb_refstring_get_sort_key">
        <doc xml:whitespace="preserve">Returns the sort key version of the string underlying @val.
The sort key string is cached inside the #RBRefString for speed.
Sort key strings are not generally human readable, so don't display
them anywhere.  See @g_utf8_collate_key_for_filename for information
on sort keys.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">sort key string, must not be freed.</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
      </method>
      <method name="ref" c:identifier="rb_refstring_ref">
        <doc xml:whitespace="preserve">Increases the reference count for an existing #RBRefString.
The refstring is returned for convenience.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the same refstring</doc>
          <type name="RefString" c:type="RBRefString*"/>
        </return-value>
      </method>
      <method name="unref" c:identifier="rb_refstring_unref">
        <doc xml:whitespace="preserve">Drops a reference to an #RBRefString.  If this is the last
reference, the string will be freed.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <function name="equal" c:identifier="rb_refstring_equal">
        <doc xml:whitespace="preserve">Key equality function suitable for use with #GHashTable.
Equality checks for #RBRefString are just pointer comparisons,
since there can only be one refstring for a given string.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the strings are the same</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="ap" transfer-ownership="none">
            <doc xml:whitespace="preserve">an #RBRefString</doc>
            <type name="gpointer" c:type="gconstpointer"/>
          </parameter>
          <parameter name="bp" transfer-ownership="none">
            <doc xml:whitespace="preserve">another #RBRefstring</doc>
            <type name="gpointer" c:type="gconstpointer"/>
          </parameter>
        </parameters>
      </function>
      <function name="find" c:identifier="rb_refstring_find">
        <doc xml:whitespace="preserve">Returns an existing #RBRefString for @init if one exists,
otherwise returns NULL.  If an existing refstring is found,
its reference count is increased.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">existing #RBRefString, or NULL</doc>
          <type name="RefString" c:type="RBRefString*"/>
        </return-value>
        <parameters>
          <parameter name="init" transfer-ownership="none">
            <doc xml:whitespace="preserve">string to find</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </function>
      <function name="hash" c:identifier="rb_refstring_hash">
        <doc xml:whitespace="preserve">Hash function suitable for use with @GHashTable.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">hash value for the string underlying @p</doc>
          <type name="guint" c:type="guint"/>
        </return-value>
        <parameters>
          <parameter name="p" transfer-ownership="none">
            <doc xml:whitespace="preserve">an #RBRefString</doc>
            <type name="gpointer" c:type="gconstpointer"/>
          </parameter>
        </parameters>
      </function>
      <function name="system_init" c:identifier="rb_refstring_system_init">
        <doc xml:whitespace="preserve">Sets up the refstring system.  Called on startup.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </function>
      <function name="system_shutdown"
                c:identifier="rb_refstring_system_shutdown">
        <doc xml:whitespace="preserve">Frees all data associated with the refstring system.
Only called on shutdown.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </function>
    </record>
    <class name="RemovableMediaManager"
           c:symbol-prefix="removable_media_manager"
           c:type="RBRemovableMediaManager"
           parent="GObject.Object"
           glib:type-name="RBRemovableMediaManager"
           glib:get-type="rb_removable_media_manager_get_type"
           glib:type-struct="RemovableMediaManagerClass">
      <constructor name="new" c:identifier="rb_removable_media_manager_new">
        <doc xml:whitespace="preserve">Creates the #RBRemovableMediaManager instance.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the #RBRemovableMediaManager</doc>
          <type name="RemovableMediaManager"
                c:type="RBRemovableMediaManager*"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShell</doc>
            <type name="Shell" c:type="RBShell*"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="create_source_device" introspectable="0">
        <return-value>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
        <parameters>
          <parameter name="device" transfer-ownership="none">
            <type name="GObject.Object" c:type="GObject*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="create_source_mount" introspectable="0">
        <return-value>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
        <parameters>
          <parameter name="mount" transfer-ownership="none">
            <type name="Gio.Mount" c:type="GMount*"/>
          </parameter>
          <parameter name="device_info" transfer-ownership="none">
            <type name="MPID.Device" c:type="MPIDDevice*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="create_source_volume" introspectable="0">
        <return-value>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
        <parameters>
          <parameter name="volume" transfer-ownership="none">
            <type name="Gio.Volume" c:type="GVolume*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="medium_added">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <type name="Source" c:type="RBSource*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="scan" c:identifier="rb_removable_media_manager_scan">
        <doc xml:whitespace="preserve">Initiates a new scan of all attached media.  Newly activated plugins that use
the create-source-volume or create-source-mount signals should call this if
the 'scanned' property is %TRUE.  Otherwise, the first scan will catch any
existing volumes or mounts that the plugin is interested in.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <property name="scanned" transfer-ownership="none">
        <doc xml:whitespace="preserve">This is set to TRUE when the removable media manager has scanned
all existing volumes and mounts.  When a plugin that handles removable
media is activated, it should request a new scan if this property is
already set to TRUE.</doc>
        <type name="gboolean"/>
      </property>
      <property name="shell" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBShell instance.</doc>
        <type name="Shell"/>
      </property>
      <property name="source" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The current selected source.</doc>
        <type name="Source"/>
      </property>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <glib:signal name="create-source-device" when="last">
        <doc xml:whitespace="preserve">Emitted when a new device is detected to allow plugins to create a
corresponding #RBSource.  The first signal handler that returns a
source wins.  Plugins should only use this signal if there will be
no #GVolume or #GMount created for the device.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">a source for the device, or NULL</doc>
          <type name="Source"/>
        </return-value>
        <parameters>
          <parameter name="device" transfer-ownership="none">
            <doc xml:whitespace="preserve">the device (actually a #GUdevDevice)</doc>
            <type name="GObject.Object"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="create-source-mount" when="last">
        <doc xml:whitespace="preserve">Emitted when a new mount is added to allow plugins to create a
corresponding #RBSource.  The first signal handler that returns
a source wins.  If a source was created for the #GVolume
for a mount, then this signal will not be emitted.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">a source for the mount, or NULL</doc>
          <type name="Source"/>
        </return-value>
        <parameters>
          <parameter name="device_info" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #MPIDDevice containing information on the device</doc>
            <type name="Gio.Mount"/>
          </parameter>
          <parameter name="mount" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GMount</doc>
            <type name="MPID.Device"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="create-source-volume" when="last">
        <doc xml:whitespace="preserve">Emitted when a new volume is added to allow plugins to create a
corresponding #RBSource.  The first signal handler that returns
a source wins.  A plugin should only use this signal if it
doesn't require the volume to be mounted.  If the volume must be
mounted to be useful, use the create-source-mount signal instead.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">a source for the volume, or NULL</doc>
          <type name="Source"/>
        </return-value>
        <parameters>
          <parameter name="volume" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GVolume</doc>
            <type name="Gio.Volume"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="medium-added" when="last">
        <doc xml:whitespace="preserve">Emitted when a new source is added for a removable medium.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">the newly added #RBSource</doc>
            <type name="GObject.Object"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="RemovableMediaManagerClass"
            c:type="RBRemovableMediaManagerClass"
            glib:is-gtype-struct-for="RemovableMediaManager">
      <field name="parent_class">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="medium_added">
        <callback name="medium_added">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="mgr" transfer-ownership="none">
              <type name="RemovableMediaManager"
                    c:type="RBRemovableMediaManager*"/>
            </parameter>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="create_source_device" introspectable="0">
        <callback name="create_source_device" introspectable="0">
          <return-value>
            <type name="Source" c:type="RBSource*"/>
          </return-value>
          <parameters>
            <parameter name="mgr" transfer-ownership="none">
              <type name="RemovableMediaManager"
                    c:type="RBRemovableMediaManager*"/>
            </parameter>
            <parameter name="device" transfer-ownership="none">
              <type name="GObject.Object" c:type="GObject*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="create_source_mount" introspectable="0">
        <callback name="create_source_mount" introspectable="0">
          <return-value>
            <type name="Source" c:type="RBSource*"/>
          </return-value>
          <parameters>
            <parameter name="mgr" transfer-ownership="none">
              <type name="RemovableMediaManager"
                    c:type="RBRemovableMediaManager*"/>
            </parameter>
            <parameter name="mount" transfer-ownership="none">
              <type name="Gio.Mount" c:type="GMount*"/>
            </parameter>
            <parameter name="device_info" transfer-ownership="none">
              <type name="MPID.Device" c:type="MPIDDevice*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="create_source_volume" introspectable="0">
        <callback name="create_source_volume" introspectable="0">
          <return-value>
            <type name="Source" c:type="RBSource*"/>
          </return-value>
          <parameters>
            <parameter name="mgr" transfer-ownership="none">
              <type name="RemovableMediaManager"
                    c:type="RBRemovableMediaManager*"/>
            </parameter>
            <parameter name="volume" transfer-ownership="none">
              <type name="Gio.Volume" c:type="GVolume*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <class name="RhythmDB"
           c:symbol-prefix="rhythmdb"
           c:type="RhythmDB"
           parent="GObject.Object"
           abstract="1"
           glib:type-name="RhythmDB"
           glib:get-type="rhythmdb_get_type"
           glib:type-struct="RhythmDBClass">
      <doc xml:whitespace="preserve">RhythmDB is an in-memory database containing #RhythmDBEntry items.  It
runs queries represented as #GPtrArray&lt;!-- --&gt;s containing query criteria,
feeding the results into #RhythmDBQueryResults implementations such as
#RhythmDBQueryModel.  From there, entries are grouped by particular property
values to form #RhythmDBPropertyModel&lt;!-- --&gt;s.

#RhythmDBEntry contains a fixed set of properties, defined by #RhythmDBPropType,</doc>
      <function name="compute_status_normal"
                c:identifier="rhythmdb_compute_status_normal">
        <doc xml:whitespace="preserve">Creates a string containing the "status" information about a list of tracks.
The singular and plural strings must be used in a direct ngettext call
elsewhere in order for them to be marked for translation correctly.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the string, which should be freed with g_free.</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
        <parameters>
          <parameter name="n_songs" transfer-ownership="none">
            <doc xml:whitespace="preserve">the number of tracks.</doc>
            <type name="gint" c:type="gint"/>
          </parameter>
          <parameter name="duration" transfer-ownership="none">
            <doc xml:whitespace="preserve">the total duration of the tracks.</doc>
            <type name="glong" c:type="glong"/>
          </parameter>
          <parameter name="size" transfer-ownership="none">
            <doc xml:whitespace="preserve">the total size of the tracks.</doc>
            <type name="guint64" c:type="guint64"/>
          </parameter>
          <parameter name="singular" transfer-ownership="none">
            <doc xml:whitespace="preserve">singular form of the format string to use for entries (eg "%d song")</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="plural" transfer-ownership="none">
            <doc xml:whitespace="preserve">plural form of the format string to use for entries (eg "%d songs")</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </function>
      <function name="error_quark" c:identifier="rhythmdb_error_quark">
        <doc xml:whitespace="preserve">Returns the #GQuark used for #RhythmDBError information</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">error quark</doc>
          <type name="GLib.Quark" c:type="GQuark"/>
        </return-value>
      </function>
      <function name="get_error_entry_type"
                c:identifier="rhythmdb_get_error_entry_type">
        <doc xml:whitespace="preserve">Returns the #RhythmDBEntryType for import errors</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the entry type for import errors</doc>
          <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
        </return-value>
      </function>
      <function name="get_ignore_entry_type"
                c:identifier="rhythmdb_get_ignore_entry_type">
        <doc xml:whitespace="preserve">Returns the #RhythmDBEntryType for ignored files</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the entry type for ignored files</doc>
          <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
        </return-value>
      </function>
      <function name="get_song_entry_type"
                c:identifier="rhythmdb_get_song_entry_type">
        <doc xml:whitespace="preserve">Returns the #RhythmDBEntryType for normal songs.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the entry type for normal songs</doc>
          <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
        </return-value>
      </function>
      <function name="query_concatenate"
                c:identifier="rhythmdb_query_concatenate">
        <doc xml:whitespace="preserve">Appends @query2 to @query1.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="query1" transfer-ownership="none">
            <doc xml:whitespace="preserve">query to append to</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
          <parameter name="query2" transfer-ownership="none">
            <doc xml:whitespace="preserve">query to append</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
        </parameters>
      </function>
      <function name="query_copy" c:identifier="rhythmdb_query_copy">
        <doc xml:whitespace="preserve">Creates a copy of a query.

It must be freed with rhythmdb_query_free()</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">a copy of the passed query.</doc>
          <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
        </return-value>
        <parameters>
          <parameter name="array" transfer-ownership="none">
            <doc xml:whitespace="preserve">the query to copy.</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
        </parameters>
      </function>
      <function name="query_free" c:identifier="rhythmdb_query_free">
        <doc xml:whitespace="preserve">Frees the query @query</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">a query.</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
        </parameters>
      </function>
      <virtual-method name="entry_added">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="changes" transfer-ownership="none">
            <type name="GObject.ValueArray" c:type="GValueArray*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_deleted">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_extra_metadata_gather">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <type name="StringValueMap" c:type="RBStringValueMap*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_extra_metadata_notify">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="field" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="metadata" transfer-ownership="none">
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_extra_metadata_request">
        <return-value transfer-ownership="full">
          <type name="GObject.Value" c:type="GValue*"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_keyword_added">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="keyword" transfer-ownership="none">
            <type name="RefString" c:type="RBRefString*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_keyword_removed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="keyword" transfer-ownership="none">
            <type name="RefString" c:type="RBRefString*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_do_full_query">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
          <parameter name="results" transfer-ownership="none">
            <type name="RhythmDBQueryResults" c:type="RhythmDBQueryResults*"/>
          </parameter>
          <parameter name="cancel" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_entry_count">
        <return-value transfer-ownership="none">
          <type name="gint64" c:type="gint64"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_entry_count_by_type">
        <return-value transfer-ownership="none">
          <type name="gint64" c:type="gint64"/>
        </return-value>
        <parameters>
          <parameter name="type" transfer-ownership="none">
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_entry_delete">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_entry_delete_by_type">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="type" transfer-ownership="none">
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_entry_foreach" introspectable="0">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="func" transfer-ownership="none" closure="1">
            <type name="GLib.Func" c:type="GFunc"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_entry_foreach_by_type" introspectable="0">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="type" transfer-ownership="none">
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
          <parameter name="func" transfer-ownership="none" closure="2">
            <type name="GLib.Func" c:type="GFunc"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_entry_get">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="propid" transfer-ownership="none">
            <type name="guint" c:type="guint"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_entry_keyword_add">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="keyword" transfer-ownership="none">
            <type name="RefString" c:type="RBRefString*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_entry_keyword_has">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="keyword" transfer-ownership="none">
            <type name="RefString" c:type="RBRefString*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_entry_keyword_remove">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="keyword" transfer-ownership="none">
            <type name="RefString" c:type="RBRefString*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_entry_keywords_get" introspectable="0">
        <return-value>
          <type name="GLib.List" c:type="GList*">
            <type name="gpointer" c:type="gpointer"/>
          </type>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_entry_new">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_entry_set">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="propid" transfer-ownership="none">
            <type name="guint" c:type="guint"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_entry_type_registered">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="type" transfer-ownership="none">
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_evaluate_query">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_load" throws="1">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="cancel" transfer-ownership="none">
            <type name="Gio.Cancellable" c:type="GCancellable*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_lookup_by_id">
        <return-value transfer-ownership="full">
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
        <parameters>
          <parameter name="id" transfer-ownership="none">
            <type name="gint" c:type="gint"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_lookup_by_location">
        <return-value transfer-ownership="full">
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="RefString" c:type="RBRefString*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_save">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="load_complete">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="load_error">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="msg" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="read_only">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="readonly" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="save_complete">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="save_error">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="error" transfer-ownership="none">
            <type name="GLib.Error" c:type="GError*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="add_uri" c:identifier="rhythmdb_add_uri">
        <doc xml:whitespace="preserve">Adds the file(s) pointed to by @uri to the database, as entries of type
RHYTHMDB_ENTRY_TYPE_SONG. If the URI is that of a file, it will be added.
If the URI is that of a directory, everything under it will be added recursively.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI to add an entry/entries for</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="add_uri_with_types"
              c:identifier="rhythmdb_add_uri_with_types">
        <doc xml:whitespace="preserve">Adds the file(s) pointed to by @uri to the database, as entries
of the specified type. If the URI points to a file, it will be added.
The the URI identifies a directory, everything under it will be added
recursively.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI to add</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntryType to use for new entries</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
          <parameter name="ignore_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntryType to use for ignored files</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
          <parameter name="error_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntryType to use for import errors</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
        </parameters>
      </method>
      <method name="commit" c:identifier="rhythmdb_commit">
        <doc xml:whitespace="preserve">Apply all database changes, and send notification of changes and new entries.
This needs to be called after any changes have been made, such as a group of
rhythmdb_entry_set() calls, or a new entry has been added.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="do_full_query"
              c:identifier="rhythmdb_do_full_query"
              introspectable="0">
        <doc xml:whitespace="preserve">Synchronously evaluates @query, feeding results to @results in
chunks.  Does not return until the query is complete.
This can only be called from the main thread.

FIXME: example</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="results" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBQueryResults instance to feed results to</doc>
            <type name="RhythmDBQueryResults" c:type="RhythmDBQueryResults*"/>
          </parameter>
          <parameter transfer-ownership="none">
            <varargs>
            </varargs>
          </parameter>
        </parameters>
      </method>
      <method name="do_full_query_async"
              c:identifier="rhythmdb_do_full_query_async"
              introspectable="0">
        <doc xml:whitespace="preserve">Asynchronously runs a query specified in the function arguments
across the database, feeding matching entries to @results in chunks.
This can only be called from the main thread.

Since @results is always a @RhythmDBQueryModel,
use the RhythmDBQueryModel::complete signal to identify when the
query is complete.

FIXME: example</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="results" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBQueryResults to feed results to</doc>
            <type name="RhythmDBQueryResults" c:type="RhythmDBQueryResults*"/>
          </parameter>
          <parameter transfer-ownership="none">
            <varargs>
            </varargs>
          </parameter>
        </parameters>
      </method>
      <method name="do_full_query_async_parsed"
              c:identifier="rhythmdb_do_full_query_async_parsed">
        <doc xml:whitespace="preserve">Asynchronously runs a parsed query across the database, feeding matching
entries to @results in chunks.  This can only be called from the
main thread.

Since @results is always a @RhythmDBQueryModel,
use the RhythmDBQueryModel::complete signal to identify when the
query is complete.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="results" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBQueryResults instance to feed results to</doc>
            <type name="RhythmDBQueryResults" c:type="RhythmDBQueryResults*"/>
          </parameter>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">the query to run</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
        </parameters>
      </method>
      <method name="do_full_query_parsed"
              c:identifier="rhythmdb_do_full_query_parsed">
        <doc xml:whitespace="preserve">Synchronously evaluates the parsed query @query, feeding results
to @results in chunks.  Does not return until the query is complete.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="results" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBQueryResults instance to feed results to</doc>
            <type name="RhythmDBQueryResults" c:type="RhythmDBQueryResults*"/>
          </parameter>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">a parsed query</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
        </parameters>
      </method>
      <method name="emit_entry_added" c:identifier="rhythmdb_emit_entry_added">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="emit_entry_deleted"
              c:identifier="rhythmdb_emit_entry_deleted">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="emit_entry_extra_metadata_notify"
              c:identifier="rhythmdb_emit_entry_extra_metadata_notify">
        <doc xml:whitespace="preserve">Emits a signal describing extra metadata for the @entry.  The @property_name
argument is emitted as the ::detail part of the
"entry_extra_metadata_notify" signal and as the 'field' parameter.  Handlers
can ensure they only get metadata they are interested in by supplying an
appropriate ::detail part when connecting to the signal.  If handlers are
interested in the metadata they should ref or copy the contents of @metadata
and unref or free it when they are finished with it.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="property_name" transfer-ownership="none">
            <doc xml:whitespace="preserve">the metadata predicate</doc>
            <type name="utf8" c:type="gchar*"/>
          </parameter>
          <parameter name="metadata" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #GValue</doc>
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_count" c:identifier="rhythmdb_entry_count">
        <doc xml:whitespace="preserve">Returns the number of entries in the database.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">number of entries</doc>
          <type name="gint64" c:type="gint64"/>
        </return-value>
      </method>
      <method name="entry_count_by_type"
              c:identifier="rhythmdb_entry_count_by_type">
        <doc xml:whitespace="preserve">Returns the number of entries in the database of a particular type.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">entry count</doc>
          <type name="gint64" c:type="gint64"/>
        </return-value>
        <parameters>
          <parameter name="entry_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntryType.</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_delete" c:identifier="rhythmdb_entry_delete">
        <doc xml:whitespace="preserve">Delete entry @entry from the database, sending notification of its deletion.
This is usually used by sources where entries can disappear randomly, such
as a network source.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry.</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_delete_by_type"
              c:identifier="rhythmdb_entry_delete_by_type">
        <doc xml:whitespace="preserve">Delete all entries from the database of the given type.
This is usually used by non-permanent sources when they disappear, such as
removable media being removed, or a network share becoming unavailable.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="type" transfer-ownership="none">
            <doc xml:whitespace="preserve">type of entried to delete.</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_foreach" c:identifier="rhythmdb_entry_foreach">
        <doc xml:whitespace="preserve">Calls the given function for each of the entries in the database.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="func"
                     transfer-ownership="none"
                     scope="call"
                     closure="1">
            <doc xml:whitespace="preserve">the function to call with each entry.</doc>
            <type name="GLib.Func" c:type="GFunc"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">user data to pass to the function.</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_foreach_by_type"
              c:identifier="rhythmdb_entry_foreach_by_type">
        <doc xml:whitespace="preserve">Calls the given function for each of the entries in the database
of a given type.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the type of entry to retrieve</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
          <parameter name="func"
                     transfer-ownership="none"
                     scope="call"
                     closure="2">
            <doc xml:whitespace="preserve">the function to call with each entry</doc>
            <type name="GLib.Func" c:type="GFunc"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">user data to pass to the function.</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_gather_metadata"
              c:identifier="rhythmdb_entry_gather_metadata">
        <doc xml:whitespace="preserve">Gathers all metadata for the @entry. The returned GHashTable maps property
names and extra metadata names (described under
@rhythmdb_entry_request_extra_metadata) to GValues. Anything wanting to
provide extra metadata should connect to the "entry_extra_metadata_gather"
signal.

This must be freed using g_object_unref.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">a RBStringValueMap containing metadata for the entry.</doc>
          <type name="StringValueMap" c:type="RBStringValueMap*"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_get" c:identifier="rhythmdb_entry_get">
        <doc xml:whitespace="preserve">Gets a property of an entry, storing it in the given #GValue.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry.</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="propid" transfer-ownership="none">
            <doc xml:whitespace="preserve">the id of the property to get.</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
          <parameter name="val" transfer-ownership="none">
            <doc xml:whitespace="preserve">return location for the property value.</doc>
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_keyword_add"
              c:identifier="rhythmdb_entry_keyword_add">
        <doc xml:whitespace="preserve">Adds a keyword to an entry.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">whether the keyword was already on the entry</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry.</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="keyword" transfer-ownership="none">
            <doc xml:whitespace="preserve">the keyword to add.</doc>
            <type name="RefString" c:type="RBRefString*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_keyword_has"
              c:identifier="rhythmdb_entry_keyword_has">
        <doc xml:whitespace="preserve">Checks whether a keyword is has been added to an entry.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">whether the keyword had been added to the entry.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry.</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="keyword" transfer-ownership="none">
            <doc xml:whitespace="preserve">the keyword to check for.</doc>
            <type name="RefString" c:type="RBRefString*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_keyword_remove"
              c:identifier="rhythmdb_entry_keyword_remove">
        <doc xml:whitespace="preserve">Removed a keyword from an entry.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">whether the keyword had previously been added to the entry.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry.</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="keyword" transfer-ownership="none">
            <doc xml:whitespace="preserve">the keyword to remove.</doc>
            <type name="RefString" c:type="RBRefString*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_keywords_get"
              c:identifier="rhythmdb_entry_keywords_get">
        <doc xml:whitespace="preserve">Gets the list ofkeywords that have been added to an entry.

that have been added to the entry.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the list of keywords</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="RefString"/>
          </type>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry.</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_lookup_by_id"
              c:identifier="rhythmdb_entry_lookup_by_id">
        <doc xml:whitespace="preserve">Looks up the entry with id @id.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the entry with id @id, or NULL if no such entry exists.</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
        <parameters>
          <parameter name="id" transfer-ownership="none">
            <doc xml:whitespace="preserve">entry ID</doc>
            <type name="gint" c:type="gint"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_lookup_by_location"
              c:identifier="rhythmdb_entry_lookup_by_location">
        <doc xml:whitespace="preserve">Looks up the entry with location @uri.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the entry with location @uri, or NULL if no such entry exists.</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI of the entry to lookup.</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_lookup_from_string"
              c:identifier="rhythmdb_entry_lookup_from_string">
        <doc xml:whitespace="preserve">Locates an entry using a string containing either an entry ID
or a location.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the entry matching the string, or NULL if no such entry exists.</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
        <parameters>
          <parameter name="str" transfer-ownership="none">
            <doc xml:whitespace="preserve">string</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="is_id" transfer-ownership="none">
            <doc xml:whitespace="preserve">whether the string is an entry ID or a location.</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_matches_ext_db_key"
              c:identifier="rhythmdb_entry_matches_ext_db_key">
        <doc xml:whitespace="preserve">Checks whether @key matches @entry.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the key matches the entry</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="key" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RBExtDBKey</doc>
            <type name="ExtDBKey" c:type="RBExtDBKey*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_move_to_trash"
              c:identifier="rhythmdb_entry_move_to_trash">
        <doc xml:whitespace="preserve">Trashes the file represented by #entry.  If possible, the file is
moved to the user's trash directory and the entry is set to hidden,
otherwise the error will be stored as the playback error for the entry.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">#RhythmDBEntry to trash</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_request_extra_metadata"
              c:identifier="rhythmdb_entry_request_extra_metadata">
        <doc xml:whitespace="preserve">Emits a request for extra metadata for the @entry.
The @property_name argument is emitted as the ::detail part of the
"entry_extra_metadata_request" signal. It should be a namespaced RDF
predicate e.g. from Dublin Core, MusicBrainz, or internal to Rhythmbox
(namespace "rb:"). Suitable predicates would be those that are expensive to
acquire or only apply to a limited range of entries.
Handlers capable of providing a particular predicate may ensure they only
see appropriate requests by supplying an appropriate ::detail part when
connecting to the signal. Upon a handler returning a non-%NULL value,
emission will be stopped and the value returned to the caller; if no
handlers return a non-%NULL value, the caller will receive %NULL. Priority
is determined by signal connection order, with %G_CONNECT_AFTER providing a
second, lower rank of priority.
A handler returning a value should do so in a #GValue allocated on the heap;
the accumulator will take ownership. The caller should unset and free the
#GValue if non-%NULL when finished with it.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">an allocated, initialised, set #GValue, or NULL</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="property_name" transfer-ownership="none">
            <doc xml:whitespace="preserve">the metadata predicate</doc>
            <type name="utf8" c:type="gchar*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_set" c:identifier="rhythmdb_entry_set">
        <doc xml:whitespace="preserve">This function can be called by any code which wishes to change a
song property and send a notification.  It may be called when the
database is read-only; in this case the change will be queued for
an unspecified time in the future.  The implication of this is that
rhythmdb_entry_get() may not reflect the changes immediately.  However,
if this property is exposed in the user interface, you should still
make the change in the widget.  Then when the database returns to a
writable state, your change will take effect in the database too,
and a notification will be sent at that point.

Note that you must call rhythmdb_commit() at some point after invoking
this function, and that even after the commit, your change may not
have taken effect.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry.</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="propid" transfer-ownership="none">
            <doc xml:whitespace="preserve">the id of the property to set.</doc>
            <type name="guint" c:type="guint"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <doc xml:whitespace="preserve">the property value.</doc>
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_type_get_by_name"
              c:identifier="rhythmdb_entry_type_get_by_name">
        <doc xml:whitespace="preserve">Locates a #RhythmDBEntryType by name. Returns NULL if no entry
type is registered with the specified name.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the #RhythmDBEntryType</doc>
          <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of the type to look for</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_write_metadata_changes"
              c:identifier="rhythmdb_entry_write_metadata_changes"
              introspectable="0"
              throws="1">
        <doc xml:whitespace="preserve">This can be called from a #RhythmDBEntryType sync_metadata function
when the appropriate action is to write the metadata changes
to the file at the entry's location.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry to update</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="changes" transfer-ownership="none">
            <doc xml:whitespace="preserve">a list of changes to write</doc>
            <type name="GLib.SList" c:type="GSList*">
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </parameter>
        </parameters>
      </method>
      <method name="evaluate_query" c:identifier="rhythmdb_evaluate_query">
        <doc xml:whitespace="preserve">Evaluates the given entry against the given query.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">whether the given entry matches the criteria of the given query.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">a query.</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a @RhythmDBEntry.</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_progress_info"
              c:identifier="rhythmdb_get_progress_info">
        <doc xml:whitespace="preserve">Provides progress information for rhythmdb operations, if any are running.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="text" transfer-ownership="none">
            <doc xml:whitespace="preserve">used to return progress text</doc>
            <type name="utf8" c:type="char**"/>
          </parameter>
          <parameter name="progress" transfer-ownership="none">
            <doc xml:whitespace="preserve">used to return progress fraction</doc>
            <type name="gfloat" c:type="float*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_property_type"
              c:identifier="rhythmdb_get_property_type">
        <doc xml:whitespace="preserve">Returns the #GType for the value of the property.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">property value type</doc>
          <type name="GType" c:type="GType"/>
        </return-value>
        <parameters>
          <parameter name="property_id" transfer-ownership="none">
            <doc xml:whitespace="preserve">a property ID (#RhythmDBPropType)</doc>
            <type name="guint" c:type="guint"/>
          </parameter>
        </parameters>
      </method>
      <method name="is_busy" c:identifier="rhythmdb_is_busy">
        <doc xml:whitespace="preserve">Checks if the database has events to process.  This probably isn't
very useful.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">whether the #RhythmDB has events to process.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="load" c:identifier="rhythmdb_load">
        <doc xml:whitespace="preserve">Load the database from disk.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="nice_elt_name_from_propid"
              c:identifier="rhythmdb_nice_elt_name_from_propid">
        <doc xml:whitespace="preserve">Returns a short non-translated name for the property #propid.
This name is suitable for use as an XML tag name, for example.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">property ID name, must not be freed</doc>
          <type name="libxml2.Char" c:type="xmlChar*"/>
        </return-value>
        <parameters>
          <parameter name="propid" transfer-ownership="none">
            <doc xml:whitespace="preserve">property ID</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </method>
      <method name="propid_from_nice_elt_name"
              c:identifier="rhythmdb_propid_from_nice_elt_name">
        <doc xml:whitespace="preserve">Converts a property name returned by @rhythmdb_propid_from_nice_elt_name
back to a #RhythmDBPropType.  If the name does not match a property ID,
-1 will be returned instead.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">a #RhythmDBPropType, or -1</doc>
          <type name="gint" c:type="int"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">a property ID name</doc>
            <type name="libxml2.Char" c:type="xmlChar*"/>
          </parameter>
        </parameters>
      </method>
      <method name="query_append"
              c:identifier="rhythmdb_query_append"
              introspectable="0">
        <doc xml:whitespace="preserve">Appends new criteria to the query @query.

The list of criteria must be in the same format as for rhythmdb_query_parse,
and ended by RHYTHMDB_QUERY_END.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">a query.</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
          <parameter transfer-ownership="none">
            <varargs>
            </varargs>
          </parameter>
        </parameters>
      </method>
      <method name="query_append_params"
              c:identifier="rhythmdb_query_append_params">
        <doc xml:whitespace="preserve">Appends a new query term to @query.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">the query to append to</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
          <parameter name="type" transfer-ownership="none">
            <doc xml:whitespace="preserve">query type</doc>
            <type name="RhythmDBQueryType" c:type="RhythmDBQueryType"/>
          </parameter>
          <parameter name="prop" transfer-ownership="none">
            <doc xml:whitespace="preserve">query property</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <doc xml:whitespace="preserve">query value</doc>
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </method>
      <method name="query_append_prop_multiple"
              c:identifier="rhythmdb_query_append_prop_multiple">
        <doc xml:whitespace="preserve">Appends a set of criteria to a query to match against any of the values
listed in @items.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">the query to append to</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
          <parameter name="propid" transfer-ownership="none">
            <doc xml:whitespace="preserve">property ID to match</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
          <parameter name="items" transfer-ownership="none">
            <doc xml:whitespace="preserve">#GList of values to match against</doc>
            <type name="GLib.List" c:type="GList*">
              <type name="GObject.Value"/>
            </type>
          </parameter>
        </parameters>
      </method>
      <method name="query_deserialize"
              c:identifier="rhythmdb_query_deserialize">
        <doc xml:whitespace="preserve">Converts a serialized query back into a @GPtrArray query.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">deserialized query.</doc>
          <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
        </return-value>
        <parameters>
          <parameter name="parent" transfer-ownership="none">
            <doc xml:whitespace="preserve">parent XML node of serialized query</doc>
            <type name="libxml2.NodePtr" c:type="xmlNodePtr"/>
          </parameter>
        </parameters>
      </method>
      <method name="query_is_time_relative"
              c:identifier="rhythmdb_query_is_time_relative">
        <doc xml:whitespace="preserve">Checks if a query contains any time-relative criteria.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if time-relative criteria found</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">the query to check</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
        </parameters>
      </method>
      <method name="query_parse"
              c:identifier="rhythmdb_query_parse"
              introspectable="0">
        <doc xml:whitespace="preserve">Creates a query from a list of criteria.

Most criteria consists of an operator (#RhythmDBQueryType),
a property (#RhythmDBPropType) and the data to compare with. An entry
matches a criteria if the operator returns true with the value of the
entries property as the first argument, and the given data as the second
argument.

Three types criteria are special. Passing RHYTHMDB_QUERY_END indicates the
end of the list of criteria, and must be the last passes parameter.

The second special criteria is a subquery which is defined by passing
RHYTHMDB_QUERY_SUBQUERY, followed by a query (#GPtrArray). An entry will
match a subquery criteria if it matches all criteria in the subquery.

The third special criteria is a disjunction which is defined by passing
RHYTHMDB_QUERY_DISJUNCTION, which will make an entry match the query if
it matches the criteria before the disjunction, the criteria after the
disjunction, or both.

Example:
rhythmdb_query_parse (db,
RHYTHMDB_QUERY_SUBQUERY, subquery,
RHYTHMDB_QUERY_DISJUNCTION
RHYTHMDB_QUERY_PROP_LIKE, RHYTHMDB_PROP_TITLE, "cat",
RHYTHMDB_QUERY_DISJUNCTION
RHYTHMDB_QUERY_PROP_GREATER, RHYTHMDB_PROP_RATING, 2.5,
RHYTHMDB_QUERY_PROP_LESS, RHYTHMDB_PROP_PLAY_COUNT, 10,
RHYTHMDB_QUERY_END);

will create a query that matches entries:
a) that match the query "subquery", or
b) that have "cat" in their title, or
c) have a rating of at least 2.5, and a play count of at most 10

It must be freed with rhythmdb_query_free()</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">a the newly created query.</doc>
          <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
        </return-value>
        <parameters>
          <parameter transfer-ownership="none">
            <varargs>
            </varargs>
          </parameter>
        </parameters>
      </method>
      <method name="query_preprocess" c:identifier="rhythmdb_query_preprocess">
        <doc xml:whitespace="preserve">Preprocesses a query to prepare it for execution.  This has two main
roles: to perform expensive data transformations once per query, rather
than once per entry, and converting criteria to lower-level forms that
are implemented by the database backend.

For RHYTHMDB_PROP_SEARCH_MATCH, this converts the search terms into
an array of case-folded words.

When matching against case-folded properties such as
#RHYTHMDB_PROP_TITLE_FOLDED, this case-folds the query value.

When performing year-based criteria such as #RHYTHMDB_QUERY_PROP_YEAR_LESS,
it converts the year into the Julian date such that a simple numeric
comparison will work.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">query to preprocess</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
        </parameters>
      </method>
      <method name="query_serialize" c:identifier="rhythmdb_query_serialize">
        <doc xml:whitespace="preserve">Converts @query into XML form as a child of @parent.  It can be converted
back into a query by passing @parent to @rhythmdb_query_deserialize.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">query to serialize</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
          <parameter name="parent" transfer-ownership="none">
            <doc xml:whitespace="preserve">XML node to attach the query to</doc>
            <type name="libxml2.NodePtr" c:type="xmlNodePtr"/>
          </parameter>
        </parameters>
      </method>
      <method name="query_to_string" c:identifier="rhythmdb_query_to_string">
        <doc xml:whitespace="preserve">Returns a supposedly human-readable form of the query.
This is only intended for debug usage.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">allocated string form of the query</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">a query.</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </parameter>
        </parameters>
      </method>
      <method name="register_entry_type"
              c:identifier="rhythmdb_register_entry_type">
        <doc xml:whitespace="preserve">Registers a new entry type.  An entry type must be registered before
any entries can be created for it.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new entry type to register</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
        </parameters>
      </method>
      <method name="save" c:identifier="rhythmdb_save">
        <doc xml:whitespace="preserve">Save the database to disk, not returning until it has been saved.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="save_async" c:identifier="rhythmdb_save_async">
        <doc xml:whitespace="preserve">Save the database to disk, asynchronously.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="shutdown" c:identifier="rhythmdb_shutdown">
        <doc xml:whitespace="preserve">Ceases all #RhythmDB operations, including stopping all directory monitoring, and
removing all actions and events currently queued.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="start_action_thread"
              c:identifier="rhythmdb_start_action_thread">
        <doc xml:whitespace="preserve">Starts the #RhythmDB processing thread. Needs to be called during startup.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <property name="dry-run" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">If %TRUE, no metadata changes will be written back to media fies.</doc>
        <type name="gboolean"/>
      </property>
      <property name="name" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">Database name.  Not sure whta this is used for.</doc>
        <type name="utf8"/>
      </property>
      <property name="no-update" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">If %TRUE, the database will not be updated.</doc>
        <type name="gboolean"/>
      </property>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="RhythmDBPrivate" c:type="RhythmDBPrivate*"/>
      </field>
      <glib:signal name="create-mount-op" when="last">
        <doc xml:whitespace="preserve">Emitted to request creation of a #GMountOperation to use to mount a volume.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">a #GMountOperation (usually actually a #GtkMountOperation)</doc>
          <type name="Gio.MountOperation"/>
        </return-value>
      </glib:signal>
      <glib:signal name="entry-added" when="last">
        <doc xml:whitespace="preserve">Emitted when a new entry is added to the database.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the newly added #RhythmDBEntry</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="entry-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when a database entry is modified.  The @changes list
contains a structure for each entry property that has been modified.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the changed #RhythmDBEntry</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
          <parameter name="changes" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #GValueArray of #RhythmDBEntryChange structures describing the changes</doc>
            <type name="GObject.ValueArray"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="entry-deleted" when="last">
        <doc xml:whitespace="preserve">Emitted when an entry is deleted from the database.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the deleted #RhythmDBEntry</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="entry-extra-metadata-gather" when="last">
        <doc xml:whitespace="preserve">Emitted to gather all available extra metadata for a database entry.
Handlers for this signal should insert any metadata they can provide
into the string-value map.  Only immediately available metadata
items should be returned.  If one or more metadata items is not
immediately available, the handler should not initiate an attempt to
retrieve them.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry for which to gather metadata</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RBStringValueMap to hold the gathered metadata</doc>
            <type name="StringValueMap"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="entry-extra-metadata-notify" when="last" detailed="1">
        <doc xml:whitespace="preserve">This signal is emitted when an extra metadata value is provided for a specific
entry independantly of an extra metadata request.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry for which extra metadata has been supplied</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
          <parameter name="field" transfer-ownership="none">
            <doc xml:whitespace="preserve">the extra metadata field being supplied</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="metadata" transfer-ownership="none">
            <doc xml:whitespace="preserve">the extra metadata value</doc>
            <type name="GObject.Value"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="entry-extra-metadata-request"
                   when="last"
                   detailed="1">
        <doc xml:whitespace="preserve">This signal is emitted to allow extra (transient) metadata to be supplied
for the given entry.  The detail of the signal invocation describes the
specific metadata value being requested.  If the object handling the signal
can provide the requested item, but it isn't immediately available, it can
initiate an attempt to retrieve it.  If successful, it would call
@rhythmdb_emit_entry_extra_metadata_notify when the metadata is available.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the extra metadata value</doc>
          <type name="GObject.Value"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry for which extra metadata is being requested</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="entry-keyword-added" when="last">
        <doc xml:whitespace="preserve">Emitted when a keyword is added to an entry.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry to which a keyword has been added</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
          <parameter name="keyword" transfer-ownership="none">
            <doc xml:whitespace="preserve">the keyword that was added</doc>
            <type name="RefString"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="entry-keyword-removed" when="last">
        <doc xml:whitespace="preserve">Emitted when a keyword is removed from an entry.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry from which a keyword has been removed</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
          <parameter name="keyword" transfer-ownership="none">
            <doc xml:whitespace="preserve">the keyword that was removed</doc>
            <type name="RefString"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="load-complete" when="last">
        <doc xml:whitespace="preserve">Emitted when the database is fully loaded.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
      <glib:signal name="read-only" when="last">
        <doc xml:whitespace="preserve">Emitted when the database becomes temporarily read-only, or becomes
writeable after being read-only.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="readonly" transfer-ownership="none">
            <doc xml:whitespace="preserve">%TRUE if the database is read-only</doc>
            <type name="gboolean"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="save-complete" when="last">
        <doc xml:whitespace="preserve">Emitted when the database has been saved.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
      <glib:signal name="save-error" when="last">
        <doc xml:whitespace="preserve">Emitted when an error occurs while saving the database.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">URI of the database file</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="error" transfer-ownership="none">
            <doc xml:whitespace="preserve">the error that occurred</doc>
            <type name="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="RhythmDBClass"
            c:type="RhythmDBClass"
            glib:is-gtype-struct-for="RhythmDB">
      <field name="parent">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="entry_added">
        <callback name="entry_added">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entry_changed">
        <callback name="entry_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="changes" transfer-ownership="none">
              <type name="GObject.ValueArray" c:type="GValueArray*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entry_deleted">
        <callback name="entry_deleted">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entry_keyword_added">
        <callback name="entry_keyword_added">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="keyword" transfer-ownership="none">
              <type name="RefString" c:type="RBRefString*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entry_keyword_removed">
        <callback name="entry_keyword_removed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="keyword" transfer-ownership="none">
              <type name="RefString" c:type="RBRefString*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entry_extra_metadata_request">
        <callback name="entry_extra_metadata_request">
          <return-value transfer-ownership="full">
            <type name="GObject.Value" c:type="GValue*"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entry_extra_metadata_gather">
        <callback name="entry_extra_metadata_gather">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="data" transfer-ownership="none">
              <type name="StringValueMap" c:type="RBStringValueMap*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entry_extra_metadata_notify">
        <callback name="entry_extra_metadata_notify">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="field" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="metadata" transfer-ownership="none">
              <type name="GObject.Value" c:type="GValue*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="load_complete">
        <callback name="load_complete">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="save_complete">
        <callback name="save_complete">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="load_error">
        <callback name="load_error">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="msg" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="save_error">
        <callback name="save_error">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="error" transfer-ownership="none">
              <type name="GLib.Error" c:type="GError*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="read_only">
        <callback name="read_only">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="readonly" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_load">
        <callback name="impl_load" throws="1">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="cancel" transfer-ownership="none">
              <type name="Gio.Cancellable" c:type="GCancellable*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_save">
        <callback name="impl_save">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_new">
        <callback name="impl_entry_new">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_set">
        <callback name="impl_entry_set">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="propid" transfer-ownership="none">
              <type name="guint" c:type="guint"/>
            </parameter>
            <parameter name="value" transfer-ownership="none">
              <type name="GObject.Value" c:type="GValue*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_get">
        <callback name="impl_entry_get">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="propid" transfer-ownership="none">
              <type name="guint" c:type="guint"/>
            </parameter>
            <parameter name="value" transfer-ownership="none">
              <type name="GObject.Value" c:type="GValue*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_delete">
        <callback name="impl_entry_delete">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_delete_by_type">
        <callback name="impl_entry_delete_by_type">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="type" transfer-ownership="none">
              <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_lookup_by_location">
        <callback name="impl_lookup_by_location">
          <return-value transfer-ownership="full">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="RefString" c:type="RBRefString*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_lookup_by_id">
        <callback name="impl_lookup_by_id">
          <return-value transfer-ownership="full">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="id" transfer-ownership="none">
              <type name="gint" c:type="gint"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_evaluate_query">
        <callback name="impl_evaluate_query">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="query" transfer-ownership="none">
              <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_foreach" introspectable="0">
        <callback name="impl_entry_foreach" introspectable="0">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="func" transfer-ownership="none" closure="2">
              <type name="GLib.Func" c:type="GFunc"/>
            </parameter>
            <parameter name="data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_count">
        <callback name="impl_entry_count">
          <return-value transfer-ownership="none">
            <type name="gint64" c:type="gint64"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_foreach_by_type" introspectable="0">
        <callback name="impl_entry_foreach_by_type" introspectable="0">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="type" transfer-ownership="none">
              <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
            </parameter>
            <parameter name="func" transfer-ownership="none" closure="3">
              <type name="GLib.Func" c:type="GFunc"/>
            </parameter>
            <parameter name="data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_count_by_type">
        <callback name="impl_entry_count_by_type">
          <return-value transfer-ownership="none">
            <type name="gint64" c:type="gint64"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="type" transfer-ownership="none">
              <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_do_full_query">
        <callback name="impl_do_full_query">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="query" transfer-ownership="none">
              <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
            </parameter>
            <parameter name="results" transfer-ownership="none">
              <type name="RhythmDBQueryResults"
                    c:type="RhythmDBQueryResults*"/>
            </parameter>
            <parameter name="cancel" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_type_registered">
        <callback name="impl_entry_type_registered">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="type" transfer-ownership="none">
              <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_keyword_add">
        <callback name="impl_entry_keyword_add">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="keyword" transfer-ownership="none">
              <type name="RefString" c:type="RBRefString*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_keyword_remove">
        <callback name="impl_entry_keyword_remove">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="keyword" transfer-ownership="none">
              <type name="RefString" c:type="RBRefString*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_keyword_has">
        <callback name="impl_entry_keyword_has">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="keyword" transfer-ownership="none">
              <type name="RefString" c:type="RBRefString*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_entry_keywords_get" introspectable="0">
        <callback name="impl_entry_keywords_get" introspectable="0">
          <return-value>
            <type name="GLib.List" c:type="GList*">
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </return-value>
          <parameters>
            <parameter name="db" transfer-ownership="none">
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="RhythmDBEntry"
            c:type="RhythmDBEntry"
            glib:type-name="RhythmDBEntry"
            glib:get-type="rhythmdb_entry_get_type"
            c:symbol-prefix="rhythmdb_entry">
      <constructor name="example_new"
                   c:identifier="rhythmdb_entry_example_new">
        <doc xml:whitespace="preserve">Creates a new sample entry of type @type and location @uri, it does not insert
it into the database.  This is indended for use as a example entry.

This may return NULL if entry creation fails.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the newly created #RhythmDBEntry</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDB.</doc>
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="type" transfer-ownership="none">
            <doc xml:whitespace="preserve">type of entry to create</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the location of the entry, this be unique amongst all entries.</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new" c:identifier="rhythmdb_entry_new">
        <doc xml:whitespace="preserve">Creates a new entry of type @type and location @uri, and inserts
it into the database. You must call rhythmdb_commit() at some  point
after invoking this function.

This may return NULL if entry creation fails. This can occur if there is
already an entry with the given uri.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the newly created #RhythmDBEntry</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDB.</doc>
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="type" transfer-ownership="none">
            <doc xml:whitespace="preserve">type of entry to create</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the location of the entry, this be unique amongst all entries.</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </constructor>
      <method name="can_sync_metadata"
              c:identifier="rhythmdb_entry_can_sync_metadata">
        <doc xml:whitespace="preserve">Calls the entry type's method to check if it can sync metadata for @entry.
Usually this is only true for entries backed by files, where tag-writing is
enabled, and the appropriate tag-writing facilities are available.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the entry can be synced</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="create_ext_db_key"
              c:identifier="rhythmdb_entry_create_ext_db_key">
        <doc xml:whitespace="preserve">Creates a #RBExtDBKey for finding external metadata
for a given property.  This is mostly useful for finding album or
track related data.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the new #RBExtDBKey</doc>
          <type name="ExtDBKey" c:type="RBExtDBKey*"/>
        </return-value>
        <parameters>
          <parameter name="prop" transfer-ownership="none">
            <doc xml:whitespace="preserve">the primary #RhythmDBPropType for metadata lookups</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </method>
      <method name="created" c:identifier="rhythmdb_entry_created">
        <doc xml:whitespace="preserve">Calls the entry type's post-creation method for @entry.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="dup_string" c:identifier="rhythmdb_entry_dup_string">
        <return-value transfer-ownership="full">
          <type name="utf8" c:type="char*"/>
        </return-value>
        <parameters>
          <parameter name="propid" transfer-ownership="none">
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_boolean" c:identifier="rhythmdb_entry_get_boolean">
        <doc xml:whitespace="preserve">Returns the value of a boolean property of @entry.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">property value</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="propid" transfer-ownership="none">
            <doc xml:whitespace="preserve">property to return</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_double" c:identifier="rhythmdb_entry_get_double">
        <doc xml:whitespace="preserve">Returns the value of a double-precision floating point property of @value.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">property value</doc>
          <type name="gdouble" c:type="double"/>
        </return-value>
        <parameters>
          <parameter name="propid" transfer-ownership="none">
            <doc xml:whitespace="preserve">the property to return</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_entry_type"
              c:identifier="rhythmdb_entry_get_entry_type">
        <doc xml:whitespace="preserve">Returns the #RhythmDBEntryType for @entry.  This is used to access
entry type properties, to check that entries are of the same type,
and to call entry type methods.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the #RhythmDBEntryType for @entry</doc>
          <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
        </return-value>
      </method>
      <method name="get_object" c:identifier="rhythmdb_entry_get_object">
        <doc xml:whitespace="preserve">Returns the value of an object property of @entry.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">property value</doc>
          <type name="GObject.Object" c:type="GObject*"/>
        </return-value>
        <parameters>
          <parameter name="propid" transfer-ownership="none">
            <doc xml:whitespace="preserve">the property to return</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_playback_uri"
              c:identifier="rhythmdb_entry_get_playback_uri">
        <doc xml:whitespace="preserve">Returns an allocated string containing the playback URI for @entry,
or NULL if the entry cannot be played.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">playback URI or NULL</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
      </method>
      <method name="get_refstring" c:identifier="rhythmdb_entry_get_refstring">
        <doc xml:whitespace="preserve">Returns an #RBRefString containing a string property of @entry.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">a #RBRefString, must be unreffed by caller.</doc>
          <type name="RefString" c:type="RBRefString*"/>
        </return-value>
        <parameters>
          <parameter name="propid" transfer-ownership="none">
            <doc xml:whitespace="preserve">the property to return</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_string" c:identifier="rhythmdb_entry_get_string">
        <doc xml:whitespace="preserve">Returns the value of a string property of #entry.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">property value, must not be freed</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
        <parameters>
          <parameter name="propid" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBPropType to return</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_type_data" c:identifier="rhythmdb_entry_get_type_data">
        <doc xml:whitespace="preserve">Retrieves a pointer to the entry's type-specific data, checking that
the size of the data structure matches what is expected.
Callers should use the RHYTHMDB_ENTRY_GET_TYPE_DATA macro for
a slightly more friendly interface to this functionality.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">type-specific data pointer</doc>
          <type name="gpointer" c:type="gpointer"/>
        </return-value>
        <parameters>
          <parameter name="expected_size" transfer-ownership="none">
            <doc xml:whitespace="preserve">expected size of the type-specific data.</doc>
            <type name="guint" c:type="guint"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_uint64" c:identifier="rhythmdb_entry_get_uint64">
        <doc xml:whitespace="preserve">Returns the value of a 64bit unsigned integer property.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">property value</doc>
          <type name="guint64" c:type="guint64"/>
        </return-value>
        <parameters>
          <parameter name="propid" transfer-ownership="none">
            <doc xml:whitespace="preserve">property to return</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_ulong" c:identifier="rhythmdb_entry_get_ulong">
        <doc xml:whitespace="preserve">Returns the value of an unsigned long integer property of @entry.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">property value</doc>
          <type name="gulong" c:type="gulong"/>
        </return-value>
        <parameters>
          <parameter name="propid" transfer-ownership="none">
            <doc xml:whitespace="preserve">property to return</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </method>
      <method name="is_lossless" c:identifier="rhythmdb_entry_is_lossless">
        <doc xml:whitespace="preserve">Checks if @entry represents a file that is losslessly encoded.
An entry is considered lossless if it has no bitrate value and
its media type is "audio/x-flac".  Other lossless encoding types
may be added in the future.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if @entry is lossless</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="pre_destroy" c:identifier="rhythmdb_entry_pre_destroy">
        <doc xml:whitespace="preserve">Calls the entry type's pre-deletion method for @entry.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="ref" c:identifier="rhythmdb_entry_ref">
        <doc xml:whitespace="preserve">Increase the reference count of the entry.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the entry</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
      </method>
      <method name="sync_metadata"
              c:identifier="rhythmdb_entry_sync_metadata"
              introspectable="0"
              throws="1">
        <doc xml:whitespace="preserve">Calls the entry type's method to sync metadata changes for @entry.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="changes" transfer-ownership="none">
            <doc xml:whitespace="preserve">a list of #RhythmDBEntryChange structures</doc>
            <type name="GLib.SList" c:type="GSList*">
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </parameter>
        </parameters>
      </method>
      <method name="unref" c:identifier="rhythmdb_entry_unref">
        <doc xml:whitespace="preserve">Decrease the reference count of the entry, and destroys it if there are
no references left.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="update_availability"
              c:identifier="rhythmdb_entry_update_availability">
        <doc xml:whitespace="preserve">Updates @entry to reflect its new availability.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="avail" transfer-ownership="none">
            <doc xml:whitespace="preserve">an availability event</doc>
            <type name="RhythmDBEntryAvailability"
                  c:type="RhythmDBEntryAvailability"/>
          </parameter>
        </parameters>
      </method>
    </record>
    <enumeration name="RhythmDBEntryAvailability"
                 glib:type-name="RhythmDBEntryAvailability"
                 glib:get-type="rhythmdb_entry_availability_get_type"
                 c:type="RhythmDBEntryAvailability">
      <doc xml:whitespace="preserve">Various events that can result in changes to the entry's availability.</doc>
      <member name="checked"
              value="0"
              c:identifier="RHYTHMDB_ENTRY_AVAIL_CHECKED"
              glib:nick="checked"/>
      <member name="mounted"
              value="1"
              c:identifier="RHYTHMDB_ENTRY_AVAIL_MOUNTED"
              glib:nick="mounted"/>
      <member name="unmounted"
              value="2"
              c:identifier="RHYTHMDB_ENTRY_AVAIL_UNMOUNTED"
              glib:nick="unmounted"/>
      <member name="not_found"
              value="3"
              c:identifier="RHYTHMDB_ENTRY_AVAIL_NOT_FOUND"
              glib:nick="not-found"/>
    </enumeration>
    <enumeration name="RhythmDBEntryCategory"
                 glib:type-name="RhythmDBEntryCategory"
                 glib:get-type="rhythmdb_entry_category_get_type"
                 c:type="RhythmDBEntryCategory">
      <doc xml:whitespace="preserve">Categories used to group entry types.  These are used in a few places to control
handling of entries.</doc>
      <member name="normal"
              value="0"
              c:identifier="RHYTHMDB_ENTRY_NORMAL"
              glib:nick="normal"/>
      <member name="stream"
              value="1"
              c:identifier="RHYTHMDB_ENTRY_STREAM"
              glib:nick="stream"/>
      <member name="container"
              value="2"
              c:identifier="RHYTHMDB_ENTRY_CONTAINER"
              glib:nick="container"/>
      <member name="virtual"
              value="3"
              c:identifier="RHYTHMDB_ENTRY_VIRTUAL"
              glib:nick="virtual"/>
    </enumeration>
    <record name="RhythmDBEntryChange"
            c:type="RhythmDBEntryChange"
            glib:type-name="RhythmDBEntryChange"
            glib:get-type="rhythmdb_entry_change_get_type"
            c:symbol-prefix="rhythmdb_entry_change">
      <field name="prop" writable="1">
        <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
      </field>
      <field name="old" writable="1">
        <type name="GObject.Value" c:type="GValue"/>
      </field>
      <field name="new" writable="1">
        <type name="GObject.Value" c:type="GValue"/>
      </field>
    </record>
    <class name="RhythmDBEntryType"
           c:symbol-prefix="rhythmdb_entry_type"
           c:type="RhythmDBEntryType"
           parent="GObject.Object"
           glib:type-name="RhythmDBEntryType"
           glib:get-type="rhythmdb_entry_type_get_type"
           glib:type-struct="RhythmDBEntryTypeClass">
      <virtual-method name="can_sync_metadata">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="destroy_entry">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_created">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="get_playback_uri">
        <return-value transfer-ownership="full">
          <type name="utf8" c:type="char*"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="sync_metadata" introspectable="0" throws="1">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="changes" transfer-ownership="none">
            <type name="GLib.SList" c:type="GSList*">
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="update_availability">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="avail" transfer-ownership="none">
            <type name="RhythmDBEntryAvailability"
                  c:type="RhythmDBEntryAvailability"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="get_name" c:identifier="rhythmdb_entry_type_get_name">
        <doc xml:whitespace="preserve">Returns the name of the entry type</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">entry type name</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
      </method>
      <property name="category"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RhythmDBEntryCategory that this entry type fits into.</doc>
        <type name="RhythmDBEntryCategory"/>
      </property>
      <property name="db"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <type name="RhythmDB"/>
      </property>
      <property name="has-playlists" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">If %TRUE, entries of this type can be added to playlists.</doc>
        <type name="gboolean"/>
      </property>
      <property name="name"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">Entry type name.  This must be unique.</doc>
        <type name="utf8"/>
      </property>
      <property name="save-to-disk"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">If %TRUE, entries of this type should be written to the
on-disk database.</doc>
        <type name="gboolean"/>
      </property>
      <property name="type-data-size"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The size of the type-specific data structure to allocate for each
entry of this type.</doc>
        <type name="guint"/>
      </property>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="RhythmDBEntryTypePrivate"
              c:type="RhythmDBEntryTypePrivate*"/>
      </field>
    </class>
    <callback name="RhythmDBEntryTypeBooleanFunc"
              c:type="RhythmDBEntryTypeBooleanFunc">
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="entry_type" transfer-ownership="none">
          <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
        </parameter>
        <parameter name="entry" transfer-ownership="none">
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </parameter>
      </parameters>
    </callback>
    <record name="RhythmDBEntryTypeClass"
            c:type="RhythmDBEntryTypeClass"
            glib:is-gtype-struct-for="RhythmDBEntryType">
      <field name="parent_class">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="entry_created">
        <callback name="entry_created">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="etype" transfer-ownership="none">
              <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="destroy_entry">
        <callback name="destroy_entry">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="etype" transfer-ownership="none">
              <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="get_playback_uri">
        <callback name="get_playback_uri">
          <return-value transfer-ownership="full">
            <type name="utf8" c:type="char*"/>
          </return-value>
          <parameters>
            <parameter name="etype" transfer-ownership="none">
              <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="update_availability">
        <callback name="update_availability">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="etype" transfer-ownership="none">
              <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="avail" transfer-ownership="none">
              <type name="RhythmDBEntryAvailability"
                    c:type="RhythmDBEntryAvailability"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="can_sync_metadata">
        <callback name="can_sync_metadata">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="etype" transfer-ownership="none">
              <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="sync_metadata" introspectable="0">
        <callback name="sync_metadata" introspectable="0" throws="1">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="etype" transfer-ownership="none">
              <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="changes" transfer-ownership="none">
              <type name="GLib.SList" c:type="GSList*">
                <type name="gpointer" c:type="gpointer"/>
              </type>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="RhythmDBEntryTypePrivate"
            c:type="RhythmDBEntryTypePrivate"
            disguised="1">
    </record>
    <callback name="RhythmDBEntryTypeStringFunc"
              c:type="RhythmDBEntryTypeStringFunc">
      <return-value transfer-ownership="full">
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="entry_type" transfer-ownership="none">
          <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
        </parameter>
        <parameter name="entry" transfer-ownership="none">
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </parameter>
      </parameters>
    </callback>
    <callback name="RhythmDBEntryTypeSyncFunc"
              c:type="RhythmDBEntryTypeSyncFunc"
              introspectable="0"
              throws="1">
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="entry_type" transfer-ownership="none">
          <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
        </parameter>
        <parameter name="entry" transfer-ownership="none">
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </parameter>
        <parameter name="changes" transfer-ownership="none">
          <type name="GLib.SList" c:type="GSList*">
            <type name="gpointer" c:type="gpointer"/>
          </type>
        </parameter>
      </parameters>
    </callback>
    <enumeration name="RhythmDBError" c:type="RhythmDBError">
      <member name="rhythmdb_error_access_failed"
              value="0"
              c:identifier="RHYTHMDB_ERROR_ACCESS_FAILED"/>
    </enumeration>
    <class name="RhythmDBImportJob"
           c:symbol-prefix="rhythmdb_import_job"
           c:type="RhythmDBImportJob"
           parent="GObject.Object"
           glib:type-name="RhythmDBImportJob"
           glib:get-type="rhythmdb_import_job_get_type"
           glib:type-struct="RhythmDBImportJobClass">
      <constructor name="new" c:identifier="rhythmdb_import_job_new">
        <doc xml:whitespace="preserve">Creates a new import job with the specified entry types.
Before starting the job, the caller must add one or more
paths to import.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">new #RhythmDBImportJob object.</doc>
          <type name="RhythmDBImportJob" c:type="RhythmDBImportJob*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDB object</doc>
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="entry_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntryType to use for normal entries</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
          <parameter name="ignore_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntryType to use for ignored files (or NULL to not create ignore entries)</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
          <parameter name="error_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntryType to use for import error entries (or NULL for none)</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="complete">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="total" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_added">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="scan_complete">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="total" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="status_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="total" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="imported" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="add_uri" c:identifier="rhythmdb_import_job_add_uri">
        <doc xml:whitespace="preserve">Adds a URI to import.  All files under the specified
URI will be imported.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI to import</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="cancel" c:identifier="rhythmdb_import_job_cancel">
        <doc xml:whitespace="preserve">Cancels the import job.  The job will cease as soon
as possible.  More directories may be scanned and 
more files may be imported before the job actually
ceases.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="complete" c:identifier="rhythmdb_import_job_complete">
        <doc xml:whitespace="preserve">Returns whether the import job is complete.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if complete.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="get_imported"
              c:identifier="rhythmdb_import_job_get_imported">
        <doc xml:whitespace="preserve">Returns the number of files processed by the import job so far.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">file count</doc>
          <type name="gint" c:type="int"/>
        </return-value>
      </method>
      <method name="get_total" c:identifier="rhythmdb_import_job_get_total">
        <doc xml:whitespace="preserve">Returns the total number of files that will be processed by
this import job.  This increases as the import directories are
scanned.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the total number of files to be processed</doc>
          <type name="gint" c:type="int"/>
        </return-value>
      </method>
      <method name="scan_complete"
              c:identifier="rhythmdb_import_job_scan_complete">
        <doc xml:whitespace="preserve">Returns whether the directory scan phase of the import job is complete.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if complete</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="start" c:identifier="rhythmdb_import_job_start">
        <doc xml:whitespace="preserve">Starts the import job.  After this method has been called,
no more URIs may be added to the import job.  May only be
called once for a given import job.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <property name="db"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <type name="RhythmDB"/>
      </property>
      <property name="entry-type"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <type name="RhythmDBEntryType"/>
      </property>
      <property name="error-type"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <type name="RhythmDBEntryType"/>
      </property>
      <property name="ignore-type"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <type name="RhythmDBEntryType"/>
      </property>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="RhythmDBImportJobPrivate"
              c:type="RhythmDBImportJobPrivate*"/>
      </field>
      <glib:signal name="complete" when="last">
        <doc xml:whitespace="preserve">Emitted when the whole import job is complete.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="gint"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="entry-added" when="last">
        <doc xml:whitespace="preserve">Emitted when an entry has been added to the database by the
import job.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the newly added #RhythmDBEntry</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="scan-complete" when="last">
        <doc xml:whitespace="preserve">Emitted when the directory scan is complete.  Once
the scan is complete, the total number of files to
be processed will not change.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="gint"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="status-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when the status of the import job has changed.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="total" transfer-ownership="none">
            <doc xml:whitespace="preserve">the current total number of files to process</doc>
            <type name="gint"/>
          </parameter>
          <parameter name="imported" transfer-ownership="none">
            <doc xml:whitespace="preserve">the current count of files imported</doc>
            <type name="gint"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="RhythmDBImportJobClass"
            c:type="RhythmDBImportJobClass"
            glib:is-gtype-struct-for="RhythmDBImportJob">
      <field name="parent_class">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="entry_added">
        <callback name="entry_added">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="job" transfer-ownership="none">
              <type name="RhythmDBImportJob" c:type="RhythmDBImportJob*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="status_changed">
        <callback name="status_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="job" transfer-ownership="none">
              <type name="RhythmDBImportJob" c:type="RhythmDBImportJob*"/>
            </parameter>
            <parameter name="total" transfer-ownership="none">
              <type name="gint" c:type="int"/>
            </parameter>
            <parameter name="imported" transfer-ownership="none">
              <type name="gint" c:type="int"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="scan_complete">
        <callback name="scan_complete">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="job" transfer-ownership="none">
              <type name="RhythmDBImportJob" c:type="RhythmDBImportJob*"/>
            </parameter>
            <parameter name="total" transfer-ownership="none">
              <type name="gint" c:type="int"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="complete">
        <callback name="complete">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="job" transfer-ownership="none">
              <type name="RhythmDBImportJob" c:type="RhythmDBImportJob*"/>
            </parameter>
            <parameter name="total" transfer-ownership="none">
              <type name="gint" c:type="int"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="RhythmDBImportJobPrivate"
            c:type="RhythmDBImportJobPrivate"
            disguised="1">
    </record>
    <record name="RhythmDBPrivate" c:type="RhythmDBPrivate" disguised="1">
    </record>
    <enumeration name="RhythmDBPropType"
                 glib:type-name="RhythmDBPropType"
                 glib:get-type="rhythmdb_prop_type_get_type"
                 c:type="RhythmDBPropType">
      <member name="type"
              value="0"
              c:identifier="RHYTHMDB_PROP_TYPE"
              glib:nick="type"/>
      <member name="entry_id"
              value="1"
              c:identifier="RHYTHMDB_PROP_ENTRY_ID"
              glib:nick="entry-id"/>
      <member name="title"
              value="2"
              c:identifier="RHYTHMDB_PROP_TITLE"
              glib:nick="title"/>
      <member name="genre"
              value="3"
              c:identifier="RHYTHMDB_PROP_GENRE"
              glib:nick="genre"/>
      <member name="artist"
              value="4"
              c:identifier="RHYTHMDB_PROP_ARTIST"
              glib:nick="artist"/>
      <member name="album"
              value="5"
              c:identifier="RHYTHMDB_PROP_ALBUM"
              glib:nick="album"/>
      <member name="track_number"
              value="6"
              c:identifier="RHYTHMDB_PROP_TRACK_NUMBER"
              glib:nick="track-number"/>
      <member name="disc_number"
              value="7"
              c:identifier="RHYTHMDB_PROP_DISC_NUMBER"
              glib:nick="disc-number"/>
      <member name="duration"
              value="8"
              c:identifier="RHYTHMDB_PROP_DURATION"
              glib:nick="duration"/>
      <member name="file_size"
              value="9"
              c:identifier="RHYTHMDB_PROP_FILE_SIZE"
              glib:nick="file-size"/>
      <member name="location"
              value="10"
              c:identifier="RHYTHMDB_PROP_LOCATION"
              glib:nick="location"/>
      <member name="mountpoint"
              value="11"
              c:identifier="RHYTHMDB_PROP_MOUNTPOINT"
              glib:nick="mountpoint"/>
      <member name="mtime"
              value="12"
              c:identifier="RHYTHMDB_PROP_MTIME"
              glib:nick="mtime"/>
      <member name="first_seen"
              value="13"
              c:identifier="RHYTHMDB_PROP_FIRST_SEEN"
              glib:nick="first-seen"/>
      <member name="last_seen"
              value="14"
              c:identifier="RHYTHMDB_PROP_LAST_SEEN"
              glib:nick="last-seen"/>
      <member name="rating"
              value="15"
              c:identifier="RHYTHMDB_PROP_RATING"
              glib:nick="rating"/>
      <member name="play_count"
              value="16"
              c:identifier="RHYTHMDB_PROP_PLAY_COUNT"
              glib:nick="play-count"/>
      <member name="last_played"
              value="17"
              c:identifier="RHYTHMDB_PROP_LAST_PLAYED"
              glib:nick="last-played"/>
      <member name="bitrate"
              value="18"
              c:identifier="RHYTHMDB_PROP_BITRATE"
              glib:nick="bitrate"/>
      <member name="date"
              value="19"
              c:identifier="RHYTHMDB_PROP_DATE"
              glib:nick="date"/>
      <member name="replaygain_track_gain"
              value="20"
              c:identifier="RHYTHMDB_PROP_TRACK_GAIN"
              glib:nick="replaygain-track-gain"/>
      <member name="replaygain_track_peak"
              value="21"
              c:identifier="RHYTHMDB_PROP_TRACK_PEAK"
              glib:nick="replaygain-track-peak"/>
      <member name="replaygain_album_gain"
              value="22"
              c:identifier="RHYTHMDB_PROP_ALBUM_GAIN"
              glib:nick="replaygain-album-gain"/>
      <member name="replaygain_album_peak"
              value="23"
              c:identifier="RHYTHMDB_PROP_ALBUM_PEAK"
              glib:nick="replaygain-album-peak"/>
      <member name="media_type"
              value="24"
              c:identifier="RHYTHMDB_PROP_MEDIA_TYPE"
              glib:nick="media-type"/>
      <member name="title_sort_key"
              value="25"
              c:identifier="RHYTHMDB_PROP_TITLE_SORT_KEY"
              glib:nick="title-sort-key"/>
      <member name="genre_sort_key"
              value="26"
              c:identifier="RHYTHMDB_PROP_GENRE_SORT_KEY"
              glib:nick="genre-sort-key"/>
      <member name="artist_sort_key"
              value="27"
              c:identifier="RHYTHMDB_PROP_ARTIST_SORT_KEY"
              glib:nick="artist-sort-key"/>
      <member name="album_sort_key"
              value="28"
              c:identifier="RHYTHMDB_PROP_ALBUM_SORT_KEY"
              glib:nick="album-sort-key"/>
      <member name="title_folded"
              value="29"
              c:identifier="RHYTHMDB_PROP_TITLE_FOLDED"
              glib:nick="title-folded"/>
      <member name="genre_folded"
              value="30"
              c:identifier="RHYTHMDB_PROP_GENRE_FOLDED"
              glib:nick="genre-folded"/>
      <member name="artist_folded"
              value="31"
              c:identifier="RHYTHMDB_PROP_ARTIST_FOLDED"
              glib:nick="artist-folded"/>
      <member name="album_folded"
              value="32"
              c:identifier="RHYTHMDB_PROP_ALBUM_FOLDED"
              glib:nick="album-folded"/>
      <member name="last_played_str"
              value="33"
              c:identifier="RHYTHMDB_PROP_LAST_PLAYED_STR"
              glib:nick="last-played-str"/>
      <member name="hidden"
              value="34"
              c:identifier="RHYTHMDB_PROP_HIDDEN"
              glib:nick="hidden"/>
      <member name="playback_error"
              value="35"
              c:identifier="RHYTHMDB_PROP_PLAYBACK_ERROR"
              glib:nick="playback-error"/>
      <member name="first_seen_str"
              value="36"
              c:identifier="RHYTHMDB_PROP_FIRST_SEEN_STR"
              glib:nick="first-seen-str"/>
      <member name="last_seen_str"
              value="37"
              c:identifier="RHYTHMDB_PROP_LAST_SEEN_STR"
              glib:nick="last-seen-str"/>
      <member name="search_match"
              value="38"
              c:identifier="RHYTHMDB_PROP_SEARCH_MATCH"
              glib:nick="search-match"/>
      <member name="year"
              value="39"
              c:identifier="RHYTHMDB_PROP_YEAR"
              glib:nick="year"/>
      <member name="keyword"
              value="40"
              c:identifier="RHYTHMDB_PROP_KEYWORD"
              glib:nick="keyword"/>
      <member name="status"
              value="41"
              c:identifier="RHYTHMDB_PROP_STATUS"
              glib:nick="status"/>
      <member name="description"
              value="42"
              c:identifier="RHYTHMDB_PROP_DESCRIPTION"
              glib:nick="description"/>
      <member name="subtitle"
              value="43"
              c:identifier="RHYTHMDB_PROP_SUBTITLE"
              glib:nick="subtitle"/>
      <member name="summary"
              value="44"
              c:identifier="RHYTHMDB_PROP_SUMMARY"
              glib:nick="summary"/>
      <member name="lang"
              value="45"
              c:identifier="RHYTHMDB_PROP_LANG"
              glib:nick="lang"/>
      <member name="copyright"
              value="46"
              c:identifier="RHYTHMDB_PROP_COPYRIGHT"
              glib:nick="copyright"/>
      <member name="image"
              value="47"
              c:identifier="RHYTHMDB_PROP_IMAGE"
              glib:nick="image"/>
      <member name="post_time"
              value="48"
              c:identifier="RHYTHMDB_PROP_POST_TIME"
              glib:nick="post-time"/>
      <member name="mb_trackid"
              value="49"
              c:identifier="RHYTHMDB_PROP_MUSICBRAINZ_TRACKID"
              glib:nick="mb-trackid"/>
      <member name="mb_artistid"
              value="50"
              c:identifier="RHYTHMDB_PROP_MUSICBRAINZ_ARTISTID"
              glib:nick="mb-artistid"/>
      <member name="mb_albumid"
              value="51"
              c:identifier="RHYTHMDB_PROP_MUSICBRAINZ_ALBUMID"
              glib:nick="mb-albumid"/>
      <member name="mb_albumartistid"
              value="52"
              c:identifier="RHYTHMDB_PROP_MUSICBRAINZ_ALBUMARTISTID"
              glib:nick="mb-albumartistid"/>
      <member name="mb_artistsortname"
              value="53"
              c:identifier="RHYTHMDB_PROP_ARTIST_SORTNAME"
              glib:nick="mb-artistsortname"/>
      <member name="album_sortname"
              value="54"
              c:identifier="RHYTHMDB_PROP_ALBUM_SORTNAME"
              glib:nick="album-sortname"/>
      <member name="artist_sortname_sort_key"
              value="55"
              c:identifier="RHYTHMDB_PROP_ARTIST_SORTNAME_SORT_KEY"
              glib:nick="artist-sortname-sort-key"/>
      <member name="artist_sortname_folded"
              value="56"
              c:identifier="RHYTHMDB_PROP_ARTIST_SORTNAME_FOLDED"
              glib:nick="artist-sortname-folded"/>
      <member name="album_sortname_sort_key"
              value="57"
              c:identifier="RHYTHMDB_PROP_ALBUM_SORTNAME_SORT_KEY"
              glib:nick="album-sortname-sort-key"/>
      <member name="album_sortname_folded"
              value="58"
              c:identifier="RHYTHMDB_PROP_ALBUM_SORTNAME_FOLDED"
              glib:nick="album-sortname-folded"/>
      <member name="comment"
              value="59"
              c:identifier="RHYTHMDB_PROP_COMMENT"
              glib:nick="comment"/>
      <member name="album_artist"
              value="60"
              c:identifier="RHYTHMDB_PROP_ALBUM_ARTIST"
              glib:nick="album-artist"/>
      <member name="album_artist_sort_key"
              value="61"
              c:identifier="RHYTHMDB_PROP_ALBUM_ARTIST_SORT_KEY"
              glib:nick="album-artist-sort-key"/>
      <member name="album_artist_folded"
              value="62"
              c:identifier="RHYTHMDB_PROP_ALBUM_ARTIST_FOLDED"
              glib:nick="album-artist-folded"/>
      <member name="album_artist_sortname"
              value="63"
              c:identifier="RHYTHMDB_PROP_ALBUM_ARTIST_SORTNAME"
              glib:nick="album-artist-sortname"/>
      <member name="album_artist_sortname_sort_key"
              value="64"
              c:identifier="RHYTHMDB_PROP_ALBUM_ARTIST_SORTNAME_SORT_KEY"
              glib:nick="album-artist-sortname-sort-key"/>
      <member name="album_artist_sortname_folded"
              value="65"
              c:identifier="RHYTHMDB_PROP_ALBUM_ARTIST_SORTNAME_FOLDED"
              glib:nick="album-artist-sortname-folded"/>
      <member name="beats_per_minute"
              value="66"
              c:identifier="RHYTHMDB_PROP_BPM"
              glib:nick="beats-per-minute"/>
    </enumeration>
    <class name="RhythmDBPropertyModel"
           c:symbol-prefix="rhythmdb_property_model"
           c:type="RhythmDBPropertyModel"
           parent="GObject.Object"
           glib:type-name="RhythmDBPropertyModel"
           glib:get-type="rhythmdb_property_model_get_type"
           glib:type-struct="RhythmDBPropertyModelClass">
      <implements name="Gtk.TreeModel"/>
      <constructor name="new" c:identifier="rhythmdb_property_model_new">
        <doc xml:whitespace="preserve">Creates a new property model for the specified property ID.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the new #RhythmDBPropertyModel</doc>
          <type name="RhythmDBPropertyModel" c:type="RhythmDBPropertyModel*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDB object</doc>
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="propid" transfer-ownership="none">
            <doc xml:whitespace="preserve">the property to index</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="pre_row_deletion">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <method name="enable_drag"
              c:identifier="rhythmdb_property_model_enable_drag">
        <doc xml:whitespace="preserve">Enables drag and drop from a specified #GtkTreeView that is
backed by the #RhythmDBPropertyModel.  Drag targets are
determined by the indexed property.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="view" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GtkTreeView from which to enable drag and drop</doc>
            <type name="Gtk.TreeView" c:type="GtkTreeView*"/>
          </parameter>
        </parameters>
      </method>
      <method name="iter_from_string"
              c:identifier="rhythmdb_property_model_iter_from_string">
        <doc xml:whitespace="preserve">Locates the row in the model for a property value.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the value was found.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">the property value to find</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="iter" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #GtkTreeIter to point to the row</doc>
            <type name="Gtk.TreeIter" c:type="GtkTreeIter*"/>
          </parameter>
        </parameters>
      </method>
      <property name="db"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RhythmDB object the model is associated with.</doc>
        <type name="RhythmDB"/>
      </property>
      <property name="prop"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The property that this property model indexes.</doc>
        <type name="gint"/>
      </property>
      <property name="query-model" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The query model that this property model indexes.</doc>
        <type name="RhythmDBQueryModel"/>
      </property>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="RhythmDBPropertyModelPrivate"
              c:type="RhythmDBPropertyModelPrivate*"/>
      </field>
      <glib:signal name="pre-row-deletion" when="last">
        <doc xml:whitespace="preserve">Emitted just before a row is deleted from the model.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
    </class>
    <record name="RhythmDBPropertyModelClass"
            c:type="RhythmDBPropertyModelClass"
            glib:is-gtype-struct-for="RhythmDBPropertyModel">
      <field name="parent">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="pre_row_deletion">
        <callback name="pre_row_deletion">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="model" transfer-ownership="none">
              <type name="RhythmDBPropertyModel"
                    c:type="RhythmDBPropertyModel*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <enumeration name="RhythmDBPropertyModelColumn"
                 glib:type-name="RhythmDBPropertyModelColumn"
                 glib:get-type="rhythmdb_property_model_column_get_type"
                 c:type="RhythmDBPropertyModelColumn">
      <member name="property_title"
              value="0"
              c:identifier="RHYTHMDB_PROPERTY_MODEL_COLUMN_TITLE"
              glib:nick="property-title"/>
      <member name="value_priority"
              value="1"
              c:identifier="RHYTHMDB_PROPERTY_MODEL_COLUMN_PRIORITY"
              glib:nick="value-priority"/>
      <member name="track_count"
              value="2"
              c:identifier="RHYTHMDB_PROPERTY_MODEL_COLUMN_NUMBER"
              glib:nick="track-count"/>
    </enumeration>
    <record name="RhythmDBPropertyModelPrivate"
            c:type="RhythmDBPropertyModelPrivate"
            disguised="1">
    </record>
    <record name="RhythmDBQueryData" c:type="RhythmDBQueryData">
      <field name="type" writable="1">
        <type name="guint" c:type="guint"/>
      </field>
      <field name="propid" writable="1">
        <type name="guint" c:type="guint"/>
      </field>
      <field name="val" writable="1">
        <type name="GObject.Value" c:type="GValue*"/>
      </field>
      <field name="subquery" writable="1">
        <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
      </field>
    </record>
    <class name="RhythmDBQueryModel"
           c:symbol-prefix="rhythmdb_query_model"
           c:type="RhythmDBQueryModel"
           parent="GObject.Object"
           glib:type-name="RhythmDBQueryModel"
           glib:get-type="rhythmdb_query_model_get_type"
           glib:type-struct="RhythmDBQueryModelClass">
      <implements name="Gtk.TreeModel"/>
      <implements name="RhythmDBQueryResults"/>
      <constructor name="new" c:identifier="rhythmdb_query_model_new">
        <doc xml:whitespace="preserve">Constructs a new #RhythmDBQueryModel with the specified query and sorting
parameters.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the newly constructed query model</doc>
          <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDB</doc>
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">the query for the new model</doc>
            <array name="GLib.PtrArray" c:type="GPtrArray*">
              <type name="gpointer" c:type="gpointer"/>
            </array>
          </parameter>
          <parameter name="sort_func"
                     transfer-ownership="none"
                     scope="notified"
                     closure="3"
                     destroy="4">
            <doc xml:whitespace="preserve">the sort function for the new model</doc>
            <type name="GLib.CompareDataFunc" c:type="GCompareDataFunc"/>
          </parameter>
          <parameter name="sort_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">data to pass to the sort function</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="sort_data_destroy"
                     transfer-ownership="none"
                     scope="async">
            <doc xml:whitespace="preserve">function to call when destroying the sort data</doc>
            <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
          </parameter>
          <parameter name="sort_reverse" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %TRUE, reverse the sort order</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_empty"
                   c:identifier="rhythmdb_query_model_new_empty">
        <doc xml:whitespace="preserve">Constructs a new empty query model with no query or sorting parameters.
This should only be used when the query model will be populated by
explicitly adding entries.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the newly constructed query model</doc>
          <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDB</doc>
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
        </parameters>
      </constructor>
      <function name="album_sort_func"
                c:identifier="rhythmdb_query_model_album_sort_func">
        <doc xml:whitespace="preserve">Sort function for sorting by album.  Sorts by album, then
disc number, then track number, then title.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">result of sort comparison between a and b.</doc>
          <type name="gint" c:type="gint"/>
        </return-value>
        <parameters>
          <parameter name="a" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">nothing</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </function>
      <function name="artist_sort_func"
                c:identifier="rhythmdb_query_model_artist_sort_func">
        <doc xml:whitespace="preserve">Sort function for sorting by artist.  Sorts by artist, then
album, then disc number, then track number, then title.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">result of sort comparison between a and b.</doc>
          <type name="gint" c:type="gint"/>
        </return-value>
        <parameters>
          <parameter name="a" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">nothing</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </function>
      <function name="bitrate_sort_func"
                c:identifier="rhythmdb_query_model_bitrate_sort_func">
        <doc xml:whitespace="preserve">Sort function for sorting by bitrate.  Lossless encodings (as identified
by media type) are considered to have the highest possible bitrate.
Falls back to sorting by location for equal bitrates.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">result of sort comparison between a and b.</doc>
          <type name="gint" c:type="gint"/>
        </return-value>
        <parameters>
          <parameter name="a" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">nothing</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </function>
      <function name="date_sort_func"
                c:identifier="rhythmdb_query_model_date_sort_func">
        <doc xml:whitespace="preserve">Sort function for sorting by release date.
Falls back to album sort order for equal dates.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">result of sort comparison between a and b.</doc>
          <type name="gint" c:type="gint"/>
        </return-value>
        <parameters>
          <parameter name="a" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">nothing</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </function>
      <function name="double_ceiling_sort_func"
                c:identifier="rhythmdb_query_model_double_ceiling_sort_func">
        <doc xml:whitespace="preserve">Sort function for sorting by a rounded floating point value.
The property value is rounded up to an integer value for sorting.
If the values are the same, falls back to sorting by location.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">result of sort comparison between a and b.</doc>
          <type name="gint" c:type="gint"/>
        </return-value>
        <parameters>
          <parameter name="a" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">property to sort on</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </function>
      <function name="genre_sort_func"
                c:identifier="rhythmdb_query_model_genre_sort_func">
        <doc xml:whitespace="preserve">Sort function for sorting by genre.  Sorts by genre, then artist,
then album, then disc number, then track number, then title.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">result of sort comparison between a and b.</doc>
          <type name="gint" c:type="gint"/>
        </return-value>
        <parameters>
          <parameter name="a" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">nothing</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </function>
      <function name="location_sort_func"
                c:identifier="rhythmdb_query_model_location_sort_func">
        <doc xml:whitespace="preserve">Sort function for sorting by location.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">result of sort comparison between a and b.</doc>
          <type name="gint" c:type="gint"/>
        </return-value>
        <parameters>
          <parameter name="a" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">nothing</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </function>
      <function name="string_sort_func"
                c:identifier="rhythmdb_query_model_string_sort_func">
        <doc xml:whitespace="preserve">Sort function for sorting by a single string property
Falls back to location sort order if the strings are equal.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">result of sort comparison between a and b.</doc>
          <type name="gint" c:type="gint"/>
        </return-value>
        <parameters>
          <parameter name="a" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">property to sort on</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </function>
      <function name="title_sort_func"
                c:identifier="rhythmdb_query_model_title_sort_func">
        <doc xml:whitespace="preserve">Sort function for sorting by title.  Falls back to sorting
by location if the titles are the same.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">result of sort comparison between a and b.</doc>
          <type name="gint" c:type="gint"/>
        </return-value>
        <parameters>
          <parameter name="a" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">nothing</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </function>
      <function name="track_sort_func"
                c:identifier="rhythmdb_query_model_track_sort_func">
        <doc xml:whitespace="preserve">Sort function for sorting by track.  Sorts by artist,
then album, then disc number, then track number, then title.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">result of sort comparison between a and b.</doc>
          <type name="gint" c:type="gint"/>
        </return-value>
        <parameters>
          <parameter name="a" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">nothing</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </function>
      <function name="ulong_sort_func"
                c:identifier="rhythmdb_query_model_ulong_sort_func">
        <doc xml:whitespace="preserve">Sort function for sorting by an unsigned integer property value.
If the values are the same, falls back to sorting by location.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">result of sort comparison between a and b.</doc>
          <type name="gint" c:type="gint"/>
        </return-value>
        <parameters>
          <parameter name="a" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="b" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">property to sort on</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </function>
      <virtual-method name="complete">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="entry_prop_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="prop" transfer-ownership="none">
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
          <parameter name="old" transfer-ownership="none">
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
          <parameter name="new_value" transfer-ownership="none">
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="entry_removed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="filter_entry_drop">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="non_entry_dropped">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="position" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="post_entry_delete">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="add_entry" c:identifier="rhythmdb_query_model_add_entry">
        <doc xml:whitespace="preserve">Adds an entry to the query model at the specified position.  Does not check
if the entry matches the query (if any).</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry to add</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="index" transfer-ownership="none">
            <doc xml:whitespace="preserve">position at which to add it, or -1 to add at the end</doc>
            <type name="gint" c:type="gint"/>
          </parameter>
        </parameters>
      </method>
      <method name="chain" c:identifier="rhythmdb_query_model_chain">
        <doc xml:whitespace="preserve">Chains @model to @base.  All changes made to the base model will be reflected in
the child model, and all changes made to the child model will be passed on to the
base model.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="base" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBQueryModel to chain it to</doc>
            <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
          </parameter>
          <parameter name="import_entries" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %TRUE, copy all existing entries from @base to @model</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="compute_status_normal"
              c:identifier="rhythmdb_query_model_compute_status_normal">
        <doc xml:whitespace="preserve">Constructs a status string describing the contents of the model.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">allocated status string, to be freed by the caller.</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
        <parameters>
          <parameter name="singular" transfer-ownership="none">
            <doc xml:whitespace="preserve">singular form of the pattern describing the number of entries ("%d song")</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="plural" transfer-ownership="none">
            <doc xml:whitespace="preserve">plural form of the pattern describing the number of entries ("%d songs")</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="copy_contents"
              c:identifier="rhythmdb_query_model_copy_contents">
        <doc xml:whitespace="preserve">Copies all entries from @src to @dest.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="src" transfer-ownership="none">
            <doc xml:whitespace="preserve">source #RhythmDBQueryModel</doc>
            <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
          </parameter>
        </parameters>
      </method>
      <method name="entry_to_iter"
              c:identifier="rhythmdb_query_model_entry_to_iter">
        <doc xml:whitespace="preserve">Creates a #GtkTreeIter pointing to the specified entry in the model.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the iterator now points to the entry</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry to look up</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="iter" transfer-ownership="none">
            <doc xml:whitespace="preserve">holds the returned #GtkTreeIter</doc>
            <type name="Gtk.TreeIter" c:type="GtkTreeIter*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_duration"
              c:identifier="rhythmdb_query_model_get_duration">
        <doc xml:whitespace="preserve">Returns the total duration of all entries in the model.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the total duration (in seconds) of all entries in the model</doc>
          <type name="glong" c:type="long"/>
        </return-value>
      </method>
      <method name="get_next_from_entry"
              c:identifier="rhythmdb_query_model_get_next_from_entry">
        <doc xml:whitespace="preserve">Locates and returns the next #RhythmDBEntry in the model after the specified
entry.  The caller owns a reference to the returned entry.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the next #RhythmDBEntry in the model, if any</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_previous_from_entry"
              c:identifier="rhythmdb_query_model_get_previous_from_entry">
        <doc xml:whitespace="preserve">Locates and returns the  #RhythmDBEntry in the model before the specified
entry.  The caller owns a reference to the returned entry.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the previous #RhythmDBEntry in the model, if any</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_size" c:identifier="rhythmdb_query_model_get_size">
        <doc xml:whitespace="preserve">Returns the total size of all entries in the model.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the total size (in bytes) of all entries in the model</doc>
          <type name="guint64" c:type="guint64"/>
        </return-value>
      </method>
      <method name="has_pending_changes"
              c:identifier="rhythmdb_query_model_has_pending_changes">
        <doc xml:whitespace="preserve">Checks if a #RhythmDBQueryModel has any outstanding changes that are
yet to be processed.  This is not very useful.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if there are outstanding changes to the model</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="iter_to_entry"
              c:identifier="rhythmdb_query_model_iter_to_entry">
        <doc xml:whitespace="preserve">Locates and returns the #RhythmDBEntry pointed to by the specified iterator
in the model.  The caller owns a reference to the returned entry.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the #RhythmDBEntry, if any</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
        <parameters>
          <parameter name="entry_iter" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #GtkTreeIter to dereference</doc>
            <type name="Gtk.TreeIter" c:type="GtkTreeIter*"/>
          </parameter>
        </parameters>
      </method>
      <method name="move_entry" c:identifier="rhythmdb_query_model_move_entry">
        <doc xml:whitespace="preserve">Moves an entry to a new position in the query model.
The position must be a between 0 and the number of entries in the model.
Specifying -1 does not move the entry to the end of the model.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry to move</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="index" transfer-ownership="none">
            <doc xml:whitespace="preserve">position to move to</doc>
            <type name="gint" c:type="gint"/>
          </parameter>
        </parameters>
      </method>
      <method name="reapply_query"
              c:identifier="rhythmdb_query_model_reapply_query">
        <doc xml:whitespace="preserve">Reapplies the existing query to the entries in the model.  This
is mostly useful when the query contains relative time criteria
(such as 'not played in the last hour').  This will only remove
entries that are already in the model, it will not find entries
that previously did not match the query.

The 'filter' parameter should be set to TRUE when the query is
being used as a filter, rather than to define a base set of entries.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="filter" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %FALSE, emit entry-removed signals</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="remove_entry"
              c:identifier="rhythmdb_query_model_remove_entry">
        <doc xml:whitespace="preserve">Removes an entry from the query model.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the entry was removed</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry to remove</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_sort_order"
              c:identifier="rhythmdb_query_model_set_sort_order">
        <doc xml:whitespace="preserve">Sets a new sort order on the model.  This reorders the entries
in the model to match the new sort order.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="sort_func"
                     transfer-ownership="none"
                     scope="notified"
                     closure="1"
                     destroy="2">
            <doc xml:whitespace="preserve">new sort function</doc>
            <type name="GLib.CompareDataFunc" c:type="GCompareDataFunc"/>
          </parameter>
          <parameter name="sort_data" transfer-ownership="none">
            <doc xml:whitespace="preserve">data to pass to the new sort function</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="sort_data_destroy"
                     transfer-ownership="none"
                     scope="async">
            <doc xml:whitespace="preserve">function to call to free the sort data</doc>
            <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
          </parameter>
          <parameter name="sort_reverse" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %TRUE, reverse the sort order</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="shuffle_entries"
              c:identifier="rhythmdb_query_model_shuffle_entries">
        <doc xml:whitespace="preserve">Shuffles the entries in the model into a new random order.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="tree_path_to_entry"
              c:identifier="rhythmdb_query_model_tree_path_to_entry">
        <doc xml:whitespace="preserve">Locates the #RhythmDBEntry identified by the specified path in the model.
The caller owns a reference to the returned entry.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the #RhythmDBEntry, if any</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
        <parameters>
          <parameter name="path" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #GtkTreePath</doc>
            <type name="Gtk.TreePath" c:type="GtkTreePath*"/>
          </parameter>
        </parameters>
      </method>
      <property name="base-model"
                writable="1"
                construct="1"
                transfer-ownership="none">
        <type name="RhythmDBQueryModel"/>
      </property>
      <property name="db"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <type name="RhythmDB"/>
      </property>
      <property name="limit-type"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <type name="RhythmDBQueryModelLimitType"/>
      </property>
      <property name="limit-value"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <type name="GObject.ValueArray"/>
      </property>
      <property name="query" writable="1" transfer-ownership="none">
        <type name="gpointer"/>
      </property>
      <property name="show-hidden"
                writable="1"
                construct="1"
                transfer-ownership="none">
        <type name="gboolean"/>
      </property>
      <property name="sort-data" writable="1" transfer-ownership="none">
        <type name="gpointer"/>
      </property>
      <property name="sort-data-destroy"
                writable="1"
                transfer-ownership="none">
        <type name="gpointer"/>
      </property>
      <property name="sort-func" writable="1" transfer-ownership="none">
        <type name="gpointer"/>
      </property>
      <property name="sort-reverse" writable="1" transfer-ownership="none">
        <type name="gboolean"/>
      </property>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="RhythmDBQueryModelPrivate"
              c:type="RhythmDBQueryModelPrivate*"/>
      </field>
      <glib:signal name="complete" when="last">
        <doc xml:whitespace="preserve">Emitted when the database query populating the model is complete.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
      <glib:signal name="entry-prop-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when an entry in the query model is changed.  When multiple
properties are changed, the entry-prop-changed signals will be emitted
in the order that the changes were made.  At the point that the
signal is emitted, all changes have already been applied to the
#RhythmDBEntry.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry that changed</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
          <parameter name="prop" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBPropType that was changed</doc>
            <type name="gint"/>
          </parameter>
          <parameter name="old" transfer-ownership="none">
            <doc xml:whitespace="preserve">the previous value for the property</doc>
            <type name="gpointer"/>
          </parameter>
          <parameter name="new_value" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new value for the property</doc>
            <type name="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="entry-removed" when="last">
        <doc xml:whitespace="preserve">Emitted when an entry is removed from the model.  There is some
difference between this and the #GtkTreeModel row-removed signal
but I don't know what it is right now.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry that was removed</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="filter-entry-drop" when="last">
        <doc xml:whitespace="preserve">Emitted when an entry is being added to a model by drag-and-drop.
This allows the owner of the model to filter out entries that should
not be added to the model (based on entry type, for instance).
If the signal handler returns %FALSE, the entry will not be added.</doc>
        <return-value transfer-ownership="none">
          <type name="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry being dropped</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="non-entry-dropped" when="last">
        <doc xml:whitespace="preserve">Emitted when a URI that does not match an existing #RhythmDBEntry
is dropped into the query model.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI that was dropped</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="position" transfer-ownership="none">
            <doc xml:whitespace="preserve">the position in the query model at which it was dropped</doc>
            <type name="gint"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="post-entry-delete" when="last">
        <doc xml:whitespace="preserve">Emitted after an entry has been removed from the model.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry that was removed</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="RhythmDBQueryModelClass"
            c:type="RhythmDBQueryModelClass"
            glib:is-gtype-struct-for="RhythmDBQueryModel">
      <field name="parent">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="complete">
        <callback name="complete">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="model" transfer-ownership="none">
              <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entry_prop_changed">
        <callback name="entry_prop_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="model" transfer-ownership="none">
              <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="prop" transfer-ownership="none">
              <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
            </parameter>
            <parameter name="old" transfer-ownership="none">
              <type name="GObject.Value" c:type="GValue*"/>
            </parameter>
            <parameter name="new_value" transfer-ownership="none">
              <type name="GObject.Value" c:type="GValue*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="non_entry_dropped">
        <callback name="non_entry_dropped">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="model" transfer-ownership="none">
              <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="position" transfer-ownership="none">
              <type name="gint" c:type="int"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="entry_removed">
        <callback name="entry_removed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="model" transfer-ownership="none">
              <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="post_entry_delete">
        <callback name="post_entry_delete">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="model" transfer-ownership="none">
              <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="filter_entry_drop">
        <callback name="filter_entry_drop">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="model" transfer-ownership="none">
              <type name="RhythmDBQueryModel" c:type="RhythmDBQueryModel*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <enumeration name="RhythmDBQueryModelLimitType"
                 glib:type-name="RhythmDBQueryModelLimitType"
                 glib:get-type="rhythmdb_query_model_limit_type_get_type"
                 c:type="RhythmDBQueryModelLimitType">
      <member name="no_limit"
              value="0"
              c:identifier="RHYTHMDB_QUERY_MODEL_LIMIT_NONE"
              glib:nick="no-limit"/>
      <member name="limit_count"
              value="1"
              c:identifier="RHYTHMDB_QUERY_MODEL_LIMIT_COUNT"
              glib:nick="limit-count"/>
      <member name="limit_size"
              value="2"
              c:identifier="RHYTHMDB_QUERY_MODEL_LIMIT_SIZE"
              glib:nick="limit-size"/>
      <member name="limit_duration"
              value="3"
              c:identifier="RHYTHMDB_QUERY_MODEL_LIMIT_TIME"
              glib:nick="limit-duration"/>
    </enumeration>
    <record name="RhythmDBQueryModelPrivate"
            c:type="RhythmDBQueryModelPrivate"
            disguised="1">
    </record>
    <interface name="RhythmDBQueryResults"
               c:symbol-prefix="rhythmdb_query_results"
               c:type="RhythmDBQueryResults"
               glib:type-name="RhythmDBQueryResults"
               glib:get-type="rhythmdb_query_results_get_type"
               glib:type-struct="RhythmDBQueryResultsIface">
      <virtual-method name="add_results" invoker="add_results">
        <doc xml:whitespace="preserve">Provides a new set of query results.  References must be taken on the
entries.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entries" transfer-ownership="none">
            <doc xml:whitespace="preserve">#GPtrArray containing #RhythmDBEntry results</doc>
            <array name="GLib.PtrArray" c:type="GPtrArray*">
              <type name="gpointer" c:type="gpointer"/>
            </array>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="query_complete" invoker="query_complete">
        <doc xml:whitespace="preserve">Called when the query is complete and all entries that match the query
have been supplied to rhythmdb_query_results_add_results.  If the object
implementing this interface needs to identify newly added or changed entries
that match the query, it needs to use the entry-added, entry-deleted and
entry-changed signals from #RhythmDB.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="set_query" invoker="set_query">
        <doc xml:whitespace="preserve">When a new query is run, this method is invoked to give the
object implementing this interface a chance to take a copy of the
query criteria, so that it can evaluate the query for newly added
or changed entries once the query is complete.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new query</doc>
            <array name="GLib.PtrArray" c:type="GPtrArray*">
              <type name="gpointer" c:type="gpointer"/>
            </array>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="add_results"
              c:identifier="rhythmdb_query_results_add_results">
        <doc xml:whitespace="preserve">Provides a new set of query results.  References must be taken on the
entries.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entries" transfer-ownership="none">
            <doc xml:whitespace="preserve">#GPtrArray containing #RhythmDBEntry results</doc>
            <array name="GLib.PtrArray" c:type="GPtrArray*">
              <type name="gpointer" c:type="gpointer"/>
            </array>
          </parameter>
        </parameters>
      </method>
      <method name="query_complete"
              c:identifier="rhythmdb_query_results_query_complete">
        <doc xml:whitespace="preserve">Called when the query is complete and all entries that match the query
have been supplied to rhythmdb_query_results_add_results.  If the object
implementing this interface needs to identify newly added or changed entries
that match the query, it needs to use the entry-added, entry-deleted and
entry-changed signals from #RhythmDB.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="set_query" c:identifier="rhythmdb_query_results_set_query">
        <doc xml:whitespace="preserve">When a new query is run, this method is invoked to give the
object implementing this interface a chance to take a copy of the
query criteria, so that it can evaluate the query for newly added
or changed entries once the query is complete.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="query" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new query</doc>
            <array name="GLib.PtrArray" c:type="GPtrArray*">
              <type name="gpointer" c:type="gpointer"/>
            </array>
          </parameter>
        </parameters>
      </method>
    </interface>
    <record name="RhythmDBQueryResultsIface"
            c:type="RhythmDBQueryResultsIface"
            glib:is-gtype-struct-for="RhythmDBQueryResults">
      <field name="g_iface">
        <type name="GObject.TypeInterface" c:type="GTypeInterface"/>
      </field>
      <field name="set_query">
        <callback name="set_query">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="results" transfer-ownership="none">
              <type name="RhythmDBQueryResults"
                    c:type="RhythmDBQueryResults*"/>
            </parameter>
            <parameter name="query" transfer-ownership="none">
              <doc xml:whitespace="preserve">the new query</doc>
              <array name="GLib.PtrArray" c:type="GPtrArray*">
                <type name="gpointer" c:type="gpointer"/>
              </array>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="add_results">
        <callback name="add_results">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="results" transfer-ownership="none">
              <type name="RhythmDBQueryResults"
                    c:type="RhythmDBQueryResults*"/>
            </parameter>
            <parameter name="entries" transfer-ownership="none">
              <doc xml:whitespace="preserve">#GPtrArray containing #RhythmDBEntry results</doc>
              <array name="GLib.PtrArray" c:type="GPtrArray*">
                <type name="gpointer" c:type="gpointer"/>
              </array>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="query_complete">
        <callback name="query_complete">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="results" transfer-ownership="none">
              <type name="RhythmDBQueryResults"
                    c:type="RhythmDBQueryResults*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <enumeration name="RhythmDBQueryType"
                 glib:type-name="RhythmDBQueryType"
                 glib:get-type="rhythmdb_query_type_get_type"
                 c:type="RhythmDBQueryType">
      <member name="query_end"
              value="0"
              c:identifier="RHYTHMDB_QUERY_END"
              glib:nick="query-end"/>
      <member name="disjunctive_marker"
              value="1"
              c:identifier="RHYTHMDB_QUERY_DISJUNCTION"
              glib:nick="disjunctive-marker"/>
      <member name="subquery"
              value="2"
              c:identifier="RHYTHMDB_QUERY_SUBQUERY"
              glib:nick="subquery"/>
      <member name="equals"
              value="3"
              c:identifier="RHYTHMDB_QUERY_PROP_EQUALS"
              glib:nick="equals"/>
      <member name="not_equal"
              value="4"
              c:identifier="RHYTHMDB_QUERY_PROP_NOT_EQUAL"
              glib:nick="not-equal"/>
      <member name="fuzzy_match"
              value="5"
              c:identifier="RHYTHMDB_QUERY_PROP_LIKE"
              glib:nick="fuzzy-match"/>
      <member name="inverted_fuzzy_match"
              value="6"
              c:identifier="RHYTHMDB_QUERY_PROP_NOT_LIKE"
              glib:nick="inverted-fuzzy-match"/>
      <member name="starts_with"
              value="7"
              c:identifier="RHYTHMDB_QUERY_PROP_PREFIX"
              glib:nick="starts-with"/>
      <member name="ends_with"
              value="8"
              c:identifier="RHYTHMDB_QUERY_PROP_SUFFIX"
              glib:nick="ends-with"/>
      <member name="greater_than"
              value="9"
              c:identifier="RHYTHMDB_QUERY_PROP_GREATER"
              glib:nick="greater-than"/>
      <member name="less_than"
              value="10"
              c:identifier="RHYTHMDB_QUERY_PROP_LESS"
              glib:nick="less-than"/>
      <member name="within_current_time"
              value="11"
              c:identifier="RHYTHMDB_QUERY_PROP_CURRENT_TIME_WITHIN"
              glib:nick="within-current-time"/>
      <member name="not_within_current_time"
              value="12"
              c:identifier="RHYTHMDB_QUERY_PROP_CURRENT_TIME_NOT_WITHIN"
              glib:nick="not-within-current-time"/>
      <member name="year_equals"
              value="13"
              c:identifier="RHYTHMDB_QUERY_PROP_YEAR_EQUALS"
              glib:nick="year-equals"/>
      <member name="year_not_equals"
              value="14"
              c:identifier="RHYTHMDB_QUERY_PROP_YEAR_NOT_EQUAL"
              glib:nick="year-not-equals"/>
      <member name="year_greater_than"
              value="15"
              c:identifier="RHYTHMDB_QUERY_PROP_YEAR_GREATER"
              glib:nick="year-greater-than"/>
      <member name="year_less_than"
              value="16"
              c:identifier="RHYTHMDB_QUERY_PROP_YEAR_LESS"
              glib:nick="year-less-than"/>
    </enumeration>
    <class name="SearchEntry"
           c:symbol-prefix="search_entry"
           c:type="RBSearchEntry"
           parent="Gtk.HBox"
           glib:type-name="RBSearchEntry"
           glib:get-type="rb_search_entry_get_type"
           glib:type-struct="SearchEntryClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <implements name="Gtk.Orientable"/>
      <constructor name="new" c:identifier="rb_search_entry_new">
        <doc xml:whitespace="preserve">Creates a new search entry widget.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">new search entry widget.</doc>
          <type name="SearchEntry" c:type="RBSearchEntry*"/>
        </return-value>
        <parameters>
          <parameter name="has_popup" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="activate">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="text" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="search">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="text" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="show_popup">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <method name="clear" c:identifier="rb_search_entry_clear">
        <doc xml:whitespace="preserve">Clears the search entry text.  The 'search' signal will
be emitted.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="grab_focus" c:identifier="rb_search_entry_grab_focus">
        <doc xml:whitespace="preserve">Grabs input focus for the text entry widget.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="searching" c:identifier="rb_search_entry_searching">
        <doc xml:whitespace="preserve">Returns %TRUE if there is search text in the entry widget.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if searching</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="set_mnemonic" c:identifier="rb_search_entry_set_mnemonic">
        <doc xml:whitespace="preserve">Adds or removes a mnemonic allowing the user to focus
the search entry.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="enable" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %TRUE, enable the mnemonic</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_placeholder"
              c:identifier="rb_search_entry_set_placeholder">
        <doc xml:whitespace="preserve">Sets the placeholder text in the search entry box.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="text" transfer-ownership="none">
            <doc xml:whitespace="preserve">placeholder text</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_text" c:identifier="rb_search_entry_set_text">
        <doc xml:whitespace="preserve">Sets the text in the search entry box.
The 'search' signal will be emitted.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="text" transfer-ownership="none">
            <doc xml:whitespace="preserve">new search text</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <property name="explicit-mode" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">If TRUE, show a button and only emit the 'search' signal when
the user presses it rather than when they stop typing.</doc>
        <type name="gboolean"/>
      </property>
      <property name="has-popup"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">If TRUE, show a primary icon and emit the show-popup when clicked.</doc>
        <type name="gboolean"/>
      </property>
      <field name="parent">
        <type name="Gtk.HBox" c:type="GtkHBox"/>
      </field>
      <field name="priv">
        <type name="SearchEntryPrivate" c:type="RBSearchEntryPrivate*"/>
      </field>
      <glib:signal name="activate" when="last">
        <doc xml:whitespace="preserve">Emitted when the entry is activated.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="text" transfer-ownership="none">
            <doc xml:whitespace="preserve">search text</doc>
            <type name="utf8"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="search" when="last">
        <doc xml:whitespace="preserve">Emitted when the search text changes.  A signal
handler must initiate a search on the current
source.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="text" transfer-ownership="none">
            <doc xml:whitespace="preserve">search text</doc>
            <type name="utf8"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="show-popup" when="last">
        <doc xml:whitespace="preserve">Emitted when a popup menu should be shown</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
    </class>
    <record name="SearchEntryClass"
            c:type="RBSearchEntryClass"
            glib:is-gtype-struct-for="SearchEntry">
      <field name="parent">
        <type name="Gtk.HBoxClass" c:type="GtkHBoxClass"/>
      </field>
      <field name="search">
        <callback name="search">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="view" transfer-ownership="none">
              <type name="SearchEntry" c:type="RBSearchEntry*"/>
            </parameter>
            <parameter name="text" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="activate">
        <callback name="activate">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="entry" transfer-ownership="none">
              <type name="SearchEntry" c:type="RBSearchEntry*"/>
            </parameter>
            <parameter name="text" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="show_popup">
        <callback name="show_popup">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="entry" transfer-ownership="none">
              <type name="SearchEntry" c:type="RBSearchEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="SearchEntryPrivate"
            c:type="RBSearchEntryPrivate"
            disguised="1">
    </record>
    <class name="SegmentedBar"
           c:symbol-prefix="segmented_bar"
           c:type="RBSegmentedBar"
           parent="Gtk.Widget"
           glib:type-name="RBSegmentedBar"
           glib:get-type="rb_segmented_bar_get_type"
           glib:type-struct="SegmentedBarClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <constructor name="new" c:identifier="rb_segmented_bar_new">
        <return-value transfer-ownership="none">
          <type name="Gtk.Widget" c:type="GtkWidget*"/>
        </return-value>
      </constructor>
      <method name="add_segment" c:identifier="rb_segmented_bar_add_segment">
        <return-value transfer-ownership="none">
          <type name="guint" c:type="guint"/>
        </return-value>
        <parameters>
          <parameter name="title" transfer-ownership="none">
            <type name="utf8" c:type="gchar*"/>
          </parameter>
          <parameter name="percent" transfer-ownership="none">
            <type name="gdouble" c:type="gdouble"/>
          </parameter>
          <parameter name="red" transfer-ownership="none">
            <type name="gdouble" c:type="gdouble"/>
          </parameter>
          <parameter name="green" transfer-ownership="none">
            <type name="gdouble" c:type="gdouble"/>
          </parameter>
          <parameter name="blue" transfer-ownership="none">
            <type name="gdouble" c:type="gdouble"/>
          </parameter>
          <parameter name="alpha" transfer-ownership="none">
            <type name="gdouble" c:type="gdouble"/>
          </parameter>
        </parameters>
      </method>
      <method name="add_segment_default_color"
              c:identifier="rb_segmented_bar_add_segment_default_color">
        <return-value transfer-ownership="none">
          <type name="guint" c:type="guint"/>
        </return-value>
        <parameters>
          <parameter name="title" transfer-ownership="none">
            <type name="utf8" c:type="gchar*"/>
          </parameter>
          <parameter name="percent" transfer-ownership="none">
            <type name="gdouble" c:type="gdouble"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_value_formatter"
              c:identifier="rb_segmented_bar_set_value_formatter">
        <doc xml:whitespace="preserve">Sets a value formatter function to use for the bar.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="formatter"
                     transfer-ownership="none"
                     scope="async"
                     closure="1">
            <doc xml:whitespace="preserve">the formatter function to use</doc>
            <type name="SegmentedBarValueFormatter"
                  c:type="RBSegmentedBarValueFormatter"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">data to pass to the formatter</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
        </parameters>
      </method>
      <method name="update_segment"
              c:identifier="rb_segmented_bar_update_segment">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="segment_index" transfer-ownership="none">
            <type name="guint" c:type="guint"/>
          </parameter>
          <parameter name="percent" transfer-ownership="none">
            <type name="gdouble" c:type="gdouble"/>
          </parameter>
        </parameters>
      </method>
      <property name="bar-height"
                writable="1"
                construct="1"
                transfer-ownership="none">
        <type name="guint"/>
      </property>
      <property name="show-labels" writable="1" transfer-ownership="none">
        <type name="gboolean"/>
      </property>
      <property name="show-reflection" writable="1" transfer-ownership="none">
        <type name="gboolean"/>
      </property>
      <field name="parent">
        <type name="Gtk.Widget" c:type="GtkWidget"/>
      </field>
      <field name="priv">
        <type name="SegmentedBarPrivate" c:type="RBSegmentedBarPrivate*"/>
      </field>
    </class>
    <record name="SegmentedBarClass"
            c:type="RBSegmentedBarClass"
            glib:is-gtype-struct-for="SegmentedBar">
      <field name="parent">
        <type name="Gtk.WidgetClass" c:type="GtkWidgetClass"/>
      </field>
    </record>
    <record name="SegmentedBarPrivate"
            c:type="RBSegmentedBarPrivate"
            disguised="1">
    </record>
    <callback name="SegmentedBarValueFormatter"
              c:type="RBSegmentedBarValueFormatter">
      <return-value transfer-ownership="full">
        <type name="utf8" c:type="gchar*"/>
      </return-value>
      <parameters>
        <parameter name="percent" transfer-ownership="none">
          <type name="gdouble" c:type="gdouble"/>
        </parameter>
        <parameter name="data" transfer-ownership="none">
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </callback>
    <class name="Shell"
           c:symbol-prefix="shell"
           c:type="RBShell"
           parent="Gtk.Application"
           glib:type-name="RBShell"
           glib:get-type="rb_shell_get_type"
           glib:type-struct="ShellClass">
      <implements name="Gio.ActionGroup"/>
      <constructor name="new" c:identifier="rb_shell_new">
        <doc xml:whitespace="preserve">Creates the Rhythmbox shell.  This is effectively a singleton, so it doesn't
make sense to call this from anywhere other than main.c.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the #RBShell instance</doc>
          <type name="Shell" c:type="RBShell*"/>
        </return-value>
        <parameters>
          <parameter name="autostarted" transfer-ownership="none">
            <doc xml:whitespace="preserve">%TRUE if autostarted by the session manager</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
          <parameter name="argc" transfer-ownership="none">
            <doc xml:whitespace="preserve">a pointer to the number of command line arguments</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
          <parameter name="argv" transfer-ownership="none">
            <doc xml:whitespace="preserve">a pointer to the array of command line arguments</doc>
            <type name="utf8" c:type="char***"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="create_song_info">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="song_info" transfer-ownership="none">
            <type name="SongInfo" c:type="RBSongInfo*"/>
          </parameter>
          <parameter name="multi" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="database_load_complete">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="removable_media_scan_finished">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="visibility_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="visible" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="visibility_changing">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="initial" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
          <parameter name="visible" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="activate_source"
              c:identifier="rb_shell_activate_source"
              throws="1">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <type name="Source" c:type="RBSource*"/>
          </parameter>
          <parameter name="play" transfer-ownership="none">
            <type name="guint" c:type="guint"/>
          </parameter>
        </parameters>
      </method>
      <method name="activate_source_by_uri"
              c:identifier="rb_shell_activate_source_by_uri"
              throws="1">
        <doc xml:whitespace="preserve">Searches for a source matching @source_uri and if found, selects it,
and depending on the value of @play, may start playing from it.
Device-based sources will match the device node or mount point URI.
Other types of sources may have their own URI scheme or format.
This is part of the DBus interface.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if successful</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="source_uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">URI for the source to activate</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="play" transfer-ownership="none">
            <doc xml:whitespace="preserve">0: select source, 1: play source if not playing, 2: play source</doc>
            <type name="guint" c:type="guint"/>
          </parameter>
        </parameters>
      </method>
      <method name="add_uri" c:identifier="rb_shell_add_uri" throws="1">
        <doc xml:whitespace="preserve">Adds the specified URI to the Rhythmbox database.  Whether the
title and genre specified are actually used is up to the source
that handles the URI</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the URI was added successfully</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI to add</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="title" transfer-ownership="none">
            <doc xml:whitespace="preserve">optional title value for the URI</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="genre" transfer-ownership="none">
            <doc xml:whitespace="preserve">optional genre value for the URI</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="add_widget" c:identifier="rb_shell_add_widget">
        <doc xml:whitespace="preserve">Adds a widget to the main Rhythmbox window.  See #gtk_box_pack_start for
details on how the expand and fill parameters work.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="widget" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GtkWidget to insert into the main window</doc>
            <type name="Gtk.Widget" c:type="GtkWidget*"/>
          </parameter>
          <parameter name="location" transfer-ownership="none">
            <doc xml:whitespace="preserve">the location at which to insert the widget</doc>
            <type name="ShellUILocation" c:type="RBShellUILocation"/>
          </parameter>
          <parameter name="expand" transfer-ownership="none">
            <doc xml:whitespace="preserve">whether the widget should be given extra space</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
          <parameter name="fill" transfer-ownership="none">
            <doc xml:whitespace="preserve">whether the widget should fill all space allocated to it</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="append_display_page"
              c:identifier="rb_shell_append_display_page">
        <doc xml:whitespace="preserve">Adds a new display page to the shell.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="page" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new #RBDisplayPage</doc>
            <type name="DisplayPage" c:type="RBDisplayPage*"/>
          </parameter>
          <parameter name="parent" transfer-ownership="none" allow-none="1">
            <doc xml:whitespace="preserve">the parent page for the new page</doc>
            <type name="DisplayPage" c:type="RBDisplayPage*"/>
          </parameter>
        </parameters>
      </method>
      <method name="do_notify" c:identifier="rb_shell_do_notify" throws="1">
        <doc xml:whitespace="preserve">Displays a notification of the current playing track.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">not important</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="requested" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %TRUE, the notification was requested by some explicit user action</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_party_mode" c:identifier="rb_shell_get_party_mode">
        <doc xml:whitespace="preserve">Returns %TRUE if the shell is in party mode</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the shell is in party mode</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="get_song_properties"
              c:identifier="rb_shell_get_song_properties"
              throws="1">
        <doc xml:whitespace="preserve">Gathers and returns all metadata (including extra metadata such as album
art URIs and lyrics) for the specified URI.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the URI is found in the database</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI to query</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="properties" transfer-ownership="none">
            <doc xml:whitespace="preserve">(out callee-allocates) (element-type utf8 GObject.Value) returns the properties of the specified URI</doc>
            <type name="GLib.HashTable" c:type="GHashTable**">
              <type name="gpointer" c:type="gpointer"/>
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </parameter>
        </parameters>
      </method>
      <method name="get_source_by_entry_type"
              c:identifier="rb_shell_get_source_by_entry_type">
        <doc xml:whitespace="preserve">Looks up and returns the source that owns entries of the specified
type.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">source instance, if any</doc>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
        <parameters>
          <parameter name="type" transfer-ownership="none">
            <doc xml:whitespace="preserve">entry type for which to find a source</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
        </parameters>
      </method>
      <method name="guess_source_for_uri"
              c:identifier="rb_shell_guess_source_for_uri">
        <doc xml:whitespace="preserve">Attempts to locate the source that should handle the specified URI.
This iterates through all sources, calling #rb_source_want_uri,
returning the source that returns the highest value.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the most appropriate #RBSource for the uri</doc>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI to guess a source for</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="load_uri" c:identifier="rb_shell_load_uri" throws="1">
        <doc xml:whitespace="preserve">Loads a URI representing a single song, a directory, a playlist, or
an internet radio station, and optionally starts playing it.

For playlists containing only stream URLs, we either add the playlist
itself (if it's remote) or each URL from it (if it's local).  The main
reason for this is so clicking on stream playlist links in web browsers
works properly - the playlist file will be downloaded to /tmp/, and
we can't add that to the database, so we need to add the stream URLs
instead.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the URI was added successfully</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI to load</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="play" transfer-ownership="none">
            <doc xml:whitespace="preserve">if TRUE, start playing the URI (if possible)</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="notify_custom" c:identifier="rb_shell_notify_custom">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="timeout" transfer-ownership="none">
            <type name="guint" c:type="guint"/>
          </parameter>
          <parameter name="primary" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="secondary" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="image_uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="requested" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="present" c:identifier="rb_shell_present" throws="1">
        <doc xml:whitespace="preserve">Attempts to display the main window to the user.  See #gtk_window_present for details.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">not used.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="timestamp" transfer-ownership="none">
            <doc xml:whitespace="preserve">GTK timestamp to use (for focus-stealing prevention)</doc>
            <type name="guint32" c:type="guint32"/>
          </parameter>
        </parameters>
      </method>
      <method name="quit" c:identifier="rb_shell_quit" throws="1">
        <doc xml:whitespace="preserve">Begins the process of shutting down Rhythmbox.  This function will
return.  The error parameter and return value only exist because this
function is part of the DBus interface.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">not important</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="register_entry_type_for_source"
              c:identifier="rb_shell_register_entry_type_for_source">
        <doc xml:whitespace="preserve">Registers a source as the owner of entries of the specified type.
The main effect of this is that calling #rb_shell_get_source_by_entry_type
with the same entry type will return the source.  A source should only
be registered as the owner of a single entry type.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBSource to register</doc>
            <type name="Source" c:type="RBSource*"/>
          </parameter>
          <parameter name="type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntryType to register for</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
        </parameters>
      </method>
      <method name="remove_widget" c:identifier="rb_shell_remove_widget">
        <doc xml:whitespace="preserve">Removes a widget added with #rb_shell_add_widget from the main window.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="widget" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GtkWidget to remove from the main window</doc>
            <type name="Gtk.Widget" c:type="GtkWidget*"/>
          </parameter>
          <parameter name="location" transfer-ownership="none">
            <doc xml:whitespace="preserve">the UI location to which the widget was originally added</doc>
            <type name="ShellUILocation" c:type="RBShellUILocation"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_song_property"
              c:identifier="rb_shell_set_song_property"
              throws="1">
        <doc xml:whitespace="preserve">Attempts to set a property of a database entry identified by its URI.
If the URI identifies a file and the property is one associated with a
file metadata tag, the new value will be written to the file.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the property was set successfully.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI to modify</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="propname" transfer-ownership="none">
            <doc xml:whitespace="preserve">the name of the property to modify</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new value to set</doc>
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </method>
      <method name="toggle_visibility"
              c:identifier="rb_shell_toggle_visibility">
        <doc xml:whitespace="preserve">Toggles the visibility of the main Rhythmbox window.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <property name="autostarted"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">Whether Rhythmbox was automatically started by the session manager</doc>
        <type name="gboolean"/>
      </property>
      <property name="clipboard" introspectable="0" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBShellClipboard instance</doc>
        <type/>
      </property>
      <property name="db" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RhythmDB instance</doc>
        <type name="RhythmDB"/>
      </property>
      <property name="disable-plugins"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">If %TRUE, disable plugins</doc>
        <type name="gboolean"/>
      </property>
      <property name="display-page-model" transfer-ownership="none">
        <doc xml:whitespace="preserve">The model underlying the display page tree</doc>
        <type name="DisplayPageModel"/>
      </property>
      <property name="display-page-tree" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBDisplayPageTree instance</doc>
        <type name="DisplayPageTree"/>
      </property>
      <property name="dry-run"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">If TRUE, don't write back file metadata changes.</doc>
        <type name="gboolean"/>
      </property>
      <property name="library-source"
                introspectable="0"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The library source</doc>
        <type/>
      </property>
      <property name="no-registration"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">If %TRUE, disable single-instance features.</doc>
        <type name="gboolean"/>
      </property>
      <property name="no-update"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">If %TRUE, don't update the database.</doc>
        <type name="gboolean"/>
      </property>
      <property name="playlist-manager" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBPlaylistManager instance</doc>
        <type name="PlaylistManager"/>
      </property>
      <property name="playlists-file"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The path to the playlist file</doc>
        <type name="utf8"/>
      </property>
      <property name="prefs" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBShellPreferences instance</doc>
        <type name="ShellPreferences"/>
      </property>
      <property name="queue-source"
                introspectable="0"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The play queue source</doc>
        <type/>
      </property>
      <property name="removable-media-manager" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBRemovableMediaManager instance</doc>
        <type name="RemovableMediaManager"/>
      </property>
      <property name="rhythmdb-file"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The path to the rhythmdb file</doc>
        <type name="utf8"/>
      </property>
      <property name="selected-page" transfer-ownership="none">
        <doc xml:whitespace="preserve">The currently selected display page</doc>
        <type name="DisplayPage"/>
      </property>
      <property name="shell-player" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBShellPlayer instance</doc>
        <type name="ShellPlayer"/>
      </property>
      <property name="track-transfer-queue" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBTrackTransferQueue instance</doc>
        <type name="TrackTransferQueue"/>
      </property>
      <property name="ui-manager" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #GtkUIManager instance</doc>
        <type name="Gtk.UIManager"/>
      </property>
      <property name="visibility" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">Whether the main window is currently visible.</doc>
        <type name="gboolean"/>
      </property>
      <property name="window" transfer-ownership="none">
        <doc xml:whitespace="preserve">The main Rhythmbox window.</doc>
        <type name="Gtk.Window"/>
      </property>
      <field name="parent">
        <type name="Gtk.Application" c:type="GtkApplication"/>
      </field>
      <field name="priv">
        <type name="ShellPrivate" c:type="RBShellPrivate*"/>
      </field>
      <glib:signal name="create-song-info" when="last">
        <doc xml:whitespace="preserve">Emitted when creating a new #RBSongInfo window.  Signal handlers can
add pages to the song info window notebook to display additional
information.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="song_info" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new #RBSongInfo window</doc>
            <type name="SongInfo"/>
          </parameter>
          <parameter name="multi" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %TRUE, the song info window is for multiple entries</doc>
            <type name="gboolean"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="notify-custom" when="last">
        <doc xml:whitespace="preserve">Emitted when a custom notification should be displayed to the user.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="timeout" transfer-ownership="none">
            <doc xml:whitespace="preserve">length of time (in seconds) to display the notification</doc>
            <type name="guint"/>
          </parameter>
          <parameter name="primary" transfer-ownership="none">
            <doc xml:whitespace="preserve">main notification text</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="secondary" transfer-ownership="none">
            <doc xml:whitespace="preserve">secondary notification text</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="image_uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">URI for an image to include in the notification (optional)</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="requested" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %TRUE, the notification was triggered by an explicit user action</doc>
            <type name="gboolean"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="notify-playing-entry" when="last">
        <doc xml:whitespace="preserve">Emitted when a notification should be displayed showing the current
playing entry.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="gboolean"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="visibility-changed" when="last">
        <doc xml:whitespace="preserve">Emitted after the visibility of the main Rhythmbox window has
changed.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="visibile" transfer-ownership="none">
            <doc xml:whitespace="preserve">new visibility</doc>
            <type name="gboolean"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="visibility-changing" when="last">
        <doc xml:whitespace="preserve">Emitted before the visibility of the main window changes.  The return
value overrides the visibility setting.  If multiple signal handlers
are attached, the last one wins.</doc>
        <return-value transfer-ownership="none">
          <type name="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="initial" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %TRUE, this is the initial visibility for the window</doc>
            <type name="gboolean"/>
          </parameter>
          <parameter name="visible" transfer-ownership="none">
            <doc xml:whitespace="preserve">new shell visibility</doc>
            <type name="gboolean"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <enumeration name="ShellActivationType"
                 glib:type-name="RBShellActivationType"
                 glib:get-type="rb_shell_activation_type_get_type"
                 c:type="RBShellActivationType">
      <member name="select"
              value="0"
              c:identifier="RB_SHELL_ACTIVATION_SELECT"
              glib:nick="select"/>
      <member name="play"
              value="1"
              c:identifier="RB_SHELL_ACTIVATION_PLAY"
              glib:nick="play"/>
      <member name="always_play"
              value="2"
              c:identifier="RB_SHELL_ACTIVATION_ALWAYS_PLAY"
              glib:nick="always-play"/>
    </enumeration>
    <record name="ShellClass"
            c:type="RBShellClass"
            glib:is-gtype-struct-for="Shell">
      <field name="parent_class">
        <type name="Gtk.ApplicationClass" c:type="GtkApplicationClass"/>
      </field>
      <field name="visibility_changing">
        <callback name="visibility_changing">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="shell" transfer-ownership="none">
              <type name="Shell" c:type="RBShell*"/>
            </parameter>
            <parameter name="initial" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean"/>
            </parameter>
            <parameter name="visible" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="visibility_changed">
        <callback name="visibility_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="shell" transfer-ownership="none">
              <type name="Shell" c:type="RBShell*"/>
            </parameter>
            <parameter name="visible" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="create_song_info">
        <callback name="create_song_info">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="shell" transfer-ownership="none">
              <type name="Shell" c:type="RBShell*"/>
            </parameter>
            <parameter name="song_info" transfer-ownership="none">
              <type name="SongInfo" c:type="RBSongInfo*"/>
            </parameter>
            <parameter name="multi" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="removable_media_scan_finished">
        <callback name="removable_media_scan_finished">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="shell" transfer-ownership="none">
              <type name="Shell" c:type="RBShell*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="database_load_complete">
        <callback name="database_load_complete">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="shell" transfer-ownership="none">
              <type name="Shell" c:type="RBShell*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <enumeration name="ShellError" c:type="RBShellError">
      <member name="no_such_uri"
              value="0"
              c:identifier="RB_SHELL_ERROR_NO_SUCH_URI"/>
      <member name="no_such_property"
              value="1"
              c:identifier="RB_SHELL_ERROR_NO_SUCH_PROPERTY"/>
      <member name="immutable_property"
              value="2"
              c:identifier="RB_SHELL_ERROR_IMMUTABLE_PROPERTY"/>
      <member name="invalid_property_type"
              value="3"
              c:identifier="RB_SHELL_ERROR_INVALID_PROPERTY_TYPE"/>
      <member name="no_source_for_uri"
              value="4"
              c:identifier="RB_SHELL_ERROR_NO_SOURCE_FOR_URI"/>
    </enumeration>
    <enumeration name="ShellErrorType"
                 glib:type-name="RBShellErrorType"
                 glib:get-type="rb_shell_error_get_type"
                 c:type="RBShellErrorType">
      <member name="no_such_uri"
              value="0"
              c:identifier="RB_SHELL_ERROR_NO_SUCH_URI"
              glib:nick="no-such-uri"/>
      <member name="no_such_property"
              value="1"
              c:identifier="RB_SHELL_ERROR_NO_SUCH_PROPERTY"
              glib:nick="no-such-property"/>
      <member name="immutable_property"
              value="2"
              c:identifier="RB_SHELL_ERROR_IMMUTABLE_PROPERTY"
              glib:nick="immutable-property"/>
      <member name="invalid_property_type"
              value="3"
              c:identifier="RB_SHELL_ERROR_INVALID_PROPERTY_TYPE"
              glib:nick="invalid-property-type"/>
      <member name="no_source_for_uri"
              value="4"
              c:identifier="RB_SHELL_ERROR_NO_SOURCE_FOR_URI"
              glib:nick="no-source-for-uri"/>
      <function name="quark" c:identifier="rb_shell_error_quark">
        <doc xml:whitespace="preserve">Returns the #GQuark used for #RBShell errors</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">shell error #GQuark</doc>
          <type name="GLib.Quark" c:type="GQuark"/>
        </return-value>
      </function>
    </enumeration>
    <class name="ShellPlayer"
           c:symbol-prefix="shell_player"
           c:type="RBShellPlayer"
           parent="Gtk.HBox"
           glib:type-name="RBShellPlayer"
           glib:get-type="rb_shell_player_get_type"
           glib:type-struct="ShellPlayerClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <implements name="Gtk.Orientable"/>
      <constructor name="new" c:identifier="rb_shell_player_new">
        <doc xml:whitespace="preserve">Creates the #RBShellPlayer</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the #RBShellPlayer instance</doc>
          <type name="ShellPlayer" c:type="RBShellPlayer*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDB</doc>
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="mgr" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GtkUIManager</doc>
            <type name="Gtk.UIManager" c:type="GtkUIManager*"/>
          </parameter>
          <parameter name="actiongroup" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GtkActionGroup to use</doc>
            <type name="Gtk.ActionGroup" c:type="GtkActionGroup*"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="elapsed_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="elapsed" transfer-ownership="none">
            <type name="guint" c:type="guint"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="elapsed_nano_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="elapsed" transfer-ownership="none">
            <type name="gint64" c:type="gint64"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="playing_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="playing" transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="playing_song_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="playing_song_property_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="property" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="old" transfer-ownership="none">
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
          <parameter name="newValue" transfer-ownership="none">
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="playing_source_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <type name="Source" c:type="RBSource*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="playing_uri_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="window_title_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="window_title" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="add_play_order"
              c:identifier="rb_shell_player_add_play_order">
        <doc xml:whitespace="preserve">Adds a new play order to the set of available play orders.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of the new play order</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="description" transfer-ownership="none">
            <doc xml:whitespace="preserve">description of the new play order</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="order_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GType of the play order class</doc>
            <type name="GType" c:type="GType"/>
          </parameter>
          <parameter name="hidden" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %TRUE, don't display the play order in the UI</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="do_next" c:identifier="rb_shell_player_do_next" throws="1">
        <doc xml:whitespace="preserve">Skips to the next song.  Consults the play queue and handles
transitions between the play queue and the active source.
Fails if there is no entry to play after the current one.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if successful</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="do_previous"
              c:identifier="rb_shell_player_do_previous"
              throws="1">
        <doc xml:whitespace="preserve">If the current song has been playing for more than 3 seconds,
restarts it, otherwise, goes back to the previous song.
Fails if there is no current song, or if inside the first
3 seconds of the first song in the play order.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if successful</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="get_active_source"
              c:identifier="rb_shell_player_get_active_source">
        <doc xml:whitespace="preserve">Retrieves the active source.  This is the source that the user
selected for playback.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the active #RBSource</doc>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
      </method>
      <method name="get_mute"
              c:identifier="rb_shell_player_get_mute"
              throws="1">
        <doc xml:whitespace="preserve">Returns %TRUE if currently muted</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if currently muted</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="mute"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns the current mute setting</doc>
            <type name="gboolean" c:type="gboolean*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_playback_state"
              c:identifier="rb_shell_player_get_playback_state">
        <doc xml:whitespace="preserve">Retrieves the current state of the shuffle and repeat settings.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if successful.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="shuffle"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns the current shuffle setting</doc>
            <type name="gboolean" c:type="gboolean*"/>
          </parameter>
          <parameter name="repeat"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns the current repeat setting</doc>
            <type name="gboolean" c:type="gboolean*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_playing"
              c:identifier="rb_shell_player_get_playing"
              throws="1">
        <doc xml:whitespace="preserve">Reports whether playback is occuring by setting #playing.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if successful</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="playing"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">playback state return</doc>
            <type name="gboolean" c:type="gboolean*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_playing_entry"
              c:identifier="rb_shell_player_get_playing_entry">
        <doc xml:whitespace="preserve">Retrieves the currently playing #RhythmDBEntry, or NULL if
nothing is playing.  The caller must unref the entry
(using #rhythmdb_entry_unref) when it is no longer needed.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the currently playing #RhythmDBEntry, or NULL</doc>
          <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
        </return-value>
      </method>
      <method name="get_playing_path"
              c:identifier="rb_shell_player_get_playing_path"
              throws="1">
        <doc xml:whitespace="preserve">Retrieves the URI of the current playing entry.  The
caller must not free the returned string.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if successful</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="path"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns the URI of the current playing entry</doc>
            <type name="utf8" c:type="gchar**"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_playing_song_duration"
              c:identifier="rb_shell_player_get_playing_song_duration">
        <doc xml:whitespace="preserve">Retrieves the duration of the current playing song.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">duration, or -1 if not playing</doc>
          <type name="glong" c:type="long"/>
        </return-value>
      </method>
      <method name="get_playing_source"
              c:identifier="rb_shell_player_get_playing_source">
        <doc xml:whitespace="preserve">Retrieves the current playing source.  That is, the source from
which the current song was drawn.  This differs from 
#rb_shell_player_get_active_source when the current song came
from the play queue.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the current playing #RBSource</doc>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
      </method>
      <method name="get_playing_time"
              c:identifier="rb_shell_player_get_playing_time"
              throws="1">
        <doc xml:whitespace="preserve">Retrieves the current playback position.  Fails if
the player currently cannot provide the playback
position.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if successful</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="time"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns the current playback position</doc>
            <type name="guint" c:type="guint*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_playing_time_string"
              c:identifier="rb_shell_player_get_playing_time_string">
        <doc xml:whitespace="preserve">Constructs a string showing the current playback position,
taking the time display settings into account.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">allocated playing time string</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
      </method>
      <method name="get_volume"
              c:identifier="rb_shell_player_get_volume"
              throws="1">
        <doc xml:whitespace="preserve">Returns the current volume level</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the current volume level.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="volume"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns the volume level</doc>
            <type name="gdouble" c:type="gdouble*"/>
          </parameter>
        </parameters>
      </method>
      <method name="jump_to_current"
              c:identifier="rb_shell_player_jump_to_current">
        <doc xml:whitespace="preserve">Scrolls the #RBEntryView for the current playing source so that
the current playing entry is visible and selects the row for the
entry.  If there is no current playing entry, the selection is
cleared instead.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="pause" c:identifier="rb_shell_player_pause" throws="1">
        <doc xml:whitespace="preserve">Pauses playback if possible, completely stopping if not.

paused/stopped or playback was not occurring).</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">whether playback is not occurring (TRUE when successfully</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="play" c:identifier="rb_shell_player_play" throws="1">
        <doc xml:whitespace="preserve">Starts playback, if it is not already playing.

or already playing).</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">whether playback is now occurring (TRUE when successfully started</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="play_entry" c:identifier="rb_shell_player_play_entry">
        <doc xml:whitespace="preserve">Plays a specified entry.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry to play</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new #RBSource to set as playing (or NULL to use the selected source)</doc>
            <type name="Source" c:type="RBSource*"/>
          </parameter>
        </parameters>
      </method>
      <method name="playpause"
              c:identifier="rb_shell_player_playpause"
              throws="1">
        <doc xml:whitespace="preserve">Toggles between playing and paused state.  If there is no playing
entry, chooses an entry from (in order of preference) the play queue,
the selection in the current source, or the play order.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if successful</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="unused" transfer-ownership="none">
            <doc xml:whitespace="preserve">nothing</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="remove_play_order"
              c:identifier="rb_shell_player_remove_play_order">
        <doc xml:whitespace="preserve">Removes a play order previously added with #rb_shell_player_add_play_order
from the set of available play orders.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of the play order to remove</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="seek" c:identifier="rb_shell_player_seek" throws="1">
        <doc xml:whitespace="preserve">Seeks forwards or backwards in the current playing
song. Fails if the current song is not seekable.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if successful</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="offset" transfer-ownership="none">
            <doc xml:whitespace="preserve">relative seek target (in seconds)</doc>
            <type name="gint32" c:type="gint32"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_mute"
              c:identifier="rb_shell_player_set_mute"
              throws="1">
        <doc xml:whitespace="preserve">Updates the mute setting on the player.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if successful</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="mute" transfer-ownership="none">
            <doc xml:whitespace="preserve">%TRUE to mute playback</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_playback_state"
              c:identifier="rb_shell_player_set_playback_state">
        <doc xml:whitespace="preserve">Sets the state of the shuffle and repeat settings.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="shuffle" transfer-ownership="none">
            <doc xml:whitespace="preserve">whether to enable the shuffle setting</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
          <parameter name="repeat" transfer-ownership="none">
            <doc xml:whitespace="preserve">whether to enable the repeat setting</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_playing_source"
              c:identifier="rb_shell_player_set_playing_source">
        <doc xml:whitespace="preserve">Replaces the current playing source.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new playing #RBSource</doc>
            <type name="Source" c:type="RBSource*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_playing_time"
              c:identifier="rb_shell_player_set_playing_time"
              throws="1">
        <doc xml:whitespace="preserve">Attempts to set the playback position.  Fails if the
current song is not seekable.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if successful</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="time" transfer-ownership="none">
            <doc xml:whitespace="preserve">the target playback position (in seconds)</doc>
            <type name="guint" c:type="guint"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_selected_source"
              c:identifier="rb_shell_player_set_selected_source">
        <doc xml:whitespace="preserve">Updates the player to reflect a new source being selected.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBSource to select</doc>
            <type name="Source" c:type="RBSource*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_volume"
              c:identifier="rb_shell_player_set_volume"
              throws="1">
        <doc xml:whitespace="preserve">Sets the playback volume level.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE on success</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="volume" transfer-ownership="none">
            <doc xml:whitespace="preserve">the volume level (between 0 and 1)</doc>
            <type name="gdouble" c:type="gdouble"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_volume_relative"
              c:identifier="rb_shell_player_set_volume_relative"
              throws="1">
        <doc xml:whitespace="preserve">Adds the specified value to the current volume level.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE on success</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="delta" transfer-ownership="none">
            <doc xml:whitespace="preserve">difference to apply to the volume level (between -1 and 1)</doc>
            <type name="gdouble" c:type="gdouble"/>
          </parameter>
        </parameters>
      </method>
      <method name="stop" c:identifier="rb_shell_player_stop">
        <doc xml:whitespace="preserve">Completely stops playback, freeing resources and unloading the file.

In general rb_shell_player_pause() should be used instead, as it stops the
audio, but does not completely free resources.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <property name="action-group"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The #GtkActionGroup to use for player actions</doc>
        <type name="Gtk.ActionGroup"/>
      </property>
      <property name="db"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RhythmDB</doc>
        <type name="RhythmDB"/>
      </property>
      <property name="mute" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">Whether playback is currently muted.</doc>
        <type name="gboolean"/>
      </property>
      <property name="play-order" transfer-ownership="none">
        <doc xml:whitespace="preserve">The current play order object.</doc>
        <type name="utf8"/>
      </property>
      <property name="player" transfer-ownership="none">
        <doc xml:whitespace="preserve">The player backend object (an object implementing the #RBPlayer interface).</doc>
        <type name="GObject.Object"/>
      </property>
      <property name="playing" transfer-ownership="none">
        <doc xml:whitespace="preserve">Whether Rhythmbox is currently playing something</doc>
        <type name="gboolean"/>
      </property>
      <property name="playing-from-queue" transfer-ownership="none">
        <doc xml:whitespace="preserve">If %TRUE, the current playing entry came from the play queue.</doc>
        <type name="gboolean"/>
      </property>
      <property name="queue-only" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">If %TRUE, activating an entry should only add it to the play queue.</doc>
        <type name="gboolean"/>
      </property>
      <property name="queue-source" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The play queue source</doc>
        <type name="PlaylistSource"/>
      </property>
      <property name="source" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The current source that is selected for playback.</doc>
        <type name="Source"/>
      </property>
      <property name="statusbar"
                introspectable="0"
                writable="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBStatusbar object</doc>
        <type/>
      </property>
      <property name="ui-manager"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The GtkUIManager</doc>
        <type name="Gtk.UIManager"/>
      </property>
      <property name="volume" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The current playback volume (between 0.0 and 1.0)</doc>
        <type name="gfloat"/>
      </property>
      <field name="parent">
        <type name="Gtk.HBox" c:type="GtkHBox"/>
      </field>
      <field name="priv">
        <type name="ShellPlayerPrivate" c:type="RBShellPlayerPrivate*"/>
      </field>
      <glib:signal name="elapsed-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when the playback position changes.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="elapsed" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new playback position in seconds</doc>
            <type name="guint"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="elapsed-nano-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when the playback position changes.  Only use this (as opposed to
elapsed-changed) when you require subsecond precision.  This signal will be
emitted multiple times per second.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="elapsed" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new playback position in nanoseconds</doc>
            <type name="gint64"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="playing-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when playback either stops or starts.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="playing" transfer-ownership="none">
            <doc xml:whitespace="preserve">flag indicating playback state</doc>
            <type name="gboolean"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="playing-song-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when the playing database entry changes</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new playing #RhythmDBEntry</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="playing-song-property-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when a property of the playing database entry changes.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI of the playing entry</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="property" transfer-ownership="none">
            <doc xml:whitespace="preserve">the name of the property that changed</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="old" transfer-ownership="none">
            <doc xml:whitespace="preserve">the previous value for the property</doc>
            <type name="GObject.Value"/>
          </parameter>
          <parameter name="newvalue" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new value of the property</doc>
            <type name="GObject.Value"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="playing-source-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when a new #RBSource instance starts playing</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBSource that is now playing</doc>
            <type name="Source"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="playing-uri-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when the playing database entry changes, providing the
URI of the entry.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the URI of the new playing entry</doc>
            <type name="utf8"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="window-title-changed" when="last">
        <doc xml:whitespace="preserve">Emitted when the main window title text should be changed</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="title" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new window title</doc>
            <type name="utf8"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="ShellPlayerClass"
            c:type="RBShellPlayerClass"
            glib:is-gtype-struct-for="ShellPlayer">
      <field name="parent_class">
        <type name="Gtk.HBoxClass" c:type="GtkHBoxClass"/>
      </field>
      <field name="window_title_changed">
        <callback name="window_title_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="ShellPlayer" c:type="RBShellPlayer*"/>
            </parameter>
            <parameter name="window_title" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="elapsed_changed">
        <callback name="elapsed_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="ShellPlayer" c:type="RBShellPlayer*"/>
            </parameter>
            <parameter name="elapsed" transfer-ownership="none">
              <type name="guint" c:type="guint"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="elapsed_nano_changed">
        <callback name="elapsed_nano_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="ShellPlayer" c:type="RBShellPlayer*"/>
            </parameter>
            <parameter name="elapsed" transfer-ownership="none">
              <type name="gint64" c:type="gint64"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="playing_changed">
        <callback name="playing_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="ShellPlayer" c:type="RBShellPlayer*"/>
            </parameter>
            <parameter name="playing" transfer-ownership="none">
              <type name="gboolean" c:type="gboolean"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="playing_source_changed">
        <callback name="playing_source_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="ShellPlayer" c:type="RBShellPlayer*"/>
            </parameter>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="playing_uri_changed">
        <callback name="playing_uri_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="ShellPlayer" c:type="RBShellPlayer*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="playing_song_changed">
        <callback name="playing_song_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="ShellPlayer" c:type="RBShellPlayer*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="playing_song_property_changed">
        <callback name="playing_song_property_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="player" transfer-ownership="none">
              <type name="ShellPlayer" c:type="RBShellPlayer*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="property" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="old" transfer-ownership="none">
              <type name="GObject.Value" c:type="GValue*"/>
            </parameter>
            <parameter name="newValue" transfer-ownership="none">
              <type name="GObject.Value" c:type="GValue*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <enumeration name="ShellPlayerError"
                 glib:type-name="RBShellPlayerError"
                 glib:get-type="rb_shell_player_error_get_type"
                 c:type="RBShellPlayerError">
      <member name="playlist_parse_failed"
              value="0"
              c:identifier="RB_SHELL_PLAYER_ERROR_PLAYLIST_PARSE_ERROR"
              glib:nick="playlist-parse-failed"/>
      <member name="end_of_playlist"
              value="1"
              c:identifier="RB_SHELL_PLAYER_ERROR_END_OF_PLAYLIST"
              glib:nick="end-of-playlist"/>
      <member name="not_playing"
              value="2"
              c:identifier="RB_SHELL_PLAYER_ERROR_NOT_PLAYING"
              glib:nick="not-playing"/>
      <member name="not_seekable"
              value="3"
              c:identifier="RB_SHELL_PLAYER_ERROR_NOT_SEEKABLE"
              glib:nick="not-seekable"/>
      <member name="position_not_available"
              value="4"
              c:identifier="RB_SHELL_PLAYER_ERROR_POSITION_NOT_AVAILABLE"
              glib:nick="position-not-available"/>
      <function name="quark" c:identifier="rb_shell_player_error_quark">
        <return-value transfer-ownership="none">
          <type name="GLib.Quark" c:type="GQuark"/>
        </return-value>
      </function>
    </enumeration>
    <record name="ShellPlayerPrivate"
            c:type="RBShellPlayerPrivate"
            disguised="1">
    </record>
    <class name="ShellPreferences"
           c:symbol-prefix="shell_preferences"
           c:type="RBShellPreferences"
           parent="Gtk.Dialog"
           glib:type-name="RBShellPreferences"
           glib:get-type="rb_shell_preferences_get_type"
           glib:type-struct="ShellPreferencesClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <constructor name="new" c:identifier="rb_shell_preferences_new">
        <doc xml:whitespace="preserve">Creates the #RBShellPreferences instance, populating it with the
preferences pages for the sources in the list.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the #RBShellPreferences instance</doc>
          <type name="Gtk.Widget" c:type="GtkWidget*"/>
        </return-value>
        <parameters>
          <parameter name="views" transfer-ownership="none">
            <doc xml:whitespace="preserve">list of sources to check for preferences pages</doc>
            <type name="GLib.List" c:type="GList*">
              <type name="Source"/>
            </type>
          </parameter>
        </parameters>
      </constructor>
      <method name="add_widget" c:identifier="rb_shell_preferences_add_widget">
        <doc xml:whitespace="preserve">Adds a widget to the preferences window.  See #gtk_box_pack_start for
details on how the expand and fill parameters work.  This function can be
used to add widgets to the 'general' and 'playback' pages.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="widget" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GtkWidget to insert into the preferences window</doc>
            <type name="Gtk.Widget" c:type="GtkWidget*"/>
          </parameter>
          <parameter name="location" transfer-ownership="none">
            <doc xml:whitespace="preserve">the location at which to insert the widget</doc>
            <type name="ShellPrefsUILocation" c:type="RBShellPrefsUILocation"/>
          </parameter>
          <parameter name="expand" transfer-ownership="none">
            <doc xml:whitespace="preserve">whether the widget should be given extra space</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
          <parameter name="fill" transfer-ownership="none">
            <doc xml:whitespace="preserve">whether the widget should fill all space allocated to it</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="append_page"
              c:identifier="rb_shell_preferences_append_page">
        <doc xml:whitespace="preserve">Appends a new page to the preferences dialog notebook.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">name of the page to append</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="widget" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GtkWidget to use as the contents of the page</doc>
            <type name="Gtk.Widget" c:type="GtkWidget*"/>
          </parameter>
        </parameters>
      </method>
      <method name="remove_widget"
              c:identifier="rb_shell_preferences_remove_widget">
        <doc xml:whitespace="preserve">Removes a widget added with #rb_shell_preferences_add_widget from the preferences window.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="widget" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GtkWidget to remove from the preferences window</doc>
            <type name="Gtk.Widget" c:type="GtkWidget*"/>
          </parameter>
          <parameter name="location" transfer-ownership="none">
            <doc xml:whitespace="preserve">the UI location to which the widget was originally added</doc>
            <type name="ShellPrefsUILocation" c:type="RBShellPrefsUILocation"/>
          </parameter>
        </parameters>
      </method>
      <field name="parent">
        <type name="Gtk.Dialog" c:type="GtkDialog"/>
      </field>
      <field name="priv">
        <type name="ShellPreferencesPrivate"
              c:type="RBShellPreferencesPrivate*"/>
      </field>
    </class>
    <record name="ShellPreferencesClass"
            c:type="RBShellPreferencesClass"
            glib:is-gtype-struct-for="ShellPreferences">
      <field name="parent_class">
        <type name="Gtk.DialogClass" c:type="GtkDialogClass"/>
      </field>
    </record>
    <record name="ShellPreferencesPrivate"
            c:type="RBShellPreferencesPrivate"
            disguised="1">
    </record>
    <enumeration name="ShellPrefsUILocation"
                 glib:type-name="RBShellPrefsUILocation"
                 glib:get-type="rb_shell_prefs_ui_location_get_type"
                 c:type="RBShellPrefsUILocation">
      <doc xml:whitespace="preserve">Locations available for adding new widgets to the preferences dialog.</doc>
      <member name="general"
              value="0"
              c:identifier="RB_SHELL_PREFS_UI_LOCATION_GENERAL"
              glib:nick="general"/>
      <member name="playback"
              value="1"
              c:identifier="RB_SHELL_PREFS_UI_LOCATION_PLAYBACK"
              glib:nick="playback"/>
    </enumeration>
    <record name="ShellPrivate" c:type="RBShellPrivate" disguised="1">
    </record>
    <enumeration name="ShellUILocation"
                 glib:type-name="RBShellUILocation"
                 glib:get-type="rb_shell_ui_location_get_type"
                 c:type="RBShellUILocation">
      <member name="sidebar"
              value="0"
              c:identifier="RB_SHELL_UI_LOCATION_SIDEBAR"
              glib:nick="sidebar"/>
      <member name="right_sidebar"
              value="1"
              c:identifier="RB_SHELL_UI_LOCATION_RIGHT_SIDEBAR"
              glib:nick="right-sidebar"/>
      <member name="main_top"
              value="2"
              c:identifier="RB_SHELL_UI_LOCATION_MAIN_TOP"
              glib:nick="main-top"/>
      <member name="main_bottom"
              value="3"
              c:identifier="RB_SHELL_UI_LOCATION_MAIN_BOTTOM"
              glib:nick="main-bottom"/>
    </enumeration>
    <class name="SongInfo"
           c:symbol-prefix="song_info"
           c:type="RBSongInfo"
           parent="Gtk.Dialog"
           glib:type-name="RBSongInfo"
           glib:get-type="rb_song_info_get_type"
           glib:type-struct="SongInfoClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <constructor name="new" c:identifier="rb_song_info_new">
        <doc xml:whitespace="preserve">Creates a new #RBSongInfo for the selected entry or entries in
the specified entry view.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the new song properties window</doc>
          <type name="Gtk.Widget" c:type="GtkWidget*"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">#RBSource creating the song properties window</doc>
            <type name="Source" c:type="RBSource*"/>
          </parameter>
          <parameter name="entry_view" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBEntryView to get selection data from</doc>
            <type name="EntryView" c:type="RBEntryView*"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="post_metadata_change">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="pre_metadata_change">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="append_page" c:identifier="rb_song_info_append_page">
        <doc xml:whitespace="preserve">Adds a new page to the song properties window.  Should be called
in a handler connected to the #RBShell 'create-song-info' signal.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the page number</doc>
          <type name="guint" c:type="guint"/>
        </return-value>
        <parameters>
          <parameter name="title" transfer-ownership="none">
            <doc xml:whitespace="preserve">the title of the new page</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="page" transfer-ownership="none">
            <doc xml:whitespace="preserve">the page #GtkWidget</doc>
            <type name="Gtk.Widget" c:type="GtkWidget*"/>
          </parameter>
        </parameters>
      </method>
      <property name="current-entry" transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RhythmDBEntry that is currently being displayed.  Will be NULL for
multiple-entry song properties windows.</doc>
        <type name="RhythmDBEntry"/>
      </property>
      <property name="entry-view"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBEntryView for the source that created the song properties window.  Used
find the set of selected entries, and to change the selection when the 'back' and
'forward' buttons are pressed.</doc>
        <type name="EntryView"/>
      </property>
      <property name="selected-entries" transfer-ownership="none">
        <doc xml:whitespace="preserve">The set of #RhythmDBEntry objects currently being displayed.  Valid for both
single-entry and multiple-entry song properties windows.</doc>
        <type name="GObject.ValueArray"/>
      </property>
      <property name="source"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBSource that created the song properties window.  Used to update
for track list changes, and to find the sets of albums, artist, and genres
to use for tag edit completion.</doc>
        <type name="Source"/>
      </property>
      <field name="parent">
        <type name="Gtk.Dialog" c:type="GtkDialog"/>
      </field>
      <field name="priv">
        <type name="SongInfoPrivate" c:type="RBSongInfoPrivate*"/>
      </field>
      <glib:signal name="post-metadata-change" when="last">
        <doc xml:whitespace="preserve">Emitted just after changes have been applied to the database.
Probably useless.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry that was changed</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="pre-metadata-change" when="last">
        <doc xml:whitespace="preserve">Emitted just before the changes made in the song properties window
are applied to the database.  This is only emitted in the single-entry
case.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry being changed</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="SongInfoClass"
            c:type="RBSongInfoClass"
            glib:is-gtype-struct-for="SongInfo">
      <field name="parent_class">
        <type name="Gtk.DialogClass" c:type="GtkDialogClass"/>
      </field>
      <field name="pre_metadata_change">
        <callback name="pre_metadata_change">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="info" transfer-ownership="none">
              <type name="SongInfo" c:type="RBSongInfo*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="post_metadata_change">
        <callback name="post_metadata_change">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="info" transfer-ownership="none">
              <type name="SongInfo" c:type="RBSongInfo*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="SongInfoPrivate" c:type="RBSongInfoPrivate" disguised="1">
    </record>
    <class name="Source"
           c:symbol-prefix="source"
           c:type="RBSource"
           parent="DisplayPage"
           abstract="1"
           glib:type-name="RBSource"
           glib:get-type="rb_source_get_type"
           glib:type-struct="SourceClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <implements name="Gtk.Orientable"/>
      <virtual-method name="filter_changed">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_add_to_queue">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="queue" transfer-ownership="none">
            <type name="Source" c:type="RBSource*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_add_uri">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="title" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="genre" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="callback"
                     transfer-ownership="none"
                     scope="notified"
                     closure="4"
                     destroy="5">
            <type name="SourceAddCallback" c:type="RBSourceAddCallback"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="destroy_data"
                     transfer-ownership="none"
                     scope="async">
            <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_can_add_to_queue">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_can_copy">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_can_cut">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_can_delete">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_can_move_to_trash">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_can_paste">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_can_pause">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_can_rename">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_copy" introspectable="0">
        <return-value>
          <type name="GLib.List" c:type="GList*">
            <type name="gpointer" c:type="gpointer"/>
          </type>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_cut" introspectable="0">
        <return-value>
          <type name="GLib.List" c:type="GList*">
            <type name="gpointer" c:type="gpointer"/>
          </type>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_delete">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_delete_thyself">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_get_delete_action">
        <return-value transfer-ownership="full">
          <type name="utf8" c:type="char*"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_get_entry_view" introspectable="0">
        <return-value>
          <type name="EntryView" c:type="RBEntryView*"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_get_property_views" introspectable="0">
        <return-value>
          <type name="GLib.List" c:type="GList*">
            <type name="gpointer" c:type="gpointer"/>
          </type>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_handle_eos">
        <return-value transfer-ownership="none">
          <type name="SourceEOFType" c:type="RBSourceEOFType"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_move_to_trash">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_paste" introspectable="0">
        <return-value>
          <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
        </return-value>
        <parameters>
          <parameter name="entries" transfer-ownership="none">
            <type name="GLib.List" c:type="GList*">
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_reset_filters">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_search">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="search" transfer-ownership="none">
            <type name="SourceSearch" c:type="RBSourceSearch*"/>
          </parameter>
          <parameter name="cur_text" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="new_text" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_song_properties">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_try_playlist">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </virtual-method>
      <virtual-method name="impl_uri_is_source">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="impl_want_uri">
        <return-value transfer-ownership="none">
          <type name="guint" c:type="guint"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="add_to_queue" c:identifier="rb_source_add_to_queue">
        <doc xml:whitespace="preserve">Adds the currently selected entries to the end of the
play queue.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="queue" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBSource for the play queue</doc>
            <type name="Source" c:type="RBSource*"/>
          </parameter>
        </parameters>
      </method>
      <method name="add_uri" c:identifier="rb_source_add_uri">
        <doc xml:whitespace="preserve">Adds an entry corresponding to the URI to the source.  The
@title and @genre parameters are not really used.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">a URI to add</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="title" transfer-ownership="none">
            <doc xml:whitespace="preserve">theoretically, the title of the entity the URI points to</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="genre" transfer-ownership="none">
            <doc xml:whitespace="preserve">theoretically, the genre of the entity the URI points to</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="callback"
                     transfer-ownership="none"
                     scope="notified"
                     closure="4"
                     destroy="5">
            <doc xml:whitespace="preserve">a callback function to call when complete</doc>
            <type name="SourceAddCallback" c:type="RBSourceAddCallback"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <doc xml:whitespace="preserve">data to pass to the callback</doc>
            <type name="gpointer" c:type="gpointer"/>
          </parameter>
          <parameter name="destroy_data"
                     transfer-ownership="none"
                     scope="async">
            <doc xml:whitespace="preserve">function to call to destroy the callback data</doc>
            <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
          </parameter>
        </parameters>
      </method>
      <method name="bind_settings" c:identifier="rb_source_bind_settings">
        <doc xml:whitespace="preserve">Binds the source's #GSettings instance to the given widgets.  Should be called
from the source's constructed method.

If the browser widget has a browser-views property, it will be bound to the
browser-views settings key.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry_view"
                     transfer-ownership="none"
                     allow-none="1">
            <doc xml:whitespace="preserve">the #RBEntryView for the source</doc>
            <type name="Gtk.Widget" c:type="GtkWidget*"/>
          </parameter>
          <parameter name="paned" transfer-ownership="none" allow-none="1">
            <doc xml:whitespace="preserve">the #GtkPaned containing the entry view and the browser</doc>
            <type name="Gtk.Widget" c:type="GtkWidget*"/>
          </parameter>
          <parameter name="browser" transfer-ownership="none" allow-none="1">
            <doc xml:whitespace="preserve">the browser (typically a #RBLibraryBrowser) for the source</doc>
            <type name="Gtk.Widget" c:type="GtkWidget*"/>
          </parameter>
        </parameters>
      </method>
      <method name="can_add_to_queue"
              c:identifier="rb_source_can_add_to_queue">
        <doc xml:whitespace="preserve">Determines whether the source can add the selected entries to
the play queue.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if adding to the play queue is supported</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="can_copy" c:identifier="rb_source_can_copy">
        <doc xml:whitespace="preserve">Determines whether the source supports the copy part
of a copy-and-paste operation.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if copying is supported</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="can_cut" c:identifier="rb_source_can_cut">
        <doc xml:whitespace="preserve">Determines whether the source supporst the typical cut
(as in cut-and-paste) operation.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if cutting is supported</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="can_delete" c:identifier="rb_source_can_delete">
        <doc xml:whitespace="preserve">Determines whether the source allows the user to delete
a selected set of entries.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if deletion is supported</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="can_move_to_trash"
              c:identifier="rb_source_can_move_to_trash">
        <doc xml:whitespace="preserve">Determines whether the source allows the user to trash
the files backing a selected set of entries.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if trashing is supported</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="can_paste" c:identifier="rb_source_can_paste">
        <doc xml:whitespace="preserve">Determines whether the source supports paste operations.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the pasting is supported</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="can_pause" c:identifier="rb_source_can_pause">
        <doc xml:whitespace="preserve">Determines whether playback of entries from the source can
be paused.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if pausing is supported</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="can_rename" c:identifier="rb_source_can_rename">
        <doc xml:whitespace="preserve">Determines whether the source can be renamed.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if this source can be renamed</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="can_show_properties"
              c:identifier="rb_source_can_show_properties">
        <doc xml:whitespace="preserve">Determines whether the source can display a properties
window for the currently selected entry (or set of entries)</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if showing properties is supported</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="copy" c:identifier="rb_source_copy">
        <doc xml:whitespace="preserve">Copies the selected entries to the clipboard.

the currently selected entries from the source.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">a list containing</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="RhythmDBEntry"/>
          </type>
        </return-value>
      </method>
      <method name="cut" c:identifier="rb_source_cut">
        <doc xml:whitespace="preserve">Removes the currently selected entries from the source and
returns them so they can be pasted into another source.

from the source.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">entries cut</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="RhythmDBEntry"/>
          </type>
        </return-value>
      </method>
      <method name="delete" c:identifier="rb_source_delete">
        <doc xml:whitespace="preserve">Deletes the currently selected entries from the source.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="gather_selected_properties"
              c:identifier="rb_source_gather_selected_properties">
        <doc xml:whitespace="preserve">Returns a list containing the values of the specified
property from the selected entries in the source.
This is used to implement the 'browse this artist' (etc.)
actions.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">list of property values</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="utf8"/>
          </type>
        </return-value>
        <parameters>
          <parameter name="prop" transfer-ownership="none">
            <doc xml:whitespace="preserve">property for which to gather selection</doc>
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_delete_action"
              c:identifier="rb_source_get_delete_action">
        <doc xml:whitespace="preserve">Returns the name of the UI action to use for 'delete'.
This allows the source to customise the visible action name
and description to better describe what deletion actually does.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">allocated string holding UI action name</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
      </method>
      <method name="get_entry_view" c:identifier="rb_source_get_entry_view">
        <doc xml:whitespace="preserve">Returns the entry view widget for the source.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the #RBEntryView instance for the source</doc>
          <type name="EntryView" c:type="RBEntryView*"/>
        </return-value>
      </method>
      <method name="get_property_views"
              c:identifier="rb_source_get_property_views">
        <doc xml:whitespace="preserve">Returns a list containing the #RBPropertyView instances for the
source, if any.</doc>
        <return-value transfer-ownership="container">
          <doc xml:whitespace="preserve">list of property views</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="PropertyView"/>
          </type>
        </return-value>
      </method>
      <method name="handle_eos" c:identifier="rb_source_handle_eos">
        <doc xml:whitespace="preserve">Determines how EOS events should be handled when playing entries
from the source.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">EOS event handling type</doc>
          <type name="SourceEOFType" c:type="RBSourceEOFType"/>
        </return-value>
      </method>
      <method name="move_to_trash" c:identifier="rb_source_move_to_trash">
        <doc xml:whitespace="preserve">Trashes the files backing the currently selected set of entries.
In general, this should use #rhythmdb_entry_move_to_trash to
perform the actual trash operation.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="notify_filter_changed"
              c:identifier="rb_source_notify_filter_changed">
        <doc xml:whitespace="preserve">Source implementations call this when their filter state changes</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="paste" c:identifier="rb_source_paste">
        <doc xml:whitespace="preserve">Adds a list of entries previously cut or copied from another
source.  If the entries are not of the type used by the source,
the entries will be copied and possibly converted into an acceptable format.
This can be used for transfers to and from devices and network shares.

If the transfer is performed using an #RBTrackTransferBatch, the batch object
is returned so the caller can monitor the transfer progress.  The caller does not
own a reference on the batch object.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the #RBTrackTransferBatch used to perform the transfer (if any)</doc>
          <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
        </return-value>
        <parameters>
          <parameter name="entries" transfer-ownership="none">
            <doc xml:whitespace="preserve">a list of #RhythmDBEntry objects to paste in</doc>
            <type name="GLib.List" c:type="GList*">
              <type name="RhythmDBEntry"/>
            </type>
          </parameter>
        </parameters>
      </method>
      <method name="reset_filters" c:identifier="rb_source_reset_filters">
        <doc xml:whitespace="preserve">Clears all filters (browser selections, etc.) in this source.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="search" c:identifier="rb_source_search">
        <doc xml:whitespace="preserve">Updates the source with new search text.  The source
should recreate the database query that feeds into the
browser (if any).</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="search" transfer-ownership="none" allow-none="1">
            <doc xml:whitespace="preserve">the active #RBSourceSearch instance</doc>
            <type name="SourceSearch" c:type="RBSourceSearch*"/>
          </parameter>
          <parameter name="cur_text" transfer-ownership="none" allow-none="1">
            <doc xml:whitespace="preserve">the current search text</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="new_text" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new search text</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_hidden_when_empty"
              c:identifier="rb_source_set_hidden_when_empty">
        <doc xml:whitespace="preserve">Enables or disables automatic hiding of the source when
there are no entries in it.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="hidden" transfer-ownership="none">
            <doc xml:whitespace="preserve">if TRUE, automatically hide the source</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
        </parameters>
      </method>
      <method name="song_properties" c:identifier="rb_source_song_properties">
        <doc xml:whitespace="preserve">Displays a properties window for the currently selected entries.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="try_playlist" c:identifier="rb_source_try_playlist">
        <doc xml:whitespace="preserve">Determines whether playback URIs for entries in the source should
be parsed as playlists rather than just played.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE to attempt playlist parsing</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
      </method>
      <method name="update_play_statistics"
              c:identifier="rb_source_update_play_statistics">
        <doc xml:whitespace="preserve">Updates play count and play time statistics for a database entry.
Sources containing entries that do not normally reach EOS should
call this for an entry when it is no longer being played.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDB instance</doc>
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry to update</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="uri_is_source" c:identifier="rb_source_uri_is_source">
        <doc xml:whitespace="preserve">Checks if the URI matches the source itself.  A source
should return TRUE here if the URI points to the device that
the source represents, for example.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if the URI identifies the source itself.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">a URI for the source to consider</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="want_uri" c:identifier="rb_source_want_uri">
        <doc xml:whitespace="preserve">Returns an indication of how much the source wants to handle
the specified URI.  100 is the highest usual value, and should
only be used when the URI can only be associated with this source.
0 should be used when the URI does not match the source at all.

source wants this URI.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">value from 0 to 100 indicating how much the</doc>
          <type name="guint" c:type="guint"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">a URI for the source to consider</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <property name="base-query-model" transfer-ownership="none">
        <doc xml:whitespace="preserve">The unfiltered query model for the source, containing all entries in the source.
Source classes should override this if they perform filtering based on the search
box or a browser.</doc>
        <type name="RhythmDBQueryModel"/>
      </property>
      <property name="entry-type"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">Entry type for entries in this source.</doc>
        <type name="RhythmDBEntryType"/>
      </property>
      <property name="hidden-when-empty"
                writable="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">If TRUE, the source will not be displayed in the source list
when it contains no entries.</doc>
        <type name="gboolean"/>
      </property>
      <property name="play-order" transfer-ownership="none">
        <doc xml:whitespace="preserve">If the source provides its own play order, it can override this property.</doc>
        <type name="PlayOrder"/>
      </property>
      <property name="query-model" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">The current query model for the source.  This is used in
various places, including the play order, to find the
set of entries within the source.</doc>
        <type name="RhythmDBQueryModel"/>
      </property>
      <property name="settings"
                writable="1"
                construct="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The #GSettings instance storing settings for the source.  The instance must
have a schema of org.gnome.Rhythmbox.Source.</doc>
        <type name="Gio.Settings"/>
      </property>
      <property name="show-browser" writable="1" transfer-ownership="none">
        <doc xml:whitespace="preserve">Whether the browser widget for the source (if any) should be displayed.
This should be overridden in sources that include a browser widget.</doc>
        <type name="gboolean"/>
      </property>
      <property name="toolbar-path"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">UI manager path for a toolbar to display at the top of the source.
The #RBSource class doesn't actually display the toolbar anywhere.
Adding the toolbar to a container is the responsibility of a subclass
such as #RBBrowserSource.</doc>
        <type name="utf8"/>
      </property>
      <field name="parent">
        <type name="DisplayPage" c:type="RBDisplayPage"/>
      </field>
      <field name="priv">
        <type name="SourcePrivate" c:type="RBSourcePrivate*"/>
      </field>
      <glib:signal name="filter-changed" when="last">
        <doc xml:whitespace="preserve">Fires when the user changes the filter, either by changing the
contents of the search box or by selecting a different browser
entry.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
    </class>
    <callback name="SourceActionCallback" c:type="RBSourceActionCallback">
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="action" transfer-ownership="none">
          <type name="Gtk.Action" c:type="GtkAction*"/>
        </parameter>
        <parameter name="source" transfer-ownership="none">
          <type name="Source" c:type="RBSource*"/>
        </parameter>
      </parameters>
    </callback>
    <callback name="SourceAddCallback" c:type="RBSourceAddCallback">
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <type name="Source" c:type="RBSource*"/>
        </parameter>
        <parameter name="uri" transfer-ownership="none">
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="data" transfer-ownership="none">
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </callback>
    <record name="SourceClass"
            c:type="RBSourceClass"
            glib:is-gtype-struct-for="Source">
      <field name="parent">
        <type name="DisplayPageClass" c:type="RBDisplayPageClass"/>
      </field>
      <field name="filter_changed">
        <callback name="filter_changed">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_get_entry_view" introspectable="0">
        <callback name="impl_get_entry_view" introspectable="0">
          <return-value>
            <type name="EntryView" c:type="RBEntryView*"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_get_property_views" introspectable="0">
        <callback name="impl_get_property_views" introspectable="0">
          <return-value>
            <type name="GLib.List" c:type="GList*">
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_can_rename">
        <callback name="impl_can_rename">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_search">
        <callback name="impl_search">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
            <parameter name="search" transfer-ownership="none">
              <type name="SourceSearch" c:type="RBSourceSearch*"/>
            </parameter>
            <parameter name="cur_text" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="new_text" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_reset_filters">
        <callback name="impl_reset_filters">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_can_cut">
        <callback name="impl_can_cut">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_can_delete">
        <callback name="impl_can_delete">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_can_move_to_trash">
        <callback name="impl_can_move_to_trash">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_can_copy">
        <callback name="impl_can_copy">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_can_paste">
        <callback name="impl_can_paste">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_can_add_to_queue">
        <callback name="impl_can_add_to_queue">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_cut" introspectable="0">
        <callback name="impl_cut" introspectable="0">
          <return-value>
            <type name="GLib.List" c:type="GList*">
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_copy" introspectable="0">
        <callback name="impl_copy" introspectable="0">
          <return-value>
            <type name="GLib.List" c:type="GList*">
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_paste" introspectable="0">
        <callback name="impl_paste" introspectable="0">
          <return-value>
            <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
            <parameter name="entries" transfer-ownership="none">
              <type name="GLib.List" c:type="GList*">
                <type name="gpointer" c:type="gpointer"/>
              </type>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_delete">
        <callback name="impl_delete">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_add_to_queue">
        <callback name="impl_add_to_queue">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
            <parameter name="queue" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_move_to_trash">
        <callback name="impl_move_to_trash">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_song_properties">
        <callback name="impl_song_properties">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_try_playlist">
        <callback name="impl_try_playlist">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_want_uri">
        <callback name="impl_want_uri">
          <return-value transfer-ownership="none">
            <type name="guint" c:type="guint"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_add_uri">
        <callback name="impl_add_uri">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="title" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="genre" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="callback"
                       transfer-ownership="none"
                       scope="notified"
                       closure="5"
                       destroy="6">
              <type name="SourceAddCallback" c:type="RBSourceAddCallback"/>
            </parameter>
            <parameter name="data" transfer-ownership="none">
              <type name="gpointer" c:type="gpointer"/>
            </parameter>
            <parameter name="destroy_data"
                       transfer-ownership="none"
                       scope="async">
              <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_uri_is_source">
        <callback name="impl_uri_is_source">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_can_pause">
        <callback name="impl_can_pause">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_handle_eos">
        <callback name="impl_handle_eos">
          <return-value transfer-ownership="none">
            <type name="SourceEOFType" c:type="RBSourceEOFType"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_delete_thyself">
        <callback name="impl_delete_thyself">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="impl_get_delete_action">
        <callback name="impl_get_delete_action">
          <return-value transfer-ownership="full">
            <type name="utf8" c:type="char*"/>
          </return-value>
          <parameters>
            <parameter name="source" transfer-ownership="none">
              <type name="Source" c:type="RBSource*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <enumeration name="SourceEOFType"
                 glib:type-name="RBSourceEOFType"
                 glib:get-type="rb_source_eof_type_get_type"
                 c:type="RBSourceEOFType">
      <member name="error"
              value="0"
              c:identifier="RB_SOURCE_EOF_ERROR"
              glib:nick="error"/>
      <member name="stop"
              value="1"
              c:identifier="RB_SOURCE_EOF_STOP"
              glib:nick="stop"/>
      <member name="retry"
              value="2"
              c:identifier="RB_SOURCE_EOF_RETRY"
              glib:nick="retry"/>
      <member name="next"
              value="3"
              c:identifier="RB_SOURCE_EOF_NEXT"
              glib:nick="next"/>
    </enumeration>
    <callback name="SourceFeatureFunc" c:type="RBSourceFeatureFunc">
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <type name="Source" c:type="RBSource*"/>
        </parameter>
      </parameters>
    </callback>
    <record name="SourcePrivate" c:type="RBSourcePrivate" disguised="1">
    </record>
    <class name="SourceSearch"
           c:symbol-prefix="source_search"
           c:type="RBSourceSearch"
           parent="GObject.Object"
           glib:type-name="RBSourceSearch"
           glib:get-type="rb_source_search_get_type"
           glib:type-struct="SourceSearchClass">
      <function name="get_from_action"
                c:identifier="rb_source_search_get_from_action">
        <doc xml:whitespace="preserve">Returns the #RBSourceSearch associated with the
specified UI action.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">associated #RBSourceSearch</doc>
          <type name="SourceSearch" c:type="RBSourceSearch*"/>
        </return-value>
        <parameters>
          <parameter name="action" transfer-ownership="none">
            <doc xml:whitespace="preserve">the action to find the #RBSourceSearch for</doc>
            <type name="GObject.Object" c:type="GObject*"/>
          </parameter>
        </parameters>
      </function>
      <virtual-method name="create_query" invoker="create_query">
        <doc xml:whitespace="preserve">Creates a #RhythmDBQuery from the user's search text.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">#RhythmDBQuery for the source to use</doc>
          <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDB</doc>
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="search_text" transfer-ownership="none">
            <doc xml:whitespace="preserve">the search text</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="is_subset" invoker="is_subset">
        <doc xml:whitespace="preserve">Determines whether the new search text will result in a
subset of entries matched by the previous search.  This is
used to optimise the search query.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE iff the new search text will match a subset of those matched by the current search.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="current" transfer-ownership="none">
            <doc xml:whitespace="preserve">the current search text (or NULL if the current search was done with a different search implementation and so cannot be considered)</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="next" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new search text</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="action_attach"
              c:identifier="rb_source_search_action_attach">
        <doc xml:whitespace="preserve">Attaches a #RBSourceSearch to a UI action so that
the search implementation will be used when the action is active.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="action" transfer-ownership="none">
            <doc xml:whitespace="preserve">UI action to associate the search with</doc>
            <type name="GObject.Object" c:type="GObject*"/>
          </parameter>
        </parameters>
      </method>
      <method name="create_query" c:identifier="rb_source_search_create_query">
        <doc xml:whitespace="preserve">Creates a #RhythmDBQuery from the user's search text.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">#RhythmDBQuery for the source to use</doc>
          <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
        </return-value>
        <parameters>
          <parameter name="db" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDB</doc>
            <type name="RhythmDB" c:type="RhythmDB*"/>
          </parameter>
          <parameter name="search_text" transfer-ownership="none">
            <doc xml:whitespace="preserve">the search text</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="is_subset" c:identifier="rb_source_search_is_subset">
        <doc xml:whitespace="preserve">Determines whether the new search text will result in a
subset of entries matched by the previous search.  This is
used to optimise the search query.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE iff the new search text will match a subset of those matched by the current search.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="current" transfer-ownership="none">
            <doc xml:whitespace="preserve">the current search text (or NULL if the current search was done with a different search implementation and so cannot be considered)</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="next" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new search text</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
    </class>
    <class name="SourceSearchBasic"
           c:symbol-prefix="source_search_basic"
           c:type="RBSourceSearchBasic"
           parent="SourceSearch"
           glib:type-name="RBSourceSearchBasic"
           glib:get-type="rb_source_search_basic_get_type"
           glib:type-struct="SourceSearchBasicClass">
      <constructor name="new" c:identifier="rb_source_search_basic_new">
        <doc xml:whitespace="preserve">Creates a new #RBSourceSearchBasic instance.
This performs simple string matching on a specified
property.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">newly created #RBSourceSearchBasic</doc>
          <type name="SourceSearch" c:type="RBSourceSearch*"/>
        </return-value>
        <parameters>
          <parameter name="prop" transfer-ownership="none">
            <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
          </parameter>
        </parameters>
      </constructor>
      <function name="create_for_actions"
                c:identifier="rb_source_search_basic_create_for_actions">
        <doc xml:whitespace="preserve">Creates #RBSourceSearchBasic instances for a set of
search actions and associates them with the actions.
The property to match on is taken from the action
value in the GtkRadioActionEntry structure.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="action_group" transfer-ownership="none">
            <type name="Gtk.ActionGroup" c:type="GtkActionGroup*"/>
          </parameter>
          <parameter name="actions" transfer-ownership="none">
            <type name="Gtk.RadioActionEntry" c:type="GtkRadioActionEntry*"/>
          </parameter>
          <parameter name="n_actions" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </function>
      <property name="prop"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <type name="gint"/>
      </property>
      <field name="parent">
        <type name="SourceSearch" c:type="RBSourceSearch"/>
      </field>
      <field name="search_prop">
        <type name="RhythmDBPropType" c:type="RhythmDBPropType"/>
      </field>
    </class>
    <record name="SourceSearchBasicClass"
            c:type="RBSourceSearchBasicClass"
            glib:is-gtype-struct-for="SourceSearchBasic">
      <field name="parent_class">
        <type name="SourceSearchClass" c:type="RBSourceSearchClass"/>
      </field>
    </record>
    <record name="SourceSearchClass"
            c:type="RBSourceSearchClass"
            glib:is-gtype-struct-for="SourceSearch">
      <field name="parent_class">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="is_subset">
        <callback name="is_subset">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">TRUE iff the new search text will match a subset of those matched by the current search.</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="search" transfer-ownership="none">
              <type name="SourceSearch" c:type="RBSourceSearch*"/>
            </parameter>
            <parameter name="current" transfer-ownership="none">
              <doc xml:whitespace="preserve">the current search text (or NULL if the current search was done with a different search implementation and so cannot be considered)</doc>
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="next" transfer-ownership="none">
              <doc xml:whitespace="preserve">the new search text</doc>
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="create_query">
        <callback name="create_query">
          <return-value transfer-ownership="full">
            <doc xml:whitespace="preserve">#RhythmDBQuery for the source to use</doc>
            <type name="RhythmDBQuery" c:type="RhythmDBQuery*"/>
          </return-value>
          <parameters>
            <parameter name="search" transfer-ownership="none">
              <type name="SourceSearch" c:type="RBSourceSearch*"/>
            </parameter>
            <parameter name="db" transfer-ownership="none">
              <doc xml:whitespace="preserve">the #RhythmDB</doc>
              <type name="RhythmDB" c:type="RhythmDB*"/>
            </parameter>
            <parameter name="search_text" transfer-ownership="none">
              <doc xml:whitespace="preserve">the search text</doc>
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <callback name="SourceStringFunc" c:type="RBSourceStringFunc">
      <return-value transfer-ownership="none">
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="source" transfer-ownership="none">
          <type name="Source" c:type="RBSource*"/>
        </parameter>
      </parameters>
    </callback>
    <class name="SourceToolbar"
           c:symbol-prefix="source_toolbar"
           c:type="RBSourceToolbar"
           parent="Gtk.Grid"
           glib:type-name="RBSourceToolbar"
           glib:get-type="rb_source_toolbar_get_type"
           glib:type-struct="SourceToolbarClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <implements name="Gtk.Orientable"/>
      <constructor name="new" c:identifier="rb_source_toolbar_new">
        <doc xml:whitespace="preserve">Creates a new source toolbar for @source.  The toolbar does not
initially include a search entry.  Call #rb_source_toolbar_add_search_entry
to add one.  The toolbar content comes from the @RBSource:toolbar-path property.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the #RBSourceToolbar</doc>
          <type name="SourceToolbar" c:type="RBSourceToolbar*"/>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RBSource</doc>
            <type name="Source" c:type="RBSource*"/>
          </parameter>
          <parameter name="ui_manager" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GtkUIManager</doc>
            <type name="Gtk.UIManager" c:type="GtkUIManager*"/>
          </parameter>
        </parameters>
      </constructor>
      <method name="add_search_entry"
              c:identifier="rb_source_toolbar_add_search_entry">
        <doc xml:whitespace="preserve">Adds a search entry to the toolbar.  If a popup path is specified,
clicking on the primary icon will show a menu allowing the user to
select a search type, and the placeholder text for the entry will
be the selected search description.  Otherwise, the specified placeholder
text will be displayed.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="popup_path" transfer-ownership="none">
            <doc xml:whitespace="preserve">the UI path for the search popup (or NULL)</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="placeholder" transfer-ownership="none">
            <doc xml:whitespace="preserve">the placeholder text for the search entry (or NULL)</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="clear_search_entry"
              c:identifier="rb_source_toolbar_clear_search_entry">
        <doc xml:whitespace="preserve">Clears the search entry text.  Call this from RBSource:impl_reset_filters.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <property name="source"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBSource the toolbar is associated with</doc>
        <type name="Source"/>
      </property>
      <property name="ui-manager"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The #GtkUIManager instance</doc>
        <type name="Gtk.UIManager"/>
      </property>
      <field name="parent">
        <type name="Gtk.Grid" c:type="GtkGrid"/>
      </field>
      <field name="priv">
        <type name="SourceToolbarPrivate" c:type="RBSourceToolbarPrivate*"/>
      </field>
    </class>
    <record name="SourceToolbarClass"
            c:type="RBSourceToolbarClass"
            glib:is-gtype-struct-for="SourceToolbar">
      <field name="parent">
        <type name="Gtk.GridClass" c:type="GtkGridClass"/>
      </field>
    </record>
    <record name="SourceToolbarPrivate"
            c:type="RBSourceToolbarPrivate"
            disguised="1">
    </record>
    <class name="StaticPlaylistSource"
           c:symbol-prefix="static_playlist_source"
           c:type="RBStaticPlaylistSource"
           parent="PlaylistSource"
           glib:type-name="RBStaticPlaylistSource"
           glib:get-type="rb_static_playlist_source_get_type"
           glib:type-struct="StaticPlaylistSourceClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <implements name="Gtk.Orientable"/>
      <constructor name="new" c:identifier="rb_static_playlist_source_new">
        <doc xml:whitespace="preserve">Creates a new static playlist source.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">new playlist.</doc>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShell</doc>
            <type name="Shell" c:type="RBShell*"/>
          </parameter>
          <parameter name="name" transfer-ownership="none">
            <doc xml:whitespace="preserve">the playlist name</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="settings_name" transfer-ownership="none">
            <doc xml:whitespace="preserve">the settings name for the playlist (GSettings path friendly)</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="local" transfer-ownership="none">
            <doc xml:whitespace="preserve">if %TRUE, the playlist is local to the library</doc>
            <type name="gboolean" c:type="gboolean"/>
          </parameter>
          <parameter name="entry_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">type of database entries that can be added to the playlist.</doc>
            <type name="RhythmDBEntryType" c:type="RhythmDBEntryType*"/>
          </parameter>
        </parameters>
      </constructor>
      <constructor name="new_from_xml"
                   c:identifier="rb_static_playlist_source_new_from_xml">
        <doc xml:whitespace="preserve">Constructs a new playlist from the given XML document node.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">playlist read from XML</doc>
          <type name="Source" c:type="RBSource*"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShell</doc>
            <type name="Shell" c:type="RBShell*"/>
          </parameter>
          <parameter name="node" transfer-ownership="none">
            <doc xml:whitespace="preserve">XML node containing playlist entries</doc>
            <type name="libxml2.NodePtr" c:type="xmlNodePtr"/>
          </parameter>
        </parameters>
      </constructor>
      <function name="create_actions"
                c:identifier="rb_static_playlist_source_create_actions">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <type name="Shell" c:type="RBShell*"/>
          </parameter>
        </parameters>
      </function>
      <method name="add_entry"
              c:identifier="rb_static_playlist_source_add_entry">
        <doc xml:whitespace="preserve">Adds the specified entry to the playlist.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">entry to add to the playlist</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="index" transfer-ownership="none">
            <doc xml:whitespace="preserve">position at which to add it (-1 to add at the end)</doc>
            <type name="gint" c:type="gint"/>
          </parameter>
        </parameters>
      </method>
      <method name="add_location"
              c:identifier="rb_static_playlist_source_add_location">
        <doc xml:whitespace="preserve">If the location matches an entry in the database, the entry is added
to the playlist.  Otherwise, if it identifies a directory, the contents
of that directory are added.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="location" transfer-ownership="none">
            <doc xml:whitespace="preserve">location (URI) to add to the playlist</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="index" transfer-ownership="none">
            <doc xml:whitespace="preserve">position at which to add the location (-1 to add at the end)</doc>
            <type name="gint" c:type="gint"/>
          </parameter>
        </parameters>
      </method>
      <method name="add_locations"
              c:identifier="rb_static_playlist_source_add_locations">
        <doc xml:whitespace="preserve">Adds the locations specified in @locations to the playlist.
See @rb_static_playlist_source_add_location for details.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="locations" transfer-ownership="none">
            <doc xml:whitespace="preserve">URI strings to add</doc>
            <type name="GLib.List" c:type="GList*">
              <type name="utf8"/>
            </type>
          </parameter>
        </parameters>
      </method>
      <method name="load_from_xml"
              c:identifier="rb_static_playlist_source_load_from_xml">
        <doc xml:whitespace="preserve">Loads the playlist contents from the specified XML document node.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="node" transfer-ownership="none">
            <doc xml:whitespace="preserve">XML node to load from</doc>
            <type name="libxml2.NodePtr" c:type="xmlNodePtr"/>
          </parameter>
        </parameters>
      </method>
      <method name="move_entry"
              c:identifier="rb_static_playlist_source_move_entry">
        <doc xml:whitespace="preserve">Moves an entry within the playlist.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the entry to move</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="index" transfer-ownership="none">
            <doc xml:whitespace="preserve">new location for the entry</doc>
            <type name="gint" c:type="gint"/>
          </parameter>
        </parameters>
      </method>
      <method name="remove_entry"
              c:identifier="rb_static_playlist_source_remove_entry">
        <doc xml:whitespace="preserve">Removes the specified entry from the playlist.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the entry to remove</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="remove_location"
              c:identifier="rb_static_playlist_source_remove_location">
        <doc xml:whitespace="preserve">Removes the specified location from the playlist.  This affects both
the location map and the query model, whether an entry exists for the
location or not.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="location" transfer-ownership="none">
            <doc xml:whitespace="preserve">location to remove</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <field name="parent">
        <type name="PlaylistSource" c:type="RBPlaylistSource"/>
      </field>
    </class>
    <record name="StaticPlaylistSourceClass"
            c:type="RBStaticPlaylistSourceClass"
            glib:is-gtype-struct-for="StaticPlaylistSource">
      <field name="parent">
        <type name="PlaylistSourceClass" c:type="RBPlaylistSourceClass"/>
      </field>
      <field name="action_group">
        <type name="Gtk.ActionGroup" c:type="GtkActionGroup*"/>
      </field>
    </record>
    <class name="StreamingSource"
           c:symbol-prefix="streaming_source"
           c:type="RBStreamingSource"
           parent="Source"
           glib:type-name="RBStreamingSource"
           glib:get-type="rb_streaming_source_get_type"
           glib:type-struct="StreamingSourceClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <implements name="Gtk.Orientable"/>
      <method name="get_progress"
              c:identifier="rb_streaming_source_get_progress">
        <doc xml:whitespace="preserve">Provides status text and progress fraction suitable for use in
a streaming source's @rb_source_get_status method.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="text"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns buffering status text</doc>
            <type name="utf8" c:type="char**"/>
          </parameter>
          <parameter name="progress"
                     direction="out"
                     caller-allocates="0"
                     transfer-ownership="full">
            <doc xml:whitespace="preserve">returns buffering progress fraction</doc>
            <type name="gfloat" c:type="float*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_streaming_album"
              c:identifier="rb_streaming_source_set_streaming_album">
        <doc xml:whitespace="preserve">Updates the streaming song album name.  Call this when an updated
streaming song album name is received from the stream.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="album" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new streaming song album name</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_streaming_artist"
              c:identifier="rb_streaming_source_set_streaming_artist">
        <doc xml:whitespace="preserve">Updates the streaming song artist name.  Call this when an updated
streaming song artist name is received from the stream.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="artist" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new streaming song artist name</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_streaming_title"
              c:identifier="rb_streaming_source_set_streaming_title">
        <doc xml:whitespace="preserve">Updates the streaming song title.  Call this when an updated
streaming song title is received from the stream.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="title" transfer-ownership="none">
            <doc xml:whitespace="preserve">the new streaming song title</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <field name="parent">
        <type name="Source" c:type="RBSource"/>
      </field>
      <field name="priv">
        <type name="StreamingSourcePrivate"
              c:type="RBStreamingSourcePrivate*"/>
      </field>
    </class>
    <record name="StreamingSourceClass"
            c:type="RBStreamingSourceClass"
            glib:is-gtype-struct-for="StreamingSource">
      <field name="parent">
        <type name="SourceClass" c:type="RBSourceClass"/>
      </field>
    </record>
    <record name="StreamingSourcePrivate"
            c:type="RBStreamingSourcePrivate"
            disguised="1">
    </record>
    <class name="StringValueMap"
           c:symbol-prefix="string_value_map"
           c:type="RBStringValueMap"
           parent="GObject.Object"
           glib:type-name="RBStringValueMap"
           glib:get-type="rb_string_value_map_get_type"
           glib:type-struct="StringValueMapClass">
      <constructor name="new" c:identifier="rb_string_value_map_new">
        <doc xml:whitespace="preserve">Creates a new #RBStringValueMap</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">new empty #RBStringValueMap</doc>
          <type name="StringValueMap" c:type="RBStringValueMap*"/>
        </return-value>
      </constructor>
      <method name="get" c:identifier="rb_string_value_map_get">
        <doc xml:whitespace="preserve">Locates and copies the value associated with the key.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the value was found</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="key" transfer-ownership="none">
            <doc xml:whitespace="preserve">key to retrieve</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="out" transfer-ownership="none">
            <doc xml:whitespace="preserve">returns a copy of the value in the map</doc>
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </method>
      <method name="peek" c:identifier="rb_string_value_map_peek">
        <doc xml:whitespace="preserve">Locates the value associated with the key.  This returns the
GValue stored in the map, so it cannot be modified.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">the GValue associated with the key</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </return-value>
        <parameters>
          <parameter name="key" transfer-ownership="none">
            <doc xml:whitespace="preserve">key to retrieve</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="remove" c:identifier="rb_string_value_map_remove">
        <doc xml:whitespace="preserve">Removes a value from the map.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the value was found and removed</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="key" transfer-ownership="none">
            <doc xml:whitespace="preserve">key to remove</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="set" c:identifier="rb_string_value_map_set">
        <doc xml:whitespace="preserve">Inserts a value into the map.  The value is copied.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="key" transfer-ownership="none">
            <doc xml:whitespace="preserve">key to set</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="value" transfer-ownership="none">
            <doc xml:whitespace="preserve">value to store</doc>
            <type name="GObject.Value" c:type="GValue*"/>
          </parameter>
        </parameters>
      </method>
      <method name="size" c:identifier="rb_string_value_map_size">
        <doc xml:whitespace="preserve">Returns the number of entries in the map.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">number of entries</doc>
          <type name="guint" c:type="guint"/>
        </return-value>
      </method>
      <method name="steal_hashtable"
              c:identifier="rb_string_value_map_steal_hashtable">
        <doc xml:whitespace="preserve">Extracts and returns the underlying hash table from the map,
and creates a new empty map.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">#GHashTable from the map</doc>
          <type name="GLib.HashTable" c:type="GHashTable*">
            <type name="gpointer" c:type="gpointer"/>
            <type name="gpointer" c:type="gpointer"/>
          </type>
        </return-value>
      </method>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="StringValueMapPrivate" c:type="RBStringValueMapPrivate*"/>
      </field>
    </class>
    <record name="StringValueMapClass"
            c:type="RBStringValueMapClass"
            glib:is-gtype-struct-for="StringValueMap">
      <field name="parent">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
    </record>
    <record name="StringValueMapPrivate"
            c:type="RBStringValueMapPrivate"
            disguised="1">
    </record>
    <class name="TrackTransferBatch"
           c:symbol-prefix="track_transfer_batch"
           c:type="RBTrackTransferBatch"
           parent="GObject.Object"
           glib:type-name="RBTrackTransferBatch"
           glib:get-type="rb_track_transfer_batch_get_type"
           glib:type-struct="TrackTransferBatchClass">
      <constructor name="new" c:identifier="rb_track_transfer_batch_new">
        <doc xml:whitespace="preserve">Creates a new transfer batch with the specified encoding target.  If no target
is specified, the default target will be used with the user's preferred
encoding type.

One or more entries must be added to the batch (using #rb_track_transfer_batch_add)
before the batch can be started (#rb_track_transfer_manager_start_batch).</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">new #RBTrackTransferBatch object</doc>
          <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
        </return-value>
        <parameters>
          <parameter name="target" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #GstEncodingTarget describing allowable encodings (or NULL for defaults)</doc>
            <type name="GstPbutils.EncodingTarget"
                  c:type="GstEncodingTarget*"/>
          </parameter>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBSource from which the entries are to be transferred</doc>
            <type name="GObject.Object" c:type="GObject*"/>
          </parameter>
          <parameter name="destination" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBSource to which the entries are to be transferred</doc>
            <type name="GObject.Object" c:type="GObject*"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="cancelled">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="complete">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="get_dest_uri">
        <return-value transfer-ownership="full">
          <type name="utf8" c:type="char*"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="mediatype" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="extension" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="overwrite_prompt">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="dest_file" transfer-ownership="none">
            <type name="Gio.File" c:type="GFile*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="started">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </virtual-method>
      <virtual-method name="track_done">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="dest" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="dest_size" transfer-ownership="none">
            <type name="guint64" c:type="guint64"/>
          </parameter>
          <parameter name="error" transfer-ownership="none">
            <type name="GLib.Error" c:type="GError*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="track_progress">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="dest" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="done" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="total" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="fraction" transfer-ownership="none">
            <type name="gdouble" c:type="double"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="track_started">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="dest" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="add" c:identifier="rb_track_transfer_batch_add">
        <doc xml:whitespace="preserve">Adds an entry to be transferred.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the source #RhythmDBEntry to transfer</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="cancel" c:identifier="rb_track_transfer_batch_cancel">
        <doc xml:whitespace="preserve">Cancels the batch.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
      </method>
      <method name="check_profiles"
              c:identifier="rb_track_transfer_batch_check_profiles"
              introspectable="0">
        <doc xml:whitespace="preserve">Checks that all entries in the batch can be transferred in a format
supported by the destination.  If no encoding profile is available for
some entries, but installing additional plugins could make a profile
available, a list of profiles that require additional plugins is returned.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if some entries can be transferred without additional plugins</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="missing_plugin_profiles" transfer-ownership="none">
            <doc xml:whitespace="preserve">holds a #GList of #GstEncodingProfiles on return</doc>
            <type name="GLib.List" c:type="GList**">
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </parameter>
          <parameter name="error_count" transfer-ownership="none">
            <doc xml:whitespace="preserve">holds the number of entries that cannot be transferred on return</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
        </parameters>
      </method>
      <property name="destination"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The RBSource to which the tracks are being transferred.</doc>
        <type name="Source"/>
      </property>
      <property name="done-entries" transfer-ownership="none">
        <doc xml:whitespace="preserve">Number of entries in the batch that have been transferred.</doc>
        <type name="gint"/>
      </property>
      <property name="encoding-target"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">A GstEncodingTarget describing allowable target formats.
If NULL, the default set of profiles will be used.</doc>
        <type name="GstPbutils.EncodingTarget"/>
      </property>
      <property name="entry-list" transfer-ownership="none">
        <doc xml:whitespace="preserve">A list of all entries in the batch.</doc>
        <type name="gpointer"/>
      </property>
      <property name="progress" transfer-ownership="none">
        <doc xml:whitespace="preserve">Fraction of the transfer batch that has been processed.</doc>
        <type name="gdouble"/>
      </property>
      <property name="source"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The RBSource from which the tracks are being transferred.</doc>
        <type name="Source"/>
      </property>
      <property name="total-entries" transfer-ownership="none">
        <doc xml:whitespace="preserve">Total number of entries in the transfer batch.</doc>
        <type name="gint"/>
      </property>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="TrackTransferBatchPrivate"
              c:type="RBTrackTransferBatchPrivate*"/>
      </field>
      <glib:signal name="cancelled" when="last">
        <doc xml:whitespace="preserve">Emitted when the batch is cancelled.

hmm.  will 'complete' still be emitted in this case?</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
      <glib:signal name="complete" when="last">
        <doc xml:whitespace="preserve">Emitted when the batch is complete.  This will be immediately
after the final entry transfer is complete.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
      <glib:signal name="get-dest-uri" when="last">
        <doc xml:whitespace="preserve">The batch emits this to allow the creator to provide a destination
URI for an entry being transferred.  This is emitted after the
output media type is decided, so the usual extension for the media
type can be taken into consideration.</doc>
        <return-value transfer-ownership="full">
          <type name="utf8"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry to be transferred</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
          <parameter name="mediatype" transfer-ownership="none">
            <doc xml:whitespace="preserve">the destination media type for the transfer</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="extension" transfer-ownership="none">
            <doc xml:whitespace="preserve">usual extension for the destionation media type</doc>
            <type name="utf8"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="overwrite-prompt" when="last">
        <doc xml:whitespace="preserve">Emitted when the destination URI for a transfer already exists.
If a handler returns TRUE, the file will be overwritten, otherwise
the transfer will be skipped.</doc>
        <return-value transfer-ownership="none">
          <type name="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="file" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #GFile that may be overwritten</doc>
            <type name="Gio.File"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="started" when="last">
        <doc xml:whitespace="preserve">Emitted when the batch is started.  This will be after
all previous batches have finished, which is not necessarily
when #rb_track_transfer_manager_start_batch is called.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
      </glib:signal>
      <glib:signal name="track-done" when="last">
        <doc xml:whitespace="preserve">Emitted when a track transfer is complete, whether because
the track was fully transferred, because an error occurred,
or because the batch was cancelled (maybe..).</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry that was transferred</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
          <parameter name="dest" transfer-ownership="none">
            <doc xml:whitespace="preserve">the destination URI for the transfer</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="dest_size" transfer-ownership="none">
            <doc xml:whitespace="preserve">size of the destination file</doc>
            <type name="guint64"/>
          </parameter>
          <parameter name="dest_mediatype" transfer-ownership="none">
            <doc xml:whitespace="preserve">the media type of the destination file</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="error" transfer-ownership="none">
            <doc xml:whitespace="preserve">any error that occurred during transfer</doc>
            <type name="gpointer"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="track-progress" when="last">
        <doc xml:whitespace="preserve">Emitted regularly throughout the transfer to allow progress bars
and other UI elements to be updated.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry being transferred</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
          <parameter name="dest" transfer-ownership="none">
            <doc xml:whitespace="preserve">the destination URI for the transfer</doc>
            <type name="utf8"/>
          </parameter>
          <parameter name="done" transfer-ownership="none">
            <doc xml:whitespace="preserve">some measure of how much of the transfer is done</doc>
            <type name="gint"/>
          </parameter>
          <parameter name="total" transfer-ownership="none">
            <doc xml:whitespace="preserve">the total amount of that same measure</doc>
            <type name="gint"/>
          </parameter>
          <parameter name="fraction" transfer-ownership="none">
            <doc xml:whitespace="preserve">the fraction of the transfer that is done</doc>
            <type name="gdouble"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="track-started" when="last">
        <doc xml:whitespace="preserve">Emitted when a new entry is about to be transferred.
This will be emitted for each entry in the batch, unless
the batch is cancelled.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RhythmDBEntry being transferred</doc>
            <type name="RhythmDBEntry"/>
          </parameter>
          <parameter name="dest" transfer-ownership="none">
            <doc xml:whitespace="preserve">the destination URI for the transfer</doc>
            <type name="utf8"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="TrackTransferBatchClass"
            c:type="RBTrackTransferBatchClass"
            glib:is-gtype-struct-for="TrackTransferBatch">
      <field name="parent_class">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="started">
        <callback name="started">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="batch" transfer-ownership="none">
              <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="cancelled">
        <callback name="cancelled">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="batch" transfer-ownership="none">
              <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="complete">
        <callback name="complete">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="batch" transfer-ownership="none">
              <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="get_dest_uri">
        <callback name="get_dest_uri">
          <return-value transfer-ownership="full">
            <type name="utf8" c:type="char*"/>
          </return-value>
          <parameters>
            <parameter name="batch" transfer-ownership="none">
              <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="mediatype" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="extension" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="overwrite_prompt">
        <callback name="overwrite_prompt">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="batch" transfer-ownership="none">
              <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
            </parameter>
            <parameter name="dest_file" transfer-ownership="none">
              <type name="Gio.File" c:type="GFile*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="track_started">
        <callback name="track_started">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="batch" transfer-ownership="none">
              <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="dest" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="track_progress">
        <callback name="track_progress">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="batch" transfer-ownership="none">
              <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="dest" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="done" transfer-ownership="none">
              <type name="gint" c:type="int"/>
            </parameter>
            <parameter name="total" transfer-ownership="none">
              <type name="gint" c:type="int"/>
            </parameter>
            <parameter name="fraction" transfer-ownership="none">
              <type name="gdouble" c:type="double"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="track_done">
        <callback name="track_done">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="batch" transfer-ownership="none">
              <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="dest" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="dest_size" transfer-ownership="none">
              <type name="guint64" c:type="guint64"/>
            </parameter>
            <parameter name="error" transfer-ownership="none">
              <type name="GLib.Error" c:type="GError*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="TrackTransferBatchPrivate"
            c:type="RBTrackTransferBatchPrivate"
            disguised="1">
    </record>
    <class name="TrackTransferQueue"
           c:symbol-prefix="track_transfer_queue"
           c:type="RBTrackTransferQueue"
           parent="GObject.Object"
           glib:type-name="RBTrackTransferQueue"
           glib:get-type="rb_track_transfer_queue_get_type"
           glib:type-struct="TrackTransferQueueClass">
      <constructor name="new" c:identifier="rb_track_transfer_queue_new">
        <doc xml:whitespace="preserve">Creates the #RBTrackTransferQueue instance</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">the #RBTrackTransferQueue</doc>
          <type name="TrackTransferQueue" c:type="RBTrackTransferQueue*"/>
        </return-value>
        <parameters>
          <parameter name="shell" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBShell</doc>
            <type name="Shell" c:type="RBShell*"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="transfer_progress">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="done" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="total" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
          <parameter name="fraction" transfer-ownership="none">
            <type name="gdouble" c:type="double"/>
          </parameter>
          <parameter name="time_left" transfer-ownership="none">
            <type name="gint" c:type="int"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="cancel_batch"
              c:identifier="rb_track_transfer_queue_cancel_batch">
        <doc xml:whitespace="preserve">Removes a transfer batch from the queue.  If an entry from the
batch is currently being transferred, the transfer will be
aborted.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="batch" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBTrackTransferBatch to cancel, or NULL for the current batch</doc>
            <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
          </parameter>
        </parameters>
      </method>
      <method name="find_batch_by_source"
              c:identifier="rb_track_transfer_queue_find_batch_by_source">
        <doc xml:whitespace="preserve">Finds all transfer batches where @source is the source or destination.
This should be used to wait for transfers to finish (or cancel them) before
ejecting a device.  The transfer batches are returned in the order they're
found in the queue, so waiting for the @RBTrackTransferBatch::complete signal
on the last one is sufficient to wait for them all to finish.</doc>
        <return-value transfer-ownership="container">
          <doc xml:whitespace="preserve">#GList of #RBTrackTransferBatch objects, not referenced</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="TrackTransferBatch"/>
          </type>
        </return-value>
        <parameters>
          <parameter name="source" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBSource to search for</doc>
            <type name="Source" c:type="RBSource*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_status"
              c:identifier="rb_track_transfer_queue_get_status">
        <doc xml:whitespace="preserve">Retrieves transfer status information.  Works similarly to
#rb_source_get_status.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">TRUE if transfer status information is returned</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="text" transfer-ownership="none">
            <doc xml:whitespace="preserve">returns the status bar text</doc>
            <type name="utf8" c:type="char**"/>
          </parameter>
          <parameter name="progress_text" transfer-ownership="none">
            <doc xml:whitespace="preserve">returns the progress bar text</doc>
            <type name="utf8" c:type="char**"/>
          </parameter>
          <parameter name="progress" transfer-ownership="none">
            <doc xml:whitespace="preserve">returns the progress fraction</doc>
            <type name="gfloat" c:type="float*"/>
          </parameter>
          <parameter name="time_left" transfer-ownership="none">
            <doc xml:whitespace="preserve">returns the estimated number of seconds remaining</doc>
            <type name="gint" c:type="int*"/>
          </parameter>
        </parameters>
      </method>
      <method name="start_batch"
              c:identifier="rb_track_transfer_queue_start_batch">
        <doc xml:whitespace="preserve">Adds a new transfer batch to the transfer queue; if the queue is currently
empty, the transfer will start immediately, but not before the call returns.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="batch" transfer-ownership="none">
            <doc xml:whitespace="preserve">the #RBTrackTransferBatch to add to the queue</doc>
            <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
          </parameter>
        </parameters>
      </method>
      <property name="batch" transfer-ownership="none">
        <doc xml:whitespace="preserve">The current #RBTrackTransferBatch being processed</doc>
        <type name="TrackTransferBatch"/>
      </property>
      <property name="shell"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The #RBShell</doc>
        <type name="Shell"/>
      </property>
      <field name="parent">
        <type name="GObject.Object" c:type="GObject"/>
      </field>
      <field name="priv">
        <type name="TrackTransferQueuePrivate"
              c:type="RBTrackTransferQueuePrivate*"/>
      </field>
      <glib:signal name="missing-plugins" when="last">
        <doc xml:whitespace="preserve">Emitted to request installation of one or more encoder plugins for a
destination media format.  When the closure included in the signal args
is called, the transfer batch will be started.</doc>
        <return-value transfer-ownership="none">
          <type name="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="details" transfer-ownership="none">
            <doc xml:whitespace="preserve">the list of plugin detail strings describing the missing plugins</doc>
            <array>
              <type name="utf8"/>
            </array>
          </parameter>
          <parameter name="descriptions" transfer-ownership="none">
            <doc xml:whitespace="preserve">the list of descriptions for the missing plugins</doc>
            <array>
              <type name="utf8"/>
            </array>
          </parameter>
          <parameter name="closure" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #GClosure to be called when the plugin installation is complete</doc>
            <type name="GObject.Closure"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="transfer-progress" when="last">
        <doc xml:whitespace="preserve">Emitted regularly to convey progress information.  At the end of any given
transfer batch, there will be one signal emission with @done == @total and
@fraction == 1.0.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="done" transfer-ownership="none">
            <doc xml:whitespace="preserve">the number of entries transferred</doc>
            <type name="gint"/>
          </parameter>
          <parameter name="total" transfer-ownership="none">
            <doc xml:whitespace="preserve">the total number of entries in the batch</doc>
            <type name="gint"/>
          </parameter>
          <parameter name="fraction" transfer-ownership="none">
            <doc xml:whitespace="preserve">the fraction of the batch that has been transferred</doc>
            <type name="gdouble"/>
          </parameter>
          <parameter name="time_left" transfer-ownership="none">
            <doc xml:whitespace="preserve">the estimated remaining time (in seconds)</doc>
            <type name="gint"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="TrackTransferQueueClass"
            c:type="RBTrackTransferQueueClass"
            glib:is-gtype-struct-for="TrackTransferQueue">
      <field name="parent_class">
        <type name="GObject.ObjectClass" c:type="GObjectClass"/>
      </field>
      <field name="transfer_progress">
        <callback name="transfer_progress">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="queue" transfer-ownership="none">
              <type name="TrackTransferQueue" c:type="RBTrackTransferQueue*"/>
            </parameter>
            <parameter name="done" transfer-ownership="none">
              <type name="gint" c:type="int"/>
            </parameter>
            <parameter name="total" transfer-ownership="none">
              <type name="gint" c:type="int"/>
            </parameter>
            <parameter name="fraction" transfer-ownership="none">
              <type name="gdouble" c:type="double"/>
            </parameter>
            <parameter name="time_left" transfer-ownership="none">
              <type name="gint" c:type="int"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="TrackTransferQueuePrivate"
            c:type="RBTrackTransferQueuePrivate"
            disguised="1">
    </record>
    <interface name="TransferTarget"
               c:symbol-prefix="transfer_target"
               c:type="RBTransferTarget"
               glib:type-name="RBTransferTarget"
               glib:get-type="rb_transfer_target_get_type"
               glib:type-struct="TransferTargetInterface">
      <virtual-method name="build_dest_uri" invoker="build_dest_uri">
        <doc xml:whitespace="preserve">Constructs a URI to use as the destination for a transfer or transcoding
operation.  The URI may be on the device itself, if the device is mounted
into the normal filesystem or through gvfs, or it may be a temporary
location used to store the file before uploading it to the device.

The destination URI should conform to the device's normal URI format,
and should use the provided extension instead of the extension from
the source entry.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">constructed URI</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry being transferred</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="media_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">destination media type</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="extension" transfer-ownership="none">
            <doc xml:whitespace="preserve">extension associated with destination media type</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="should_transfer" invoker="should_transfer">
        <doc xml:whitespace="preserve">Checks whether @entry should be transferred to the target.
The target can check whether a matching entry already exists on the device,
for instance.  @rb_transfer_target_check_duplicate may form part of
an implementation.  If this method returns %FALSE, the entry
will be skipped.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the entry should be transferred to the target</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry to consider transferring</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="track_add_error">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="error" transfer-ownership="none">
            <type name="GLib.Error" c:type="GError*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="track_added">
        <return-value transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="dest_size" transfer-ownership="none">
            <type name="guint64" c:type="guint64"/>
          </parameter>
          <parameter name="media_type" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <method name="build_dest_uri"
              c:identifier="rb_transfer_target_build_dest_uri">
        <doc xml:whitespace="preserve">Constructs a URI to use as the destination for a transfer or transcoding
operation.  The URI may be on the device itself, if the device is mounted
into the normal filesystem or through gvfs, or it may be a temporary
location used to store the file before uploading it to the device.

The destination URI should conform to the device's normal URI format,
and should use the provided extension instead of the extension from
the source entry.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">constructed URI</doc>
          <type name="utf8" c:type="char*"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry being transferred</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="media_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">destination media type</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="extension" transfer-ownership="none">
            <doc xml:whitespace="preserve">extension associated with destination media type</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="check_category"
              c:identifier="rb_transfer_target_check_category">
        <doc xml:whitespace="preserve">This checks that the entry type of @entry is in a suitable
category for transfer.  This can be used to implement
@should_transfer.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the entry is in a suitable category</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry to check</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="check_duplicate"
              c:identifier="rb_transfer_target_check_duplicate">
        <doc xml:whitespace="preserve">This checks for an existing entry in the target that matches
the title, album, artist, and track number of the entry being
considered.  This can be used to implement @should_transfer.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the entry already exists on the target.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry to check</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_format_descriptions"
              c:identifier="rb_transfer_target_get_format_descriptions">
        <doc xml:whitespace="preserve">Returns a #GList of allocated media format descriptions for
the formats supported by the target.  The list and the strings
it holds must be freed by the caller.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">list of descriptions.</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="utf8"/>
          </type>
        </return-value>
      </method>
      <method name="should_transfer"
              c:identifier="rb_transfer_target_should_transfer">
        <doc xml:whitespace="preserve">Checks whether @entry should be transferred to the target.
The target can check whether a matching entry already exists on the device,
for instance.  @rb_transfer_target_check_duplicate may form part of
an implementation.  If this method returns %FALSE, the entry
will be skipped.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">%TRUE if the entry should be transferred to the target</doc>
          <type name="gboolean" c:type="gboolean"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #RhythmDBEntry to consider transferring</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
        </parameters>
      </method>
      <method name="track_add_error"
              c:identifier="rb_transfer_target_track_add_error">
        <doc xml:whitespace="preserve">This is called when a transfer fails.  If the source's
impl_track_add_error implementation returns %TRUE, an error dialog
will be displayed to the user containing the error message, unless
the error indicates that the destination file already exists.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the source #RhythmDBEntry for the transfer</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the destination URI</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="error" transfer-ownership="none">
            <doc xml:whitespace="preserve">the transfer error information</doc>
            <type name="GLib.Error" c:type="GError*"/>
          </parameter>
        </parameters>
      </method>
      <method name="track_added" c:identifier="rb_transfer_target_track_added">
        <doc xml:whitespace="preserve">This is called when a transfer to the target has completed.
If the source's @track_added method returns %TRUE, the destination
URI will be added to the database using the entry type for the device.

If the target uses a temporary area as the destination for transfers,
it can instead upload the destination file to the device and create an
entry for it, then return %FALSE.</doc>
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="entry" transfer-ownership="none">
            <doc xml:whitespace="preserve">the source #RhythmDBEntry for the transfer</doc>
            <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
          </parameter>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">the destination URI</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="filesize" transfer-ownership="none">
            <doc xml:whitespace="preserve">size of the destination file</doc>
            <type name="guint64" c:type="guint64"/>
          </parameter>
          <parameter name="media_type" transfer-ownership="none">
            <doc xml:whitespace="preserve">media type of the destination file</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </method>
      <method name="transfer"
              c:identifier="rb_transfer_target_transfer"
              introspectable="0">
        <doc xml:whitespace="preserve">Starts tranferring @entries to the target.  This returns the
#RBTrackTransferBatch that it starts, so the caller can track
the progress of the transfer, or NULL if the target doesn't
want any of the entries.</doc>
        <return-value transfer-ownership="full">
          <doc xml:whitespace="preserve">an #RBTrackTransferBatch, or NULL</doc>
          <type name="TrackTransferBatch" c:type="RBTrackTransferBatch*"/>
        </return-value>
        <parameters>
          <parameter name="entries" transfer-ownership="none">
            <doc xml:whitespace="preserve">a #GList of entries to transfer</doc>
            <type name="GLib.List" c:type="GList*">
              <type name="gpointer" c:type="gpointer"/>
            </type>
          </parameter>
        </parameters>
      </method>
      <property name="encoding-target" writable="1" transfer-ownership="none">
        <type name="GstPbutils.EncodingTarget"/>
      </property>
    </interface>
    <record name="TransferTargetInterface"
            c:type="RBTransferTargetInterface"
            glib:is-gtype-struct-for="TransferTarget">
      <field name="g_iface">
        <type name="GObject.TypeInterface" c:type="GTypeInterface"/>
      </field>
      <field name="build_dest_uri">
        <callback name="build_dest_uri">
          <return-value transfer-ownership="full">
            <doc xml:whitespace="preserve">constructed URI</doc>
            <type name="utf8" c:type="char*"/>
          </return-value>
          <parameters>
            <parameter name="target" transfer-ownership="none">
              <type name="TransferTarget" c:type="RBTransferTarget*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <doc xml:whitespace="preserve">a #RhythmDBEntry being transferred</doc>
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="media_type" transfer-ownership="none">
              <doc xml:whitespace="preserve">destination media type</doc>
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="extension" transfer-ownership="none">
              <doc xml:whitespace="preserve">extension associated with destination media type</doc>
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="track_added">
        <callback name="track_added">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="target" transfer-ownership="none">
              <type name="TransferTarget" c:type="RBTransferTarget*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="dest_size" transfer-ownership="none">
              <type name="guint64" c:type="guint64"/>
            </parameter>
            <parameter name="media_type" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="track_add_error">
        <callback name="track_add_error">
          <return-value transfer-ownership="none">
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="target" transfer-ownership="none">
              <type name="TransferTarget" c:type="RBTransferTarget*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
            <parameter name="error" transfer-ownership="none">
              <type name="GLib.Error" c:type="GError*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="should_transfer">
        <callback name="should_transfer">
          <return-value transfer-ownership="none">
            <doc xml:whitespace="preserve">%TRUE if the entry should be transferred to the target</doc>
            <type name="gboolean" c:type="gboolean"/>
          </return-value>
          <parameters>
            <parameter name="target" transfer-ownership="none">
              <type name="TransferTarget" c:type="RBTransferTarget*"/>
            </parameter>
            <parameter name="entry" transfer-ownership="none">
              <doc xml:whitespace="preserve">a #RhythmDBEntry to consider transferring</doc>
              <type name="RhythmDBEntry" c:type="RhythmDBEntry*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <class name="URIDialog"
           c:symbol-prefix="uri_dialog"
           c:type="RBURIDialog"
           parent="Gtk.Dialog"
           glib:type-name="RBURIDialog"
           glib:get-type="rb_uri_dialog_get_type"
           glib:type-struct="URIDialogClass">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <constructor name="new" c:identifier="rb_uri_dialog_new">
        <doc xml:whitespace="preserve">Creates a URI entry dialog.</doc>
        <return-value transfer-ownership="none">
          <doc xml:whitespace="preserve">URI dialog instance.</doc>
          <type name="Gtk.Widget" c:type="GtkWidget*"/>
        </return-value>
        <parameters>
          <parameter name="title" transfer-ownership="none">
            <doc xml:whitespace="preserve">Window title for the dialog</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
          <parameter name="label" transfer-ownership="none">
            <doc xml:whitespace="preserve">Label to display in the dialog</doc>
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </constructor>
      <virtual-method name="location_added">
        <return-value transfer-ownership="none">
          <type name="none" c:type="void"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <type name="utf8" c:type="char*"/>
          </parameter>
        </parameters>
      </virtual-method>
      <property name="label"
                writable="1"
                construct-only="1"
                transfer-ownership="none">
        <doc xml:whitespace="preserve">The label displayed in the dialog.</doc>
        <type name="utf8"/>
      </property>
      <field name="parent">
        <type name="Gtk.Dialog" c:type="GtkDialog"/>
      </field>
      <field name="priv">
        <type name="URIDialogPrivate" c:type="RBURIDialogPrivate*"/>
      </field>
      <glib:signal name="location-added" when="last">
        <doc xml:whitespace="preserve">Emitted when the user has entered a URI into the dialog.</doc>
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="uri" transfer-ownership="none">
            <doc xml:whitespace="preserve">URI entered</doc>
            <type name="utf8"/>
          </parameter>
        </parameters>
      </glib:signal>
    </class>
    <record name="URIDialogClass"
            c:type="RBURIDialogClass"
            glib:is-gtype-struct-for="URIDialog">
      <field name="parent_class">
        <type name="Gtk.DialogClass" c:type="GtkDialogClass"/>
      </field>
      <field name="location_added">
        <callback name="location_added">
          <return-value transfer-ownership="none">
            <type name="none" c:type="void"/>
          </return-value>
          <parameters>
            <parameter name="dialog" transfer-ownership="none">
              <type name="URIDialog" c:type="RBURIDialog*"/>
            </parameter>
            <parameter name="uri" transfer-ownership="none">
              <type name="utf8" c:type="char*"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <record name="URIDialogPrivate" c:type="RBURIDialogPrivate" disguised="1">
    </record>
    <callback name="UriRecurseFunc" c:type="RBUriRecurseFunc">
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="file" transfer-ownership="none">
          <type name="Gio.File" c:type="GFile*"/>
        </parameter>
        <parameter name="dir" transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
        <parameter name="data" transfer-ownership="none">
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </callback>
    <function name="assert_locked"
              c:identifier="rb_assert_locked"
              introspectable="0">
      <doc xml:whitespace="preserve">Asserts that @mutex is currently locked.  Does not work with all
mutex implementations.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="mutex" transfer-ownership="none">
          <doc xml:whitespace="preserve">a #GMutex</doc>
          <type name="GLib.Mutex" c:type="GMutex*"/>
        </parameter>
      </parameters>
    </function>
    <function name="builder_boldify_label"
              c:identifier="rb_builder_boldify_label">
      <doc xml:whitespace="preserve">Makes a label built from a GtkBuilder file bold.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="builder" transfer-ownership="none">
          <doc xml:whitespace="preserve">a #GtkBuilder instance</doc>
          <type name="Gtk.Builder" c:type="GtkBuilder*"/>
        </parameter>
        <parameter name="name" transfer-ownership="none">
          <doc xml:whitespace="preserve">name of the label to boldify</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="builder_load" c:identifier="rb_builder_load">
      <doc xml:whitespace="preserve">Locates and reads a GtkBuilder file, automatically connecting
signal handlers where possible.  The caller can specify a path
relative to the shared data directory, or its 'ui' or 'art'
subdirectories.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">#GtkBuilder object built from the file</doc>
        <type name="Gtk.Builder" c:type="GtkBuilder*"/>
      </return-value>
      <parameters>
        <parameter name="file" transfer-ownership="none">
          <doc xml:whitespace="preserve">filename, either absolute or relative to the data directory</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="user_data" transfer-ownership="none">
          <doc xml:whitespace="preserve">user data to pass to autoconnected signal handlers</doc>
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </function>
    <function name="canonicalise_uri" c:identifier="rb_canonicalise_uri">
      <doc xml:whitespace="preserve">Converts @uri to canonical URI form, ensuring it doesn't contain
any redundant directory fragments or unnecessarily escaped characters.
All URIs passed to #RhythmDB functions should be canonicalised.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">canonical URI, must be freed by caller</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">URI to canonicalise</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_dir_has_space" c:identifier="rb_check_dir_has_space">
      <doc xml:whitespace="preserve">Checks that the filesystem holding @file has at least @bytes_needed
bytes available.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if enough space is available.</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="dir" transfer-ownership="none">
          <doc xml:whitespace="preserve">a #GFile to check</doc>
          <type name="Gio.File" c:type="GFile*"/>
        </parameter>
        <parameter name="bytes_needed" transfer-ownership="none">
          <doc xml:whitespace="preserve">number of bytes to check for</doc>
          <type name="guint64" c:type="guint64"/>
        </parameter>
      </parameters>
    </function>
    <function name="check_dir_has_space_uri"
              c:identifier="rb_check_dir_has_space_uri">
      <doc xml:whitespace="preserve">Checks that the filesystem holding @uri has at least @bytes_needed
bytes available.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if enough space is available.</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">a URI to check</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="bytes_needed" transfer-ownership="none">
          <doc xml:whitespace="preserve">number of bytes to check for</doc>
          <type name="guint64" c:type="guint64"/>
        </parameter>
      </parameters>
    </function>
    <function name="collate_hash_table_keys"
              c:identifier="rb_collate_hash_table_keys"
              introspectable="0">
      <doc xml:whitespace="preserve">Returns a #GList containing all keys from @table.  The keys are
not copied.</doc>
      <return-value transfer-ownership="container">
        <doc xml:whitespace="preserve">#GList of keys</doc>
        <type name="GLib.List" c:type="GList*">
          <type name="gpointer"/>
        </type>
      </return-value>
      <parameters>
        <parameter name="table" transfer-ownership="none">
          <doc xml:whitespace="preserve">#GHashTable to collate</doc>
          <type name="GLib.HashTable" c:type="GHashTable*">
            <type name="gpointer" c:type="gpointer"/>
            <type name="gpointer" c:type="gpointer"/>
          </type>
        </parameter>
      </parameters>
    </function>
    <function name="collate_hash_table_values"
              c:identifier="rb_collate_hash_table_values"
              introspectable="0">
      <doc xml:whitespace="preserve">Returns a #GList containing all values from @table.  The values are
not copied.</doc>
      <return-value transfer-ownership="container">
        <doc xml:whitespace="preserve">#GList of values</doc>
        <type name="GLib.List" c:type="GList*">
          <type name="gpointer"/>
        </type>
      </return-value>
      <parameters>
        <parameter name="table" transfer-ownership="none">
          <doc xml:whitespace="preserve">#GHashTable to collate</doc>
          <type name="GLib.HashTable" c:type="GHashTable*">
            <type name="gpointer" c:type="gpointer"/>
            <type name="gpointer" c:type="gpointer"/>
          </type>
        </parameter>
      </parameters>
    </function>
    <function name="combo_box_hyphen_separator_func"
              c:identifier="rb_combo_box_hyphen_separator_func">
      <doc xml:whitespace="preserve">A row separator function to use for GtkComboBox widgets.
It expects the model to contain a string in its first column,
and interprets a string containing a single hyphen character
as a separator.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if the row pointed to by @iter is a separator</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="model" transfer-ownership="none">
          <doc xml:whitespace="preserve">a #GtkTreeModel</doc>
          <type name="Gtk.TreeModel" c:type="GtkTreeModel*"/>
        </parameter>
        <parameter name="iter" transfer-ownership="none">
          <doc xml:whitespace="preserve">a #GtkTreeIter</doc>
          <type name="Gtk.TreeIter" c:type="GtkTreeIter*"/>
        </parameter>
        <parameter name="data" transfer-ownership="none">
          <doc xml:whitespace="preserve">nothing</doc>
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </function>
    <function name="compare_gtimeval" c:identifier="rb_compare_gtimeval">
      <doc xml:whitespace="preserve">Compares two #GTimeVal structures for sorting.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">-1 if @a &lt; @b, 0 if @a == @b, 1 if @a &gt; @b</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="a" transfer-ownership="none">
          <doc xml:whitespace="preserve">left hand side</doc>
          <type name="GLib.TimeVal" c:type="GTimeVal*"/>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <doc xml:whitespace="preserve">right hand size</doc>
          <type name="GLib.TimeVal" c:type="GTimeVal*"/>
        </parameter>
      </parameters>
    </function>
    <function name="copy_function"
              c:identifier="rb_copy_function"
              introspectable="0">
      <doc xml:whitespace="preserve">Just returns its first argument.  Useful as a callback function.</doc>
      <return-value>
        <doc xml:whitespace="preserve">@data</doc>
        <type name="gpointer" c:type="gpointer"/>
      </return-value>
      <parameters>
        <parameter name="data" transfer-ownership="none">
          <doc xml:whitespace="preserve">generic argument</doc>
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </function>
    <function name="debug_get_args" c:identifier="rb_debug_get_args">
      <doc xml:whitespace="preserve">Constructs arguments to pass to another process using
this debug output code that will produce the same debug output
settings.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">debug output arguments, must be freed with #g_strfreev()</doc>
        <array c:type="char**">
          <type name="utf8"/>
        </array>
      </return-value>
    </function>
    <function name="debug_init" c:identifier="rb_debug_init">
      <doc xml:whitespace="preserve">Sets up debug output, with either all debug enabled
or none.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="debug" transfer-ownership="none">
          <doc xml:whitespace="preserve">if TRUE, enable all debug output</doc>
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
      </parameters>
    </function>
    <function name="debug_init_match" c:identifier="rb_debug_init_match">
      <doc xml:whitespace="preserve">Sets up debug output, enabling debug output from file and function
names that contain the specified match string.

Also sets up a GLib log handler that will trigger a debugger
break for critical or warning level output if any debug output
at all is enabled.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="match" transfer-ownership="none">
          <doc xml:whitespace="preserve">string to match functions and filenames against</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="debug_matches" c:identifier="rb_debug_matches">
      <doc xml:whitespace="preserve">Checks if @file or @func matches the current debug output settings.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if matched</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="func" transfer-ownership="none">
          <doc xml:whitespace="preserve">function to check</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="file" transfer-ownership="none">
          <doc xml:whitespace="preserve">filename to check</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="debug_real" c:identifier="rb_debug_real">
      <doc xml:whitespace="preserve">If the debug output settings match the function or file names,
the debug message will be formatted and written to standard error.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="func" transfer-ownership="none">
          <doc xml:whitespace="preserve">function name</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="file" transfer-ownership="none">
          <doc xml:whitespace="preserve">file name</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="line" transfer-ownership="none">
          <doc xml:whitespace="preserve">line number</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="newline" transfer-ownership="none">
          <doc xml:whitespace="preserve">if TRUE, add a newline to the output</doc>
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
        <parameter name="message" transfer-ownership="none">
          <doc xml:whitespace="preserve">the debug message</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="debug_realf"
              c:identifier="rb_debug_realf"
              introspectable="0">
      <doc xml:whitespace="preserve">If the debug output settings match the function or file names,
the debug message will be formatted and written to standard error.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="func" transfer-ownership="none">
          <doc xml:whitespace="preserve">function name</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="file" transfer-ownership="none">
          <doc xml:whitespace="preserve">file name</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="line" transfer-ownership="none">
          <doc xml:whitespace="preserve">line number</doc>
          <type name="gint" c:type="int"/>
        </parameter>
        <parameter name="newline" transfer-ownership="none">
          <doc xml:whitespace="preserve">if TRUE, add a newline to the output</doc>
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
        <parameter name="format" transfer-ownership="none">
          <doc xml:whitespace="preserve">printf style format specifier</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter transfer-ownership="none">
          <varargs>
          </varargs>
        </parameter>
      </parameters>
    </function>
    <function name="debug_stop_in_debugger"
              c:identifier="rb_debug_stop_in_debugger">
      <doc xml:whitespace="preserve">Raises a SIGINT signal to get the attention of the debugger.
When not running under the debugger, we don't want to stop,
so we ignore the signal for just the moment that we raise it.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="encoder_error_quark"
              c:identifier="rb_encoder_error_quark"
              moved-to="EncoderError.quark">
      <return-value transfer-ownership="none">
        <type name="GLib.Quark" c:type="GQuark"/>
      </return-value>
    </function>
    <function name="encoder_new"
              c:identifier="rb_encoder_new"
              moved-to="Encoder.new">
      <doc xml:whitespace="preserve">Creates a new #RBEncoder instance.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">the new #RBEncoder</doc>
        <type name="Encoder" c:type="RBEncoder*"/>
      </return-value>
    </function>
    <function name="error_dialog"
              c:identifier="rb_error_dialog"
              introspectable="0">
      <doc xml:whitespace="preserve">Creates and displays a simple error dialog box containing a primary
message in bold, larger type and a secondary message in the regular
font.  Both the primary and secondary message strings should be
translated.

Care should be taken to avoid opening multiple error dialog boxes
when a single error message (such as 'out of disk space') affects
multiple items.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="parent" transfer-ownership="none">
          <doc xml:whitespace="preserve">parent #GtkWindow for the dialog</doc>
          <type name="Gtk.Window" c:type="GtkWindow*"/>
        </parameter>
        <parameter name="primary" transfer-ownership="none">
          <doc xml:whitespace="preserve">main error message</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="secondary" transfer-ownership="none">
          <doc xml:whitespace="preserve">secondary error message (printf-style format string)</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter transfer-ownership="none">
          <varargs>
          </varargs>
        </parameter>
      </parameters>
    </function>
    <function name="ext_db_key_create_lookup"
              c:identifier="rb_ext_db_key_create_lookup"
              moved-to="ExtDBKey.create_lookup">
      <doc xml:whitespace="preserve">Creates a new metadata lookup key with a single field.
Use @rb_ext_db_key_add_field to add more.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">the new key</doc>
        <type name="ExtDBKey" c:type="RBExtDBKey*"/>
      </return-value>
      <parameters>
        <parameter name="field" transfer-ownership="none">
          <doc xml:whitespace="preserve">required field name</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="value" transfer-ownership="none">
          <doc xml:whitespace="preserve">value for field</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="ext_db_key_create_storage"
              c:identifier="rb_ext_db_key_create_storage"
              moved-to="ExtDBKey.create_storage">
      <doc xml:whitespace="preserve">Creates a new metadata storage key with a single field.
Use @rb_ext_db_key_add_field to add more.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">the new key</doc>
        <type name="ExtDBKey" c:type="RBExtDBKey*"/>
      </return-value>
      <parameters>
        <parameter name="field" transfer-ownership="none">
          <doc xml:whitespace="preserve">required field name</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="value" transfer-ownership="none">
          <doc xml:whitespace="preserve">value for field</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="false_function"
              c:identifier="rb_false_function"
              introspectable="0">
      <doc xml:whitespace="preserve">Just returns %FALSE, useful as a callback function.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%FALSE</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="dummy" transfer-ownership="none">
          <doc xml:whitespace="preserve">unused</doc>
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </function>
    <function name="file" c:identifier="rb_file">
      <doc xml:whitespace="preserve">Searches for an installed file, returning the full path name
if found, NULL otherwise.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">Full file name, if found.  Must not be freed.</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="filename" transfer-ownership="none">
          <doc xml:whitespace="preserve">name of file to search for</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="file_chooser_new" c:identifier="rb_file_chooser_new">
      <doc xml:whitespace="preserve">Creates and shows a regular gtk+ file chooser dialog with
a given title.  The user's music directory (typically ~/Music) is
added as a shortcut.

For consistency, this should be used anywhere a file chooser is required.

After creating the dialog, the caller should connect a handler to its 
'response' signal to process the user's selected files or folders.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">the file chooser #GtkWidget</doc>
        <type name="Gtk.Widget" c:type="GtkWidget*"/>
      </return-value>
      <parameters>
        <parameter name="title" transfer-ownership="none">
          <doc xml:whitespace="preserve">title for the file chooser</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="parent" transfer-ownership="none">
          <doc xml:whitespace="preserve">parent #GtkWindow for the file chooser</doc>
          <type name="Gtk.Window" c:type="GtkWindow*"/>
        </parameter>
        <parameter name="action" transfer-ownership="none">
          <doc xml:whitespace="preserve">the #GtkFileChooserAction</doc>
          <type name="Gtk.FileChooserAction" c:type="GtkFileChooserAction"/>
        </parameter>
        <parameter name="local_only" transfer-ownership="none">
          <doc xml:whitespace="preserve">if TRUE, don't show network locations</doc>
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
      </parameters>
    </function>
    <function name="file_find_extant_parent"
              c:identifier="rb_file_find_extant_parent">
      <doc xml:whitespace="preserve">Walks up the filesystem hierarchy to find a #GFile representing
the nearest extant ancestor of the specified file, which may be
the file itself if it exists.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">#GFile for the nearest extant ancestor</doc>
        <type name="Gio.File" c:type="GFile*"/>
      </return-value>
      <parameters>
        <parameter name="file" transfer-ownership="none">
          <doc xml:whitespace="preserve">a #GFile to find an extant ancestor of</doc>
          <type name="Gio.File" c:type="GFile*"/>
        </parameter>
      </parameters>
    </function>
    <function name="file_helpers_init" c:identifier="rb_file_helpers_init">
      <doc xml:whitespace="preserve">Sets up file search paths for @rb_file.  Must be called on startup.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="uninstalled" transfer-ownership="none">
          <doc xml:whitespace="preserve">if %TRUE, search in source and build directories as well as installed locations</doc>
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
      </parameters>
    </function>
    <function name="file_helpers_shutdown"
              c:identifier="rb_file_helpers_shutdown">
      <doc xml:whitespace="preserve">Frees various data allocated by file helper functions.
Should be called on shutdown.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="find_plugin_data_file"
              c:identifier="rb_find_plugin_data_file">
      <doc xml:whitespace="preserve">Locates a file under the plugin's data directory.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">allocated string containing the location of the file</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="plugin" transfer-ownership="none">
          <doc xml:whitespace="preserve">the plugin object</doc>
          <type name="GObject.Object" c:type="GObject*"/>
        </parameter>
        <parameter name="name" transfer-ownership="none">
          <doc xml:whitespace="preserve">name of the file to find</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="find_user_cache_file"
              c:identifier="rb_find_user_cache_file">
      <doc xml:whitespace="preserve">Determines the full path to use for user-specific cached files
within the user cache directory.

an error occurred.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">allocated string containing the location of the file to use, even if</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="name" transfer-ownership="none">
          <doc xml:whitespace="preserve">name of file to find</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="find_user_data_file" c:identifier="rb_find_user_data_file">
      <doc xml:whitespace="preserve">Determines the full path to use for user-specific files, such as rhythmdb.xml,
within the user data directory (see @rb_user_data_dir).

an error occurred.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">allocated string containing the location of the file to use, even if</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="name" transfer-ownership="none">
          <doc xml:whitespace="preserve">name of file to find</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="gtk_action_popup_menu"
              c:identifier="rb_gtk_action_popup_menu"
              introspectable="0">
      <doc xml:whitespace="preserve">Simple shortcut for getting a popup menu from a #GtkUIManager and
displaying it.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="uimanager" transfer-ownership="none">
          <doc xml:whitespace="preserve">a #GtkUIManager</doc>
          <type name="Gtk.UIManager" c:type="GtkUIManager*"/>
        </parameter>
        <parameter name="path" transfer-ownership="none">
          <doc xml:whitespace="preserve">UI path for the popup to display</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="gvalue_compare"
              c:identifier="rb_gvalue_compare"
              introspectable="0">
      <doc xml:whitespace="preserve">Compares @a and @b for sorting.  @a and @b must contain the same value
type for the comparison to be valid.  Comparisons for some value types
are not particularly useful.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">-1 if @a &lt; @b, 0 if @a == @b, 1 if @a &gt; @b</doc>
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="a" transfer-ownership="none">
          <doc xml:whitespace="preserve">left hand side</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <doc xml:whitespace="preserve">right hand size</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
      </parameters>
    </function>
    <function name="image_new_from_stock"
              c:identifier="rb_image_new_from_stock">
      <doc xml:whitespace="preserve">Same as @gtk_image_new_from_stock except that it mirrors the icons for RTL
languages.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">a #GtkImage of the requested stock item</doc>
        <type name="Gtk.Widget" c:type="GtkWidget*"/>
      </return-value>
      <parameters>
        <parameter name="stock_id" transfer-ownership="none">
          <doc xml:whitespace="preserve">stock image id</doc>
          <type name="utf8" c:type="gchar*"/>
        </parameter>
        <parameter name="size" transfer-ownership="none">
          <doc xml:whitespace="preserve">requested icon size</doc>
          <type name="Gtk.IconSize" c:type="GtkIconSize"/>
        </parameter>
      </parameters>
    </function>
    <function name="is_main_thread" c:identifier="rb_is_main_thread">
      <doc xml:whitespace="preserve">Checks if currently executing on the main thread.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if on the main thread</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
    </function>
    <function name="list_deep_free"
              c:identifier="rb_list_deep_free"
              introspectable="0">
      <doc xml:whitespace="preserve">Frees each element of @list and @list itself.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="list" transfer-ownership="full">
          <doc xml:whitespace="preserve">list to free</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="gpointer"/>
          </type>
        </parameter>
      </parameters>
    </function>
    <function name="list_destroy_free"
              c:identifier="rb_list_destroy_free"
              introspectable="0">
      <doc xml:whitespace="preserve">Calls @destroyer for each element in @list, then frees @list.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="list" transfer-ownership="none">
          <doc xml:whitespace="preserve">list to destroy</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="gpointer" c:type="gpointer"/>
          </type>
        </parameter>
        <parameter name="destroyer" transfer-ownership="none" scope="async">
          <doc xml:whitespace="preserve">function to call to free elements of @list</doc>
          <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
        </parameter>
      </parameters>
    </function>
    <function name="locale_dir" c:identifier="rb_locale_dir">
      <doc xml:whitespace="preserve">Returns the locale directory identified at build configuration time.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">locale dir</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
    </function>
    <function name="make_duration_string"
              c:identifier="rb_make_duration_string">
      <doc xml:whitespace="preserve">Constructs a string describing the specified duration.  The string
describes hours, minutes, and seconds, and its format is localised.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">duration string</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="duration" transfer-ownership="none">
          <doc xml:whitespace="preserve">duration in seconds</doc>
          <type name="guint" c:type="guint"/>
        </parameter>
      </parameters>
    </function>
    <function name="make_elapsed_time_string"
              c:identifier="rb_make_elapsed_time_string">
      <doc xml:whitespace="preserve">Constructs a string describing a playback position.  The string describes hours,
minutes, and seconds, and its format is localised.  The string can describe either
the elapsed time or the time remaining.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">elapsed/remaining time string</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="elapsed" transfer-ownership="none">
          <doc xml:whitespace="preserve">elapsed time (in seconds)</doc>
          <type name="guint" c:type="guint"/>
        </parameter>
        <parameter name="duration" transfer-ownership="none">
          <doc xml:whitespace="preserve">duration (in seconds)</doc>
          <type name="guint" c:type="guint"/>
        </parameter>
        <parameter name="show_remaining" transfer-ownership="none">
          <doc xml:whitespace="preserve">if %TRUE, show the remaining time, otherwise show elapsed time</doc>
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
      </parameters>
    </function>
    <function name="metadata_error_quark"
              c:identifier="rb_metadata_error_quark"
              moved-to="MetadataErrorType.quark">
      <return-value transfer-ownership="none">
        <type name="GLib.Quark" c:type="GQuark"/>
      </return-value>
    </function>
    <function name="music_dir" c:identifier="rb_music_dir">
      <doc xml:whitespace="preserve">Returns the default directory for the user's music library.
This will usually be the 'Music' directory under the home directory.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">user's music directory.  must not be freed.</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
    </function>
    <function name="null_function"
              c:identifier="rb_null_function"
              introspectable="0">
      <doc xml:whitespace="preserve">Just returns NULL.  Useful as a callback function.</doc>
      <return-value>
        <doc xml:whitespace="preserve">NULL</doc>
        <type name="gpointer" c:type="gpointer"/>
      </return-value>
      <parameters>
        <parameter name="dummy" transfer-ownership="none">
          <doc xml:whitespace="preserve">unused</doc>
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </function>
    <function name="player_error_quark"
              c:identifier="rb_player_error_quark"
              moved-to="PlayerError.quark">
      <return-value transfer-ownership="none">
        <type name="GLib.Quark" c:type="GQuark"/>
      </return-value>
    </function>
    <function name="player_new"
              c:identifier="rb_player_new"
              moved-to="Player.new"
              throws="1">
      <doc xml:whitespace="preserve">Creates a new player object.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">new player object.</doc>
        <type name="Player" c:type="RBPlayer*"/>
      </return-value>
      <parameters>
        <parameter name="want_crossfade" transfer-ownership="none">
          <doc xml:whitespace="preserve">if TRUE, try to use a backend that supports crossfading and other track transitions.</doc>
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
      </parameters>
    </function>
    <function name="podcast_parse_channel_free"
              c:identifier="rb_podcast_parse_channel_free">
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="data" transfer-ownership="none">
          <type name="PodcastChannel" c:type="RBPodcastChannel*"/>
        </parameter>
      </parameters>
    </function>
    <function name="podcast_parse_error_quark"
              c:identifier="rb_podcast_parse_error_quark">
      <return-value transfer-ownership="none">
        <type name="GLib.Quark" c:type="GQuark"/>
      </return-value>
    </function>
    <function name="podcast_parse_item_free"
              c:identifier="rb_podcast_parse_item_free">
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="data" transfer-ownership="none">
          <type name="PodcastItem" c:type="RBPodcastItem*"/>
        </parameter>
      </parameters>
    </function>
    <function name="podcast_parse_load_feed"
              c:identifier="rb_podcast_parse_load_feed"
              throws="1">
      <return-value transfer-ownership="none">
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="data" transfer-ownership="none">
          <type name="PodcastChannel" c:type="RBPodcastChannel*"/>
        </parameter>
        <parameter name="url" transfer-ownership="none">
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="existing_feed" transfer-ownership="none">
          <type name="gboolean" c:type="gboolean"/>
        </parameter>
      </parameters>
    </function>
    <function name="profiler_new"
              c:identifier="rb_profiler_new"
              moved-to="Profiler.new"
              introspectable="0">
      <doc xml:whitespace="preserve">Creates a new profiler instance.  This can be used to
time certain sections of code.</doc>
      <return-value>
        <doc xml:whitespace="preserve">profiler instance</doc>
        <type name="Profiler" c:type="RBProfiler*"/>
      </return-value>
      <parameters>
        <parameter name="name" transfer-ownership="none">
          <doc xml:whitespace="preserve">profiler name</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="refstring_equal"
              c:identifier="rb_refstring_equal"
              moved-to="RefString.equal">
      <doc xml:whitespace="preserve">Key equality function suitable for use with #GHashTable.
Equality checks for #RBRefString are just pointer comparisons,
since there can only be one refstring for a given string.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if the strings are the same</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="ap" transfer-ownership="none">
          <doc xml:whitespace="preserve">an #RBRefString</doc>
          <type name="gpointer" c:type="gconstpointer"/>
        </parameter>
        <parameter name="bp" transfer-ownership="none">
          <doc xml:whitespace="preserve">another #RBRefstring</doc>
          <type name="gpointer" c:type="gconstpointer"/>
        </parameter>
      </parameters>
    </function>
    <function name="refstring_find"
              c:identifier="rb_refstring_find"
              moved-to="RefString.find">
      <doc xml:whitespace="preserve">Returns an existing #RBRefString for @init if one exists,
otherwise returns NULL.  If an existing refstring is found,
its reference count is increased.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">existing #RBRefString, or NULL</doc>
        <type name="RefString" c:type="RBRefString*"/>
      </return-value>
      <parameters>
        <parameter name="init" transfer-ownership="none">
          <doc xml:whitespace="preserve">string to find</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="refstring_hash"
              c:identifier="rb_refstring_hash"
              moved-to="RefString.hash">
      <doc xml:whitespace="preserve">Hash function suitable for use with @GHashTable.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">hash value for the string underlying @p</doc>
        <type name="guint" c:type="guint"/>
      </return-value>
      <parameters>
        <parameter name="p" transfer-ownership="none">
          <doc xml:whitespace="preserve">an #RBRefString</doc>
          <type name="gpointer" c:type="gconstpointer"/>
        </parameter>
      </parameters>
    </function>
    <function name="refstring_system_init"
              c:identifier="rb_refstring_system_init"
              moved-to="RefString.system_init">
      <doc xml:whitespace="preserve">Sets up the refstring system.  Called on startup.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="refstring_system_shutdown"
              c:identifier="rb_refstring_system_shutdown"
              moved-to="RefString.system_shutdown">
      <doc xml:whitespace="preserve">Frees all data associated with the refstring system.
Only called on shutdown.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="rhythmdb_query_get_type"
              c:identifier="rhythmdb_query_get_type">
      <return-value transfer-ownership="none">
        <type name="GType" c:type="GType"/>
      </return-value>
    </function>
    <function name="safe_strcmp" c:identifier="rb_safe_strcmp">
      <return-value transfer-ownership="none">
        <type name="gint" c:type="int"/>
      </return-value>
      <parameters>
        <parameter name="a" transfer-ownership="none">
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="sanitize_path_for_msdos_filesystem"
              c:identifier="rb_sanitize_path_for_msdos_filesystem">
      <doc xml:whitespace="preserve">Modifies @path such that it represents a legal path for MS DOS
filesystems.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="path" transfer-ownership="none">
          <doc xml:whitespace="preserve">a path to sanitize (modified in place)</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="sanitize_uri_for_filesystem"
              c:identifier="rb_sanitize_uri_for_filesystem">
      <doc xml:whitespace="preserve">Removes characters from @uri that are not allowed by the filesystem
on which it would be stored.  At present, this only supports MS DOS
filesystems.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">sanitized copy of @uri, must be freed by caller.</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">a URI to sanitize</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="scale_pixbuf_to_size"
              c:identifier="rb_scale_pixbuf_to_size">
      <doc xml:whitespace="preserve">Creates a new #GdkPixbuf from the original one, for a target of
size, respecting the aspect ratio of the image.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">scaled #GdkPixbuf</doc>
        <type name="GdkPixbuf.Pixbuf" c:type="GdkPixbuf*"/>
      </return-value>
      <parameters>
        <parameter name="pixbuf" transfer-ownership="none">
          <doc xml:whitespace="preserve">the #GdkPixbuf containing the original image</doc>
          <type name="GdkPixbuf.Pixbuf" c:type="GdkPixbuf*"/>
        </parameter>
        <parameter name="size" transfer-ownership="none">
          <doc xml:whitespace="preserve">a stock icon size</doc>
          <type name="Gtk.IconSize" c:type="GtkIconSize"/>
        </parameter>
      </parameters>
    </function>
    <function name="search_fold" c:identifier="rb_search_fold">
      <doc xml:whitespace="preserve">Returns a case-folded and punctuation-stripped version of @original, useful
for performing text searches.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">case-folded string</doc>
        <type name="utf8" c:type="gchar*"/>
      </return-value>
      <parameters>
        <parameter name="original" transfer-ownership="none">
          <doc xml:whitespace="preserve">the string to fold</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="set_tree_view_column_fixed_width"
              c:identifier="rb_set_tree_view_column_fixed_width">
      <doc xml:whitespace="preserve">Sets a fixed size for a tree view column based on
a set of strings to be displayed in the column.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="treeview" transfer-ownership="none">
          <doc xml:whitespace="preserve">the #GtkTreeView containing the column</doc>
          <type name="Gtk.Widget" c:type="GtkWidget*"/>
        </parameter>
        <parameter name="column" transfer-ownership="none">
          <doc xml:whitespace="preserve">the #GtkTreeViewColumn to size</doc>
          <type name="Gtk.TreeViewColumn" c:type="GtkTreeViewColumn*"/>
        </parameter>
        <parameter name="renderer" transfer-ownership="none">
          <doc xml:whitespace="preserve">the #GtkCellRenderer used in the column</doc>
          <type name="Gtk.CellRenderer" c:type="GtkCellRenderer*"/>
        </parameter>
        <parameter name="strings" transfer-ownership="none">
          <doc xml:whitespace="preserve">a NULL-terminated set of strings to base the size on</doc>
          <array c:type="char**">
            <type name="utf8" c:type="char*"/>
          </array>
        </parameter>
        <parameter name="padding" transfer-ownership="none">
          <doc xml:whitespace="preserve">a small amount of extra padding for the column</doc>
          <type name="gint" c:type="int"/>
        </parameter>
      </parameters>
    </function>
    <function name="settings_delayed_sync"
              c:identifier="rb_settings_delayed_sync">
      <doc xml:whitespace="preserve">Synchronizes settings in the @settings instance after 500ms has elapsed
with no further changes.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="settings" transfer-ownership="none">
          <doc xml:whitespace="preserve">#GSettings instance</doc>
          <type name="Gio.Settings" c:type="GSettings*"/>
        </parameter>
        <parameter name="sync_func"
                   transfer-ownership="none"
                   allow-none="1"
                   scope="notified"
                   closure="2"
                   destroy="3">
          <doc xml:whitespace="preserve">function to call</doc>
          <type name="DelayedSyncFunc" c:type="RBDelayedSyncFunc"/>
        </parameter>
        <parameter name="data" transfer-ownership="none" allow-none="1">
          <doc xml:whitespace="preserve">data to pass to @func</doc>
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
        <parameter name="destroy"
                   transfer-ownership="none"
                   allow-none="1"
                   scope="async">
          <doc xml:whitespace="preserve">function to use to free @data</doc>
          <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
        </parameter>
      </parameters>
    </function>
    <function name="shell_error_quark"
              c:identifier="rb_shell_error_quark"
              moved-to="ShellErrorType.quark">
      <doc xml:whitespace="preserve">Returns the #GQuark used for #RBShell errors</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">shell error #GQuark</doc>
        <type name="GLib.Quark" c:type="GQuark"/>
      </return-value>
    </function>
    <function name="shell_player_error_quark"
              c:identifier="rb_shell_player_error_quark"
              moved-to="ShellPlayerError.quark">
      <return-value transfer-ownership="none">
        <type name="GLib.Quark" c:type="GQuark"/>
      </return-value>
    </function>
    <function name="signal_accumulator_boolean_or"
              c:identifier="rb_signal_accumulator_boolean_or"
              introspectable="0">
      <doc xml:whitespace="preserve">A #GSignalAccumulator used to return the boolean OR of all
returned (boolean) values.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%FALSE to abort signal emission, %TRUE to continue</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="hint" transfer-ownership="none">
          <doc xml:whitespace="preserve">a #GSignalInvocationHint</doc>
          <type name="GObject.SignalInvocationHint"
                c:type="GSignalInvocationHint*"/>
        </parameter>
        <parameter name="return_accu" transfer-ownership="none">
          <doc xml:whitespace="preserve">holds the accumulated return value</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="handler_return" transfer-ownership="none">
          <doc xml:whitespace="preserve">holds the return value to be accumulated</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="dummy" transfer-ownership="none">
          <doc xml:whitespace="preserve">user data (unused)</doc>
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </function>
    <function name="signal_accumulator_object_handled"
              c:identifier="rb_signal_accumulator_object_handled"
              introspectable="0">
      <doc xml:whitespace="preserve">A #GSignalAccumulator that aborts the signal emission after the
first handler to return a value, and returns the value returned by
that handler.  This is the opposite behaviour from what you get when
no accumulator is specified, where the last signal handler wins.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%FALSE to abort signal emission, %TRUE to continue</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="hint" transfer-ownership="none">
          <doc xml:whitespace="preserve">a #GSignalInvocationHint</doc>
          <type name="GObject.SignalInvocationHint"
                c:type="GSignalInvocationHint*"/>
        </parameter>
        <parameter name="return_accu" transfer-ownership="none">
          <doc xml:whitespace="preserve">holds the accumulated return value</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="handler_return" transfer-ownership="none">
          <doc xml:whitespace="preserve">holds the return value to be accumulated</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="dummy" transfer-ownership="none">
          <doc xml:whitespace="preserve">user data (unused)</doc>
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </function>
    <function name="signal_accumulator_value_array"
              c:identifier="rb_signal_accumulator_value_array"
              introspectable="0">
      <doc xml:whitespace="preserve">A #GSignalAccumulator used to combine all returned values into
a #GValueArray.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%FALSE to abort signal emission, %TRUE to continue</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="hint" transfer-ownership="none">
          <doc xml:whitespace="preserve">a #GSignalInvocationHint</doc>
          <type name="GObject.SignalInvocationHint"
                c:type="GSignalInvocationHint*"/>
        </parameter>
        <parameter name="return_accu" transfer-ownership="none">
          <doc xml:whitespace="preserve">holds the accumulated return value</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="handler_return" transfer-ownership="none">
          <doc xml:whitespace="preserve">holds the return value to be accumulated</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="dummy" transfer-ownership="none">
          <doc xml:whitespace="preserve">user data (unused)</doc>
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </function>
    <function name="signal_accumulator_value_handled"
              c:identifier="rb_signal_accumulator_value_handled"
              introspectable="0">
      <doc xml:whitespace="preserve">A #GSignalAccumulator that aborts the signal emission after the
first handler to return a value, and returns the value returned by
that handler.  This is the opposite behaviour from what you get when
no accumulator is specified, where the last signal handler wins.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%FALSE to abort signal emission, %TRUE to continue</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="hint" transfer-ownership="none">
          <doc xml:whitespace="preserve">a #GSignalInvocationHint</doc>
          <type name="GObject.SignalInvocationHint"
                c:type="GSignalInvocationHint*"/>
        </parameter>
        <parameter name="return_accu" transfer-ownership="none">
          <doc xml:whitespace="preserve">holds the accumulated return value</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="handler_return" transfer-ownership="none">
          <doc xml:whitespace="preserve">holds the return value to be accumulated</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
        <parameter name="dummy" transfer-ownership="none">
          <doc xml:whitespace="preserve">user data (unused)</doc>
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </function>
    <function name="slist_deep_free"
              c:identifier="rb_slist_deep_free"
              introspectable="0">
      <doc xml:whitespace="preserve">Frees each element of @list and @list itself.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="list" transfer-ownership="full">
          <doc xml:whitespace="preserve">list to free</doc>
          <type name="GLib.SList" c:type="GSList*">
            <type name="gpointer"/>
          </type>
        </parameter>
      </parameters>
    </function>
    <function name="stock_icons_init" c:identifier="rb_stock_icons_init">
      <doc xml:whitespace="preserve">Initializes the stock icons, adding the necessary filesystem
locations to the GTK icon search path.  Must be called on startup.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="stock_icons_shutdown"
              c:identifier="rb_stock_icons_shutdown">
      <doc xml:whitespace="preserve">If anything was necessary to clean up the stock icons, this function
would do it.  Doesn't do anything, but should be called on shutdown
anyway.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="str_in_strv"
              c:identifier="rb_str_in_strv"
              introspectable="0">
      <doc xml:whitespace="preserve">Checks if @needle is present in the NULL-terminated string
array @haystack.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if found</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="needle" transfer-ownership="none">
          <doc xml:whitespace="preserve">string to search for</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="haystack" transfer-ownership="none">
          <doc xml:whitespace="preserve">array of strings to search</doc>
          <type name="utf8" c:type="char**"/>
        </parameter>
      </parameters>
    </function>
    <function name="string_list_contains"
              c:identifier="rb_string_list_contains"
              introspectable="0">
      <doc xml:whitespace="preserve">Checks if @list contains the string @s.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if found</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="list" transfer-ownership="none">
          <doc xml:whitespace="preserve">(element-type utf8) list to check</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="gpointer" c:type="gpointer"/>
          </type>
        </parameter>
        <parameter name="s" transfer-ownership="none">
          <doc xml:whitespace="preserve">string to check for</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="string_list_copy"
              c:identifier="rb_string_list_copy"
              introspectable="0">
      <doc xml:whitespace="preserve">Creates a deep copy of @list.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">copied list</doc>
        <type name="GLib.List" c:type="GList*">
          <type name="utf8"/>
        </type>
      </return-value>
      <parameters>
        <parameter name="list" transfer-ownership="none">
          <doc xml:whitespace="preserve">list of strings to copy</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="utf8"/>
          </type>
        </parameter>
      </parameters>
    </function>
    <function name="string_list_equal"
              c:identifier="rb_string_list_equal"
              introspectable="0">
      <doc xml:whitespace="preserve">Checks if @a and @b contain exactly the same set of strings,
regardless of order.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if the lists contain all the same strings</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="a" transfer-ownership="none">
          <doc xml:whitespace="preserve">list of strings to compare</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="utf8"/>
          </type>
        </parameter>
        <parameter name="b" transfer-ownership="none">
          <doc xml:whitespace="preserve">other list of strings to compare</doc>
          <type name="GLib.List" c:type="GList*">
            <type name="utf8"/>
          </type>
        </parameter>
      </parameters>
    </function>
    <function name="string_split_words" c:identifier="rb_string_split_words">
      <doc xml:whitespace="preserve">Splits @string on word boundaries using Unicode character definitions.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">NULL-terminated array of strings</doc>
        <array c:type="gchar**">
          <type name="utf8"/>
        </array>
      </return-value>
      <parameters>
        <parameter name="string" transfer-ownership="none">
          <doc xml:whitespace="preserve">the string to split</doc>
          <type name="utf8" c:type="gchar*"/>
        </parameter>
      </parameters>
    </function>
    <function name="threads_init"
              c:identifier="rb_threads_init"
              introspectable="0">
      <doc xml:whitespace="preserve">Initializes various thread helpers.  Must be called on startup.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
    </function>
    <function name="true_function"
              c:identifier="rb_true_function"
              introspectable="0">
      <doc xml:whitespace="preserve">Just returns %TRUE, useful as a callback function.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="dummy" transfer-ownership="none">
          <doc xml:whitespace="preserve">unused</doc>
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_append_path" c:identifier="rb_uri_append_path">
      <doc xml:whitespace="preserve">Creates a new URI consisting of @path appended to @uri.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">new URI, must be freed by caller</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">the URI to append to</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="path" transfer-ownership="none">
          <doc xml:whitespace="preserve">the path fragment to append</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_append_uri" c:identifier="rb_uri_append_uri">
      <doc xml:whitespace="preserve">Creates a new URI consisting of @fragment appended to @uri.
Generally isn't a good idea.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">new URI, must be freed by caller</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">the URI to append to</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="fragment" transfer-ownership="none">
          <doc xml:whitespace="preserve">the URI fragment to append</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_could_be_podcast"
              c:identifier="rb_uri_could_be_podcast">
      <doc xml:whitespace="preserve">Checks if @uri identifies a resource that is probably a podcast
(RSS or Atom feed).  This does not perform any IO, it just guesses
based on the URI itself.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if @uri may be a podcast</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">a URI to check</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="is_opml" transfer-ownership="none">
          <doc xml:whitespace="preserve">returns whether the URI identifies an OPML document</doc>
          <type name="gboolean" c:type="gboolean*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_create_parent_dirs"
              c:identifier="rb_uri_create_parent_dirs"
              throws="1">
      <doc xml:whitespace="preserve">Ensures that all parent directories of @uri exist so that
@uri itself can be created directly.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if successful</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">a URI for which to create parent directories</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_exists" c:identifier="rb_uri_exists">
      <doc xml:whitespace="preserve">Checks if a URI identifies a resource that exists</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if @uri exists</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">a URI to check</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_get_dir_name" c:identifier="rb_uri_get_dir_name">
      <doc xml:whitespace="preserve">Returns the directory component of @uri, that is, everything up
to the start of the filename.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">new URI for parent of @uri, must be freed by caller.</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">a URI</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_get_filesystem_type"
              c:identifier="rb_uri_get_filesystem_type">
      <doc xml:whitespace="preserve">Returns a string describing the type of the filesystem containing @uri.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">filesystem type string, must be freed by caller.</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">URI to get filesystem type for</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="mount_point" transfer-ownership="none">
          <doc xml:whitespace="preserve">optionally returns the mount point for the filesystem as a URI</doc>
          <type name="utf8" c:type="char**"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_get_mount_point" c:identifier="rb_uri_get_mount_point">
      <doc xml:whitespace="preserve">Returns the mount point of the filesystem holding @uri.
If @uri is on a normal filesystem mount (such as /, /home,
/var, etc.) this will be NULL.

or NULL.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">filesystem mount point (must be freed by caller)</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">a URI</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_get_short_path_name"
              c:identifier="rb_uri_get_short_path_name">
      <doc xml:whitespace="preserve">Returns the filename component of @uri, that is, everything after the
final slash and before the start of the query string or fragment.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">filename component of @uri, must be freed by caller</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">a URI</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_handle_recursively"
              c:identifier="rb_uri_handle_recursively">
      <doc xml:whitespace="preserve">Calls @func for each file found under the directory identified by @uri.
If @uri identifies a file, calls @func for that instead.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">URI to visit</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="cancel" transfer-ownership="none" allow-none="1">
          <doc xml:whitespace="preserve">an optional #GCancellable to allow cancellation</doc>
          <type name="Gio.Cancellable" c:type="GCancellable*"/>
        </parameter>
        <parameter name="func"
                   transfer-ownership="none"
                   scope="call"
                   closure="3">
          <doc xml:whitespace="preserve">Callback function</doc>
          <type name="UriRecurseFunc" c:type="RBUriRecurseFunc"/>
        </parameter>
        <parameter name="user_data" transfer-ownership="none">
          <doc xml:whitespace="preserve">Data for callback function</doc>
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_handle_recursively_async"
              c:identifier="rb_uri_handle_recursively_async">
      <doc xml:whitespace="preserve">Calls @func for each file found under the directory identified
by @uri, or if @uri identifies a file, calls it once
with that.

Directory recursion happens on a separate thread, but the callbacks
are called on the main thread.

If non-NULL, @destroy_data will be called once all files have been
processed, or when the operation is cancelled.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">the URI to visit</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="cancel" transfer-ownership="none" allow-none="1">
          <doc xml:whitespace="preserve">a #GCancellable to allow cancellation</doc>
          <type name="Gio.Cancellable" c:type="GCancellable*"/>
        </parameter>
        <parameter name="func"
                   transfer-ownership="none"
                   scope="notified"
                   closure="3"
                   destroy="4">
          <doc xml:whitespace="preserve">callback function</doc>
          <type name="UriRecurseFunc" c:type="RBUriRecurseFunc"/>
        </parameter>
        <parameter name="user_data" transfer-ownership="none">
          <doc xml:whitespace="preserve">data to pass to callback</doc>
          <type name="gpointer" c:type="gpointer"/>
        </parameter>
        <parameter name="data_destroy" transfer-ownership="none" scope="async">
          <doc xml:whitespace="preserve">function to call to free @user_data</doc>
          <type name="GLib.DestroyNotify" c:type="GDestroyNotify"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_is_directory" c:identifier="rb_uri_is_directory">
      <doc xml:whitespace="preserve">Checks if @uri identifies a directory.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if @uri is a directory</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">the URI to check</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_is_hidden" c:identifier="rb_uri_is_hidden">
      <doc xml:whitespace="preserve">Checks if @uri is hidden, according to the Unix filename convention.
If the filename component of @uri begins with a dot, the file is considered
hidden.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if @uri is hidden</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">a URI to check</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_is_local" c:identifier="rb_uri_is_local">
      <doc xml:whitespace="preserve">Checks if @uri identifies a local resource.  Currently this just
checks that it uses the 'file' URI scheme.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if @uri is local</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">a URI to check</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_is_readable" c:identifier="rb_uri_is_readable">
      <doc xml:whitespace="preserve">Checks if the user can read the resource identified by @uri</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if @uri is readable</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">a URI to check</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_is_writable" c:identifier="rb_uri_is_writable">
      <doc xml:whitespace="preserve">Checks if the user can write to the resource identified by @uri</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if @uri is writable</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">a URI to check</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_list_parse" c:identifier="rb_uri_list_parse">
      <doc xml:whitespace="preserve">Converts a single string containing a list of URIs into
a #GList of URI strings.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">#GList of URI strings</doc>
        <type name="GLib.List" c:type="GList*">
          <type name="utf8"/>
        </type>
      </return-value>
      <parameters>
        <parameter name="uri_list" transfer-ownership="none">
          <doc xml:whitespace="preserve">string containing URIs to parse</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_make_hidden" c:identifier="rb_uri_make_hidden">
      <doc xml:whitespace="preserve">Constructs a URI that is similar to @uri but which identifies
a hidden file.  This can be used for temporary files that should not
be visible to the user while they are in use.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">hidden URI, must be freed by the caller.</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">a URI to construct a hidden version of</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_mkstemp" c:identifier="rb_uri_mkstemp" throws="1">
      <doc xml:whitespace="preserve">Creates a temporary file whose URI begins with @prefix, returning
the file URI and an output stream for writing to it.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">%TRUE if successful</doc>
        <type name="gboolean" c:type="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="prefix" transfer-ownership="none">
          <doc xml:whitespace="preserve">URI prefix</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
        <parameter name="uri_ret" transfer-ownership="none">
          <doc xml:whitespace="preserve">returns the temporary file URI</doc>
          <type name="utf8" c:type="char**"/>
        </parameter>
        <parameter name="stream" transfer-ownership="none">
          <doc xml:whitespace="preserve">returns a @GOutputStream for the temporary file</doc>
          <type name="Gio.OutputStream" c:type="GOutputStream**"/>
        </parameter>
      </parameters>
    </function>
    <function name="uri_resolve_symlink"
              c:identifier="rb_uri_resolve_symlink"
              throws="1">
      <doc xml:whitespace="preserve">Attempts to resolve symlinks in @uri and return a canonical URI for the file
it identifies.</doc>
      <return-value transfer-ownership="full">
        <doc xml:whitespace="preserve">resolved URI, or NULL on error</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
      <parameters>
        <parameter name="uri" transfer-ownership="none">
          <doc xml:whitespace="preserve">the URI to process</doc>
          <type name="utf8" c:type="char*"/>
        </parameter>
      </parameters>
    </function>
    <function name="user_cache_dir" c:identifier="rb_user_cache_dir">
      <doc xml:whitespace="preserve">This will create the rhythmbox user cache directory, using the XDG
Base Directory specification.  If none of the XDG environment
variables are set, this will be ~/.cache/rhythmbox.

NULL if the directory does not exist and could not be created.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">string holding the path to the rhythmbox user cache directory, or</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
    </function>
    <function name="user_data_dir" c:identifier="rb_user_data_dir">
      <doc xml:whitespace="preserve">This will create the rhythmbox user data directory, using the XDG Base
Directory specification.  If none of the XDG environment variables are
set, this will be ~/.local/share/rhythmbox.

NULL if the directory does not exist and cannot be created.</doc>
      <return-value transfer-ownership="none">
        <doc xml:whitespace="preserve">string holding the path to the rhythmbox user data directory, or</doc>
        <type name="utf8" c:type="char*"/>
      </return-value>
    </function>
    <function name="value_array_append_data"
              c:identifier="rb_value_array_append_data"
              introspectable="0">
      <doc xml:whitespace="preserve">Appends a single value to @array, collecting it from @Varargs.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="array" transfer-ownership="none">
          <doc xml:whitespace="preserve">#GValueArray to append to</doc>
          <type name="GObject.ValueArray" c:type="GValueArray*"/>
        </parameter>
        <parameter name="type" transfer-ownership="none">
          <doc xml:whitespace="preserve">#GType of the value being appended</doc>
          <type name="GType" c:type="GType"/>
        </parameter>
        <parameter transfer-ownership="none">
          <varargs>
          </varargs>
        </parameter>
      </parameters>
    </function>
    <function name="value_free"
              c:identifier="rb_value_free"
              introspectable="0">
      <doc xml:whitespace="preserve">Unsets and frees @val.  @val must have been allocated using
@g_slice_new or @g_slice_new0.</doc>
      <return-value transfer-ownership="none">
        <type name="none" c:type="void"/>
      </return-value>
      <parameters>
        <parameter name="val" transfer-ownership="full">
          <doc xml:whitespace="preserve">a #GValue</doc>
          <type name="GObject.Value" c:type="GValue*"/>
        </parameter>
      </parameters>
    </function>
  </namespace>
</repository>
