X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fpage_status.c;h=c526a29573580830d5c10618eeaec0f74f5dd7e0;hb=5b8660aa24307a5ea69119579e7e060860a786b9;hp=1ca948788910c6cdbeb917c0a7f21ffb734d176f;hpb=a3add8d78fbe7c397316520f7e5edf84a8a516ca;p=rugen diff --git a/src/page_status.c b/src/page_status.c index 1ca9487..c526a29 100644 --- a/src/page_status.c +++ b/src/page_status.c @@ -43,6 +43,7 @@ typedef struct guint context; int unit; int count; + struct page_t *parent_page; } *page_status, page_status_t; @@ -67,22 +68,28 @@ static char* status_to_text( mvcp_status status ) 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 ]; - char tc1[12], tc2[12], tc3[12]; - - sprintf( temp, "[%s] IN:%s POS:%s OUT:%s %s", - status_to_text( status ), - frames2tc(status->in, status->fps, tc1), - frames2tc(status->position, status->fps, tc2), - frames2tc(status->out, status->fps, tc3), - status->clip - ); + format_status_string(temp, sizeof(temp), status , "\n"); sprintf( label_name, "label_unit_%d", status->unit ); gdk_threads_enter(); @@ -90,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(); @@ -194,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 ) @@ -261,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; } @@ -305,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;