# HG changeset patch # User anders # Date 1033903574 0 # Node ID c67328dd459a05aa0105ac6c3a85849f2fe8a95f # Parent ce6a938aa6d35b7af35a58257b64e18937836efd Adding Support for non-reentrant audio filters diff -r ce6a938aa6d3 -r c67328dd459a libaf/af.c --- a/libaf/af.c Sun Oct 06 11:23:02 2002 +0000 +++ b/libaf/af.c Sun Oct 06 11:26:14 2002 +0000 @@ -41,8 +41,23 @@ return NULL; } +/* Find filter in the dynamic filter list using it's name This + function is used for finding already initialized filters */ +af_instance_t* af_get(af_stream_t* s, char* name) +{ + af_instance_t* af=s->first; + // Find the filter + while(af != NULL){ + printf("%s\n",af->info->name); + if(!strcmp(af->info->name,name)) + return af; + af=af->next; + } + return NULL; +} + // Function for creating a new filter of type name -af_instance_t* af_create(char* name) +af_instance_t* af_create(af_stream_t* s, char* name) { // Allocate space for the new filter and reset all pointers af_instance_t* new=malloc(sizeof(af_instance_t)); @@ -53,10 +68,20 @@ memset(new,0,sizeof(af_instance_t)); // Find filter from name - new->info=af_find(name); - + if(NULL == (new->info=af_find(name))) + return NULL; + + // Make sure that the filter is not already in the list if it is non-reentrant + if(new->info->flags & AF_FLAGS_NOT_REENTRANT){ + if(af_get(s,name)){ + mp_msg(MSGT_AFILTER,MSGL_ERR,"There can only be one instance of the filter '%s' in each stream\n",name); + free(new); + return NULL; + } + } + // Initialize the new filter - if(new->info && (AF_OK==new->info->open(new))) + if(AF_OK==new->info->open(new)) return new; free(new); @@ -70,7 +95,7 @@ af_instance_t* af_prepend(af_stream_t* s, af_instance_t* af, char* name) { // Create the new filter and make sure it is OK - af_instance_t* new=af_create(name); + af_instance_t* new=af_create(s,name); if(!new) return NULL; // Update pointers @@ -94,7 +119,7 @@ af_instance_t* af_append(af_stream_t* s, af_instance_t* af, char* name) { // Create the new filter and make sure it is OK - af_instance_t* new=af_create(name); + af_instance_t* new=af_create(s,name); if(!new) return NULL; // Update pointers @@ -213,19 +238,6 @@ return AF_OK; } -/* Find filter in the dynamic filter list using it's name This - function is used for finding already initialized filters */ -af_instance_t* af_get(af_stream_t* s, char* name) -{ - af_instance_t* af=s->first; - while(af->next != NULL){ - if(!strcmp(af->info->name,name)) - return af; - af=af->next; - } - return NULL; -} - // Uninit and remove all filters void af_uninit(af_stream_t* s) { diff -r ce6a938aa6d3 -r c67328dd459a libaf/af.h --- a/libaf/af.h Sun Oct 06 11:23:02 2002 +0000 +++ b/libaf/af.h Sun Oct 06 11:26:14 2002 +0000 @@ -21,6 +21,10 @@ int d; // Denominator } frac_t; +// Flags used for defining the behavour of an audio filter +#define AF_FLAGS_REENTRANT 0x00000000 +#define AF_FLAGS_NOT_REENTRANT 0x00000001 + /* Audio filter information not specific for current instance, but for a specific filter */ typedef struct af_info_s @@ -29,6 +33,7 @@ const char *name; const char *author; const char *comment; + const int flags; int (*open)(struct af_instance_s* vf); } af_info_t; diff -r ce6a938aa6d3 -r c67328dd459a libaf/af_channels.c --- a/libaf/af_channels.c Sun Oct 06 11:23:02 2002 +0000 +++ b/libaf/af_channels.c Sun Oct 06 11:26:14 2002 +0000 @@ -168,5 +168,6 @@ "channels", "Anders", "", + AF_FLAGS_REENTRANT, open }; diff -r ce6a938aa6d3 -r c67328dd459a libaf/af_delay.c --- a/libaf/af_delay.c Sun Oct 06 11:23:02 2002 +0000 +++ b/libaf/af_delay.c Sun Oct 06 11:26:14 2002 +0000 @@ -140,6 +140,7 @@ "delay", "Anders", "", + AF_FLAGS_REENTRANT, open }; diff -r ce6a938aa6d3 -r c67328dd459a libaf/af_dummy.c --- a/libaf/af_dummy.c Sun Oct 06 11:23:02 2002 +0000 +++ b/libaf/af_dummy.c Sun Oct 06 11:26:14 2002 +0000 @@ -56,5 +56,6 @@ "dummy", "Anders", "", + AF_FLAGS_REENTRANT, open }; diff -r ce6a938aa6d3 -r c67328dd459a libaf/af_format.c --- a/libaf/af_format.c Sun Oct 06 11:23:02 2002 +0000 +++ b/libaf/af_format.c Sun Oct 06 11:26:14 2002 +0000 @@ -287,5 +287,6 @@ "format", "Anders", "", + AF_FLAGS_REENTRANT, open }; diff -r ce6a938aa6d3 -r c67328dd459a libaf/af_resample.c --- a/libaf/af_resample.c Sun Oct 06 11:23:02 2002 +0000 +++ b/libaf/af_resample.c Sun Oct 06 11:26:14 2002 +0000 @@ -331,6 +331,7 @@ "resample", "Anders", "", + AF_FLAGS_REENTRANT, open };