r2882 - trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src

abraxa at sita.openmoko.org abraxa at sita.openmoko.org
Sat Sep 1 13:12:21 CEST 2007


Author: abraxa
Date: 2007-09-01 13:12:10 +0200 (Sat, 01 Sep 2007)
New Revision: 2882

Modified:
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/editor_page.c
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/files_page.c
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/files_page.h
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/guitools.c
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/main.c
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/main.h
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/main_page.c
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/omp_spiff_c.cpp
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/omp_spiff_c.h
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/persistent.c
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/persistent.h
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playback.c
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playlist.c
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playlist.h
   trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playlist_page.c
Log:
Proper XSPF artist/title handling (simple libSpiff C binding didn't permit this)
Bugfixes: Prev track treshold (prevented skipping backwards), track duration no longer buggy, error dialogs no longer block the message loop 
Enhancements: Titles for files without metadata, prev track treshold now configurable, better meta data handling by the UI



Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/editor_page.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/editor_page.c	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/editor_page.c	2007-09-01 11:12:10 UTC (rev 2882)
@@ -27,6 +27,7 @@
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 #include <libmokoui2/moko-finger-scroll.h>
+#include <string.h>
 
 #include "editor_page.h"
 #include "playlist.h"
@@ -72,32 +73,52 @@
  * Updates a track's title and duration upon arrival of metadata
  */
 void
-omp_editor_page_update_track_info(gpointer instance, gpointer track_infos, gpointer user_data)
+omp_editor_page_update_track_info(gpointer instance, guint track_id, gpointer user_data)
 {
-/*	omp_track_infos *infos;
-	gchar *track_title, *track_duration, *path;
+	gchar *artist, *title, *caption, *duration, *path;
+	gulong int_duration = 0;
 	GtkTreeIter tree_iter;
 
-	infos = (omp_track_infos*)track_infos;
+	omp_playlist_get_track_info(track_id, &artist, &title, &int_duration);
 
-	if (infos->duration > 0)
+	// Prepare values for display
+	if (int_duration > 0)
 	{
-		track_duration = g_strdup_printf(OMP_WIDGET_CAPTION_EDITOR_TRACK_TIME,
-			infos->duration / 60000, (infos->duration/1000) % 60);
+		duration = g_strdup_printf(OMP_WIDGET_CAPTION_EDITOR_TRACK_TIME,
+			(gint)(int_duration / 60000), (gint)(int_duration/1000) % 60);
 	} else {
-		track_duration = NULL;
+		duration = NULL;
 	}
 
-	path = g_strdup_printf("%d", infos->id);
+	if (artist)
+	{
+		if (strcmp(artist, "") != 0)
+		{
+			caption = g_strdup_printf(_("%1$s - %2$s"), artist, title);
+		} else {
+			caption = g_strdup(title);
+		}
+
+	} else {
+		caption = g_strdup(title);
+	}
+
+	// Find column to edit
+	path = g_strdup_printf("%d", track_id);
 	gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(omp_editor_page_list_store),
 		&tree_iter, path);
-	
+
+	// Update values
 	gtk_list_store_set(omp_editor_page_list_store, &tree_iter,
-		TITLE_COLUMN, infos->title,
-		DURATION_COLUMN, track_duration, -1);
+		TITLE_COLUMN, caption,
+		DURATION_COLUMN, duration, -1);
 
+	// Clean up
 	g_free(path);
-	g_free(track_duration); */
+	g_free(caption);
+	g_free(duration);
+	g_free(title);
+	g_free(artist);
 }
 
 /**
@@ -106,7 +127,8 @@
 void
 omp_editor_page_add_clicked(gpointer instance, gpointer user_data)
 {
-	
+	// Show file chooser
+	omp_show_tab(OMP_TAB_FILE_CHOOSER);
 }
 
 /**

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/files_page.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/files_page.c	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/files_page.c	2007-09-01 11:12:10 UTC (rev 2882)
@@ -26,3 +26,16 @@
 
 #include "files_page.h"
 
+/**
+ * Creates the file chooser UI page and all its elements
+ */
+GtkWidget *
+omp_files_page_create()
+{
+	GtkWidget *main_vbox;
+
+	// Create main container
+	main_vbox = gtk_vbox_new(FALSE, 0);
+
+	return main_vbox;
+}

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/files_page.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/files_page.h	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/files_page.h	2007-09-01 11:12:10 UTC (rev 2882)
@@ -27,7 +27,10 @@
 #ifndef FILES_PAGE_H
 #define FILES_PAGE_H
 
+#include <gtk/gtk.h>
 
+GtkWidget *omp_files_page_create();
+
 #endif
 
 

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/guitools.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/guitools.c	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/guitools.c	2007-09-01 11:12:10 UTC (rev 2882)
@@ -145,8 +145,8 @@
 	// We don't want a title of "<unnamed>"
 	gtk_window_set_title(GTK_WINDOW(dialog), " ");
 
-	gtk_dialog_run(GTK_DIALOG(dialog));
-	gtk_widget_destroy(dialog);
+	g_signal_connect_swapped(dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog);
+	gtk_widget_show_all(dialog);
 }
 
 /**

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/main.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/main.c	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/main.c	2007-09-01 11:12:10 UTC (rev 2882)
@@ -33,11 +33,9 @@
 #include <glib/gprintf.h>
 #include <gdk/gdk.h>
 
-#include <stdlib.h>
-#include <errno.h>
+#include <signal.h>
+#include <unistd.h>
 #include <fcntl.h>
-#include <unistd.h>
-#include <signal.h>
 
 #define DBUS_API_SUBJECT_TO_CHANGE
 #include <dbus/dbus.h>
@@ -47,13 +45,14 @@
 #include "libmokoui2/moko-stock.h"
 
 #include "main.h"
+#include "editor_page.h"
+#include "files_page.h"
+#include "guitools.h"
 #include "main_page.h"
+#include "persistent.h"
 #include "playlist_page.h"
-#include "editor_page.h"
-#include "guitools.h"
 #include "playlist.h"
 #include "playback.h"
-#include "persistent.h"
 
 // Determines how the segfault handler terminates the program
 //define HANDLE_SIGSEGV
@@ -194,8 +193,14 @@
 	if (pid > 0)
 	{
 		g_printf(_("Already running an instance of the Media Player, bringing that to the front instead.\n"));
-		kill(pid, SIGUSR1);
-		return TRUE;
+
+		// Was signaling the other process successful?
+		if (kill(pid, SIGUSR1) == 0)
+		{
+			return TRUE;
+		} else {
+			g_printf(_("Previous instance invalid, proceeding with regular startup.\n"));
+		}
 	}
 
 	set_lock(lock_file);
@@ -260,6 +265,12 @@
 	notebook_add_page_with_icon(omp_notebook, page, "gtk-index", 0);
 	omp_notebook_tabs[OMP_TAB_PLAYLIST_EDITOR] = page;
 	gtk_widget_hide(page);	// We show the page once a playlist was loaded
+
+	// Add file chooser page
+	page = omp_files_page_create();
+	notebook_add_page_with_icon(omp_notebook, page, "gtk-index", 0);
+	omp_notebook_tabs[OMP_TAB_FILE_CHOOSER] = page;
+	gtk_widget_hide(page);	// We show the page once user wants to add files
 }
 
 /**

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/main.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/main.h	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/main.h	2007-09-01 11:12:10 UTC (rev 2882)
@@ -43,6 +43,7 @@
 	OMP_TAB_MAIN = 0,
 	OMP_TAB_PLAYLISTS,
 	OMP_TAB_PLAYLIST_EDITOR,
+	OMP_TAB_FILE_CHOOSER,
 	OMP_TABS
 };
 

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/main_page.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/main_page.c	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/main_page.c	2007-09-01 11:12:10 UTC (rev 2882)
@@ -65,13 +65,12 @@
 
 // Forward declarations for internal use
 void omp_main_update_track_change(gpointer instance, gpointer user_data);
+void omp_main_update_track_info_changed(gpointer instance, guint track_id, gpointer user_data);
 void omp_main_update_shuffle_state(gpointer instance, gboolean state, gpointer user_data);
 void omp_main_update_repeat_mode(gpointer instance, guint mode, gpointer user_data);
 void omp_main_update_status_change(gpointer instance, gpointer user_data);
 void omp_main_update_track_position(gpointer instance, gpointer user_data);
 void omp_main_update_volume(gpointer instance, gpointer user_data);
-void omp_main_update_tag_artist(gpointer instance, const gchar *artist, gpointer user_data);
-void omp_main_update_tag_title(gpointer instance, const gchar *title, gpointer user_data);
 
 
 
@@ -185,7 +184,7 @@
 	// Prevent UI callbacks from messing with the slider position
 	omp_main_time_slider_can_update = FALSE;
 
-	return TRUE;
+	return FALSE;
 }
 
 /**
@@ -202,7 +201,7 @@
 	// Notify the slider change callback that this time we indeed want to change position
 	omp_main_time_slider_was_dragged = TRUE;
 
-	return TRUE;
+	return FALSE;
 }
 
 /**
@@ -553,7 +552,7 @@
 	gtk_scale_set_draw_value(GTK_SCALE(vol_scale), FALSE);
 	GTK_WIDGET_UNSET_FLAGS(GTK_WIDGET(vol_scale), GTK_CAN_FOCUS);
 	gtk_widget_set_size_request(GTK_WIDGET(vol_scale), 338, 35);
-	gtk_range_set_update_policy(GTK_RANGE(vol_scale), GTK_UPDATE_DISCONTINUOUS);
+	gtk_range_set_update_policy(GTK_RANGE(vol_scale), GTK_UPDATE_CONTINUOUS);
 	g_signal_connect(G_OBJECT(vol_scale), "value_changed", G_CALLBACK(omp_main_volume_slider_changed), NULL);
 	gtk_container_add(GTK_CONTAINER(alignment), GTK_WIDGET(vol_scale));
 	main_widgets.volume_hscale = vol_scale;
@@ -590,6 +589,9 @@
 	g_signal_connect(G_OBJECT(omp_window), OMP_EVENT_PLAYLIST_TRACK_CHANGED,
 		G_CALLBACK(omp_main_update_track_change), NULL);
 
+	g_signal_connect(G_OBJECT(omp_window), OMP_EVENT_PLAYLIST_TRACK_INFO_CHANGED,
+		G_CALLBACK(omp_main_update_track_info_changed), NULL);
+
 	g_signal_connect(G_OBJECT(omp_window), OMP_EVENT_PLAYLIST_TRACK_COUNT_CHANGED,
 		G_CALLBACK(omp_main_update_track_change), NULL);
 
@@ -613,12 +615,6 @@
 	g_signal_connect(G_OBJECT(omp_window), OMP_EVENT_PLAYBACK_VOLUME_CHANGED,
 		G_CALLBACK(omp_main_update_volume), NULL);
 
-	g_signal_connect(G_OBJECT(omp_window), OMP_EVENT_PLAYBACK_META_ARTIST_CHANGED,
-		G_CALLBACK(omp_main_update_tag_artist), NULL);
-
-	g_signal_connect(G_OBJECT(omp_window), OMP_EVENT_PLAYBACK_META_TITLE_CHANGED,
-		G_CALLBACK(omp_main_update_tag_title), NULL);
-
 	// Make all widgets visible
 	gtk_widget_show_all(bg_muxer);
 
@@ -638,9 +634,18 @@
 	static gulong old_track_length = 0;
 
 	gulong track_length, track_position;
+	gchar *artist = NULL;
+	gchar *title = NULL;
 	gchar *text;
 	gint track_id;
 
+	// Set preliminary artist/title strings (updated on incoming metadata)
+	omp_playlist_get_track_info(omp_playlist_current_track_id, &artist, &title, &track_length);
+	gtk_label_set_text(GTK_LABEL(main_widgets.artist_label), artist);
+	gtk_label_set_text(GTK_LABEL(main_widgets.title_label), title);
+	if (artist) g_free(artist);
+	if (title) g_free(title);
+
 	// Track id/track count changed?
 	if (
 			(omp_playlist_track_count != old_track_count) ||
@@ -658,16 +663,11 @@
 	}
 
 	// Got a track length change?
-	track_length = omp_playback_get_track_length();
-
-	if (track_length != old_track_length)
+	if ( (track_length) && (track_length != old_track_length) )
 	{
 		old_track_length = track_length;
 		track_position = omp_playback_get_track_position();
 
-		// Set new time slider increments: one tap is 10% of the track's playing time
-		gtk_range_set_increments(GTK_RANGE(main_widgets.time_hscale), track_length/10, track_length/10);
-
 		// Update label and slider
 		text = g_strdup_printf(OMP_WIDGET_CAPTION_TRACK_TIME,
 			(guint)(track_position / 60000), (guint)(track_position/1000) % 60,
@@ -681,11 +681,23 @@
 			// critial GTK warning, so we set 0/1 instead in that case
 			gtk_range_set_range(GTK_RANGE(main_widgets.time_hscale), 0, track_length ? track_length : 1);
 			gtk_range_set_value(GTK_RANGE(main_widgets.time_hscale), track_position);
+
+			// Set new time slider increments: one tap is 10% of the track's playing time
+			gtk_range_set_increments(GTK_RANGE(main_widgets.time_hscale), track_length/10, track_length/10);
 		}
 	}
 }
 
 /**
+ * Updates the UI when the track's meta data changed
+ */
+void
+omp_main_update_track_info_changed(gpointer instance, guint track_id, gpointer user_data)
+{
+	omp_main_update_track_change(NULL, NULL);
+}
+
+/**
  * Updates the UI after a change to the shuffle flag
  */
 void
