blob: 012c068f7a54a24ae3010825170b11c251679d1e [file] [log] [blame]
/*
The mediastreamer library aims at providing modular media processing and I/O
for linphone, but also for any telephony application.
Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef MS_SYNC_H
#define MS_SYNC_H
#include "msfilter.h"
struct _MSSync
{
struct _MSSyncClass *klass;
GMutex *lock;
MSFilter **attached_filters; /* pointer to a table of pointer of filters*/
GList *execution_list; /* the list of filters to be executed. This is filled with compilation */
gint filters; /*number of filters attached to the sync */
gint run; /* flag to indicate whether the sync must be run or not */
GThread * thread; /* the thread ressource if this sync is run by a thread*/
GCond *thread_cond;
GCond *stop_cond;
guint32 flags;
gint interval; /* in miliseconds*/
#define MS_SYNC_NEED_UPDATE (0x0001) /* a modification has occured in the processing chains
attached to this sync; so the execution list has to be updated */
guint samples_per_tick; /* number of bytes produced by sources of the processing chains*/
guint32 ticks;
guint32 time; /* a time since the start of the sync expressed in milisec*/
};
typedef struct _MSSync MSSync;
typedef void (*MSSyncDestroyFunc)(MSSync*);
typedef void (*MSSyncSyncFunc)(MSSync*);
typedef int (*MSSyncAttachFunc)(MSSync*,MSFilter*);
typedef int (*MSSyncDetachFunc)(MSSync*,MSFilter*);
typedef struct _MSSyncClass
{
gint max_filters; /* the maximum number of filters that can be attached to this sync*/
MSSyncSyncFunc synchronize;
MSSyncDestroyFunc destroy;
MSSyncAttachFunc attach;
MSSyncDetachFunc detach;
} MSSyncClass;
/* private */
void ms_sync_init(MSSync *sync);
void ms_sync_class_init(MSSyncClass *klass);
int ms_sync_attach_generic(MSSync *sync,MSFilter *f);
int ms_sync_detach_generic(MSSync *sync,MSFilter *f);
/* public*/
#define MS_SYNC(sync) ((MSSync*)(sync))
#define MS_SYNC_CLASS(klass) ((MSSyncClass*)(klass))
#define ms_sync_synchronize(_sync) \
do \
{ \
MSSync *__sync=_sync; \
__sync->ticks++; \
((__sync)->klass->synchronize((__sync))); \
}while(0)
void ms_sync_setup(MSSync *sync);
void ms_sync_unsetup(MSSync *sync);
#define ms_sync_update(sync) (sync)->flags|=MS_SYNC_NEED_UPDATE
#define ms_sync_get_samples_per_tick(sync) ((sync)->samples_per_tick)
void ms_sync_set_samples_per_tick(MSSync *sync,gint size);
#define ms_sync_get_tick_count(sync) ((sync)->ticks)
#define ms_sync_suspend(sync) g_cond_wait((sync)->thread_cond,(sync)->lock)
#define ms_sync_lock(sync) g_mutex_lock((sync)->lock)
#define ms_sync_unlock(sync) g_mutex_unlock((sync)->lock)
#define ms_sync_trylock(sync) g_mutex_trylock((sync)->lock)
/**
* function_name:ms_sync_attach
* @sync: A #MSSync object.
* @f: A #MSFilter object.
*
* Attach a chain of filters to a synchronisation source. Filter @f must be the first filter of the processing chain.
*
* Returns: 0 if successfull, a negative value reprensenting the errno.h error.
*/
int ms_sync_attach(MSSync *sync,MSFilter *f);
/**
* ms_sync_detach:
* @sync: A #MSSync object.
* @f: A #MSFilter object.
*
* Dettach a chain of filters to a synchronisation source. Filter @f must be the first filter of the processing chain.
* The processing chain will no more be executed.
*
* Returns: 0 if successfull, a negative value reprensenting the errno.h error.
*/
int ms_sync_detach(MSSync *sync,MSFilter *f);
int ms_sync_uninit(MSSync *sync);
#define ms_sync_start(sync) ms_start((sync))
#define ms_sync_stop(sync) ms_stop((sync))
/*destroy*/
#define ms_sync_destroy(sync) (sync)->klass->destroy((sync))
#endif