#include <string.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
+#include <pthread.h>
#include "omnplay.h"
#include "ui.h"
#include "opts.h"
+#include "timecode.h"
#include "omplrclnt.h"
return TRUE;
}
-
omnplay_instance_t* omnplay_create(int argc, char** argv)
{
int i, c;
return app;
};
-
void omnplay_destroy(omnplay_instance_t* app)
{
free(app);
};
+static void omnplay_update_status(omnplay_player_t* player, OmPlrStatus *prev , OmPlrStatus *curr)
+{
+ char tc_cur[32], tc_rem[32], state[32], status[32];
+ const char *clip;
+
+ if(curr)
+ {
+ frames2tc(curr->pos - curr->minPos, 25.0, tc_cur);
+ frames2tc(curr->maxPos - curr->pos, 25.0, tc_rem);
+ strcpy(status, "ONLINE");
+ clip = curr->currClipName;
+
+ switch(curr->state)
+ {
+ case omPlrStateStopped: strcpy(state, "STOPPED"); break;
+ case omPlrStateCuePlay: strcpy(state, "CUE_PLAY"); break;
+ case omPlrStatePlay: strcpy(state, "PLAY"); break;
+ case omPlrStateCueRecord: strcpy(state, "CUE_RECORD"); break;
+ case omPlrStateRecord: strcpy(state, "RECORD"); break;
+ };
+ }
+ else
+ {
+ tc_cur[0] = 0;
+ tc_rem[0] = 0;
+ clip = "";
+ state[0] = 0;
+ strcpy(status, "OFFLINE");
+ };
+
+ gdk_threads_enter();
+ gtk_label_set_text(GTK_LABEL (player->label_tc_cur), tc_cur);
+ gtk_label_set_text(GTK_LABEL (player->label_tc_rem), tc_rem);
+ gtk_label_set_text(GTK_LABEL (player->label_state), state);
+ gtk_label_set_text(GTK_LABEL (player->label_status), status);
+ gtk_label_set_text(GTK_LABEL (player->label_clip), clip);
+ gdk_flush();
+ gdk_threads_leave();
+
+ memcpy(prev, curr, sizeof(OmPlrStatus));
+};
-#if 0
-static void test()
+static void* omnplay_thread_proc(void* data)
{
int r;
- OmPlrClipInfo clip_info;
- char clip_name[omPlrMaxClipDirLen];
- OmPlrHandle omn;
-
- /* open director */
- r = OmPlrOpen
- (
- "omneon-1b.internal.m1stereo.tv",
- "Play_11",
- &omn
- );
+ OmPlrStatus st_curr, st_prev;
+ omnplay_player_t* player = (omnplay_player_t*)data;
+ /* 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 failed with 0x%.8X\n", r);
- else
{
- /* fetch all clips known in Omneon */
- r = OmPlrClipGetFirst
- (
- omn,
- clip_name, sizeof(clip_name)
- );
+ fprintf(stderr, "ERROR: OmPlrOpen(%s, %s) failed with 0x%.8X\n",
+ player->host, player->name, r);
+
+ return (void*)r;
+ };
+
+ /* setup to do not reconnect */
+ pthread_mutex_lock(&player->app->players.lock);
+ OmPlrSetRetryOpen((OmPlrHandle)player->handle, 0);
+ pthread_mutex_unlock(&player->app->players.lock);
+
+ /* setup directory */
+ if(player->app->players.path[0])
+ {
+ pthread_mutex_lock(&player->app->players.lock);
+// r = OmPlrClipSetDirectory((OmPlrHandle)player->handle, player->app->players.path);
+ pthread_mutex_unlock(&player->app->players.lock);
if(r)
- fprintf(stderr, "ERROR: OmPlrClipGetFirst failed with 0x%.8X\n", r);
- else
{
- fprintf(stderr, "OmPlrClipGetFirst=[%s]\n", clip_name);
-
- clip_info.maxMsTracks = 0;
- clip_info.size = sizeof(clip_info);
- r = OmPlrClipGetInfo(omn, clip_name, &clip_info);
-
- if(r)
- fprintf(stderr, "ERROR: OmPlrClipGetInfo failed with 0x%.8X\n", r);
- else
- {
- fprintf(stderr, "OmPlrClipGetInfo(%s)=firstFrame=%d, lastFrame=%d",
- clip_name, clip_info.firstFrame, clip_info.lastFrame);
- }
+ fprintf(stderr, "ERROR: OmPlrClipSetDirectory(%s) failed with 0x%.8X\n",
+ player->app->players.path, r);
+
+ pthread_mutex_lock(&player->app->players.lock);
+ OmPlrClose((OmPlrHandle)player->handle);
+ pthread_mutex_unlock(&player->app->players.lock);
+
+ return (void*)r;
};
+ };
+
+ /* endless loop */
+ for(r = 0 ; !player->app->f_exit && !r;)
+ {
+ /* sleep */
+ usleep(100000);
+
+ /* get status */
+ pthread_mutex_lock(&player->app->players.lock);
+ st_curr.size = sizeof(OmPlrStatus);
+ r = OmPlrGetPlayerStatus((OmPlrHandle)player->handle, &st_curr);
+ pthread_mutex_unlock(&player->app->players.lock);
+ if(r)
+ fprintf(stderr, "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);
+ };
+
+ pthread_mutex_lock(&player->app->players.lock);
+ OmPlrClose((OmPlrHandle)player->handle);
+ pthread_mutex_unlock(&player->app->players.lock);
- OmPlrClose(omn);
+ return NULL;
+};
+
+static gboolean omnplay_button_click(omnplay_instance_t* app, control_buttons_t button)
+{
+ switch(button)
+ {
+ case BUTTON_PLAYLIST_ITEM_ADD:
+ case BUTTON_PLAYLIST_ITEM_DEL:
+ case BUTTON_PLAYLIST_ITEM_EDIT:
+ case BUTTON_PLAYLIST_LOAD:
+ omnplay_playlist_load(app);
+ break;
+ case BUTTON_PLAYLIST_SAVE:
+ omnplay_playlist_save(app);
+ break;
+ case BUTTON_PLAYLIST_BLOCK_SINGLE:
+ case BUTTON_PLAYLIST_BLOCK_LOOP:
+ case BUTTON_PLAYLIST_ITEM_UP:
+ case BUTTON_PLAYLIST_ITEM_DOWN:
+ case BUTTON_PLAYER_CUE:
+ case BUTTON_PLAYER_PLAY:
+ case BUTTON_PLAYER_PAUSE:
+ case BUTTON_PLAYER_STOP:
+ case BUTTON_LIBRARY_ADD:
+ case BUTTON_LIBRARY_REFRESH:
+ break;
};
+
+ return TRUE;
+};
+
+static gboolean on_button_click(GtkWidget *button, gpointer user_data)
+{
+ int i;
+ omnplay_instance_t* app = (omnplay_instance_t*)user_data;
+
+ for(i = 1; i < BUTTON_LAST; i++)
+ if(app->buttons[i] == button)
+ return omnplay_button_click(app, (control_buttons_t)i);
+
+ return FALSE;
};
-#endif
void omnplay_init(omnplay_instance_t* app)
{
+ int i;
+
gtk_signal_connect( GTK_OBJECT( app->window ), "destroy",
GTK_SIGNAL_FUNC(on_main_window_delete_event), app);
-#if 0
- test();
-#endif
+
+ /* create lock */
+ pthread_mutex_init(&app->players.lock, NULL);
+
+ /* 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, 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 );
+
};
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);
+
+ /* destroy lock */
+ pthread_mutex_destroy(&app->players.lock);
+
+ /* destroy lock */
+ pthread_mutex_destroy(&app->playlist.lock);
};