@@ -775,7 +787,7 @@
 		// Update UI
 		text = g_strdup_printf(OMP_WIDGET_CAPTION_TRACK_TIME,
 			(guint)(track_position / 60000), (guint)(track_position/1000) % 60,
-			(guint)track_length / 60000, (guint)(track_length/1000) % 60);
+			(guint)(track_length / 60000), (guint)(track_length/1000) % 60);
 		gtk_label_set_text(GTK_LABEL(main_widgets.time_label), text);
 		g_free(text);
 
@@ -785,6 +797,9 @@
 			// critial GTK warning, so we set 0/1 instead in that case
 			gtk_range_set_range(GTK_RANGE(main_widgets.time_hscale), 0, track_length ? track_length : 1);
 			gtk_range_set_value(GTK_RANGE(main_widgets.time_hscale), track_position);
+
+			// Set new time slider increments: one tap is 10% of the track's playing time
+			gtk_range_set_increments(GTK_RANGE(main_widgets.time_hscale), track_length/10, track_length/10);
 		}
 	}
 
@@ -811,21 +826,3 @@
 
 	gtk_range_set_value(GTK_RANGE(main_widgets.volume_hscale), volume);
 }
-
-/**
- * Updates the UI's track artist label
- */
-void
-omp_main_update_tag_artist(gpointer instance, const gchar *artist, gpointer user_data)
-{
-	gtk_label_set_text(GTK_LABEL(main_widgets.artist_label), artist);
-}
-
-/**
- * Updates the UI's track title label
- */
-void
-omp_main_update_tag_title(gpointer instance, const gchar *title, gpointer user_data)
-{
-	gtk_label_set_text(GTK_LABEL(main_widgets.title_label), title);
-}

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/omp_spiff_c.cpp
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/omp_spiff_c.cpp	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/omp_spiff_c.cpp	2007-09-01 11:12:10 UTC (rev 2882)
@@ -86,7 +86,7 @@
 		/// Creates the callback interface for filling an omp_spiff_list
 		SpiffCReaderCallback(omp_spiff_list *list);
 
