]> git.sesse.net Git - mlt/commitdiff
SDL transport callback
authorlilo_booter <lilo_booter@d19143bc-622f-0410-bfdd-b5b2a6649095>
Fri, 26 Dec 2003 16:56:32 +0000 (16:56 +0000)
committerlilo_booter <lilo_booter@d19143bc-622f-0410-bfdd-b5b2a6649095>
Fri, 26 Dec 2003 16:56:32 +0000 (16:56 +0000)
git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@20 d19143bc-622f-0410-bfdd-b5b2a6649095

mlt/src/framework/mlt_property.c
mlt/src/modules/sdl/consumer_sdl.c
mlt/src/tests/Makefile
mlt/src/tests/charlie.c
src/framework/mlt_property.c
src/modules/sdl/consumer_sdl.c
src/tests/Makefile
src/tests/charlie.c

index 021dbc1774b387d66b9b0070284c89fd9f5c555c..22e43c8b38572badf3968207059570f3aef09f09 100644 (file)
@@ -101,6 +101,8 @@ int mlt_property_set_string( mlt_property this, char *value )
 
 int mlt_property_set_data( mlt_property this, void *value, int length, mlt_destructor destructor, mlt_serialiser serialiser )
 {
+       if ( this->data == value )
+               this->destructor = NULL;
        mlt_property_clear( this );
        this->types = mlt_prop_data;
        this->data = value;
index f438d26a6d1023b92591eac13365bfb015c714b2..a4d6b30aac024097abec05d35578420d1337d227 100644 (file)
@@ -188,6 +188,9 @@ static void *consumer_thread( void *arg )
        // Get the service assoicated to the consumer
        mlt_service service = mlt_consumer_service( consumer );
 
+       // Get the properties of this consumer
+       mlt_properties properties = this->properties;
+
        // Define a frame pointer
        mlt_frame frame;
 
@@ -269,6 +272,14 @@ static void *consumer_thread( void *arg )
                                                        this->window_height = event.resize.h;
                                                        changed = 1;
                                                        break;
+                                               case SDL_KEYDOWN:
+                                                       {
+                                                               mlt_producer producer = mlt_properties_get_data( properties, "transport_producer", NULL );
+                                                               void (*callback)( mlt_producer, char * ) = mlt_properties_get_data( properties, "transport_callback", NULL );
+                                                               if ( callback != NULL && producer != NULL )
+                                                                       callback( producer, SDL_GetKeyName(event.key.keysym.sym) );
+                                                       }
+                                                       break;
                                        }
                                }
                        }
index 6812f785aeee2992c86a5d24da54fd5b38ad827a..448e44e1bfc77d8e6f9fad26855f2689927933ac 100644 (file)
@@ -9,13 +9,13 @@ all: $(TARGET)
 dan:           dan.o 
                        $(CC) dan.o -o $@ $(LDFLAGS)
 
-charlie:       charlie.o 
-                       $(CC) charlie.o -o $@ $(LDFLAGS)
+charlie:       charlie.o io.o
+                       $(CC) charlie.o io.o -o $@ $(LDFLAGS)
 
 clean:
-                       rm -f dan.o charlie.o dan charlie
+                       rm -f dan.o io.o charlie.o dan charlie
 
-depend:                dan.c charlie.c
+depend:                dan.c charlie.c io.c
                        $(CC) -MM $(CFLAGS) $^ 1>.depend
 
 ifneq ($(wildcard .depend),)
index b8c7d4f8ae32248897468c0fb0e281d2c3f9ebc3..48dab2938432ec804df76438bfdcb8bf9a7d8b11 100644 (file)
@@ -4,6 +4,8 @@
 
 #include <framework/mlt.h>
 
+#include "io.h"
+
 mlt_producer create_producer( char *file )
 {
        mlt_producer result = NULL;
@@ -35,12 +37,62 @@ mlt_producer create_producer( char *file )
        return result;
 }
 
