For now this is just a list of things needed to change.

Grouping of the browser(s) Edit

  • Impact: Medium
  • Involves: Plugins/playlist3.c in gmpc
  • Improves: Usability.
  • Long term: n/a
  • Language: C

Group plugins by type:

  • Library
    • Play Queue
    • Search
    • Artist browser
    • Metadata browser
  • Playlist
    • Playlist editor (show playlists in left pane?)
  • Internet Radio
    • Magnatune
    • Jamendo
  • Tools
    • Mserver
  • Statistics
    • Server stats
    • plugin?

Plugin structure to Plugin ObjectsEdit

  • Impact: HIGH
  • Involves: Rewriting/updating all plugins.
  • Improves: Maintainability, plugin writing.
  • Long term: Eases implementation of making non-C plugins.
  • Language: C + GObject code, probably generated by vala.

Turn this into objects. You have a GmpcPlugin that can implement several interfaces like f.e. GmpcMetadataIface

  • GmpcPlugin
* GmpcPluginMetadataIface
* GmpcPluginBrowserExtentionIface
* GmpcPluginPreferencesIface
* etc.

Code for this can be grabbed partially from stuffkeeper.

  • First step done

Turn libmpd into a GObject Edit

  • Impact: HIGH. (libmpd rewrite, smaller modifications to gmpc if api stays somewhat identical)
  • Involves: GMPC, Libmpd and plugins using libmpd.
  • Improves: Conversion to idle command and impact thereof on gmpc.
  • Long term: Easier to generate bindings for non-C languages.
  • Language: C + GObject.

There is going to be a rewrite of libmpdclient (libmpdclient2). It will be based on this. Get rid of libmpd completely? and write a libgmpdclient?

Remove threading from GMPC and switch to async I/O Edit

  • Impact: Medium.
  • Involves: gmpc_easy_download needs to be converted or removed, plugins using gmpc_easy_download and the whole metadata system.
  • Improves: No threading, less prone to race conditions and other hard to trace bugs. Less nasty hacks of keeping the gui alive in f.e. magnatune plugin.
  • Long term:
  • Language: C + libgio.

This requires a rewrite of the metadata system. This is now (in a different thread) a fully sequential system. Each query is done after the other and in every query each plugin is queried after the other. This needs to be made async. (but still sequential). Jamendo plugin does this.

  • How to solve portability? Write an own async downloader using a thread + libcurl?


  1. Async downloader written using libsoup, GmpcEasyAsyncDownloader. Vala binding (for internal use) available.
  2. basic support is in, 2 plugins converted.


Help system

  • Impact: Low
  • Involves: Gmpc help menu
  • Improves: Usability
  • Long term: n/a
  • Language: html/C/GtkBuilder

Use pages from this wiki to create a basic help-set for gmpc. Don't use yelp, just open html pages in a browser. (offline)