-		/// Finalize the list
+		/// Finalizes the list
 		virtual ~SpiffCReaderCallback();
 };
 
@@ -111,6 +111,7 @@
 	// Append new item to the track list
 	*newtrack = new omp_spiff_track;
 
+	(*newtrack)->creator = track->stealCreator();
 	(*newtrack)->title = track->stealTitle();
 	(*newtrack)->album = track->stealAlbum();
 	(*newtrack)->duration = track->getDuration();
@@ -133,12 +134,12 @@
 		*newmv = new omp_spiff_mvalue;
 		(*newmv)->value = str;
 
-		// On to the next location
+		// On to the next identifier
 		newmv = &(*newmv)->next;
 	}
 	*newmv = NULL;
 
-	// Clean up and move to the next track
+	// Clean up and move on to the next track
 	delete track;
 	newtrack = &(*newtrack)->next;
 }
@@ -238,6 +239,7 @@
 		// Back-up pointer
 		ntr = tr->next;
 
+		delete tr->creator;
 		delete tr->title;
 		delete tr->album;
 
@@ -266,6 +268,7 @@
 	props.lendLicense(list->license);
 	props.lendLocation(list->location);
 	props.lendIdentifier(list->identifier);
+
 	SpiffPropsWriter pwriter(&props);
 	SpiffTrackWriter twriter;
 	SpiffWriter writer(1, formatter, pwriter);
