view xmms-songpos.patch-1.2.2 @ 1:183e7cbc1036

Initial revision
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 03 Jun 2003 10:23:04 +0000
parents
children
line wrap: on
line source

diff -r -u xmms-1.2.2/General/ir/ir.c xmms-1.2.2-songpos/General/ir/ir.c
--- xmms-1.2.2/General/ir/ir.c	Wed Mar  1 15:13:49 2000
+++ xmms-1.2.2-songpos/General/ir/ir.c	Sat Nov 11 18:23:55 2000
@@ -288,12 +288,7 @@
 				}
 				else if (!strcmp(text, ircfg.button_seekf) && g_timer_elapsed(timer1, NULL) > S_PAUSE / 2)
 				{
-					output_time = xmms_remote_get_output_time(ir_gp.xmms_session);
-					playlist_pos = xmms_remote_get_playlist_pos(ir_gp.xmms_session);
-					playlist_time = xmms_remote_get_playlist_time(ir_gp.xmms_session, playlist_pos);
-					if (playlist_time - output_time < 5000)
-						output_time = playlist_time - 5000;
-					xmms_remote_jump_to_time(ir_gp.xmms_session, output_time + 5000);
+					xmms_remote_seek(ir_gp.xmms_session, + 5000);
 					g_timer_reset(timer1);
 					g_timer_reset(timer2);
 					g_timer_stop(timer2);
@@ -301,10 +296,7 @@
 				}
 				else if (!strcmp(text, ircfg.button_seekb) && g_timer_elapsed(timer1, NULL) > S_PAUSE / 2)
 				{
-					output_time = xmms_remote_get_output_time(ir_gp.xmms_session);
-					if (output_time < 5000)
-						output_time = 5000;
-					xmms_remote_jump_to_time(ir_gp.xmms_session, output_time - 5000);
+					xmms_remote_seek(ir_gp.xmms_session, - 5000);
 					g_timer_reset(timer1);
 					g_timer_reset(timer2);
 					g_timer_stop(timer2);
diff -r -u xmms-1.2.2/General/joystick/joy.c xmms-1.2.2-songpos/General/joystick/joy.c
--- xmms-1.2.2/General/joystick/joy.c	Wed Mar  1 15:13:49 2000
+++ xmms-1.2.2-songpos/General/joystick/joy.c	Sat Nov 11 18:23:55 2000
@@ -316,18 +316,10 @@
 					xmms_remote_set_volume(joy_gp.xmms_session, vl - 5, vr - 5);
 					break;
 				case JC_FWD:
-					output_time = xmms_remote_get_output_time(joy_gp.xmms_session);
-					playlist_pos = xmms_remote_get_playlist_pos(joy_gp.xmms_session);
-					playlist_time = xmms_remote_get_playlist_time(joy_gp.xmms_session, playlist_pos);
-					if (playlist_time - output_time < 5000)
-						output_time = playlist_time - 5000;
-					xmms_remote_jump_to_time(joy_gp.xmms_session, output_time + 5000);
+					xmms_remote_seek(joy_gp.xmms_session, + 5000);
 					break;
 				case JC_RWD:
-					output_time = xmms_remote_get_output_time(joy_gp.xmms_session);
-					if (output_time < 5000)
-						output_time = 5000;
-					xmms_remote_jump_to_time(joy_gp.xmms_session, output_time - 5000);
+					xmms_remote_seek(joy_gp.xmms_session, - 5000);
 					break;
 				case JC_SHUFFLE:
 					xmms_remote_toggle_shuffle(joy_gp.xmms_session);
diff -r -u xmms-1.2.2/Input/mikmod/plugin.c xmms-1.2.2-songpos/Input/mikmod/plugin.c
--- xmms-1.2.2/Input/mikmod/plugin.c	Sun Feb  6 14:52:58 2000
+++ xmms-1.2.2-songpos/Input/mikmod/plugin.c	Sat Nov 11 18:23:55 2000
@@ -189,15 +189,8 @@
 
 static void seek(int time)
 {
-	/*
-	   We need to seek in pattrens somehow
-	   can't seek by time only by X pattrens on way or the other
-
-	   Player_NextPosition ();
-	   Player_PrevPosition ();
-
-	 */
-	return;
+	Player_SetPosition(time);
+	mikmod_ip.output->flush(get_time());
 }
 
 static void mod_pause(short p)
@@ -213,6 +206,7 @@
 		return -1;
 	if(!Player_Active() && !mikmod_ip.output->buffer_playing())
 		return -1;
+	set_song_position(mf->sngpos, 0, (mf->numpos - 1));
 	return mikmod_ip.output->output_time();
 }
 
