-Fri Nov 20 16:02:03 CST 2009
+Mon Nov 23 10:00:46 CST 2009
/**
* Create MPF engine.
- * @param rate the rate (n times faster than real-time)
* @param pool the pool to allocate memory from
*/
-MPF_DECLARE(mpf_engine_t*) mpf_engine_create(unsigned long rate, apr_pool_t *pool);
+MPF_DECLARE(mpf_engine_t*) mpf_engine_create(apr_pool_t *pool);
/**
* Create MPF codec manager.
*/
MPF_DECLARE(apt_bool_t) mpf_engine_message_send(mpf_engine_t *engine, mpf_task_msg_t **task_msg);
+/**
+ * Set scheduler rate.
+ * @param engine the engine to set rate for
+ * @param rate the rate (n times faster than real-time)
+ */
+MPF_DECLARE(apt_bool_t) mpf_engine_scheduler_rate_set(mpf_engine_t *engine, unsigned long rate);
+
APT_END_EXTERN_C
typedef void (*mpf_scheduler_proc_f)(mpf_scheduler_t *scheduler, void *obj);
/** Create scheduler */
-MPF_DECLARE(mpf_scheduler_t*) mpf_scheduler_create(unsigned long rate, apr_pool_t *pool);
+MPF_DECLARE(mpf_scheduler_t*) mpf_scheduler_create(apr_pool_t *pool);
/** Destroy scheduler */
MPF_DECLARE(void) mpf_scheduler_destroy(mpf_scheduler_t *scheduler);
mpf_scheduler_proc_f proc,
void *obj);
+/** Set scheduler rate (n times faster than real-time) */
+MPF_DECLARE(apt_bool_t) mpf_scheduler_rate_set(
+ mpf_scheduler_t *scheduler,
+ unsigned long rate);
+
/** Start scheduler */
MPF_DECLARE(apt_bool_t) mpf_scheduler_start(mpf_scheduler_t *scheduler);
mpf_codec_t* mpf_codec_g711u_create(apr_pool_t *pool);
mpf_codec_t* mpf_codec_g711a_create(apr_pool_t *pool);
-MPF_DECLARE(mpf_engine_t*) mpf_engine_create(unsigned long rate, apr_pool_t *pool)
+MPF_DECLARE(mpf_engine_t*) mpf_engine_create(apr_pool_t *pool)
{
apt_task_vtable_t *vtable;
apt_task_msg_pool_t *msg_pool;
engine->request_queue = apt_cyclic_queue_create(CYCLIC_QUEUE_DEFAULT_SIZE);
apr_thread_mutex_create(&engine->request_queue_guard,APR_THREAD_MUTEX_UNNESTED,engine->pool);
- engine->scheduler = mpf_scheduler_create(rate,engine->pool);
+ engine->scheduler = mpf_scheduler_create(engine->pool);
mpf_scheduler_media_clock_set(engine->scheduler,CODEC_FRAME_TIME_BASE,mpf_engine_main,engine);
engine->timer_manager = mpf_timer_manager_create(engine->scheduler,engine->pool);
engine->codec_manager = codec_manager;
return TRUE;
}
+
+MPF_DECLARE(apt_bool_t) mpf_engine_scheduler_rate_set(mpf_engine_t *engine, unsigned long rate)
+{
+ return mpf_scheduler_rate_set(engine->scheduler,rate);
+}
struct mpf_scheduler_t {
apr_pool_t *pool;
unsigned long resolution; /* scheduler resolution */
- unsigned long rate; /* faster than real-time simulation */
unsigned long media_resolution;
mpf_scheduler_proc_f media_proc;
static APR_INLINE void mpf_scheduler_init(mpf_scheduler_t *scheduler);
/** Create scheduler */
-MPF_DECLARE(mpf_scheduler_t*) mpf_scheduler_create(unsigned long rate, apr_pool_t *pool)
+MPF_DECLARE(mpf_scheduler_t*) mpf_scheduler_create(apr_pool_t *pool)
{
mpf_scheduler_t *scheduler = apr_palloc(pool,sizeof(mpf_scheduler_t));
mpf_scheduler_init(scheduler);
scheduler->pool = pool;
scheduler->resolution = 0;
- if(rate == 0 || rate > 10) {
- /* rate shows how many times scheduler should be faster than real-time,
- 1 is the defualt and probably the only reasonable value,
- however, the rates up to 10 times faster should be acceptable */
- rate = 1;
- }
- scheduler->rate = rate;
scheduler->media_resolution = 0;
scheduler->media_obj = NULL;
mpf_scheduler_proc_f proc,
void *obj)
{
- scheduler->media_resolution = resolution / scheduler->rate;
+ scheduler->media_resolution = resolution;
scheduler->media_proc = proc;
scheduler->media_obj = obj;
return TRUE;
mpf_scheduler_proc_f proc,
void *obj)
{
- scheduler->timer_resolution = resolution / scheduler->rate;
+ scheduler->timer_resolution = resolution;
scheduler->timer_elapsed_time = 0;
scheduler->timer_proc = proc;
scheduler->timer_obj = obj;
return TRUE;
}
+/** Set scheduler rate (n times faster than real-time) */
+MPF_DECLARE(apt_bool_t) mpf_scheduler_rate_set(
+ mpf_scheduler_t *scheduler,
+ unsigned long rate)
+{
+ if(rate == 0 || rate > 10) {
+ /* rate shows how many times scheduler should be faster than real-time,
+ 1 is the defualt and probably the only reasonable value,
+ however, the rates up to 10 times faster should be acceptable */
+ rate = 1;
+ }
+
+ scheduler->media_resolution /= rate;
+ scheduler->timer_resolution /= rate;
+ return TRUE;
+}
+
static APR_INLINE void mpf_scheduler_resolution_set(mpf_scheduler_t *scheduler)
{
if(scheduler->media_resolution) {
}
}
apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Loading Media Engine");
- media_engine = mpf_engine_create(rate,pool);
+ media_engine = mpf_engine_create(pool);
if(media_engine) {
+ mpf_engine_scheduler_rate_set(media_engine,rate);
mrcp_client_media_engine_register(client,media_engine,name);
}
}
}
}
apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Loading Media Engine");
- media_engine = mpf_engine_create(rate,pool);
+ media_engine = mpf_engine_create(pool);
if(media_engine) {
+ mpf_engine_scheduler_rate_set(media_engine,rate);
mrcp_server_media_engine_register(server,media_engine,name);
}
}
suite_engine = apr_palloc(suite->pool,sizeof(mpf_suite_engine_t));
- engine = mpf_engine_create(1,suite->pool);
+ engine = mpf_engine_create(suite->pool);
if(!engine) {
apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Create MPF Engine");
return FALSE;