|
|
|
/*
|
|
|
|
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., 51 Franklin Street, Fifth Floor, 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
|