diff -r -u xmms-1.2.2/libxmms/xmmsctrl.c xmms-1.2.2-songpos/libxmms/xmmsctrl.c
--- xmms-1.2.2/libxmms/xmmsctrl.c	Wed Jun 21 15:29:29 2000
+++ xmms-1.2.2-songpos/libxmms/xmmsctrl.c	Sat Nov 11 18:23:55 2000
@@ -365,6 +365,11 @@
 	remote_send_guint32(session, CMD_JUMP_TO_TIME, pos);
 }
 
+void xmms_remote_seek(gint session, gint off)
+{
+	remote_send_guint32(session, CMD_SEEK, off);
+}
+
 void xmms_remote_get_volume(gint session, gint * vl, gint * vr)
 {
 	ServerPktHeader pkt_hdr;
diff -r -u xmms-1.2.2/libxmms/xmmsctrl.h xmms-1.2.2-songpos/libxmms/xmmsctrl.h
--- xmms-1.2.2/libxmms/xmmsctrl.h	Mon Jun 19 15:25:09 2000
+++ xmms-1.2.2-songpos/libxmms/xmmsctrl.h	Sat Nov 11 18:23:55 2000
@@ -40,6 +40,7 @@
 void xmms_remote_playlist_clear(gint session);
 gint xmms_remote_get_output_time(gint session);
 void xmms_remote_jump_to_time(gint session, gint pos);
+void xmms_remote_seek(gint session, gint off);
 void xmms_remote_get_volume(gint session, gint * vl, gint * vr);
 gint xmms_remote_get_main_volume(gint session);
 gint xmms_remote_get_balance(gint session);
diff -r -u xmms-1.2.2/xmms/controlsocket.c xmms-1.2.2-songpos/xmms/controlsocket.c
--- xmms-1.2.2/xmms/controlsocket.c	Sat Jul  8 17:35:12 2000
+++ xmms-1.2.2-songpos/xmms/controlsocket.c	Sat Nov 11 18:27:16 2000
@@ -445,6 +445,10 @@
 			if (num <= playlist_get_current_length())
 				input_seek(num / 1000);
 			break;
+		case CMD_SEEK:
+			num = *((guint32 *) data);
+			song_seek(num);
+			break;
 		case CMD_SET_VOLUME:
 			v[0] = ((guint32 *) data)[0];
 			v[1] = ((guint32 *) data)[1];
diff -r -u xmms-1.2.2/xmms/controlsocket.h xmms-1.2.2-songpos/xmms/controlsocket.h
--- xmms-1.2.2/xmms/controlsocket.h	Mon Jun 19 15:25:14 2000
+++ xmms-1.2.2-songpos/xmms/controlsocket.h	Sat Nov 11 18:23:55 2000
@@ -31,7 +31,7 @@
 	CMD_GET_VERSION, CMD_PLAYLIST_ADD, CMD_PLAY, CMD_PAUSE, CMD_STOP,
 	CMD_IS_PLAYING, CMD_IS_PAUSED, CMD_GET_PLAYLIST_POS,
 	CMD_SET_PLAYLIST_POS, CMD_GET_PLAYLIST_LENGTH, CMD_PLAYLIST_CLEAR,
-	CMD_GET_OUTPUT_TIME, CMD_JUMP_TO_TIME, CMD_GET_VOLUME,
+	CMD_GET_OUTPUT_TIME, CMD_JUMP_TO_TIME, CMD_SEEK, CMD_GET_VOLUME,
 	CMD_SET_VOLUME, CMD_GET_SKIN, CMD_SET_SKIN, CMD_GET_PLAYLIST_FILE,
 	CMD_GET_PLAYLIST_TITLE, CMD_GET_PLAYLIST_TIME, CMD_GET_INFO,
 	CMD_GET_EQ_DATA, CMD_SET_EQ_DATA, CMD_PL_WIN_TOGGLE,
diff -r -u xmms-1.2.2/xmms/input.c xmms-1.2.2-songpos/xmms/input.c
--- xmms-1.2.2/xmms/input.c	Wed Feb 16 23:05:57 2000
+++ xmms-1.2.2-songpos/xmms/input.c	Sat Nov 11 18:28:47 2000
@@ -281,6 +281,7 @@
 		}
 	}
 	ip_data->playing = FALSE;
