Merge mlt++/CUSTOMISING into docs/melted++.
[melted] / src / miracle / miracle_unit_commands.c
index a630422..97fb2dd 100644 (file)
@@ -40,6 +40,7 @@ int miracle_load( command_argument cmd_arg )
        char *filename = (char*) cmd_arg->argument;
        char fullname[1024];
        int flush = 1;
+       char *service;
 
        if ( filename[0] == '!' )
        {
@@ -47,20 +48,35 @@ int miracle_load( command_argument cmd_arg )
                filename ++;
        }
 
-       if ( filename[0] == '/' )
-               filename++;
+       service = strchr( filename, ':' );
+       if ( service != NULL )
+       {
+               service = filename;
+               filename = strchr( service, ':' );
+               *filename ++ = '\0';
+               
+               if ( strlen( cmd_arg->root_dir ) && filename[0] == '/' )
+                       filename++;
+       
+               snprintf( fullname, 1023, "%s:%s%s", service, cmd_arg->root_dir, filename );
+       }
+       else
+       {
+               if ( strlen( cmd_arg->root_dir ) && filename[0] == '/' )
+                       filename++;
 
-       snprintf( fullname, 1023, "%s%s", cmd_arg->root_dir, filename );
+               snprintf( fullname, 1023, "%s%s", cmd_arg->root_dir, filename );
+       }
        
        if (unit == NULL)
                return RESPONSE_INVALID_UNIT;
        else
        {
-               double in = -1, out = -1;
+               int32_t in = -1, out = -1;
                if ( valerie_tokeniser_count( cmd_arg->tokeniser ) == 5 )
                {
-                       in = atof( valerie_tokeniser_get_string( cmd_arg->tokeniser, 3 ) );
-                       out = atof( valerie_tokeniser_get_string( cmd_arg->tokeniser, 4 ) );
+                       in = atol( valerie_tokeniser_get_string( cmd_arg->tokeniser, 3 ) );
+                       out = atol( valerie_tokeniser_get_string( cmd_arg->tokeniser, 4 ) );
                }
                if ( miracle_unit_load( unit, fullname, in, out, flush ) != valerie_ok )
                        return RESPONSE_BAD_FILE;
@@ -80,40 +96,33 @@ int miracle_list( command_argument cmd_arg )
 
        return RESPONSE_INVALID_UNIT;
 }
