+extern pthread_mutex_t g_activate_mutex;
+
+#define BUFFER_LEN 204800 * 6
+
+static void jack_started_transmitter( mlt_listener listener, mlt_properties owner, mlt_service service, void **args )
+{
+ listener( owner, service, (mlt_position*) args[0] );
+}
+
+static void jack_stopped_transmitter( mlt_listener listener, mlt_properties owner, mlt_service service, void **args )
+{
+ listener( owner, service, (mlt_position*) args[0] );
+}
+
+static void jack_seek_transmitter( mlt_listener listener, mlt_properties owner, mlt_service service, void **args )
+{
+ listener( owner, service, (mlt_position*) args[0] );
+}
+
+#define JACKSTATE(x) (x==JackTransportStopped?"stopped":x==JackTransportStarting?"starting":x==JackTransportRolling?"rolling":"unknown")
+
+static int jack_sync( jack_transport_state_t state, jack_position_t *jack_pos, void *arg )
+{
+ mlt_filter filter = (mlt_filter) arg;
+ mlt_properties properties = MLT_FILTER_PROPERTIES( filter );
+ mlt_profile profile = mlt_service_profile( MLT_FILTER_SERVICE(filter) );
+ mlt_position position = mlt_profile_fps( profile ) * jack_pos->frame / jack_pos->frame_rate + 0.5;
+ int result = 1;
+
+ mlt_log_debug( MLT_FILTER_SERVICE(filter), "%s frame %u rate %u pos %d last_pos %d\n",
+ JACKSTATE(state), jack_pos->frame, jack_pos->frame_rate, position,
+ mlt_properties_get_position( properties, "_last_pos" ) );
+ if ( state == JackTransportStopped )
+ {
+ mlt_events_fire( properties, "jack-stopped", &position, NULL );
+ mlt_properties_set_int( properties, "_sync_guard", 0 );
+ }
+ else if ( state == JackTransportStarting )
+ {
+ result = 0;
+ if ( !mlt_properties_get_int( properties, "_sync_guard" ) )
+ {
+ mlt_properties_set_int( properties, "_sync_guard", 1 );
+ mlt_events_fire( properties, "jack-started", &position, NULL );
+ }
+ else if ( position >= mlt_properties_get_position( properties, "_last_pos" ) - 2 )
+ {
+ mlt_properties_set_int( properties, "_sync_guard", 0 );
+ result = 1;
+ }
+ }
+ else
+ {
+ mlt_properties_set_int( properties, "_sync_guard", 0 );
+ }
+
+ return result;
+}
+
+static void on_jack_start( mlt_properties owner, mlt_properties properties )
+{
+ fprintf(stderr, "%s\n", __FUNCTION__);
+ jack_client_t *jack_client = mlt_properties_get_data( properties, "jack_client", NULL );
+ jack_transport_start( jack_client );
+}
+
+static void on_jack_stop( mlt_properties owner, mlt_properties properties )
+{
+ fprintf(stderr, "%s\n", __FUNCTION__);
+ jack_client_t *jack_client = mlt_properties_get_data( properties, "jack_client", NULL );
+ jack_transport_stop( jack_client );
+}
+
+static void on_jack_seek( mlt_properties owner, mlt_filter filter, mlt_position *position )
+{
+ mlt_properties properties = MLT_FILTER_PROPERTIES( filter );
+
+
+ mlt_properties_set_int( properties, "_sync_guard", 1 );
+ mlt_properties_set_position( properties, "_jack_seek", *position );
+ return;
+
+
+ mlt_profile profile = mlt_service_profile( MLT_FILTER_SERVICE( filter ) );
+ jack_client_t *jack_client = mlt_properties_get_data( properties, "jack_client", NULL );
+ jack_nframes_t jack_frame = jack_get_sample_rate( jack_client );
+ jack_frame *= *position / mlt_profile_fps( profile );
+
+ fprintf(stderr, "%s: %d\n", __FUNCTION__, *position);
+ jack_transport_locate( jack_client, jack_frame );
+}