X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fframework%2Fmlt_service.c;h=6df363064cebcd5534d3c38c35bd2fc9002ef665;hb=f44c1d4653f43c8e7a63e6c3895f6f1f0ee0103b;hp=14ae45f5e0131505b1c549e53cee450b78931e4c;hpb=0701ae9e794bf32506a2eb667233c70f50e4fb87;p=melted diff --git a/src/framework/mlt_service.c b/src/framework/mlt_service.c index 14ae45f..6df3630 100644 --- a/src/framework/mlt_service.c +++ b/src/framework/mlt_service.c @@ -53,12 +53,15 @@ mlt_service_base; static void mlt_service_disconnect( mlt_service this ); static void mlt_service_connect( mlt_service this, mlt_service that ); static int service_get_frame( mlt_service this, mlt_frame_ptr frame, int index ); +static void mlt_service_property_changed( mlt_listener, mlt_properties owner, mlt_service this, void **args ); /** Constructor */ int mlt_service_init( mlt_service this, void *child ) { + int error = 0; + // Initialise everything to NULL memset( this, 0, sizeof( struct mlt_service_s ) ); @@ -72,7 +75,23 @@ int mlt_service_init( mlt_service this, void *child ) this->get_frame = service_get_frame; // Initialise the properties - return mlt_properties_init( &this->parent, this ); + error = mlt_properties_init( &this->parent, this ); + if ( error == 0 ) + { + this->parent.close = ( mlt_destructor )mlt_service_close; + this->parent.close_object = this; + + mlt_events_init( &this->parent ); + mlt_events_register( &this->parent, "property-changed", ( mlt_transmitter )mlt_service_property_changed ); + } + + return error; +} + +static void mlt_service_property_changed( mlt_listener listener, mlt_properties owner, mlt_service this, void **args ) +{ + if ( listener != NULL ) + listener( owner, this, ( char * )args[ 0 ] ); } /** Connect a producer service. @@ -110,6 +129,13 @@ int mlt_service_connect_producer( mlt_service this, mlt_service producer, int in // If we have space, assign the input if ( base->in != NULL && index >= 0 && index < base->size ) { + // Get the current service + mlt_service current = base->in[ index ]; + + // Increment the reference count on this producer + if ( producer != NULL ) + mlt_properties_inc_ref( mlt_service_properties( producer ) ); + // Now we disconnect the producer service from its consumer mlt_service_disconnect( producer ); @@ -123,6 +149,9 @@ int mlt_service_connect_producer( mlt_service this, mlt_service producer, int in // Now we connect the producer to its connected consumer mlt_service_connect( producer, this ); + // Close the current service + mlt_service_close( current ); + // Inform caller that all went well return 0; } @@ -142,7 +171,7 @@ static void mlt_service_disconnect( mlt_service this ) // Get the service base mlt_service_base *base = this->local; - // There's a bit more required here... + // Disconnect base->out = NULL; } } @@ -242,9 +271,24 @@ int mlt_service_get_frame( mlt_service this, mlt_frame_ptr frame, int index ) void mlt_service_close( mlt_service this ) { - mlt_service_base *base = this->local; - free( base->in ); - free( base ); - mlt_properties_close( &this->parent ); + if ( this != NULL && mlt_properties_dec_ref( mlt_service_properties( this ) ) <= 0 ) + { + if ( this->close != NULL ) + { + this->close( this->close_object ); + } + else + { + mlt_service_base *base = this->local; + int i = 0; + for ( i = 0; i < base->count; i ++ ) + if ( base->in[ i ] != NULL ) + mlt_service_close( base->in[ i ] ); + free( base->in ); + free( base ); + this->parent.close = NULL; + mlt_properties_close( &this->parent ); + } + } }