guint context;
int unit;
int count;
+ struct page_t *parent_page;
}
*page_status, page_status_t;
/** 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();
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();
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++)
{
+ mvcp_notifier_get( notifier, &status, i);
+
if ( status.status == unit_disconnected )
- break;
- if ( show_status( this, &status ) )
- show_units( this, TRUE );
+ goto break_unit_disconnected;
+
+ if( memcmp(&status, &statuses[i], sizeof(mvcp_status_t)) || !this->app->eof[i])
+ {
+ /* 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 );
+ }
}
}
+break_unit_disconnected:
+
+ free(statuses);
+
show_units( this, FALSE );
if ( !this->terminated )
{
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;
}
static void this_page_get_toolbar_info( page super, GtkIconSize size, GtkWidget **icon, char **label )
{
- *icon = gtk_image_new_from_stock( "gtk-execute", size );
- *label = "_Units";
+ *icon = gtk_image_new_from_stock( "gtk-home", size );
+ *label = _("_Units");
}
static void this_page_on_connect( 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;