Audio

 view release on metacpan or  search on metacpan

Data/Data.xs  view on Meta::CPAN

  }
 else
  {
   float *d = Audio_more(aTHX_ lau,1);
   *d = (float) SvNV(sv);
  }
}

Audio *
Audio_overload_init(pTHX_ Audio *lau, SV **argp,int dorev, SV *right, SV *rev)
{
 SV *left  = argp[0];
 if (SvOK(rev))
  {
   /* Not assignment form */
   char *type = AUDIO_CLASS(left);
   SV *tsv = Nullsv;
   Audio *tau = Audio_new(aTHX_ &tsv,lau->rate,lau->flags,0,type);
   if (dorev && SvTRUE(rev))
    {
     SV *tsv = left;
     left    = right;
     argp[1] = tsv;
    }
   Audio_append_sv(aTHX_ tau,left);
   argp[0] = tsv;
   return tau;
  }
 return lau;
}

MODULE = Audio::Data	PACKAGE = Audio::Data	PREFIX = Audio_

PROTOTYPES: DISABLE

SV *
Audio_shorts(au)
Audio *	au;

void
Audio_silence(au, time = 0.1)
Audio *	au;
float	time;

void
Audio_tone(au,freq,dur = 0.1, amp = 0.5)
Audio *	au;
float	freq;
float	dur
float	amp

void
Audio_noise(au,dur = 0.1, amp = 0.5)
Audio *	au;
float	dur
float	amp

void
DESTROY(au)
Audio *	au
PPCODE:
 {
  if (au->comment)
   SvREFCNT_dec(au->comment);
  if (au->data)
   SvREFCNT_dec(au->data);
 }

Audio *
create(class)
char *	class
PREINIT:
  Audio x;
CODE:
 {
  Zero(&x,1,Audio);
  x.comment = newSV(0);
  x.data    = newSVpv("",0);
  RETVAL    = &x;
 }
OUTPUT:
  RETVAL

void
Audio_clone(Audio *au)
CODE:
{
 SV *result = Nullsv;
 Audio *rau = Audio_new(aTHX_ &result,au->rate,au->flags,0,AUDIO_CLASS(ST(0)));
 Audio_append_sv(aTHX_ rau, ST(0));
 ST(0) = result;
 XSRETURN(1);
}

void
Audio_timerange(Audio *au, float t0, float t1)
CODE:
{
 SV *result = Nullsv;
 UV samples = Audio_samples(au);
 UV start = au->rate*t0;
 UV end   = au->rate*t1+0.5;
 Audio *rau = Audio_new(aTHX_ &result,au->rate,au->flags,end-start,AUDIO_CLASS(ST(0)));
 if (start < samples)
  {
   float *d   = AUDIO_DATA(rau);
   float *s   = AUDIO_DATA(au)+start;
   if (end > samples)
    end = samples;
   Copy(s,d,(end-start)*AUDIO_WORDS(au),float);
  }
 ST(0) = result;
 XSRETURN(1);
}

void
Audio_bounds(Audio *au, float t0 = 0.0, float t1 = Audio_duration(au))
CODE:
{
 UV samples = Audio_samples(au);
 UV start = au->rate*t0;

Data/Data.xs  view on Meta::CPAN

  Zero(&tmp,1,Audio);
  tmp.data = newSVpvn("",0);
  tmp.rate = au->rate;
  d = Audio_more(aTHX_ &tmp,n);
  Audio_difference(n,x,d);
  sv_setref_pvn((ST(0) = sv_2mortal(newSV(0))),"Audio::Data",(char *)&tmp,sizeof(tmp));
  XSRETURN(1);
 }

void
Audio_lpc(Audio *au,int order,SV *ac = 0, SV *rf = 0)
CODE:
{
 char *type = AUDIO_CLASS(ST(0));
 SV *result = Nullsv;
 Audio *lpc = Audio_new(aTHX_ &result,au->rate, 0, order+1,type);
 float *acf = AUDIO_DATA(Audio_new(aTHX_ &ac, au->rate, 0, order+1,type));
 float *ref = AUDIO_DATA(Audio_new(aTHX_ &rf, au->rate, 0, order+1,type));
 int length = Audio_samples(au);
 float *sig = AUDIO_DATA(au);
 if (AUDIO_COMPLEX(au))
  croak("Cannot process complex data");
 order = Audio_lpc(length,sig,order,acf,ref,AUDIO_DATA(lpc));
 ST(0) = result;
 XSRETURN(1);
}


void
Audio_durbin(au)
Audio * au
CODE:
 {
  int n = Audio_samples(au);
  SV *result = Nullsv;
  Audio *tmp = Audio_new(aTHX_ &result,au->rate,au->flags,n,AUDIO_CLASS(ST(0)));
  float *x = AUDIO_DATA(au);
  float *d = AUDIO_DATA(tmp);
  if (AUDIO_COMPLEX(au))
   croak("Cannot process complex data");
  Audio_durbin(n-1,x,d);
  ST(0) = result;
  XSRETURN(1);
 }

void
Audio_conjugate(au,right,rev)
Audio *		au
SV *		right
SV *		rev
CODE:
 {
  ST(2) = &PL_sv_no;
  au = Audio_overload_init(aTHX_ au, &ST(0),0,right,rev);
  Audio_conjugate(Audio_samples(au),Audio_complex(au),1.0);
 }