-/*
+
 static int parse_clip( command_argument cmd_arg, int arg )
 {
-       dv_unit unit = miracle_get_unit(cmd_arg->unit);
-       int clip = dv_unit_get_current_clip( unit );
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
+       int clip = miracle_unit_get_current_clip( unit );
        
-       if ( dv_tokeniser_count( cmd_arg->tokeniser ) > arg )
+       if ( valerie_tokeniser_count( cmd_arg->tokeniser ) > arg )
        {
-               dv_player player = dv_unit_get_dv_player( unit );
-               char *token = dv_tokeniser_get_string( cmd_arg->tokeniser, arg );
+               char *token = valerie_tokeniser_get_string( cmd_arg->tokeniser, arg );
                if ( token[ 0 ] == '+' )
                        clip += atoi( token + 1 );
                else if ( token[ 0 ] == '-' )
                        clip -= atoi( token + 1 );
                else
                        clip = atoi( token );
-               if ( clip < 0 )
-                       clip = 0;
-               if ( clip >= player->size )
-                       clip = player->size - 1;
        }
        
        return clip;
 }
-*/
 
 int miracle_insert( command_argument cmd_arg )
 {
-       /*
-       dv_unit unit = miracle_get_unit(cmd_arg->unit);
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
        char *filename = (char*) cmd_arg->argument;
        char fullname[1024];
 
-       if ( filename[0] == '/' )
+       if ( strlen( cmd_arg->root_dir ) && filename[0] == '/' )
                filename++;
 
        snprintf( fullname, 1023, "%s%s", cmd_arg->root_dir, filename );
@@ -125,30 +134,26 @@ int miracle_insert( command_argument cmd_arg )
                long in = -1, out = -1;
                int index = parse_clip( cmd_arg, 3 );
                
-               if ( dv_tokeniser_count( cmd_arg->tokeniser ) == 6 )
+               if ( valerie_tokeniser_count( cmd_arg->tokeniser ) == 6 )
                {
-                       in = atoi( dv_tokeniser_get_string( cmd_arg->tokeniser, 4 ) );
-                       out = atoi( dv_tokeniser_get_string( cmd_arg->tokeniser, 5 ) );
+                       in = atoi( valerie_tokeniser_get_string( cmd_arg->tokeniser, 4 ) );
+                       out = atoi( valerie_tokeniser_get_string( cmd_arg->tokeniser, 5 ) );
                }
                
-               switch( dv_unit_insert( unit, fullname, index, in, out ) )
+               switch( miracle_unit_insert( unit, fullname, index, in, out ) )
                {
-                       case dv_pump_ok:
+                       case valerie_ok:
                                return RESPONSE_SUCCESS;
-                       case dv_pump_too_many_files_open:
-                               return RESPONSE_TOO_MANY_FILES;
                        default:
                                return RESPONSE_BAD_FILE;
                }
        }
-       */
        return RESPONSE_SUCCESS;
 }
 
 int miracle_remove( command_argument cmd_arg )
 {
-       /*
-       dv_unit unit = miracle_get_unit(cmd_arg->unit);
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
        
        if (unit == NULL)
                return RESPONSE_INVALID_UNIT;
@@ -156,42 +161,66 @@ int miracle_remove( command_argument cmd_arg )
        {
                int index = parse_clip( cmd_arg, 2 );
                        
-               if ( dv_unit_remove( unit, index ) != dv_pump_ok )
+               if ( miracle_unit_remove( unit, index ) != valerie_ok )
                        return RESPONSE_BAD_FILE;
        }
-       */
        return RESPONSE_SUCCESS;
 }
 
 int miracle_clean( command_argument cmd_arg )
 {
-       /*
-       dv_unit unit = miracle_get_unit(cmd_arg->unit);
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
+       
+       if (unit == NULL)
+               return RESPONSE_INVALID_UNIT;
+       else
+       {
+               if ( miracle_unit_clean( unit ) != valerie_ok )
+                       return RESPONSE_BAD_FILE;
+       }
+       return RESPONSE_SUCCESS;
+}
+
+int miracle_wipe( command_argument cmd_arg )
+{
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
+       
+       if (unit == NULL)
+               return RESPONSE_INVALID_UNIT;
+       else
+       {
+               if ( miracle_unit_wipe( unit ) != valerie_ok )
+                       return RESPONSE_BAD_FILE;
+       }
+       return RESPONSE_SUCCESS;
+}
+
+int miracle_clear( command_argument cmd_arg )
+{
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
        
        if (unit == NULL)
                return RESPONSE_INVALID_UNIT;
        else
        {
-               if ( dv_unit_clean( unit ) != dv_pump_ok )
+               if ( miracle_unit_clear( unit ) != valerie_ok )
                        return RESPONSE_BAD_FILE;
        }
-       */
        return RESPONSE_SUCCESS;
 }
 
 int miracle_move( command_argument cmd_arg )
 {
-       /*
-       dv_unit unit = miracle_get_unit(cmd_arg->unit);
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
        
        if ( unit != NULL )
        {
-               if ( dv_tokeniser_count( cmd_arg->tokeniser ) > 2 )
+               if ( valerie_tokeniser_count( cmd_arg->tokeniser ) > 2 )
                {
                        int src = parse_clip( cmd_arg, 2 );
                        int dest = parse_clip( cmd_arg, 3 );
                        
-                       if ( dv_unit_move( unit, src, dest ) != dv_pump_ok )
+                       if ( miracle_unit_move( unit, src, dest ) != valerie_ok )
                                return RESPONSE_BAD_FILE;
                }
                else
@@ -203,7 +232,6 @@ int miracle_move( command_argument cmd_arg )
        {
                return RESPONSE_INVALID_UNIT;
        }
-       */
 
        return RESPONSE_SUCCESS;
 }
