X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fomnplay.cpp;h=8c2bafc02ce9b0e00ef952b06b186e139a528a74;hb=f717f5b0949cf55190ebe9bb41aa07fa7fd545e1;hp=c5fe925ccaa72576b915f5abed64e8ec2e31c152;hpb=8ed1e720aacd066d1d7870d1f02b35ccd02c81db;p=omnplay diff --git a/src/omnplay.cpp b/src/omnplay.cpp index c5fe925..8c2bafc 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -124,6 +124,9 @@ void omnplay_destroy(omnplay_instance_t* app) static int find_index_of_playlist_item(omnplay_instance_t* app, int start, int idx) { + if(start < 0 || start >= app->playlist.count) + return -1; + while(1) { if(app->playlist.item[start].omn_idx == idx) @@ -224,13 +227,18 @@ static void* omnplay_thread_proc(void* data) OmPlrStatus st_curr, st_prev; omnplay_player_t* player = (omnplay_player_t*)data; + g_warning("omnplay_thread_proc\n"); + + memset(&st_curr, 0, sizeof(OmPlrStatus)); + memset(&st_prev, 0, sizeof(OmPlrStatus)); + /* connect */ pthread_mutex_lock(&player->app->players.lock); r = OmPlrOpen(player->host, player->name, (OmPlrHandle*)&player->handle); pthread_mutex_unlock(&player->app->players.lock); if(r) { - fprintf(stderr, "ERROR: OmPlrOpen(%s, %s) failed with 0x%.8X\n", + g_warning("ERROR: OmPlrOpen(%s, %s) failed with 0x%.8X\n", player->host, player->name, r); return (void*)r; @@ -250,7 +258,7 @@ static void* omnplay_thread_proc(void* data) if(r) { - fprintf(stderr, "ERROR: OmPlrClipSetDirectory(%s) failed with 0x%.8X\n", + g_warning("ERROR: OmPlrClipSetDirectory(%s) failed with 0x%.8X\n", player->app->players.path, r); pthread_mutex_lock(&player->app->players.lock); @@ -265,7 +273,11 @@ static void* omnplay_thread_proc(void* data) for(r = 0 ; !player->app->f_exit && !r;) { /* sleep */ +#ifdef _WIN32 + Sleep(100); +#else usleep(100000); +#endif /* get status */ pthread_mutex_lock(&player->app->players.lock); @@ -274,7 +286,7 @@ static void* omnplay_thread_proc(void* data) pthread_mutex_unlock(&player->app->players.lock); if(r) - fprintf(stderr, "ERROR: OmPlrGetPlayerStatus failed with 0x%.8X\n", r); + g_warning("ERROR: OmPlrGetPlayerStatus failed with 0x%.8X\n", r); else if(memcmp(&st_curr, &st_prev, sizeof(OmPlrStatus))) omnplay_update_status(player, &st_prev , &st_curr); @@ -416,7 +428,7 @@ static void omnplay_playlist_block(omnplay_instance_t* app, control_buttons_t bu }; } else - fprintf(stderr, "omnplay_playlist_block: range [%d %d] do OVERLAP player\n", + g_warning("omnplay_playlist_block: range [%d %d] do OVERLAP player\n", start, stop); pthread_mutex_unlock(&app->players.lock); @@ -447,7 +459,7 @@ static int get_playlist_block(omnplay_instance_t* app, int idx, int* start_ptr, if(app->playlist.item[stop].type & OMNPLAY_PLAYLIST_BLOCK_END) break; - fprintf(stderr, "get_playlist_block: range %d -> %d\n", start, stop); + g_warning("get_playlist_block: range %d -> %d\n", start, stop); /* check block range */ if(start >= 0 && stop < app->playlist.count) @@ -640,7 +652,7 @@ static void omnplay_playlist_item_add(omnplay_instance_t* app, int after) if(!omnplay_playlist_insert_check(app, idx, &t)) return; - fprintf(stderr, "allowed insert into idx=%d\n", idx); + g_warning("allowed insert into idx=%d\n", idx); /* clear item */ memset(&item, 0, sizeof(playlist_item_t)); @@ -693,7 +705,7 @@ static void omnplay_ctl(omnplay_instance_t* app, control_buttons_t button) return; }; - fprintf(stderr, "cue: selected item is %d\n", idx); + g_warning("cue: selected item is %d\n", idx); if(get_playlist_block(app, idx, &start, &stop) < 0) { @@ -701,7 +713,7 @@ static void omnplay_ctl(omnplay_instance_t* app, control_buttons_t button) return; }; - fprintf(stderr, "cue: range %d -> %d\n", start, stop); + g_warning("cue: range %d -> %d\n", start, stop); player = get_player_at_pos(app, start); @@ -741,7 +753,7 @@ static void omnplay_ctl(omnplay_instance_t* app, control_buttons_t button) { unsigned int l; - fprintf(stderr, "OmPlrClipGetInfo(%s): firstFrame=%d, lastFrame=%d\n", + g_warning("OmPlrClipGetInfo(%s): firstFrame=%d, lastFrame=%d\n", app->playlist.item[i].id, clip.firstFrame, clip.lastFrame); /* should we fix playlist clip timings */ @@ -750,7 +762,7 @@ static void omnplay_ctl(omnplay_instance_t* app, control_buttons_t button) app->playlist.item[i].in + app->playlist.item[i].dur <= clip.lastFrame) || !app->playlist.item[i].dur) { - fprintf(stderr, "cue: item [%s] will be updated [%d;%d]->[%d;%d]\n", + g_warning("cue: item [%s] will be updated [%d;%d]->[%d;%d]\n", app->playlist.item[i].id, app->playlist.item[i].in, app->playlist.item[i].dur, clip.firstFrame, clip.lastFrame - clip.firstFrame); @@ -769,7 +781,7 @@ static void omnplay_ctl(omnplay_instance_t* app, control_buttons_t button) if(r) { - fprintf(stderr, "cue: failed with %d, %s\n", r, OmPlrGetErrorString((OmPlrError)r)); + g_warning("cue: failed with %d, %s\n", r, OmPlrGetErrorString((OmPlrError)r)); app->playlist.item[i].omn_idx = -1; app->playlist.item[i].omn_offset = -1; app->playlist.item[i].error |= PLAYLIST_ITEM_ERROR_CUE; @@ -1087,6 +1099,20 @@ static gboolean on_playlist_grid_key(GtkWidget *widget, GdkEventKey *event, gpoi return TRUE; }; break; + case GDK_KEY_uparrow: + if(event->state & GDK_CONTROL_MASK) + { + omnplay_playlist_item_swap(app, -1); + return TRUE; + }; + break; + case GDK_KEY_downarrow: + if(event->state & GDK_CONTROL_MASK) + { + omnplay_playlist_item_swap(app, -1); + return TRUE; + }; + break; case GDK_KEY_space: omnplay_ctl(app, BUTTON_PLAYER_PLAY); return TRUE; @@ -1099,7 +1125,8 @@ static gboolean on_playlist_grid_key(GtkWidget *widget, GdkEventKey *event, gpoi case GDK_KEY_Delete: omnplay_playlist_item_del(app); return TRUE; - case GDK_KEY_BackSpace: + case GDK_E: + case GDK_e: omnplay_playlist_item_edit(app); return TRUE; }; @@ -1139,7 +1166,7 @@ static gboolean on_library_grid_key(GtkWidget *widget, GdkEventKey *event, gpoin case GDK_v: if(event->state & GDK_CONTROL_MASK) { - fprintf(stderr, "CTRL+v\n"); + g_warning("CTRL+v\n"); return TRUE; }; break; @@ -1147,10 +1174,42 @@ static gboolean on_library_grid_key(GtkWidget *widget, GdkEventKey *event, gpoin case GDK_x: if(event->state & GDK_CONTROL_MASK) { - fprintf(stderr, "CTRL+x\n"); + g_warning("CTRL+x\n"); return TRUE; }; break; + case GDK_KEY_BackSpace: + omnplay_library_add(app, 0); + return TRUE; + case GDK_KEY_F5: + omnplay_library_refresh(app); + return TRUE; + }; + + return FALSE; +}; + +static gboolean on_library_grid_button(GtkWidget *widget, GdkEventButton *event, gpointer data) +{ +// g_warning("on_library_grid_button: event->button=%d, event->type=%d", event->button, event->type); + + if(event->button==1 && event->type==GDK_2BUTTON_PRESS) + { + omnplay_library_add((omnplay_instance_t* )data, 0); + return TRUE; + }; + + return FALSE; +}; + +static gboolean on_playlist_grid_button(GtkWidget *widget, GdkEventButton *event, gpointer data) +{ +// g_warning("on_playlist_grid_button"); + + if(event->button==1 && event->type==GDK_2BUTTON_PRESS) + { + omnplay_ctl((omnplay_instance_t* )data, BUTTON_PLAYER_CUE); + return TRUE; }; return FALSE; @@ -1161,6 +1220,7 @@ void omnplay_init(omnplay_instance_t* app) int i; pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); gtk_signal_connect( GTK_OBJECT( app->window ), "delete-event", @@ -1170,46 +1230,51 @@ void omnplay_init(omnplay_instance_t* app) GTK_SIGNAL_FUNC(on_main_window_destroy), app); gtk_widget_add_events(app->playlist_grid, GDK_BUTTON_PRESS_MASK); + gtk_widget_add_events(app->playlist_grid, GDK_KEY_PRESS_MASK); gtk_signal_connect(GTK_OBJECT(app->playlist_grid), "key-press-event", GTK_SIGNAL_FUNC(on_playlist_grid_key), app); gtk_widget_add_events(app->library_grid, GDK_BUTTON_PRESS_MASK); + gtk_widget_add_events(app->library_grid, GDK_KEY_PRESS_MASK); gtk_signal_connect(GTK_OBJECT(app->library_grid), "key-press-event", GTK_SIGNAL_FUNC(on_library_grid_key), app); + gtk_signal_connect(GTK_OBJECT(app->playlist_grid), "button-press-event", + GTK_SIGNAL_FUNC(on_playlist_grid_button), app); + + gtk_signal_connect(GTK_OBJECT(app->library_grid), "button-press-event", + GTK_SIGNAL_FUNC(on_library_grid_button), app); + /* create lock */ pthread_mutex_init(&app->players.lock, &attr); + pthread_mutex_init(&app->playlist.lock, &attr); + pthread_mutex_init(&app->library.lock, &attr); /* create a omneon status thread */ for(i = 0; i < app->players.count; i++) - pthread_create(&app->players.item[i].thread, NULL, - omnplay_thread_proc, &app->players.item[i]); - - /* create lock */ - pthread_mutex_init(&app->playlist.lock, &attr); + app->players.item[i].thread = g_thread_create( + omnplay_thread_proc, &app->players.item[i], TRUE, NULL); /* attach buttons click */ for(i = 1; i < BUTTON_LAST; i++) gtk_signal_connect(GTK_OBJECT(app->buttons[i]), "clicked", GTK_SIGNAL_FUNC( on_button_click), app ); - /* create lock */ - pthread_mutex_init(&app->library.lock, &attr); - /* load library */ omnplay_library_load(app); + + pthread_mutexattr_destroy(&attr); }; void omnplay_release(omnplay_instance_t* app) { int i; - void* r; app->f_exit = 1; for(i = 0; i < app->players.count; i++) /* create a omneon status thread */ - pthread_join(app->players.item[i].thread, &r); + g_thread_join(app->players.item[i].thread); /* destroy lock */ pthread_mutex_destroy(&app->players.lock); @@ -1233,3 +1298,12 @@ void omnplay_playlist_normalize(omnplay_instance_t* app) if(omnplay_library_normalize_item(app, &app->playlist.item[i])) omnplay_playlist_draw_item(app, i); }; + +void omnplay_set_status(omnplay_instance_t* app, char* str) +{ + gdk_threads_enter(); +// gtk_label_set_text(GTK_LABEL(data), str); + gdk_flush(); + gdk_threads_leave(); +}; +