void ol_scroll_module_set_lrc (struct OlDisplayModule *module, OlLrc *lrc) { ol_log_func (); ol_assert (module != NULL); ol_assert (module != NULL); OlScrollModule *priv = ol_display_module_get_data (module); ol_assert (priv != NULL); if (priv->lrc != NULL) g_object_unref (priv->lrc); priv->lrc = lrc; if (priv->lrc == NULL) ol_scroll_window_set_whole_lyrics(priv->scroll, NULL); else { g_object_ref (priv->lrc); /*dump the whole lyrics of a song*/ GPtrArray *text_array = g_ptr_array_new_with_free_func (g_free); OlLrcIter *iter = ol_lrc_iter_from_id (lrc, 0); const char *text = NULL; while (ol_lrc_iter_loop (iter, NULL, NULL, &text)) { g_ptr_array_add (text_array, g_strdup (text)); } ol_scroll_window_set_whole_lyrics(priv->scroll, text_array); g_ptr_array_unref (text_array); ol_lrc_iter_free (iter); } }
static void ol_scroll_module_set_message (struct OlDisplayModule *module, const char *message) { ol_assert (module != NULL); OlScrollModule *priv = ol_display_module_get_data (module); ol_assert (priv != NULL); if (priv->scroll != NULL && message != NULL) { ol_scroll_window_set_text (priv->scroll, message); } }
static void ol_scroll_module_clear_message (struct OlDisplayModule *module) { ol_assert (module != NULL); OlScrollModule *priv = ol_display_module_get_data (module); ol_assert (priv != NULL); _set_metadata_as_text (priv); if (priv->message_timer > 0) { g_source_remove (priv->message_timer); priv->message_timer = 0; } }
static void ol_osd_module_clear_message (struct OlDisplayModule *module) { ol_log_func (); ol_assert (module != NULL); OlOsdModule *priv = ol_display_module_get_data (module); ol_assert (priv != NULL); if (priv->message_source != 0) { g_source_remove (priv->message_source); hide_message (priv); } ol_debug (" clear message done"); }
static void ol_scroll_module_set_last_message (struct OlDisplayModule *module, const char *message) { ol_assert (module != NULL); OlScrollModule *priv = ol_display_module_get_data (module); ol_assert (priv != NULL); ol_scroll_module_set_message (module, message); if (priv->message_timer != 0) g_source_remove (priv->message_timer); priv->message_timer = g_timeout_add (MESSAGE_TIMEOUT_MS, (GSourceFunc) ol_scroll_module_clear_message, module); }
static void ol_osd_module_set_played_time (struct OlDisplayModule *module, guint64 played_time) { ol_assert (module != NULL); OlOsdModule *priv = ol_display_module_get_data (module); ol_assert (priv != NULL); if (priv->lrc != NULL && priv->window != NULL) { OlLrcIter *iter = ol_lrc_iter_from_timestamp (priv->lrc, played_time); if (_advance_to_nonempty_lyric (iter)) { gint id = ol_lrc_iter_get_id (iter); if (id != priv->lrc_id) { if (id == priv->lrc_next_id) { /* advance to the next line */ ol_osd_window_set_percentage (priv->window, priv->current_line, 1.0); priv->current_line = 1 - priv->current_line; priv->lrc_id = priv->lrc_next_id; priv->lrc_next_id = -1; ol_osd_window_set_current_line (priv->window, priv->current_line); } else { /* The user seeks the position or there is only 1 line in OSD window. Reset the lyrics. */ priv->lrc_id = id; priv->current_line = 0; ol_osd_window_set_current_line (priv->window, 0); ol_osd_window_set_lyric (priv->window, priv->current_line, ol_lrc_iter_get_text (iter)); ol_osd_module_update_next_lyric (priv, iter); } } gdouble percentage = ol_lrc_iter_compute_percentage (iter, played_time); ol_osd_window_set_current_percentage (priv->window, percentage); if (percentage > 0.5 && priv->lrc_next_id == -1) ol_osd_module_update_next_lyric (priv, iter); } else if (priv->lrc_id != -1) { clear_lyrics (priv); } ol_lrc_iter_free (iter); } }
static void ol_scroll_module_set_played_time (struct OlDisplayModule *module, guint64 played_time) { ol_assert (module != NULL); OlScrollModule *priv = ol_display_module_get_data (module); ol_assert (priv != NULL); if (priv->lrc != NULL && priv->scroll != NULL) { OlLrcIter *iter = ol_lrc_iter_from_timestamp (priv->lrc, played_time); ol_scroll_window_set_progress (priv->scroll, ol_lrc_iter_get_id (iter), ol_lrc_iter_compute_percentage (iter, played_time)); ol_lrc_iter_free (iter); } }
void ol_scroll_module_free (struct OlDisplayModule *module) { ol_assert (module != NULL); OlScrollModule *priv = ol_display_module_get_data (module); ol_assert (priv != NULL); if (_config_is_setting) return; if (module == NULL) return; if (priv->scroll != NULL) { gtk_widget_destroy (GTK_WIDGET (priv->scroll)); priv->scroll = NULL; } if (priv->message_timer > 0) g_source_remove (priv->message_timer); if (priv->player != NULL) { g_signal_handlers_disconnect_by_func (priv->player, _metadata_changed_cb, priv); g_signal_handlers_disconnect_by_func (priv->player, _caps_changed_cb, priv); g_object_unref (priv->player); priv->player = NULL; } if (priv->metadata != NULL) { ol_metadata_free (priv->metadata); priv->metadata = NULL; } if (priv->lrc) { g_object_unref (priv->lrc); priv->lrc = NULL; } while (priv->config_bindings != NULL) { _unbind_config (priv->config_bindings->data); priv->config_bindings = g_list_delete_link (priv->config_bindings, priv->config_bindings); } g_free (priv); }
static void ol_osd_module_free (struct OlDisplayModule *module) { ol_log_func (); ol_assert (module != NULL); OlOsdModule *priv = ol_display_module_get_data (module); ol_assert (priv != NULL); if (priv->lrc) { g_object_unref (priv->lrc); priv->lrc = NULL; } if (priv->toolbar) { g_object_unref (priv->toolbar); priv->toolbar = NULL; } if (priv->window != NULL) { gtk_widget_destroy (GTK_WIDGET (priv->window)); priv->window = NULL; } if (priv->message_source > 0) { g_source_remove (priv->message_source); priv->message_source = 0; } if (priv->metadata != NULL) { ol_metadata_free (priv->metadata); priv->metadata = NULL; } g_signal_handlers_disconnect_by_func (priv->player, _metadata_changed_cb, priv); g_object_unref (priv->player); priv->player = NULL; while (priv->config_bindings != NULL) { _unbind_config (priv->config_bindings->data); priv->config_bindings = g_list_delete_link (priv->config_bindings, priv->config_bindings); } g_free (priv); }
static void ol_osd_module_set_lrc (struct OlDisplayModule *module, OlLrc *lrc_file) { ol_log_func (); ol_assert (module != NULL); OlOsdModule *priv = ol_display_module_get_data (module); ol_assert (priv != NULL); if (priv->lrc) g_object_unref (priv->lrc); priv->lrc = lrc_file; if (lrc_file) g_object_ref (lrc_file); if (lrc_file != NULL && priv->message_source != 0) { ol_osd_module_clear_message (module); } if (lrc_file == NULL && priv->message_source == 0) { clear_lyrics (priv); } /* if (lrc_file != NULL) */ /* module->display = TRUE; */ }
static void ol_osd_module_set_message (struct OlDisplayModule *module, const char *message, int duration_ms) { ol_log_func (); ol_assert (module != NULL); OlOsdModule *priv = ol_display_module_get_data (module); ol_assert (priv != NULL); ol_assert (message != NULL); ol_assert (priv->window != NULL); if (priv->lrc != NULL) return; ol_debugf (" message:%s\n", message); ol_osd_window_set_current_line (priv->window, 0); ol_osd_window_set_current_percentage (priv->window, 1.0); ol_osd_window_set_lyric (priv->window, 0, message); ol_osd_window_set_lyric (priv->window, 1, NULL); if (priv->message_source != 0) g_source_remove (priv->message_source); priv->message_source = g_timeout_add (duration_ms, (GSourceFunc) hide_message, (gpointer) priv); }