All pastes #1726142 Raw Edit

C

public c v1 · immutable
#1726142 ·published 2009-12-24 18:43 UTC
rendered paste body
#include <gtk/gtk.h>#include "gui.h"#include "statusbox.h"#include "playlist.h"gchar *scale_format_value(GtkScale *scale,gdouble value, gpointer user_data){	return g_strdup_printf("%i:%02i",(int)value/60,(int)value%60);}short amatory_isblank(char *cptr){	return ! ((int)cptr[0]);}void statusbox_update(GUI_SESSION *g, LIBRARY_track_metadata *t){	gchar *cptr;	char buffer[256];	int rv;	printf("Status: %p\n",t);	if(t){		rv = snprintf(buffer,254,"Playing: <b>%s</b>",t->name);		if(!amatory_isblank(t->artist->name)){			rv += snprintf(buffer+rv,254-rv," by <b>%s</b>",				t->artist->name);		}		if(!amatory_isblank(t->album->name)){			rv += snprintf(buffer+rv,254-rv," on <b>%s</b>",					t->album->name);		}	}else {		sprintf(buffer,"Idle");	}	buffer[255]=0;	sleep(1);	gchar *temp;//	temp = g_markup_escape_text(buffer,-1);//	gtk_label_set_markup (g->status_label,temp);	gtk_label_set_markup (g->status_label,buffer);//	g_free(temp);}void on_scale_seek(GtkRange *range, gpointer user_data){	gdouble pos;	GUI_SESSION *g = user_data;	g->flag_timer =1; // stop the timer	pos = gtk_range_get_value(range);	printf("on_scale_seek: %i\n",(int) pos);	g->amatory->audio_session->AUDIO_play(		g->amatory->audio_session,NULL,(int)pos);	g->flag_timer =0; // restart the timer}void on_audio_event(const int event, void *data){	GUI_SESSION *g = data;	printf("on_audio_event: %i\n",event);	switch(event){	case AUDIO_STOP:		gtk_widget_set_sensitive(GTK_WIDGET(g->scale),FALSE);		statusbox_update(g,NULL);		break;	case AUDIO_START:		gtk_widget_set_sensitive(GTK_WIDGET(g->scale),TRUE);		gpointer ptr;		gtk_tree_model_get (g->playlist_store, &(g->activated_row), 			PL_PTR_COL,&ptr,-1);		statusbox_update(g,ptr);		break;	case AUDIO_END:		gtk_widget_set_sensitive(GTK_WIDGET(g->scale),FALSE);		break;	}}void *one_sec_handler(void *data){	printf("one_sec_handler: %p\n",data);	GUI_SESSION *g = data;	AUDIO_SESSION *s = g->amatory->audio_session;	int time;	int rv;	for(;;){		usleep(400000); // 0.4s		if(g->is_playing && !g->flag_timer){			rv =s->AUDIO_get_position(s,&time);			/* Disable the handler for a second */			g_signal_handler_disconnect(g->scale,				g->scale_handler_id);			gtk_range_set_value(GTK_RANGE(g->scale),(rv)?0:time);			sleep(1); // g_slice_alloc dies otherwise			g->scale_handler_id =g_signal_connect(g->scale,				"value-changed",G_CALLBACK(on_scale_seek),g);		}	}}void scale_set(GUI_SESSION *g){	gtk_range_set_range(GTK_RANGE(g->scale),0,		g->amatory->audio_session->length);	gtk_widget_set_sensitive(GTK_WIDGET(g->scale),TRUE);}GtkWidget *create_statusbox(GUI_SESSION *g){	GtkWidget *status_bar;//	status_bar = gtk_statusbar_new();	status_bar = gtk_hbox_new(FALSE,1);	/* Add a status label */	g->status_label = GTK_LABEL(gtk_label_new(NULL));	/* Left align the label */	gtk_misc_set_alignment(GTK_MISC(g->status_label),0,1);	gtk_label_set_use_markup (g->status_label,TRUE);	gtk_label_set_markup (GTK_LABEL (g->status_label), "<b>Idle</b>");	gtk_box_pack_start(GTK_BOX(status_bar),GTK_WIDGET(g->status_label),		TRUE,TRUE,1);	/* Add a seek slider */	GtkWidget *scale = gtk_hscale_new_with_range(0,1,1);	g_object_set(scale,"value-pos",GTK_POS_LEFT, NULL);	gtk_widget_set_size_request(scale,200,-1);	gtk_widget_set_sensitive(scale,FALSE);	/* Add the sliderto the status box */	gtk_box_pack_end(GTK_BOX(status_bar),scale,FALSE,TRUE,1);	g_signal_connect(scale,"format-value",		G_CALLBACK(scale_format_value),NULL);	g->scale_handler_id = g_signal_connect(scale,		"value-changed",G_CALLBACK(on_scale_seek),g);	AUDIO_setup_handler(g->amatory->audio_session,on_audio_event,g);		g->scale = GTK_HSCALE(scale);		/* setup an interval (1s) timer */	pthread_t tid;	int rv;	g->flag_timer =0;	rv = pthread_create(&tid, NULL,one_sec_handler,g);	return status_bar;}