changeset 7615:c67328dd459a

Adding Support for non-reentrant audio filters
author anders
date Sun, 06 Oct 2002 11:26:14 +0000
parents ce6a938aa6d3
children d09c125a88fa
files libaf/af.c libaf/af.h libaf/af_channels.c libaf/af_delay.c libaf/af_dummy.c libaf/af_format.c libaf/af_resample.c
diffstat 7 files changed, 41 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- 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)
 {
--- 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;
 
--- 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
 };
--- 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
 };
 
--- 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
 };
--- 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
 };
--- 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
 };