2 * consumer_null.c -- a null consumer
3 * Copyright (C) 2003-2004 Ushodaya Enterprises Limited
4 * Author: Charles Yates <charles.yates@pandora.be>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <framework/mlt_consumer.h>
23 #include <framework/mlt_frame.h>
25 // System header files
31 // Forward references.
32 static int consumer_start( mlt_consumer this );
33 static int consumer_stop( mlt_consumer this );
34 static int consumer_is_stopped( mlt_consumer this );
35 static void *consumer_thread( void *arg );
36 static void consumer_close( mlt_consumer this );
38 /** Initialise the dv consumer.
41 mlt_consumer consumer_null_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg )
43 // Allocate the consumer
44 mlt_consumer this = mlt_consumer_new( profile );
46 // If memory allocated and initialises without error
49 // Assign close callback
50 this->close = consumer_close;
52 // Set up start/stop/terminated callbacks
53 this->start = consumer_start;
54 this->stop = consumer_stop;
55 this->is_stopped = consumer_is_stopped;
62 /** Start the consumer.
65 static int consumer_start( mlt_consumer this )
68 mlt_properties properties = MLT_CONSUMER_PROPERTIES( this );
70 // Check that we're not already running
71 if ( !mlt_properties_get_int( properties, "running" ) )
74 pthread_t *thread = calloc( 1, sizeof( pthread_t ) );
76 // Assign the thread to properties
77 mlt_properties_set_data( properties, "thread", thread, sizeof( pthread_t ), free, NULL );
79 // Set the running state
80 mlt_properties_set_int( properties, "running", 1 );
81 mlt_properties_set_int( properties, "joined", 0 );
84 pthread_create( thread, NULL, consumer_thread, this );
89 /** Stop the consumer.
92 static int consumer_stop( mlt_consumer this )
95 mlt_properties properties = MLT_CONSUMER_PROPERTIES( this );
97 // Check that we're running
98 if ( !mlt_properties_get_int( properties, "joined" ) )
101 pthread_t *thread = mlt_properties_get_data( properties, "thread", NULL );
104 mlt_properties_set_int( properties, "running", 0 );
105 mlt_properties_set_int( properties, "joined", 1 );
107 // Wait for termination
109 pthread_join( *thread, NULL );
115 /** Determine if the consumer is stopped.
118 static int consumer_is_stopped( mlt_consumer this )
120 // Get the properties
121 mlt_properties properties = MLT_CONSUMER_PROPERTIES( this );
122 return !mlt_properties_get_int( properties, "running" );
125 /** The main thread - the argument is simply the consumer.
128 static void *consumer_thread( void *arg )
130 // Map the argument to the object
131 mlt_consumer this = arg;
133 // Get the properties
134 mlt_properties properties = MLT_CONSUMER_PROPERTIES( this );
136 // Convenience functionality
137 int terminate_on_pause = mlt_properties_get_int( properties, "terminate_on_pause" );
141 mlt_frame frame = NULL;
143 // Loop while running
144 while( !terminated && mlt_properties_get_int( properties, "running" ) )
147 frame = mlt_consumer_rt_frame( this );
149 // Check for termination
150 if ( terminate_on_pause && frame != NULL )
151 terminated = mlt_properties_get_double( MLT_FRAME_PROPERTIES( frame ), "_speed" ) == 0.0;
153 // Check that we have a frame to work with
157 mlt_events_fire( properties, "consumer-frame-show", frame, NULL );
158 mlt_frame_close( frame );
162 // Indicate that the consumer is stopped
163 mlt_properties_set_int( properties, "running", 0 );
164 mlt_consumer_stopped( this );
169 /** Close the consumer.
172 static void consumer_close( mlt_consumer this )
175 mlt_consumer_stop( this );
178 mlt_consumer_close( this );