int ol_elapse_emulator_get_real_ms (OlElapseEmulator *emulator, int time) { if (emulator->first_time < 0 || emulator->prev_time - time > emulator->accuracy || time - emulator->last_time > 150) { /* reinitialize timer */ ol_infof ("prev:%d, time:%d\n", emulator->prev_time, time); ol_elapse_emulator_init (emulator, time, emulator->accuracy); } else { struct timeval current_time; gettimeofday (¤t_time, NULL); int real_time = emulator->first_time + (current_time.tv_sec - emulator->begin_time.tv_sec) * 1000 + (current_time.tv_usec - emulator->begin_time.tv_usec) / 1000; if (real_time - time > 2 * emulator->accuracy || time - real_time > emulator->accuracy ) { ol_infof ("real_time: %d, time: %d\n", real_time, time); ol_elapse_emulator_init (emulator, time, emulator->accuracy); } else { emulator->prev_time = time; time = real_time; } } emulator->last_time = time; return time; }
OlElapseEmulator * ol_elapse_emulator_new (int initial_time, int accuracy) { OlElapseEmulator *emulator = g_new (OlElapseEmulator, 1); ol_elapse_emulator_init (emulator, initial_time, accuracy); return emulator; }
static void ol_player_amarok2_ensure_elapse (int elapsed_time) { if (elapse_emulator == NULL) { elapse_emulator = g_new (OlElapseEmulator, 1); if (elapse_emulator != NULL) ol_elapse_emulator_init (elapse_emulator, elapsed_time, 1000); } }
int ol_elapse_emulator_get_last_ms (OlElapseEmulator *emulator, int time) { if (emulator->first_time < 0 || emulator->last_time - time > emulator->accuracy || time - emulator->last_time > emulator->accuracy) { /* reinitialize timer */ ol_debugf ("prev:%d, time:%d\n", emulator->prev_time, time); ol_elapse_emulator_init (emulator, time, emulator->accuracy); } return emulator->last_time; }
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; }