@@ -214,7 +242,7 @@ int miracle_append( command_argument cmd_arg )
        char *filename = (char*) cmd_arg->argument;
        char fullname[1024];
 
-       if ( filename[0] == '/' )
+       if ( strlen( cmd_arg->root_dir ) && filename[0] == '/' )
                filename++;
 
        snprintf( fullname, 1023, "%s%s", cmd_arg->root_dir, filename );
@@ -223,11 +251,11 @@ int miracle_append( command_argument cmd_arg )
                return RESPONSE_INVALID_UNIT;
        else
        {
-               double in = -1, out = -1;
+               int32_t in = -1, out = -1;
                if ( valerie_tokeniser_count( cmd_arg->tokeniser ) == 5 )
                {
-                       in = atof( valerie_tokeniser_get_string( cmd_arg->tokeniser, 3 ) );
-                       out = atof( valerie_tokeniser_get_string( cmd_arg->tokeniser, 4 ) );
+                       in = atol( valerie_tokeniser_get_string( cmd_arg->tokeniser, 3 ) );
+                       out = atol( valerie_tokeniser_get_string( cmd_arg->tokeniser, 4 ) );
                }
                switch ( miracle_unit_append( unit, fullname, in, out ) )
                {
@@ -240,6 +268,37 @@ int miracle_append( command_argument cmd_arg )
        return RESPONSE_SUCCESS;
 }
 
+int miracle_push( command_argument cmd_arg, mlt_service service )
+{
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
+       if ( unit != NULL && service != NULL )
+               if ( miracle_unit_append_service( unit, service ) == valerie_ok )
+                       return RESPONSE_SUCCESS;
+       return RESPONSE_BAD_FILE;
+}
+
+int miracle_receive( command_argument cmd_arg, char *doc )
+{
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
+       if ( unit != NULL )
+       {
+               // Get the consumer's profile
+               mlt_consumer consumer = mlt_properties_get_data( unit->properties, "consumer", NULL );
+               mlt_profile profile = mlt_service_profile( MLT_CONSUMER_SERVICE( consumer ) );
+               mlt_producer producer = mlt_factory_producer( profile, "westley-xml", doc );
+               if ( producer != NULL )
+               {
+                       if ( miracle_unit_append_service( unit, MLT_PRODUCER_SERVICE( producer ) ) == valerie_ok )
+                       {
+                               mlt_producer_close( producer );
+                               return RESPONSE_SUCCESS;
+                       }
+                       mlt_producer_close( producer );
+               }
+       }
+       return RESPONSE_BAD_FILE;
+}
+
 int miracle_play( command_argument cmd_arg )
 {
        miracle_unit unit = miracle_get_unit(cmd_arg->unit);
@@ -265,7 +324,7 @@ int miracle_stop( command_argument cmd_arg )
        if ( unit == NULL )
                return RESPONSE_INVALID_UNIT;
        else 
-               miracle_unit_play( unit, 0 );
+               miracle_unit_terminate( unit );
        return RESPONSE_SUCCESS;
 }
 
@@ -291,31 +350,27 @@ int miracle_rewind( command_argument cmd_arg )
 
 int miracle_step( command_argument cmd_arg )
 {
-       /*
-       dv_unit unit = miracle_get_unit(cmd_arg->unit);
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
        
-       if (unit == NULL || dv_unit_is_offline(unit))
+       if (unit == NULL)
                return RESPONSE_INVALID_UNIT;
        else
        {
-               dv_unit_play( unit, 0 );
-               dv_unit_step( unit, *(int*) cmd_arg->argument );
+               miracle_unit_play( unit, 0 );
+               miracle_unit_step( unit, *(int*) cmd_arg->argument );
        }
-       */
        return RESPONSE_SUCCESS;
 }
 
 int miracle_goto( command_argument cmd_arg )
 {
-       /*
-       dv_unit unit = miracle_get_unit(cmd_arg->unit);
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
        int clip = parse_clip( cmd_arg, 3 );
        
-       if (unit == NULL || dv_unit_is_offline(unit))
+       if (unit == NULL || miracle_unit_is_offline(unit))
                return RESPONSE_INVALID_UNIT;
        else
-               dv_unit_change_position( unit, clip, *(int*) cmd_arg->argument );
-       */
+               miracle_unit_change_position( unit, clip, *(int*) cmd_arg->argument );
        return RESPONSE_SUCCESS;
 }
 
@@ -331,17 +386,16 @@ int miracle_ff( command_argument cmd_arg )
 
 int miracle_set_in_point( command_argument cmd_arg )
 {
-       /*
-       dv_unit unit = miracle_get_unit(cmd_arg->unit);
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
        int clip = parse_clip( cmd_arg, 3 );
-       
-       if (unit == NULL || dv_unit_is_offline(unit))
+
+       if ( unit == NULL )
                return RESPONSE_INVALID_UNIT;
        else
        {
                int position = *(int *) cmd_arg->argument;
 
-               switch( dv_unit_set_clip_in( unit, clip, position ) )
+               switch( miracle_unit_set_clip_in( unit, clip, position ) )
                {
                        case -1:
                                return RESPONSE_BAD_FILE;
@@ -349,23 +403,21 @@ int miracle_set_in_point( command_argument cmd_arg )
                                return RESPONSE_OUT_OF_RANGE;
                }
        }
-       */
        return RESPONSE_SUCCESS;
 }
 
 int miracle_set_out_point( command_argument cmd_arg )
 {
-       /*
-       dv_unit unit = miracle_get_unit(cmd_arg->unit);
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
        int clip = parse_clip( cmd_arg, 3 );
        
-       if (unit == NULL || dv_unit_is_offline(unit))
+       if ( unit == NULL )
                return RESPONSE_INVALID_UNIT;
        else
        {
                int position = *(int *) cmd_arg->argument;
 
-               switch( dv_unit_set_clip_out( unit, clip, position ) )
+               switch( miracle_unit_set_clip_out( unit, clip, position ) )
                {
                        case -1:
                                return RESPONSE_BAD_FILE;
@@ -373,7 +425,7 @@ int miracle_set_out_point( command_argument cmd_arg )
                                return RESPONSE_OUT_OF_RANGE;
                }
        }
-       */
+
        return RESPONSE_SUCCESS;
 }
 
@@ -396,187 +448,31 @@ int miracle_get_unit_status( command_argument cmd_arg )
 
 int miracle_set_unit_property( command_argument cmd_arg )
 {
-       /*
-       dv_unit unit = miracle_get_unit(cmd_arg->unit);
-       
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
+       char *name_value = (char*) cmd_arg->argument;
        if (unit == NULL)
                return RESPONSE_INVALID_UNIT;
        else
-       {
-               char *key = (char*) cmd_arg->argument;
-               char *value = NULL;
-
-               value = strchr( key, '=' );
-               if (value == NULL)
-                       return RESPONSE_OUT_OF_RANGE;
-               value[0] = 0;
-               value++;
-               miracle_log( LOG_DEBUG, "USET %s = %s", key, value );
-               if ( strncasecmp( key, "eof", 1024) == 0 )
-               {
-                       if ( strncasecmp( value, "pause", 1024) == 0)
-                               dv_unit_set_eof_action( unit, dv_player_pause );
-                       else if ( strncasecmp( value, "loop", 1024) == 0)
-                               dv_unit_set_eof_action( unit, dv_player_loop );
-                       else if ( strncasecmp( value, "stop", 1024) == 0)
-                               dv_unit_set_eof_action( unit, dv_player_terminate );
-                       else if ( strncasecmp( value, "clean", 1024) == 0)
-                               dv_unit_set_eof_action( unit, dv_player_clean_loop );
-                       else
-                               return RESPONSE_OUT_OF_RANGE;
-               }
-               else if ( strncasecmp( key, "points", 1024) == 0 )
-               {
-                       if ( strncasecmp( value, "use", 1024) == 0)
-                               dv_unit_set_mode( unit, dv_clip_mode_restricted );
-                       else if ( strncasecmp( value, "ignore", 1024) == 0)
-                               dv_unit_set_mode( unit, dv_clip_mode_unrestricted );
-                       else
-                               return RESPONSE_OUT_OF_RANGE;
-               }
-               else if ( strncasecmp( key, "syt_offset", 1024) == 0 )
-               {
-                       dv_unit_set_syt_offset( unit, atoi( value ) );
-               }
-               else if ( strncasecmp( key, "cip_n", 1024) == 0 )
-               {
-                       dv_unit_set_cip_n( unit, atoi( value ) );
-               }
-               else if ( strncasecmp( key, "cip_d", 1024) == 0 )
-               {
-                       dv_unit_set_cip_d( unit, atoi( value ) );
-               }
-               else if ( strncasecmp( key, "size", 1024) == 0 )
-               {
-                       dv_unit_set_buffer_size( unit, atoi( value ) );
-               }
-               else if ( strncasecmp( key, "n_frames", 1024) == 0 )
-               {
-                       dv_unit_set_n_frames( unit, atoi( value ) );
-               }               
-               else if ( strncasecmp( key, "n_fill", 1024) == 0 )
-               {
-                       dv_unit_set_n_fill( unit, atoi( value ) );
-               }               
-               else
-                       return RESPONSE_OUT_OF_RANGE;
-       }
-       */
+               miracle_unit_set( unit, name_value );
        return RESPONSE_SUCCESS;
 }
 
 int miracle_get_unit_property( command_argument cmd_arg )
 {
-       /*
-       dv_unit unit = miracle_get_unit(cmd_arg->unit);
-       
+       miracle_unit unit = miracle_get_unit(cmd_arg->unit);
+       char *name = (char*) cmd_arg->argument;
+       char *value = miracle_unit_get( unit, name );
        if (unit == NULL)
                return RESPONSE_INVALID_UNIT;
-       else
-       {
-               char *key = (char*) cmd_arg->argument;
-
-               if ( strncasecmp( key, "eof", 1024) == 0 )
-               {
-                       switch ( dv_unit_get_eof_action( unit ) )
-                       {
-                               case dv_player_pause:
-                                       dv_response_write( cmd_arg->response, "pause", strlen("pause") );
-                                       break;
-                               case dv_player_loop:
-                                       dv_response_write( cmd_arg->response, "loop", strlen("loop") );
-                                       break;
-                               case dv_player_terminate:
-                                       dv_response_write( cmd_arg->response, "stop", strlen("stop") );
-                                       break;
-                               case dv_player_clean_loop:
-                                       dv_response_write( cmd_arg->response, "clean", strlen("clean") );
-                                       break;
-                       }
-                       return RESPONSE_SUCCESS_1;
-               }
-               else if ( strncasecmp( key, "points", 1024) == 0 )
-               {
-                       if ( dv_unit_get_mode( unit ) == dv_clip_mode_restricted )
-                               dv_response_write( cmd_arg->response, "use", strlen("use") );
-                       else
-                               dv_response_write( cmd_arg->response, "ignore", strlen("ignore") );
-                       return RESPONSE_SUCCESS_1;
-               }
-               else if ( strncasecmp( key, "syt_offset", 1024) == 0 )
-               {
-                       dv_response_printf( cmd_arg->response, 1024, "%d\n",
-                               dv_unit_get_syt_offset( unit ) );
-                       return RESPONSE_SUCCESS_1;
-               }
-               else if ( strncasecmp( key, "cip_n", 1024) == 0 )
-               {
-                       dv_response_printf( cmd_arg->response, 1024, "%d\n",
-                               dv_unit_get_cip_n( unit ) );
-                       return RESPONSE_SUCCESS_1;
-               }
-               else if ( strncasecmp( key, "cip_d", 1024) == 0 )
-               {
-                       dv_response_printf( cmd_arg->response, 1024, "%d\n",
-                               dv_unit_get_cip_d( unit ) );
-                       return RESPONSE_SUCCESS_1;
-               }
-               else if ( strncasecmp( key, "size", 1024) == 0 )
-               {
-                       dv_response_printf( cmd_arg->response, 1024, "%d\n",
-                               dv_unit_get_buffer_size( unit ) );
-                       return RESPONSE_SUCCESS_1;
-               }
-               else if ( strncasecmp( key, "n_frames", 1024) == 0 )
-               {
-                       dv_response_printf( cmd_arg->response, 1024, "%d\n",
-                               dv_unit_get_n_frames( unit ) );
-                       return RESPONSE_SUCCESS_1;
-               }
-               else if ( strncasecmp( key, "n_fill", 1024) == 0 )
-               {
-                       dv_response_printf( cmd_arg->response, 1024, "%d\n",
-                               dv_unit_get_n_fill( unit ) );
-                       return RESPONSE_SUCCESS_1;
-               }
-               else if ( strncasecmp( key, "all", 1024 ) == 0 )
-               {
-                       switch ( dv_unit_get_eof_action( unit ) )
-                       {
-                               case dv_player_pause:
-                                       dv_response_write( cmd_arg->response, "eof=pause\n", strlen("pause") );
-                                       break;
-                               case dv_player_loop:
-                                       dv_response_write( cmd_arg->response, "eof=loop\n", strlen("loop") );
-                                       break;
-                               case dv_player_terminate:
-                                       dv_response_write( cmd_arg->response, "eof=stop\n", strlen("stop") );
-                                       break;
-                               case dv_player_clean_loop:
-                                       dv_response_write( cmd_arg->response, "eof=clean\n", strlen("clean") );
-                                       break;
-                       }
-                       if ( dv_unit_get_mode( unit ) == dv_clip_mode_restricted )
-                               dv_response_write( cmd_arg->response, "points=use\n", strlen("use") );
-                       else
-                               dv_response_write( cmd_arg->response, "points=ignore\n", strlen("ignore") );
-                       dv_response_printf( cmd_arg->response, 1024, "syt_offset=%d\n", dv_unit_get_syt_offset( unit ) );
-                       dv_response_printf( cmd_arg->response, 1024, "cip_n=%d\n", dv_unit_get_cip_n( unit ) );
-                       dv_response_printf( cmd_arg->response, 1024, "cip_d=%d\n", dv_unit_get_cip_d( unit ) );
-                       dv_response_printf( cmd_arg->response, 1024, "size=%d\n", dv_unit_get_buffer_size( unit ) );
-                       dv_response_printf( cmd_arg->response, 1024, "n_frames=%d\n", dv_unit_get_n_frames( unit ) );
-                       dv_response_printf( cmd_arg->response, 1024, "n_fill=%d\n", dv_unit_get_n_fill( unit ) );
-               }
-       }
-       */
+       else if ( value != NULL )
+               valerie_response_printf( cmd_arg->response, 1024, "%s\n", value );
        return RESPONSE_SUCCESS;
 }
 
 
 int miracle_transfer( command_argument cmd_arg )
 {
-       /*
-       dv_unit src_unit = miracle_get_unit(cmd_arg->unit);
+       miracle_unit src_unit = miracle_get_unit(cmd_arg->unit);
        int dest_unit_id = -1;
        char *string = (char*) cmd_arg->argument;
        if ( string != NULL && ( string[ 0 ] == 'U' || string[ 0 ] == 'u' ) && strlen( string ) > 1 )
@@ -584,13 +480,12 @@ int miracle_transfer( command_argument cmd_arg )
        
        if ( src_unit != NULL && dest_unit_id != -1 )
        {
-               dv_unit dest_unit = miracle_get_unit( dest_unit_id );
-               if ( dest_unit != NULL && !dv_unit_is_offline(dest_unit) && dest_unit != src_unit )
+               miracle_unit dest_unit = miracle_get_unit( dest_unit_id );
+               if ( dest_unit != NULL && !miracle_unit_is_offline(dest_unit) && dest_unit != src_unit )
                {
-                       dv_unit_transfer( dest_unit, src_unit );
+                       miracle_unit_transfer( dest_unit, src_unit );
                        return RESPONSE_SUCCESS;
                }
        }
-       */
        return RESPONSE_INVALID_UNIT;
 }