diff libao2/pl_delay.c @ 3107:ef2287ccc42b

Changes to audio out plugin, first plugin added
author anders
date Sun, 25 Nov 2001 14:29:54 +0000
parents
children 1648d11fc36c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libao2/pl_delay.c	Sun Nov 25 14:29:54 2001 +0000
@@ -0,0 +1,120 @@
+/* This is a null audio out plugin it doesnt't really do anything
+   useful but serves an example of how audio plugins work. It delays
+   the output signal by the nuber of samples set by aop_delay n
+   where n is the number of bytes.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "audio_out.h"
+#include "audio_plugin.h"
+#include "audio_plugin_internal.h"
+#include "afmt.h"
+
+static ao_info_t info =
+{
+        "Null audio plugin",
+        "delay",
+        "Anders",
+        ""
+};
+
+LIBAO_PLUGIN_EXTERN(delay)
+
+// local data
+typedef struct pl_delay_s
+{
+  void* data;       // local audio data block
+  void* delay; 	    // data block used for delaying audio signal
+  int len;          // local buffer length
+  int rate;         // local data rate
+  int channels;     // local number of channels
+  int format;       // local format
+
+} pl_delay_t;
+
+static pl_delay_t pl_delay={NULL,NULL,0,0,0,0};
+
+// global data
+int pl_delay_len=0; // number of samples to delay sound output set from cmd line
+
+// to set/get/query special features/parameters
+static int control(int cmd,int arg){
+  switch(cmd){
+  case AOCONTROL_PLUGIN_SET_LEN:
+    if(pl_delay.data) 
+      uninit();
+    pl_delay.len = arg;
+    pl_delay.data=(void*)malloc(arg);
+    return CONTROL_OK;
+  }
+  return -1;
+}
+
+// open & setup audio device
+// return: 1=success 0=fail
+static int init(){
+  int i=0;
+  float time_delay; // The number of tsamples this plugin delays the output data
+  /* if the output format of any of the below parameters differs from
+     what is give it should be changed. See ao_plugin init() */
+  pl_delay.rate=ao_plugin_data.rate;
+  pl_delay.channels=ao_plugin_data.channels+1; //0=mono 1=stereo
+  pl_delay.format=ao_plugin_data.format;
+
+  // Tell ao_plugin how much this plugin adds to the overall time delay
+  time_delay=-1*(float)pl_delay_len/((float)pl_delay.channels*(float)pl_delay.rate);
+  if(pl_delay.format != AFMT_U8 && pl_delay.format != AFMT_S8)
+    time_delay/=2;
+  ao_plugin_data.delay_fix+=time_delay;
+
+  pl_delay.delay=(void*)malloc(pl_delay_len);
+  if(!pl_delay.delay)
+    return 0;
+  for(i=0;i<pl_delay_len;i++)
+    ((char*)pl_delay.delay)[i]=0;
+  printf("[pl_delay] Output sound delayed by %i bytes\n",pl_delay_len);
+  return 1;
+}
+
+// close plugin
+static void uninit(){
+  if(pl_delay.delay) 
+    free(pl_delay.delay);
+  if(pl_delay.data) 
+    free(pl_delay.data);
+  pl_delay_len=0;
+}
+
+// empty buffers
+static void reset(){
+  int i = 0;
+  for(i=0;i<pl_delay.len;i++)
+    ((char*)pl_delay.data)[i]=0;
+  for(i=0;i<pl_delay_len;i++)
+    ((char*)pl_delay.delay)[i]=0;
+}
+
+// processes 'ao_plugin_data.len' bytes of 'data'
+// called for every block of data
+static int play(){
+  int i=0;
+  int j=0;
+  int k=0;
+  // Copy end of prev block to begining of buffer
+  for(i=0;i<pl_delay_len;i++,j++)
+    ((char*)pl_delay.data)[j]=((char*)pl_delay.delay)[i];
+  // Copy current block except end
+  for(i=0;i<ao_plugin_data.len-pl_delay_len;i++,j++,k++)
+    ((char*)pl_delay.data)[j]=((char*)ao_plugin_data.data)[k];
+  // Save away end of current block for next call
+  for(i=0;i<pl_delay_len;i++,k++)
+    ((char*)pl_delay.delay)[i]=((char*)ao_plugin_data.data)[k];
+  // Set output data block
+  ao_plugin_data.data=pl_delay.data;
+  return 1;
+}
+
+
+