-mlt_consumer create_consumer( char *id )
+void transport_action( mlt_producer producer, char *value )
+{
+       mlt_properties properties = mlt_producer_properties( producer );
+
+       switch( value[ 0 ] )
+       {
+               case 'q':
+                       mlt_properties_set_int( properties, "done", 1 );
+                       break;
+               case '0':
+                       mlt_producer_set_speed( producer, 1 );
+                       mlt_producer_seek( producer, 0 );
+                       break;
+               case '1':
+                       mlt_producer_set_speed( producer, -5 );
+                       break;
+               case '2':
+                       mlt_producer_set_speed( producer, -2.5 );
+                       break;
+               case '3':
+                       mlt_producer_set_speed( producer, -1 );
+                       break;
+               case '4':
+                       mlt_producer_set_speed( producer, -0.5 );
+                       break;
+               case '5':
+                       mlt_producer_set_speed( producer, 0 );
+                       break;
+               case '6':
+                       mlt_producer_set_speed( producer, 0.5 );
+                       break;
+               case '7':
+                       mlt_producer_set_speed( producer, 1 );
+                       break;
+               case '8':
+                       mlt_producer_set_speed( producer, 2.5 );
+                       break;
+               case '9':
+                       mlt_producer_set_speed( producer, 5 );
+                       break;
+       }
+}
+
+mlt_consumer create_consumer( char *id, mlt_producer producer )
 {
        char *arg = strchr( id, ':' );
        if ( arg != NULL )
                *arg ++ = '\0';
-       return mlt_factory_consumer( id, arg );
+       mlt_consumer consumer = mlt_factory_consumer( id, arg );
+       if ( consumer != NULL )
+       {
+               mlt_properties properties = mlt_consumer_properties( consumer );
+               mlt_properties_set_data( properties, "transport_callback", transport_action, 0, NULL, NULL );
+               mlt_properties_set_data( properties, "transport_producer", producer, 0, NULL, NULL );
+       }
+       return consumer;
 }
 
 void track_service( mlt_field field, void *service, mlt_destructor destructor )
@@ -74,9 +126,15 @@ void set_properties( mlt_service service, char *namevalue )
 
 void transport( mlt_producer producer )
 {
-       char temp[ 132 ];
-       fprintf( stderr, "Press return to continue\n" );
-       fgets( temp, 132, stdin );
+       mlt_properties properties = mlt_producer_properties( producer );
+
+       fprintf( stderr, "Press 'q' to continue\n" );
+
+       while( mlt_properties_get_int( properties, "done" ) == 0 )
+       {
+               char value = get_keypress( );
+               transport_action( producer, &value );
+       }
 }
 
 int main( int argc, char **argv )
@@ -108,7 +166,7 @@ int main( int argc, char **argv )
        {
                if ( !strcmp( argv[ i ], "-consumer" ) )
                {
-                       consumer = create_consumer( argv[ ++ i ] );
+                       consumer = create_consumer( argv[ ++ i ], mlt_multitrack_producer( multitrack ) );
                        if ( consumer != NULL )
                                service = mlt_consumer_service( consumer );
                }
@@ -134,7 +192,7 @@ int main( int argc, char **argv )
 
        // If we have no consumer, default to sdl
        if ( consumer == NULL )
-               consumer= mlt_factory_consumer( "sdl", NULL );
+               consumer = create_consumer( "sdl:PAL", mlt_multitrack_producer( multitrack ) );
 
        // Connect producer to playlist
        if ( producer != NULL )
index 021dbc1774b387d66b9b0070284c89fd9f5c555c..22e43c8b38572badf3968207059570f3aef09f09 100644 (file)
@@ -101,6 +101,8 @@ int mlt_property_set_string( mlt_property this, char *value )
 
 int mlt_property_set_data( mlt_property this, void *value, int length, mlt_destructor destructor, mlt_serialiser serialiser )
 {
+       if ( this->data == value )
+               this->destructor = NULL;
        mlt_property_clear( this );
        this->types = mlt_prop_data;
        this->data = value;
index f438d26a6d1023b92591eac13365bfb015c714b2..a4d6b30aac024097abec05d35578420d1337d227 100644 (file)
@@ -188,6 +188,9 @@ static void *consumer_thread( void *arg )
        // Get the service assoicated to the consumer
        mlt_service service = mlt_consumer_service( consumer );
 
+       // Get the properties of this consumer
+       mlt_properties properties = this->properties;
+
        // Define a frame pointer
        mlt_frame frame;
 
@@ -269,6 +272,14 @@ static void *consumer_thread( void *arg )
                                                        this->window_height = event.resize.h;
                                                        changed = 1;
                                                        break;
+                                               case SDL_KEYDOWN:
+                                                       {
+                                                               mlt_producer producer = mlt_properties_get_data( properties, "transport_producer", NULL );
+                                                               void (*callback)( mlt_producer, char * ) = mlt_properties_get_data( properties, "transport_callback", NULL );
+                                                               if ( callback != NULL && producer != NULL )
+                                                                       callback( producer, SDL_GetKeyName(event.key.keysym.sym) );
+                                                       }
+                                                       break;
                                        }
                                }
                        }
index 6812f785aeee2992c86a5d24da54fd5b38ad827a..448e44e1bfc77d8e6f9fad26855f2689927933ac 100644 (file)
@@ -9,13 +9,13 @@ all: $(TARGET)
 dan:           dan.o 
                        $(CC) dan.o -o $@ $(LDFLAGS)
 