+	set_song_position(0, 0, 0);
 }
 
 void input_pause(void)
diff -r -u xmms-1.2.2/xmms/main.c xmms-1.2.2-songpos/xmms/main.c
--- xmms-1.2.2/xmms/main.c	Tue Jul 11 19:11:14 2000
+++ xmms-1.2.2-songpos/xmms/main.c	Sat Nov 11 18:32:36 2000
@@ -614,6 +614,55 @@
 	g_free(filename);
 }
 
+/*\
+|*| Separate song position stuff, for songs without a time length,
+|*|  but that want to be able to seek anyway.
+|*|      
+|*|      Have the input plugin's get_time() function call
+|*|      set_song_position(int pos, int first, int last)
+|*|      to set the slider.  If the slider is dragged,
+|*|      the plugin's seek() is called with the position.
+|*|      (If last <= first the feature is turned off)
+\*/
+
+static int song_pos_cur, song_pos_first, song_pos_num = 0;
+
+void set_song_position(int pos, int first, int last)
+{
+	last -= first;
+	song_pos_cur = pos;
+	song_pos_first = first;
+	song_pos_num = last;
+	if (last <= 0) return;
+	pos -= first;
+	if (pos > last) pos = last;
+	if (cfg.player_shaded)
+		show_widget(mainwin_sposition);
+	show_widget(mainwin_position);
+	hslider_set_position(mainwin_position, (pos * 219) / last);
+	hslider_set_position(mainwin_sposition, ((pos * 12) / last) + 1);
+}
+
+void song_seek(gint off)
+{
+	if (!get_input_playing()) return;
+	if (song_pos_num > 0) {
+		gint newpos;
+		if (off < 0) newpos = song_pos_cur - 1;
+		else if (off > 0) newpos = song_pos_cur + 1;
+		if (newpos < song_pos_first) newpos = song_pos_first;
+		if (newpos > song_pos_first + song_pos_num)
+			newpos = song_pos_first + song_pos_num;
+		input_seek(newpos);
+	} else {
+		gint newpos = (input_get_time() / 1000) + (off / 1000);
+		gint pcl = playlist_get_current_length() / 1000;
+		if (newpos >= pcl) newpos = pcl - 1;
+		if (newpos < 0) newpos = 0;
+		input_seek(newpos);
+	}
+}
+
 void mainwin_set_always_on_top(gboolean always)
 {
 	cfg.always_on_top = always;
@@ -680,7 +729,9 @@
 		show_widget(mainwin_stime_min);
 		show_widget(mainwin_stime_sec);
 
-		if (get_input_playing() && playlist_get_current_length() != -1)
+		if (get_input_playing() &&
+			((playlist_get_current_length() != -1) ||
+				 (song_pos_num > 0)))
 			show_widget(mainwin_sposition);
 
 		mainwin_shade->pb_ny = mainwin_shade->pb_py = 27;
@@ -987,7 +1038,7 @@
 	show_widget(mainwin_10sec_num);
 	show_widget(mainwin_sec_num);
 	playstatus_set_status(mainwin_playstatus, STATUS_PLAY);
-	if (playlist_get_current_length() != -1)
+	if ((playlist_get_current_length() != -1) || (song_pos_num > 0))
 	{
 		if (cfg.player_shaded)
 			show_widget(mainwin_sposition);
@@ -1217,13 +1268,19 @@
 		break;
 	case GDK_Left:
 	case GDK_KP_Left:
+/*
 		if(playlist_get_current_length() != -1)
 			input_seek(CLAMP(input_get_time() - 5000, 0, playlist_get_current_length()) / 1000);
+*/
+		song_seek(-5000);
 		break;
 	case GDK_Right:
 	case GDK_KP_Right:
+/*
 		if(playlist_get_current_length() != -1)
 			input_seek(CLAMP(input_get_time() + 5000, 0, playlist_get_current_length()) / 1000);
+*/
+		song_seek(+5000);
 		break;
 	default:
 	     break;
@@ -1805,6 +1862,16 @@
 
 	pos--;
 
+	if (song_pos_num > 0) {
+		time = ((song_pos_num * pos + 6) / 12) + song_pos_first;
+		tmp = g_strdup_printf("%d", time);
+		textbox_set_text(mainwin_stime_min, tmp);
+		g_free(tmp);
+		tmp = g_strdup_printf("%d", song_pos_first + song_pos_num);
+		textbox_set_text(mainwin_stime_sec, tmp);
+		g_free(tmp);
+		return;
+	}
 	time = ((playlist_get_current_length() / 1000) * pos) / 12;
 	if (cfg.timer_mode == TIMER_REMAINING)
 	{
@@ -1826,6 +1893,10 @@
 
 void mainwin_spos_release_cb(gint pos)
 {
+	if (song_pos_num > 0) {
+		input_seek(((song_pos_num * (pos - 1) + 6) / 12) + song_pos_first);
+		return;
+	}
 	input_seek(((playlist_get_current_length() / 1000) * (pos - 1)) / 12);
 }
 
@@ -1834,6 +1905,14 @@
 	gint length, time;
 	gchar *buf;
 
+	if (song_pos_num > 0) {
+		time = ((song_pos_num * pos + 110) / 219) + song_pos_first;
+		buf = g_strdup_printf("JUMP TO: %d/%d", time,
+				song_pos_num + song_pos_first);
+		mainwin_lock_info_text(buf);
+		g_free(buf);
+		return;
+	}
 	length = playlist_get_current_length() / 1000;
 	time = (length * pos) / 219;
 	buf = g_strdup_printf(_("SEEK TO: %d:%-2.2d/%d:%-2.2d (%d%%)"), time / 60, time % 60, length / 60, length % 60, (length != 0) ? (time * 100) / length : 0);
@@ -1845,6 +1924,12 @@
 {
 	int length, time;
 
+	if (song_pos_num > 0) {
+		time = ((song_pos_num * pos + 110) / 219) + song_pos_first;
+		input_seek(time);
+		mainwin_release_info_text();
+		return;
+	}
 	length = playlist_get_current_length() / 1000;
 	time = (length * pos) / 219;
 	input_seek(time);
@@ -2236,12 +2321,18 @@
 		case MAINWIN_GENERAL_STOPFADE:
 			break;
 		case MAINWIN_GENERAL_BACK5SEC:
+/*
 			if (get_input_playing() && playlist_get_current_length() != -1)
 				input_seek((((input_get_time() / 1000) - 5 >= 0) ? (input_get_time() / 1000) - 5 : 0));
+*/
+			song_seek(-5000);
 			break;
 		case MAINWIN_GENERAL_FWD5SEC:
+/*
 			if (get_input_playing() && playlist_get_current_length() != -1)
 				input_seek(((((input_get_time() / 1000) + 5) < (playlist_get_current_length() / 1000)) ? ((input_get_time() / 1000) + 5) : ((playlist_get_current_length() / 1000) - 1)));
+*/
+			song_seek(+5000);
 			break;
 		case MAINWIN_GENERAL_START:
 			playlist_set_position(0);
@@ -2801,7 +2892,7 @@
 					hslider_set_position(mainwin_sposition, ((time * 12) / length) + 1);
 				}
 			}
-			else
+			else if (song_pos_num <= 0)
 			{
 				hslider_set_position(mainwin_position, 0);
 				hslider_set_position(mainwin_sposition, 1);
diff -r -u xmms-1.2.2/xmms/main.h xmms-1.2.2-songpos/xmms/main.h
--- xmms-1.2.2/xmms/main.h	Fri Jul  7 19:18:26 2000
+++ xmms-1.2.2-songpos/xmms/main.h	Sat Nov 11 18:23:55 2000
@@ -82,6 +82,7 @@
 void mainwin_play_pushed(void);
 void mainwin_stop_pushed(void);
 void mainwin_eject_pushed(void);
+void song_seek(gint off);
 
 void mainwin_set_back_pixmap(void);
 
diff -r -u xmms-1.2.2/xmms/plugin.h xmms-1.2.2-songpos/xmms/plugin.h
--- xmms-1.2.2/xmms/plugin.h	Wed Mar  1 22:28:06 2000
+++ xmms-1.2.2-songpos/xmms/plugin.h	Sat Nov 11 18:23:55 2000
@@ -151,4 +151,6 @@
 	void (*render_freq)(gint16 freq_data[2][256]); /* Render the freq data, don't do anything time consuming in here */
 } VisPlugin;
 
+void set_song_position(int pos, int first, int last);
+
 #endif