Audio
view release on metacpan or search on metacpan
Data/Data.xs view on Meta::CPAN
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;
UV end = au->rate*t1+0.5;
if (start < samples)
{
float *s = AUDIO_DATA(au)+start;
float *e;
float max = *s++;
float min = max;
if (end > samples)
end = samples;
e = AUDIO_DATA(au)+end;
while (s < e)
{
float v = *s++;
if (v > max) max = v;
if (v < min) min = v;
}
ST(0) = sv_2mortal(newSVnv(max));
ST(1) = sv_2mortal(newSVnv(min));
XSRETURN(2);
}
XSRETURN(0);
}
SV *
Audio_comment(au,...)
Audio * au
CODE:
{
if (items > 1)
{
if (!au->comment)
au->comment = newSV(0);
sv_setsv(au->comment,ST(1));
}
RETVAL = SvREFCNT_inc(au->comment);
( run in 0.871 second using v1.01-cache-2.11-cpan-3c2a17b8caa )