reset line to avoid duplicating last item
[rugen] / src / page_status.c
index bd8bd84..c526a29 100644 (file)
@@ -43,6 +43,7 @@ typedef struct
        guint context;
        int unit;
        int count;
+       struct page_t *parent_page;
 }
 *page_status, page_status_t;
 
@@ -51,45 +52,44 @@ static GtkWidget *this_page_get_widget( page );
 /** Show the status associated to a unit.
 */
 
+static char* status_to_text( mvcp_status status )
+{
+       switch( status->status )
+       {
+               case unit_offline:      return "offline";       break;
+               case unit_undefined:    return "undefined";     break;
+               case unit_not_loaded:   return "unloaded";      break;
+               case unit_stopped:      return "stopped";       break;
+               case unit_playing:      return "playing";       break;
+               case unit_paused:       return "paused";        break;
+               case unit_disconnected: return "disconnect";    break;
+               case unit_unknown:      return "unknown";       break;
+       }
+       return "unknown";
+}
+
+static void format_status_string(char* buf, int size, mvcp_status status , char* sep)
+{
+       char tc1[12], tc2[12], tc3[12];
+
+       snprintf( buf, size,
+               "[%s]%sIN:%s%sPOS:%s%sOUT:%s%s%s%s",
+               status_to_text( status ), sep,
+               frames2tc(status->in,       status->fps, tc1), sep,
+               frames2tc(status->position, status->fps, tc2), sep,
+               frames2tc(status->out,      status->fps, tc3), sep,
+               status->clip, sep
+       );
+
+}
+
 static int show_status( page_status this, mvcp_status status )
 {
        GtkWidget *widget = this_page_get_widget( ( page )this );
        char temp[ 1024 ] = "";
-       char temp2[ 1024 ];
        char label_name[ 256 ];
 
-       sprintf( temp, "%05d %05d %05d %s [", status->in, status->position, status->out, status->clip );
-       
-       switch( status->status )
-       {
-               case unit_offline:
-                       strcat( temp, "offline" );
-                       break;
-               case unit_undefined:
-                       strcat( temp, "undefined" );
-                       break;
-               case unit_not_loaded:
-                       strcat( temp, "unloaded" );
-                       break;
-               case unit_stopped:
-                       strcat( temp, "stopped" );
-                       break;
-               case unit_playing:
-                       strcat( temp, "playing" );
-                       break;
-               case unit_paused:
-                       strcat( temp, "paused" );
-                       break;
-               case unit_disconnected:
-                       strcat( temp, "disconnect" );
-                       break;
-               default:
-                       strcat( temp, "unknown" );
-                       break;
-       }
-
-       strcat( temp, "]" );
-       
+       format_status_string(temp, sizeof(temp), status , "\n");
        sprintf( label_name, "label_unit_%d", status->unit );
 
        gdk_threads_enter();
@@ -97,10 +97,26 @@ static int show_status( page_status this, mvcp_status status )
        gtk_label_set_text( GTK_LABEL( widget ), temp );
        if ( status->unit == dv1394app_get_selected_unit( this->app ) )
        {
-               sprintf( temp2, "U%d - %s", status->unit, temp );
+               char tc[12];
+
+               snprintf( temp, sizeof(temp), "U%d - [%s] %s",
+                       status->unit,
+                       status_to_text( status ),
+                       status->clip);
                widget = lookup_widget( dv1394app_get_widget( this->app ), "statusbar" );
                gtk_statusbar_pop( GTK_STATUSBAR( widget ), this->context );
-               gtk_statusbar_push( GTK_STATUSBAR( widget ), this->context, temp2 );
+               gtk_statusbar_push( GTK_STATUSBAR( widget ), this->context, temp );
+
+               widget = lookup_widget( dv1394app_get_widget( this->app ), "bbt_label_1a" );
+               snprintf( temp, sizeof(temp), "POS: %s",
+                       frames2tc(status->position, status->fps, tc));
+               gtk_label_set_text( GTK_LABEL( widget ), temp );
+
+               widget = lookup_widget( dv1394app_get_widget( this->app ), "bbt_label_1b" );
+               snprintf( temp, sizeof(temp), "REM: %s",
+                       frames2tc(status->out - status->position, status->fps, tc));
+               gtk_label_set_text( GTK_LABEL( widget ), temp );
+
                dv1394app_show_status( this->app, status );
        }
        gdk_flush();
@@ -201,31 +217,53 @@ static void show_units( page_status this, gboolean active )
 
 static void *status_thread( void *arg )
 {
+       int i;
        page_status this = arg;
        mvcp_notifier notifier = mvcp_get_notifier( this->status );
        mvcp_status_t status;
+       mvcp_status_t *statuses;
 
        show_units( this, TRUE );
-       
+
+       statuses = malloc(sizeof(mvcp_status_t) * this->count);
+       memset(statuses, 0, sizeof(mvcp_status_t) * this->count);
+
        while ( !this->terminated )
        {
-               if ( mvcp_notifier_wait( notifier, &status ) != -1 )
+               char buf[32];
+
+               /* wait for any event from notifier */
+               mvcp_notifier_wait( notifier, &status );
+
+               /* get status for all units */
+               for(i = 0; i < this->count; i++)
                {
-                       char buf[32];
+                       mvcp_notifier_get( notifier, &status, i);
 
                        if ( status.status == unit_disconnected )
+                               goto break_unit_disconnected;
+
+                       if( memcmp(&status, &statuses[i], sizeof(mvcp_status_t)) || !this->app->eof[i])
                        {
-                               this->app->eof = 0;
-                               break;
+                               /* save status */
+                               statuses[i] = status;
+
+                               /* save eof status */
+                               if ( !this->app->eof[i] && mvcp_unit_get( this->app->command, i,
+                                       "eof", buf, sizeof(buf) ) != -1)
+                                       this->app->eof[i] = buf[0];
+
+                               /* send status update */
+                               if ( show_status( this, &status ) )
+                                       show_units( this, TRUE );
                        }
-                       if ( show_status( this, &status ) )
-                               show_units( this, TRUE );
-                       if ( !this->app->eof && mvcp_unit_get( this->app->command, this->app->selected_unit,
-                               "eof", buf, sizeof(buf) ) != -1)
-                                       this->app->eof = buf[0];
                }
        }
 
+break_unit_disconnected:
+
+       free(statuses);
+
        show_units( this, FALSE );
        
        if ( !this->terminated )
@@ -268,7 +306,7 @@ static GtkWidget *this_page_get_widget( page super )
 {
        page_status this = ( page_status )super;
        if ( this->widget == NULL )
-               this->widget = create_page_status( );
+               this->widget = this->parent_page->get_widget(this->parent_page);
        return this->widget;
 }
 
@@ -312,12 +350,13 @@ static void this_page_close( page super )
                free( this );
 }
 
-page page_status_init( dv1394app app )
+page page_status_init( dv1394app app, struct page_t *parent_page )
 {
        page_status this = calloc( 1, sizeof( page_status_t ) );
        int index = 0;
        GtkWidget *widget;
-       
+
+       this->parent_page = parent_page;
        this->parent.get_widget = this_page_get_widget;
        this->parent.get_toolbar_info = this_page_get_toolbar_info;
        this->parent.on_connect = this_page_on_connect;