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;}