-charlie:       charlie.o 
-                       $(CC) charlie.o -o $@ $(LDFLAGS)
+charlie:       charlie.o io.o
+                       $(CC) charlie.o io.o -o $@ $(LDFLAGS)
 
 clean:
-                       rm -f dan.o charlie.o dan charlie
+                       rm -f dan.o io.o charlie.o dan charlie
 
-depend:                dan.c charlie.c
+depend:                dan.c charlie.c io.c
                        $(CC) -MM $(CFLAGS) $^ 1>.depend
 
 ifneq ($(wildcard .depend),)
index b8c7d4f8ae32248897468c0fb0e281d2c3f9ebc3..48dab2938432ec804df76438bfdcb8bf9a7d8b11 100644 (file)
@@ -4,6 +4,8 @@
 
 #include <framework/mlt.h>
 
+#include "io.h"
+
 mlt_producer create_producer( char *file )
 {
        mlt_producer result = NULL;
@@ -35,12 +37,62 @@ mlt_producer create_producer( char *file )
        return result;
 }
 
-mlt_consumer create_consumer( char *id )
+void transport_action( mlt_producer producer, char *value )
+{
+       mlt_properties properties = mlt_producer_properties( producer );
+
+       switch( value[ 0 ] )
+       {
+               case 'q':
+                       mlt_properties_set_int( properties, "done", 1 );
+                       break;
+               case '0':
+                       mlt_producer_set_speed( producer, 1 );
+                       mlt_producer_seek( producer, 0 );
+                       break;
+               case '1':
+                       mlt_producer_set_speed( producer, -5 );
+                       break;
+               case '2':
+                       mlt_producer_set_speed( producer, -2.5 );
+                       break;
+               case '3':
+                       mlt_producer_set_speed( producer, -1 );
+                       break;
+               case '4':
+                       mlt_producer_set_speed( producer, -0.5 );
+                       break;
+               case '5':
+                       mlt_producer_set_speed( producer, 0 );
+                       break;
+               case '6':
+                       mlt_producer_set_speed( producer, 0.5 );
+                       break;
+               case '7':
+                       mlt_producer_set_speed( producer, 1 );
+                       break;
+               case '8':
+                       mlt_producer_set_speed( producer, 2.5 );
+                       break;
+               case '9':
+                       mlt_producer_set_speed( producer, 5 );
+                       break;
+       }
+}
+
+mlt_consumer create_consumer( char *id, mlt_producer producer )
 {
        char *arg = strchr( id, ':' );
        if ( arg != NULL )
                *arg ++ = '\0';
-       return mlt_factory_consumer( id, arg );
+       mlt_consumer consumer = mlt_factory_consumer( id, arg );
+       if ( consumer != NULL )
+       {
+               mlt_properties properties = mlt_consumer_properties( consumer );
+               mlt_properties_set_data( properties, "transport_callback", transport_action, 0, NULL, NULL );
+               mlt_properties_set_data( properties, "transport_producer", producer, 0, NULL, NULL );
+       }
+       return consumer;
 }
 
 void track_service( mlt_field field, void *service, mlt_destructor destructor )
@@ -74,9 +126,15 @@ void set_properties( mlt_service service, char *namevalue )
 
 void transport( mlt_producer producer )
 {
-       char temp[ 132 ];
-       fprintf( stderr, "Press return to continue\n" );
-       fgets( temp, 132, stdin );
+       mlt_properties properties = mlt_producer_properties( producer );
+
+       fprintf( stderr, "Press 'q' to continue\n" );
+
+       while( mlt_properties_get_int( properties, "done" ) == 0 )
+       {
+               char value = get_keypress( );
+               transport_action( producer, &value );
+       }
 }
 
 int main( int argc, char **argv )
@@ -108,7 +166,7 @@ int main( int argc, char **argv )
        {
                if ( !strcmp( argv[ i ], "-consumer" ) )
                {
-                       consumer = create_consumer( argv[ ++ i ] );
+                       consumer = create_consumer( argv[ ++ i ], mlt_multitrack_producer( multitrack ) );
                        if ( consumer != NULL )
                                service = mlt_consumer_service( consumer );
                }
@@ -134,7 +192,7 @@ int main( int argc, char **argv )
 
        // If we have no consumer, default to sdl
        if ( consumer == NULL )
-               consumer= mlt_factory_consumer( "sdl", NULL );
+               consumer = create_consumer( "sdl:PAL", mlt_multitrack_producer( multitrack ) );
 
        // Connect producer to playlist
        if ( producer != NULL )