static gboolean
ol_player_amarok2_get_played_time (int *played_time)
{
    OlPlayerMpris *mpris = ol_player_amarok2_get_mpris ();
    int amarok_time = 0;
    if (!ol_player_mpris_get_played_time (mpris, &amarok_time))
        return FALSE;
    ol_player_amarok2_ensure_elapse (amarok_time);
    /* FIXME: Due to a bug in Amarok 2.0, the status returned is always set to
       stopped, so we can't determine the true status of Amarok.
       Enable the true clause when the fixed version of Amarok 2 is wide spread.
     */
    if (0)
    {
        enum OlPlayerStatus status = ol_player_amarok2_get_status ();
        if (status == OL_PLAYER_PLAYING)
            *played_time = ol_elapse_emulator_get_real_ms (elapse_emulator, amarok_time);
        else
            *played_time = ol_elapse_emulator_get_last_ms (elapse_emulator, amarok_time);
    }
    else
    {
        *played_time = ol_elapse_emulator_get_real_ms (elapse_emulator, amarok_time);
    }
    return TRUE;
}
static gboolean
ol_player_moc_get_played_time (int *played_time)
{
  /* ol_log_func (); */
  ol_assert_ret (played_time != NULL, FALSE);
  if (!ol_player_moc_get_activated ())
    return FALSE;
  int status = ol_player_moc_get_status ();
  if (status != OL_PLAYER_PLAYING && status != OL_PLAYER_PAUSED)
  {
    *played_time = -1;
    return TRUE;
  }
  char *cmd = g_strdup_printf (QUERY_CMD, QUERY_POS);
  int moc_time;
  gboolean ret = ol_cmd_get_int (cmd, &moc_time);
  moc_time *= 1000;
  ensure_elapse (moc_time);
  if (status == OL_PLAYER_PLAYING)
    *played_time = ol_elapse_emulator_get_real_ms (elapse_emulator,
                                                   moc_time);
  else if (status == OL_PLAYER_PAUSED)
    *played_time = ol_elapse_emulator_get_last_ms (elapse_emulator,
                                                   moc_time);
  g_free (cmd);
  return ret;
}
static gboolean
ol_player_clementine_get_played_time (int *played_time)
{
  OlPlayerMpris *mpris = ol_player_clementine_get_mpris ();
  int clementine_time = 0;
  if (!ol_player_mpris_get_played_time (mpris, &clementine_time))
    return FALSE;
  ol_player_clementine_ensure_elapse (clementine_time);

  if (0)
  {
    enum OlPlayerStatus status = ol_player_clementine_get_status ();
    if (status == OL_PLAYER_PLAYING)
      *played_time = ol_elapse_emulator_get_real_ms (elapse_emulator, clementine_time);
    else
      *played_time = ol_elapse_emulator_get_last_ms (elapse_emulator, clementine_time);
  }
  else
  {
    *played_time = ol_elapse_emulator_get_real_ms (elapse_emulator, clementine_time);
  }
  return TRUE;
}
static gboolean
ol_player_qmmp_get_played_time (int *played_time)
{
  OlPlayerMpris *mpris = ol_player_qmmp_get_mpris ();
  int qmmp_time;
  if (!ol_player_mpris_get_played_time (mpris, &qmmp_time))
    return FALSE;
  enum OlPlayerStatus status = ol_player_qmmp_get_status ();
  ol_player_qmmp_ensure_elapse (qmmp_time);
  if (status == OL_PLAYER_PLAYING)
    *played_time = ol_elapse_emulator_get_real_ms (elapse_emulator,
                                                   qmmp_time);
  else if (status == OL_PLAYER_PAUSED)
    *played_time = ol_elapse_emulator_get_last_ms (elapse_emulator,
                                                   qmmp_time);
  else
    *played_time = -1;
  return TRUE;
}
static gboolean
_get_played_time (int *played_time)
{
    ol_assert_ret (played_time != NULL, FALSE);
    if (!_ensure_connection ())
        return FALSE;
    int muine_time = 0;
    if (!ol_dbus_get_int (proxy, GET_POSITION, &muine_time))
        return FALSE;
    muine_time *= 1000;
    _ensure_elapse (muine_time);
    enum OlPlayerStatus status = _get_status ();
    if (status == OL_PLAYER_PLAYING)
        *played_time = ol_elapse_emulator_get_real_ms (elapse_emulator, muine_time);
    else if (status == OL_PLAYER_PAUSED)
        *played_time = ol_elapse_emulator_get_last_ms (elapse_emulator, muine_time);
    else
        *played_time = 0;
    return TRUE;
}
static gboolean
_get_played_time (int *played_time)
{
  ol_assert_ret (played_time != NULL, FALSE);
  if (!_ensure_dbus ())
    return FALSE;
  int juk_time;
  if (!ol_dbus_get_int (proxy, CURRENT_TIME, &juk_time))
    return FALSE;
  juk_time *= 1000;
  _ensure_elapse (juk_time);
  enum OlPlayerStatus status = _get_status ();
  if (status == OL_PLAYER_PLAYING)
    *played_time = ol_elapse_emulator_get_real_ms (elapse_emulator, juk_time);
  else if (status == OL_PLAYER_PAUSED)
    *played_time = ol_elapse_emulator_get_last_ms (elapse_emulator, juk_time);
  else
    *played_time = 0;
  return TRUE;
}
static gboolean
ol_player_exaile02_get_played_time (int *played_time)
{
  guint8 percent;
  int duration;
  int exaile02_time;
  if (played_time == NULL)
    return FALSE;
  if (connection == NULL || proxy == NULL)
    if (!ol_player_exaile02_init_dbus ())
      return FALSE;
  enum OlPlayerStatus status = ol_player_exaile02_get_status ();
  if (status == OL_PLAYER_PLAYING || status == OL_PLAYER_PAUSED)
  {
    if (!ol_dbus_get_uint8 (proxy, current_position, &percent))
      return FALSE;
    if (!ol_player_exaile02_get_music_length (&duration))
      return FALSE;
    exaile02_time = duration * percent / 100;
    if (elapse_emulator == NULL)
    {
      elapse_emulator = g_new (OlElapseEmulator, 1);
      if (elapse_emulator != NULL)
        ol_elapse_emulator_init (elapse_emulator, exaile02_time, duration / 100);
    }
    if (elapse_emulator != NULL)
    {
      if (status == OL_PLAYER_PLAYING)
        *played_time = ol_elapse_emulator_get_real_ms (elapse_emulator, exaile02_time);
      else /* if (status == OL_PLAYER_PAUSED)  */
        *played_time = ol_elapse_emulator_get_last_ms (elapse_emulator, exaile02_time);
    }
    else
      *played_time = exaile02_time;
  }
  else
  {
    *played_time = -1;
  }
  return TRUE;
}
static gboolean
ol_player_listen_get_played_time (int *played_time)
{
  /* ol_log_func (); */
  int listen_time;
  if (played_time == NULL)
    return FALSE;
  if (connection == NULL || proxy == NULL)
    if (!ol_player_listen_init_dbus ())
      return FALSE;
  enum OlPlayerStatus status = ol_player_listen_get_status ();
  if (status == OL_PLAYER_PLAYING)
  {
    if (!ol_dbus_get_int (proxy, current_position, &listen_time))
      return FALSE;
    listen_time = listen_time*1000;
    if (elapse_emulator == NULL)
    {
      elapse_emulator = g_new (OlElapseEmulator, 1);
      if (elapse_emulator != NULL)
        ol_elapse_emulator_init (elapse_emulator, listen_time, 1000);
    }
    if (elapse_emulator != NULL)
    {
      if (status == OL_PLAYER_PLAYING)
        *played_time = ol_elapse_emulator_get_real_ms (elapse_emulator, listen_time);
      else /* if (status == OL_PLAYER_PAUSED)  */
        *played_time = ol_elapse_emulator_get_last_ms (elapse_emulator, listen_time);
    }
    else
      *played_time = listen_time;
  }
  else
  {
    *played_time = -1;
  }
  return TRUE;
}