minimal status monitoring added
[melted_gui] / src / player.c
index bd456b6..03746fa 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
 #include <string.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 #include <mvcp/mvcp_remote.h>
 
 #include "player.h"
+#include "ui.h"
+#include "timecode.h"
 
-static void* player_thread_proc(void* data)
+static char* status_to_text(mvcp_status status)
 {
-    int r;
-    int playlist_start_prev = 0;
-//    OmPlrStatus st_curr, st_prev;
-    player_t* player = (player_t*)data;
-
-    g_warning("omnplay_thread_proc\n");
+    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";
+}
+
+typedef struct player_handle_desc
+{
+    mvcp_parser parser;
+    mvcp conn;
+} player_handle_t;
 
-//    memset(&st_curr, 0, sizeof(OmPlrStatus));
-//    memset(&st_prev, 0, sizeof(OmPlrStatus));
+static void player_update_status(player_t* player, mvcp_status_t *status_prev , mvcp_status_t *status_curr,
+    int *playlist_start_prev)
+{
+    int idx;
+    char tc_cur[32], tc_rem[32], *state, status[32], *clip;
 
-    /* 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)
+    if(status_curr->status == unit_disconnected)
     {
-//        g_warning("ERROR: OmPlrOpen(%s, %s) failed with 0x%.8X\n",
-//            player->host, player->name, r);
+        tc_cur[0] = 0;
+        tc_rem[0] = 0;
+        clip = "";
+        state = "";
+        strcpy(status, "OFFLINE");
+    }
+    else
+    {
+        int p = status_curr->start + (status_curr->position - status_curr->in);
 
-        return (void*)r;
+        frames2tc(p, 25.0, tc_cur);
+        frames2tc(status_curr->dur - p, 25.0, tc_rem);
+        clip = status_curr->clip;
+        state = status_to_text(status_curr);
+        strcpy(status, "ONLINE");
     };
 
-    /* setup to do not reconnect */
-    pthread_mutex_lock(&player->app->players.lock);
-//    OmPlrSetRetryOpen((OmPlrHandle)player->handle, 0);
-    pthread_mutex_unlock(&player->app->players.lock);
+    ui_update_player(player, tc_cur, tc_rem, state, status, clip);
 
-    /* setup directory */
-//    if(player->app->players.path[0])
+    /* update remaining time of playlist's item */
+    pthread_mutex_lock(&player->app->playlist.lock);
+    pthread_mutex_lock(&player->app->players.lock);
+    if(player->playlist_length)
     {
-        pthread_mutex_lock(&player->app->players.lock);
-//        r = OmPlrClipSetDirectory((OmPlrHandle)player->handle, player->app->players.path);
-        pthread_mutex_unlock(&player->app->players.lock);
+        /* clear remain on "previous" item */
+        if((status_curr->clip_index != status_prev->clip_index && 1 != player->playlist_length) ||
+            (*playlist_start_prev != player->playlist_start))
+        {
+            tc_rem[0] = 0;
+            idx = playlist_item_index /* find_index_of_playlist_item */(player->app, *playlist_start_prev, status_prev->clip_index);
+            if(idx >= 0)
+                ui_playlist_draw_item_rem(player->app, idx, tc_rem);
+        };
 
-        if(r)
+        /* update current item */
+        idx = playlist_item_index /* find_index_of_playlist_item */(player->app, player->playlist_start, status_curr->clip_index);
+        if(idx >= 0)
         {
-//            g_warning("ERROR: OmPlrClipSetDirectory(%s) failed with 0x%.8X\n",
-//                player->app->players.path, r);
+            /* reset value */
+            tc_rem[0] = 0;
 
-            pthread_mutex_lock(&player->app->players.lock);
-//            OmPlrClose((OmPlrHandle)player->handle);
-            pthread_mutex_unlock(&player->app->players.lock);
+            /* for play and cue calc new value */
+            if(status_curr->status == unit_stopped || status_curr->status == unit_playing || status_curr->status == unit_paused)
+                frames2tc(status_curr->out - status_curr->position, 25.0, tc_rem);
 
-            return (void*)r;
+            /* setup that value */
+            ui_playlist_draw_item_rem(player->app, idx, tc_rem);
         };
     };
+    pthread_mutex_unlock(&player->app->players.lock);
+    pthread_mutex_unlock(&player->app->playlist.lock);
+};
 
-    /* endless loop */
-    for(r = 0 ; !player->app->f_exit && !r;)
-    {
-        /* sleep */
-#ifdef _WIN32
-        Sleep(100);
-#else
-        usleep(100000);
-#endif
+static void* player_thread_proc(void* data)
+{
+    int r, f;
+    int playlist_start_prev = 0;
+    mvcp_status_t status_curr, status_prev;
+    player_t* player = (player_t*)data;
+    player_handle_t* handle = player->handle;
+    mvcp_notifier notifier = mvcp_get_notifier(handle->conn);
 
-        /* get status */
+    g_warning("player_thread_proc: started\n");
+
+//    memset(&st_curr, 0, sizeof(OmPlrStatus));
+//    memset(&st_prev, 0, sizeof(OmPlrStatus));
+
+    /* endless reconnect loop */
+    for(; !player->app->f_exit;)
+    {
+        /* connect */
         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(mvcp_connect(handle->conn) == mvcp_ok)
+        {
+            g_warning("player_thread_proc: failed to connect to server\n");
+            sleep(1);
+            continue;
+        };
 
-        if(r)
-            g_warning("ERROR: OmPlrGetPlayerStatus failed with 0x%.8X\n", r);
-        else
+        /* status request loop */
+        for(r = 0, f = 0; !player->app->f_exit && !r;)
         {
-//            omnplay_update_status(player, &st_prev , &st_curr, &playlist_start_prev);
-//            playlist_start_prev = player->playlist_start;
-//            memcmp(&st_curr, &st_prev, sizeof(OmPlrStatus));
+            /* wait for any event from notifier */
+            mvcp_notifier_wait(notifier, &status_curr);
+
+            /* get status for our unit */
+            if(player->unit != status_curr.unit)
+                mvcp_notifier_get(notifier, &status_curr, player->unit);
+
+            /* notify about exit from loop and reconnect */
+            if(status_curr.status == unit_disconnected)
+                r = 1;
+
+            /* do we need to update status */
+            if(!memcmp(&status_curr, &status_prev, sizeof(mvcp_status_t)) || !f)
+            {
+            };
+
+            f = 1;
+            player_update_status(player, &status_prev , &status_curr, &playlist_start_prev);
+            playlist_start_prev = player->playlist_start;
+            status_prev = status_curr;
         };
     };
 
@@ -121,14 +184,19 @@ static void* player_thread_proc(void* data)
 
 void player_run(instance_t* app, int idx)
 {
-    mvcp_parser parser = mvcp_parser_init_remote(app->players.host, 5250);
-    mvcp command = mvcp_init(parser);
-
+    player_handle_t* handle = malloc(sizeof(player_handle_t));
+    handle->parser = mvcp_parser_init_remote(app->players.host, 5250);
+    handle->conn = mvcp_init(handle->parser);
+    app->players.item[idx].handle = handle;
     app->players.item[idx].thread = g_thread_create(
         player_thread_proc, &app->players.item[idx], TRUE, NULL);
 };
 
 void player_stop(instance_t* app, int idx)
 {
+    player_handle_t* handle = app->players.item[idx].handle;
     g_thread_join(app->players.item[idx].thread);
+    mvcp_close(handle->conn);
+    mvcp_parser_close(handle->parser);
+    free(handle);
 };