Fixed error in Vorbis I specification for limiting residue vector size
[platform/upstream/libvorbis.git] / lib / tone.c
index 3cc32b3..5b8b020 100644 (file)
@@ -1,31 +1,53 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <math.h>
+#include <string.h>
 
 void usage(){
-  fprintf(stderr,"tone <frequency_Hz> [<amplitude>]\n");
+  fprintf(stderr,"tone <frequency_Hz>,[<amplitude>] [<frequency_Hz>,[<amplitude>]...]\n");
   exit(1);
 }
 
 int main (int argc,char *argv[]){
-  int i;
-  double f;
-  double amp=32767.;
+  int i,j;
+  double *f;
+  double *amp;
 
   if(argc<2)usage();
-  f=atof(argv[1]);
-  if(argc>=3)amp=atof(argv[2])*32767.;
+
+  f=alloca(sizeof(*f)*(argc-1));
+  amp=alloca(sizeof(*amp)*(argc-1));
+
+  i=0;
+  while(argv[i+1]){
+    char *pos=strchr(argv[i+1],',');
+
+    f[i]=atof(argv[i+1]);
+    if(pos)
+      amp[i]=atof(pos+1)*32767.f;
+    else
+      amp[i]=32767.f;
+
+    fprintf(stderr,"%g Hz, %g amp\n",f[i],amp[i]);
+
+    i++;
+  }
 
   for(i=0;i<44100*10;i++){
-    long val=rint(amp*sin(i/44100.*f*2*M_PI));
-    if(val>32767.)val=32767.;
-    if(val<-32768.)val=-32768.;
+    float val=0;
+    int ival;
+    for(j=0;j<argc-1;j++)
+      val+=amp[j]*sin(i/44100.f*f[j]*2*M_PI);
+    ival=rint(val);
+
+    if(ival>32767.f)ival=32767.f;
+    if(ival<-32768.f)ival=-32768.f;
 
     fprintf(stdout,"%c%c%c%c",
-           (char)(val&0xff),
-           (char)((val>>8)&0xff),
-           (char)(val&0xff),
-           (char)((val>>8)&0xff));
+            (char)(ival&0xff),
+            (char)((ival>>8)&0xff),
+            (char)(ival&0xff),
+            (char)((ival>>8)&0xff));
   }
   return(0);
 }