* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
free(app);
};
+static int find_index_of_playlist_item(omnplay_instance_t* app, int start, int idx)
+{
+ while(1)
+ {
+ if(app->playlist.item[start].omn_idx == idx)
+ return start;
+
+ if(app->playlist.item[start].type & OMNPLAY_PLAYLIST_BLOCK_END)
+ break;
+
+ start++;
+ };
+
+ return -1;
+};
+
static void omnplay_update_status(omnplay_player_t* player, OmPlrStatus *prev , OmPlrStatus *curr)
{
+ int idx;
char tc_cur[32], tc_rem[32], state[32], status[32];
const char *clip;
strcpy(status, "OFFLINE");
};
+ /* update status in status page */
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);
gdk_flush();
gdk_threads_leave();
+ /* update remaining time */
+ gdk_threads_enter();
+ pthread_mutex_lock(&player->app->playlist.lock);
+ pthread_mutex_lock(&player->app->players.lock);
+ if(curr->state == omPlrStatePlay || curr->state == omPlrStateCuePlay)
+ {
+ idx = find_index_of_playlist_item(player->app, player->playlist_start, curr->currClipNum);
+ if(idx >= 0)
+ {
+ frames2tc(curr->currClipStartPos + curr->currClipLen - curr->pos, 25.0, tc_rem);
+ omnplay_playlist_draw_item_rem(player->app, idx, tc_rem);
+ }
+ if(curr->currClipNum != prev->currClipNum && 1 != prev->numClips)
+ {
+ tc_rem[0] = 0;
+ idx = find_index_of_playlist_item(player->app, player->playlist_start, prev->currClipNum);
+ if(idx >= 0)
+ omnplay_playlist_draw_item_rem(player->app, idx, tc_rem);
+ };
+ }
+ else
+ {
+ tc_rem[0] = 0;
+ idx = find_index_of_playlist_item(player->app, player->playlist_start, curr->currClipNum);
+ if(idx >= 0)
+ omnplay_playlist_draw_item_rem(player->app, idx, tc_rem);
+ idx = find_index_of_playlist_item(player->app, player->playlist_start, prev->currClipNum);
+ if(idx >= 0)
+ omnplay_playlist_draw_item_rem(player->app, idx, tc_rem);
+ };
+ pthread_mutex_unlock(&player->app->players.lock);
+ pthread_mutex_unlock(&player->app->playlist.lock);
+ gdk_flush();
+ gdk_threads_leave();
+
+
memcpy(prev, curr, sizeof(OmPlrStatus));
};
OmPlrStop((OmPlrHandle)player->handle);
/* detach previous clips */
- player->playlist_start = -1;
- player->playlist_count = -1;
+// player->playlist_start = -1;
+// player->playlist_count = -1;
OmPlrDetachAllClips((OmPlrHandle)player->handle);
};
/* Attach clips to timeline */
for(i = start, c = 0, o = 0; i <= stop; i++)
{
- unsigned int l;
+ OmPlrClipInfo clip;
- r = OmPlrAttach((OmPlrHandle)player->handle,
- app->playlist.item[i].id,
- app->playlist.item[i].in,
- app->playlist.item[i].in + app->playlist.item[i].dur,
- 0, omPlrShiftModeAfter, &l);
+ /* get clip info */
+ clip.maxMsTracks = 0;
+ clip.size = sizeof(clip);
+ r = OmPlrClipGetInfo((OmPlrHandle)player->handle, app->playlist.item[i].id, &clip);
+
+ if(!r)
+ {
+ unsigned int l;
+
+ fprintf(stderr, "OmPlrClipGetInfo(%s): firstFrame=%d, lastFrame=%d\n",
+ app->playlist.item[i].id, clip.firstFrame, clip.lastFrame);
+
+ /* should we fix playlist clip timings */
+ if(!(
+ app->playlist.item[i].in >= clip.firstFrame &&
+ 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",
+ app->playlist.item[i].id,
+ app->playlist.item[i].in, app->playlist.item[i].dur,
+ clip.firstFrame, clip.lastFrame - clip.firstFrame);
+
+ app->playlist.item[i].in = clip.firstFrame;
+ app->playlist.item[i].dur = clip.lastFrame - clip.firstFrame;
+ omnplay_playlist_draw_item(app, i);
+ };
+
+ r = OmPlrAttach((OmPlrHandle)player->handle,
+ app->playlist.item[i].id,
+ app->playlist.item[i].in,
+ app->playlist.item[i].in + app->playlist.item[i].dur,
+ 0, omPlrShiftModeAfter, &l);
+ };
if(r)
{
OmPlrGetPlayerStatus((OmPlrHandle)player->handle, &hs);
OmPlrSetPos((OmPlrHandle)player->handle, hs.minPos + p);
+ /* setup loop */
+ if(app->playlist.item[start].type & OMNPLAY_PLAYLIST_BLOCK_LOOP)
+ OmPlrLoop((OmPlrHandle)player->handle, hs.minPos, hs.maxPos);
+
+ player->playlist_start = start;
+
/* Cue */
OmPlrCuePlay((OmPlrHandle)player->handle, 0.0);
OmPlrPlay((OmPlrHandle)player->handle, 0.0);
-
- player->playlist_start = start;
- player->playlist_count = stop - start + 1;
};
};
void omnplay_init(omnplay_instance_t* app)
{
int i;
+ pthread_mutexattr_t attr;
+
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
gtk_signal_connect( GTK_OBJECT( app->window ), "destroy",
GTK_SIGNAL_FUNC(on_main_window_delete_event), app);
/* create lock */
- pthread_mutex_init(&app->players.lock, NULL);
+ pthread_mutex_init(&app->players.lock, &attr);
/* create a omneon status thread */
for(i = 0; i < app->players.count; i++)
omnplay_thread_proc, &app->players.item[i]);
/* create lock */
- pthread_mutex_init(&app->playlist.lock, NULL);
+ pthread_mutex_init(&app->playlist.lock, &attr);
/* attach buttons click */
for(i = 1; i < BUTTON_LAST; i++)