void
Audio_data(au,...)
Audio *		au
PPCODE:
 {
  int gimme = GIMME_V;
  if (items > 1)
   {
    int i;
    au->flags &= ~AUDIO_F_COMPLEX;
    SvCUR(au->data) = 0;
    for (i=1; i < items; i++)
     {
      Audio_append_sv(aTHX_ au,ST(i));
     }
   }
  if (gimme == G_VOID)
   {
    XSRETURN(0);
   }
  else if (gimme == G_ARRAY)
   {
    STRLEN sz;
    int count = 0;
    float *p = (float *) SvPV(au->data,sz);
    while (sz >= sizeof(float))
     {
      double d = *p++;
      XPUSHs(sv_2mortal(newSVnv(d)));
      sz -= sizeof(float);
      count++;
     }
    XSRETURN(count);
   }
  else
   {
    XPUSHs(SvREFCNT_inc(au->data));
    XSRETURN(1);
   }
 }

void
Audio_dB(au,start = 0, count = (GIMME == G_ARRAY) ? Audio_samples(au)-start : 1)
Audio *		au
int		start
int		count
PPCODE:
 {
  int n = Audio_samples(au);
  float *p = AUDIO_DATA(au)+start*AUDIO_WORDS(au);
  /* Min noticable value in 16bit is 1/(2**15) - call that 100dB */
  float min = 1.0/(1 << 15);
  float dB0 = 10*log10(min);
  if (start+count > n)
   count = n - start;
  if (AUDIO_COMPLEX(au))
   {
    for (n=0; n < count; n++)
     {
      float r = *p++;
      float i = *p++;
      r = sqrt(r*r+i*i);
      /* hack to avoid log10(0) yielding NaN or fault */
      if (r < min)
       r = min;
      XPUSHs(sv_2mortal(newSVnv(10*log10(r)-dB0)));
     }
   }
  else
   {
    for (n=0; n < count; n++)
     {
      float r = *p++;
      if (r < 0)
       r = -r;
      /* hack to avoid log10(0) yielding NaN or fault */
      if (r < min)
       r = min;
      XPUSHs(sv_2mortal(newSVnv(10*log10(r)-dB0)));
     }
   }
  XSRETURN(count);
 }

void
Audio_amplitude(au,start = 0, count = (GIMME == G_ARRAY) ? Audio_samples(au)-start : 1)
Audio *		au
int		start
int		count
PPCODE:
 {
  int n = Audio_samples(au);
  float *p = AUDIO_DATA(au)+start*AUDIO_WORDS(au);
  if (start+count > n)
   count = n - start;
  if (AUDIO_COMPLEX(au))
   {
    for (n=0; n < count; n++)
     {
      float r = *p++;
      float i = *p++;
      XPUSHs(sv_2mortal(newSVnv(sqrt(r*r+i*i))));
     }
   }
  else
   {
    for (n=0; n < count; n++)
     {
      float r = *p++;
      XPUSHs(sv_2mortal(newSVnv(r)));
     }
   }
  XSRETURN(count);
 }

void
Audio_phase(au,start = 0, count = (GIMME == G_ARRAY) ? Audio_samples(au)-start : 1)
Audio *		au
int		start
int		count
PPCODE:
 {
  int n = Audio_samples(au);
  float *p = AUDIO_DATA(au)+start*AUDIO_WORDS(au);
  if (start+count > n)
   count = n - start;
  if (AUDIO_COMPLEX(au))
   {
    for (n=0; n < count; n++)
     {
      float r = *p++;
      float i = *p++;
      XPUSHs(sv_2mortal(newSVnv(atan2(i,r))));
     }
   }
  else
   {
    for (n=0; n < count; n++)
     {
      XPUSHs(sv_2mortal(newSVnv(0)));
     }
   }
  XSRETURN(count);
 }


void
Audio_Load(au,fh)
Audio *		au
InputStream	fh

void
Audio_Save(au,fh,comment = NULL)
Audio *		au
OutputStream	fh
char *		comment

MODULE = Audio::Data	PACKAGE = Audio::Filter::AllPole	PREFIX = AllPole_

void
AllPole_process(au,...)
Audio *		au
PPCODE:
 {
  XSRETURN(Audio_filter_process(aTHX_ au,&Audio_AllPole,items,&ST(0)));
 }

MODULE = Audio::Data	PACKAGE = Audio::Filter::FIR	PREFIX = FIR_

void
FIR_process(au,...)
Audio *		au
PPCODE:
 {
  XSRETURN(Audio_filter_process(aTHX_ au,&Audio_FIR,items,&ST(0)));
 }


MODULE = Audio::Data	PACKAGE = Audio::Data	PREFIX = AUDIO_

void
AUDIO_r2_fft(au)
Audio *		au

void
AUDIO_r2_ifft(au)
Audio *		au

void
AUDIO_r4_fft(au)
Audio *		au

void
AUDIO_r4_ifft(au)
Audio *		au

void
AUDIO_complex_debug(au,f = PerlIO_stdout())
Audio *		au
OutputStream	f

BOOT:
 {
  sv_setiv(perl_get_sv("Audio::Data::AudioVtab",1),(IV) AudioVGet());
 }



( run in 1.216 second using v1.01-cache-2.11-cpan-71847e10f99 )