@@ -274,6 +277,8 @@
 	{
 		// Tracks
 		SpiffTrack track;
+
+		track.lendCreator(strack->creator);
 		track.lendTitle(strack->title);
 		track.lendAlbum(strack->album);
 		track.setDuration(strack->duration);
@@ -349,12 +354,14 @@
 	omp_spiff_track *ret;
 
 	ret = new omp_spiff_track;
+	ret->creator = NULL;
 	ret->title = NULL;
 	ret->album = NULL;
 	ret->duration = -1;
 	ret->tracknum = -1;
 	ret->locations = NULL;
 	ret->identifiers = NULL;
+	ret->title_is_preliminary = 0;
 	ret->next = *track;
 	*track = ret;
 

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/omp_spiff_c.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/omp_spiff_c.h	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/omp_spiff_c.h	2007-09-01 11:12:10 UTC (rev 2882)
@@ -64,6 +64,9 @@
 /// Single track in an XSPF list
 typedef struct _omp_spiff_track
 {
+	/// Track's creator (= artist)
+	char *creator;
+
 	/// Track's display name
 	char *title;
 
@@ -82,6 +85,9 @@
 	/// Unique track identifiers
 	omp_spiff_mvalue *identifiers;
 
+	/// Preliminary title flag, title will be overwritten on incoming tag data (non-XSPF feature)
+	int title_is_preliminary;
+
 	/// Pointer to next track
 	struct _omp_spiff_track *next;
 

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/persistent.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/persistent.c	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/persistent.c	2007-09-01 11:12:10 UTC (rev 2882)
@@ -42,15 +42,15 @@
 /// The default configuration
 struct _omp_config omp_default_config =
 {
-	FALSE,
-	OMP_REPEAT_OFF,
-	TRUE,
-//	FALSE,
-	FALSE,
-	"%f",
-	0.0,
-	{0,0,0,0,0,0,0,0,0,0,0},
-	TRUE
+	FALSE,											// shuffle
+	OMP_REPEAT_OFF,							// repeat_mode
+	TRUE,												// resume_playback
+	10000,											// prev_track_treshold
+//	FALSE,											// auto_scroll
+	0.0,												// equalizer_gain
+	{0,0,0,0,0,0,0,0,0,0,0},		// EQ bands
+
+TRUE												// show_numbers_in_pl
 };
 
 struct _omp_config *omp_config = NULL;			///< Global and persistent configuration data
@@ -151,6 +151,15 @@
 }
 
 /**
+ * Returns amount of milliseconds that determine behavior of the "prev track" event
+ */
+guint
+omp_config_get_prev_track_treshold()
+{
+	return omp_config->prev_track_treshold;
+}
+
+/**
  * Fills the session data with sane default values
  */
 void

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/persistent.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/persistent.h	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/persistent.h	2007-09-01 11:12:10 UTC (rev 2882)
@@ -41,9 +41,8 @@
 	gboolean shuffle;									///< Shuffle on/off
 	guint repeat_mode;								///< Repeat mode @see omp_repeat_modes
 	gboolean resume_playback;					///< Resume playback on startup where it left off?
+	guint prev_track_treshold;				///< Amount of milliseconds a track must have been playing to jump back to track beginning on "prev track" event
 //	gboolean auto_scroll;						///< Scroll title if it's too long?
-	gboolean convert_underscore;			///< Convert '_' to ' '?
-	gchar title_format[32];						///< Format string used for title display
 	gdouble equalizer_gain;						///< Pre-amplification value before audio stream is fed to equalizer [0.0..1.0]
 	gdouble equalizer_bands[11];			///< The gains for each of the equalizer bands [-1.0..1.0]
 	gboolean show_numbers_in_pl;			///< Show numbers in playlist?
@@ -75,6 +74,8 @@
 void omp_config_set_repeat_mode(guint mode);
 guint omp_config_get_repeat_mode();
 
+guint omp_config_get_prev_track_treshold();
+
 void omp_session_restore_state();
 void omp_session_free();
 void omp_session_save();

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playback.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playback.c	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playback.c	2007-09-01 11:12:10 UTC (rev 2882)
@@ -382,7 +382,7 @@
 omp_playback_get_track_length()
 {
 	GstFormat format = GST_FORMAT_TIME;
-	gint64 length;
+	gint64 length = 0;
 
 	if (!omp_gst_playbin)
 	{
@@ -522,15 +522,10 @@
 omp_gst_message_warning(GstBus *bus, GstMessage *message, gpointer data)
 {
 	GError *error;
-	gchar *text;
 
 	gst_message_parse_warning(message, &error, NULL);
 	g_printerr("gstreamer warning: %s\n", error->message);
 
-	text = g_strdup_printf("gstreamer warning:\n%s", error->message);
-	error_dialog(text);
-	g_free(text);
-
 	g_error_free(error);
 
 	return TRUE;

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playlist.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playlist.c	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playlist.c	2007-09-01 11:12:10 UTC (rev 2882)
@@ -29,6 +29,7 @@
 #include <glib-object.h>
 #include <glib/gi18n.h>
 #include <glib/gstdio.h>
+#include <uriparser/Uri.h>
 
 #include <string.h>
 
@@ -201,7 +202,7 @@
 		#endif
 
 		// Notify user
-		text = g_strdup_printf(_("\nCould not load playlist '%s'"), playlist_file);
+		text = g_strdup_printf(_("Could not load playlist '%s'"), playlist_file);
 		error_dialog(text);
 		g_free(text);
 	}
@@ -314,8 +315,8 @@
 		return FALSE;
 	}
 
-	// If track playing time is >= 10 seconds we just jump back to the beginning of the track
-	if (omp_playback_get_track_position() >= 10)
+	// If track playing time is >= n seconds we just jump back to the beginning of the track
+	if (omp_playback_get_track_position() >= omp_config_get_prev_track_treshold())
 	{
 		omp_playback_set_track_position(0);
 		return TRUE;
@@ -383,12 +384,12 @@
 		// Update session
 		omp_session_set_track_id(omp_playlist_current_track_id);
 
-		// Emit signal to update UI and the like
-		g_signal_emit_by_name(G_OBJECT(omp_window), OMP_EVENT_PLAYLIST_TRACK_CHANGED);
-
 		// Load track and start playing if needed
 		if (omp_playlist_load_current_track())
 		{
+			// Emit signal to update UI and the like
+			g_signal_emit_by_name(G_OBJECT(omp_window), OMP_EVENT_PLAYLIST_TRACK_CHANGED);
+
 			if (was_playing) omp_playback_play();
 
 		} else {
@@ -405,7 +406,6 @@
 /**
  * Moves one track forward in playlist
  * @return TRUE if a new track is to be played, FALSE if current track didn't change
- * @todo Shuffle mode, repeat
  * @todo Will cause an infinite loop if playlist only consists of tracks that can't be played and player is in shuffle mode
  */
 gboolean
@@ -492,12 +492,12 @@
 		// Update session
 		omp_session_set_track_id(omp_playlist_current_track_id);
 
-		// Emit signal to update UI and the like
-		g_signal_emit_by_name(G_OBJECT(omp_window), OMP_EVENT_PLAYLIST_TRACK_CHANGED);
-
 		// Load track and start playing if needed
 		if (omp_playlist_load_current_track())
 		{
+			// Emit signal to update UI and the like
+			g_signal_emit_by_name(G_OBJECT(omp_window), OMP_EVENT_PLAYLIST_TRACK_CHANGED);
+
 			if (was_playing) omp_playback_play();
 
 		} else {
@@ -531,7 +531,7 @@
 
 /**
  * Updates the track's artist information in the playlist on incoming tag data
- * @note This is our way of caching metadata information so we can display it in the playlist editor
+ * @note This is also our way of caching metadata information so we can display it in the playlist editor
  * @param instance Ignored
  * @param title Artist of currently played track
  * @param user_data Ignored
@@ -539,46 +539,27 @@
 void
 omp_playlist_process_tag_artist_change(gpointer instance, gchar *artist, gpointer user_data)
 {
-	gchar **tokens;
-
 	// Now that we have received metadata information we might also have the track duration ready
 	omp_playlist_update_track_duration();
 
 	if (!omp_playlist_current_track) return;
 
-	// Set preliminary title if nothing was set at all
-	if (!omp_playlist_current_track->title)
+	if (!omp_playlist_current_track->creator)
 	{
-		omp_playlist_current_track->title = g_strdup_printf(_("%s - [unknown title]"), artist);
-		return;
-	}
+		omp_playlist_current_track->creator = g_strdup(artist);
 
-	// Split title into artist/title to see if we need to replace the artist part
-	/// @todo Make unicode safe
-	tokens = g_strsplit(omp_playlist_current_track->title, " - ", 2);
-	if (!tokens) return;
+		// Save changes to disk
+		omp_playlist_save();
 
-	if (strcmp(tokens[0], _("[unknown artist]")) == 0)
-	{
-		// Yep, track artist was our placeholder, so we replace it
-		g_free(omp_playlist_current_track->title);
-		omp_playlist_current_track->title =
-			g_strdup_printf("%s - %s", artist, tokens[1]);
+		// Notify UI of the change
+		g_signal_emit_by_name(G_OBJECT(omp_window), OMP_EVENT_PLAYLIST_TRACK_INFO_CHANGED,
+			omp_playlist_current_track_id);
 	}
-
-	g_strfreev(tokens);
-
-	// Save changes to disk
-	omp_playlist_save();
-
-	// Notify UI of the change
-	g_signal_emit_by_name(G_OBJECT(omp_window), OMP_EVENT_PLAYLIST_TRACK_INFO_CHANGED,
-		omp_playlist_current_track_id);
 }
 
 /**
  * Updates the track's artist information in the playlist on incoming tag data
- * @note This is our way of caching metadata information so we can display it in the playlist editor
+ * @note This is also our way of caching metadata information so we can display it in the playlist editor
  * @param instance Ignored
  * @param title Song title of currently played track
  * @param user_data Ignored
@@ -586,41 +567,30 @@
 void
 omp_playlist_process_tag_title_change(gpointer instance, gchar *title, gpointer user_data)
 {
-	gchar **tokens;
-
 	// Now that we have received metadata information we might also have the track duration ready
 	omp_playlist_update_track_duration();
 
 	if (!omp_playlist_current_track) return;
 
-	// Set preliminary title if nothing was set at all
-	if (!omp_playlist_current_track->title)
+	if (
+			(!omp_playlist_current_track->title) ||
+			(omp_playlist_current_track->title_is_preliminary)
+		 )
 	{
-		omp_playlist_current_track->title = g_strdup_printf("[unknown artist] - %s", title);
-		return;
-	}
+		if (omp_playlist_current_track->title)
+			g_free(omp_playlist_current_track->title);
 
-	// Split title into artist/title to see if we need to replace the title part
-	/// @todo Make unicode safe
-	tokens = g_strsplit(omp_playlist_current_track->title, " - ", 2);
-	if (!tokens) return;
+		omp_playlist_current_track->title_is_preliminary = FALSE;
 
-	if (strcmp(tokens[1], _("[unknown title]")) == 0)
-	{
-		// Yep, track title was our placeholder, so we replace it
-		g_free(omp_playlist_current_track->title);
-		omp_playlist_current_track->title =
-			g_strdup_printf("%s - %s", tokens[0], title);
-	}
+		omp_playlist_current_track->title = g_strdup(title);
 
-	g_strfreev(tokens);
+		// Save changes to disk
+		omp_playlist_save();
 
-	// Save changes to disk
-	omp_playlist_save();
-
-	// Notify UI of the change
-	g_signal_emit_by_name(G_OBJECT(omp_window), OMP_EVENT_PLAYLIST_TRACK_INFO_CHANGED,
-		omp_playlist_current_track_id);
+		// Notify UI of the change
+		g_signal_emit_by_name(G_OBJECT(omp_window), OMP_EVENT_PLAYLIST_TRACK_INFO_CHANGED,
+			omp_playlist_current_track_id);
+	}
 }
 
 /**
@@ -637,9 +607,8 @@
 	duration = omp_playback_get_track_length();
 	if ( (duration > 0) && (duration != omp_playlist_current_track->duration) )
 	{
-// @note BUGGY
-//		omp_playlist_current_track->duration = duration;
-//		omp_playlist_save();
+		omp_playlist_current_track->duration = duration;
+		omp_playlist_save();
 
 		// Notify UI of the change
 		g_signal_emit_by_name(G_OBJECT(omp_window), OMP_EVENT_PLAYLIST_TRACK_INFO_CHANGED,
@@ -648,6 +617,52 @@
 }
 
 /**
+ * Sets current track's meta data from the URI unless the playlist already has meta data available
+ * @todo Unicode support
+ */
+void
+omp_playlist_set_preliminary_metadata(gchar *track_uri)
+{
+	UriParserStateA state;
+	UriUriA uri;
+	UriPathSegmentA *segment;
+	gchar *title = NULL;
+
+	state.uri = &uri;
+
+	g_return_if_fail(omp_playlist_current_track);
+
+	if (uriParseUriA(&state, track_uri) != 0)
+	{
+		#ifdef DEBUG
+			g_printerr("UriParser could not parse URI %s\n", track_uri);
+		#endif
+		return;
+	}
+
+	// The last part of the URI path is the file name of the request - which we want
+	segment = uri.pathTail;
+	title = get_base_file_name((gchar*)segment->text.first);
+	uriUnescapeInPlaceA(title);
+
+	// Set preliminary metadata if necessary
+	if (!omp_playlist_current_track->title)
+	{
+		omp_playlist_current_track->title = g_strdup(title);
+		omp_playlist_current_track->title_is_preliminary = TRUE;
+		omp_playlist_save();
+
+		// Notify UI of the change
+		g_signal_emit_by_name(G_OBJECT(omp_window), OMP_EVENT_PLAYLIST_TRACK_INFO_CHANGED,
+			omp_playlist_current_track_id);
+	}
+
+	g_free(title);
+
+	uriFreeUriMembersA(&uri);
+}
+
+/**
  * Uses the URI(s) and metadata information of a track to locate the resource to play, then returns a playable URI
  * @return URI of a playable resource
  * @note If the URI of the found resource is not in the track's locations list already it is added and the playlist saved
@@ -702,10 +717,15 @@
 	if (track_uri)
 	{
 		track_loaded = omp_playback_load_track_from_uri(track_uri);
-		g_free(track_uri);
 
+		// Maybe we already know the new track duration
 		omp_playlist_update_track_duration();
 
+		// Obtain preliminary track title from URI if needed
+		omp_playlist_set_preliminary_metadata(track_uri);
+
+		g_free(track_uri);
+
 		return track_loaded;
 	}
 
@@ -715,19 +735,23 @@
 /**
  * Retrieves a track's meta data if possible
  * @param track_id Track ID to get meta data of, starting at 0
+ * @param artist Destination for the artist string, can be NULL; must be freed after use
  * @param title Destination for the title string, can be NULL; must be freed after use
  * @param duration Destination for the track duration (in milliseconds), can be NULL
  * @todo List walking
  */
 void
-omp_playlist_get_track_info(guint track_id, gchar **title, guint *duration)
+omp_playlist_get_track_info(guint track_id, gchar **artist, gchar **title, gulong *duration)
 {
 	if (track_id == omp_playlist_current_track_id)
 	{
+		if (!omp_playlist_current_track) return;
+
+		if (artist) *artist = g_strdup(omp_playlist_current_track->creator);
 		if (title) *title = g_strdup(omp_playlist_current_track->title);
 
-		// Again, spiff's internal duration is given in milliseconds
-		if (duration) *duration = omp_playlist_current_track->duration;
+		if (duration) *duration =
+			(omp_playlist_current_track->duration > 0) ? omp_playlist_current_track->duration : 0;
 
 	} else {
 
@@ -841,36 +865,47 @@
 }
 
 /**
- * Utility function that extracts a playlist's name from its file name
- * @param playlist_file File name to extract title from, can contain a path
+ * Utility function that removes the path and extension of a file name
+ * @param file_name File name to extract title from, can contain a path
  * @return String holding the title, must be freed after use
  * @todo Make unicode safe
  * @note Yes, this is quick'n'dirty. It will be replaced.
  */
 gchar *
-get_playlist_title(gchar *playlist_file)
+get_base_file_name(gchar *file_name)
 {
-	gchar title[256];
+	gchar base[256];
 	guint i, j, last_delim, extension_pos;
 
 	// Find last directory delimiter
 	last_delim = 0;
-	for (i=0; playlist_file[i]; i++)
+	for (i=0; file_name[i]; i++)
 	{
-		if (playlist_file[i] == '/') last_delim = i+1;
+		if (file_name[i] == '/') last_delim = i+1;
 	}
 
 	// Find file extension
-	for(extension_pos = strlen(playlist_file);
-		(extension_pos) && (playlist_file[extension_pos] != '.');
+	for(extension_pos = strlen(file_name);
+		(extension_pos) && (file_name[extension_pos] != '.');
 		extension_pos--);
 
 	// Extract title
 	for (j=0, i=last_delim; i<extension_pos; i++)
 	{
-		title[j++] = playlist_file[i];
+		base[j++] = file_name[i];
 	}
-	title[j] = 0;
+	base[j] = 0;
 	
-	return g_strdup((gchar *)&title);
+	return g_strdup((gchar *)&base);
 }
+
+/**
+ * Utility function that extracts a playlist's name from its file name
+ * @param playlist_file File name to extract title from, can contain a path
+ * @return String holding the title, must be freed after use
+ */
+gchar *
+get_playlist_title(gchar *playlist_file)
+{
+	return get_base_file_name(playlist_file);
+}

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playlist.h
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playlist.h	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playlist.h	2007-09-01 11:12:10 UTC (rev 2882)
@@ -83,7 +83,7 @@
 
 gchar *omp_playlist_resolve_track(omp_spiff_track *track);
 gboolean omp_playlist_load_current_track();
-void omp_playlist_get_track_info(guint track_id, gchar **title, guint *duration);
+void omp_playlist_get_track_info(guint track_id, gchar **artist, gchar **title, gulong *duration);
 void omp_playlist_update_track_count();
 
 omp_playlist_iter *omp_playlist_init_iterator();
@@ -92,6 +92,7 @@
 void omp_playlist_advance_iter(omp_playlist_iter *iter);
 gboolean omp_playlist_iter_finished(omp_playlist_iter *iter);
 
+gchar *get_base_file_name(gchar *file_name);
 gchar *get_playlist_title(gchar *playlist_file);
 
 #endif

Modified: trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playlist_page.c
===================================================================
--- trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playlist_page.c	2007-09-01 09:37:39 UTC (rev 2881)
+++ trunk/src/target/OM-2007.2/applications/openmoko-mediaplayer2/src/playlist_page.c	2007-09-01 11:12:10 UTC (rev 2882)
@@ -341,7 +341,7 @@
 	input_box = gtk_hbox_new(FALSE, 0);
 	omp_playlist_page_entry = gtk_entry_new();
 	button = gtk_button_new();
-	image = gtk_image_new_from_icon_name("gtk-add", GTK_ICON_SIZE_BUTTON);
+	image = gtk_image_new_from_icon_name("gtk-add", GTK_ICON_SIZE_MENU);
 	gtk_container_add(GTK_CONTAINER(button), GTK_WIDGET(image));
 
 	g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(omp_playlist_page_add_list), NULL);





More information about the commitlog mailing list