Ok so I did the ugly thing with the right channel input and output pointers:
memcpy(outR, inR, vectorsize * sizeof(t_float)); inR = outR;
Works like a charm, thanks again.
Katja
On Fri, Jan 11, 2013 at 10:05 PM, Miller Puckette msp@ucsd.edu wrote:
copy_perform assumes the data is 4-byte aligned so might save a test or two compared to memcopy() - but I really don't know. I never benchmarked the two against each other :)
M
On Fri, Jan 11, 2013 at 09:36:41PM +0100, katja wrote:
Hi Miller,
Thanks for the solution. The routines are in place so copying the right channel input to output should do it. Is there any reason to prefer copy_perform() over memcpy()? I'm trying to make the most efficient reverb for RPi & Co.
Katja
On Fri, Jan 11, 2013 at 7:57 PM, Miller Puckette msp@ucsd.edu wrote:
Hi Katja -
There's one example of this in sigfft_dspx() - a complex FFT that 'natively' works on 2 signals in-place but has to deal with various cases in which buffers get re-used. It's ugly but the basic idea is first to get the inputs copied to the outputs (unless they're already there in the correct order in which case nothing needs to be done) and then run the in-place algorithm.
If the algo only works out-of-place (i.e. you need 4 distinct buffers, 2 in and 2 out) the only way out is (at least conditionally) allocate temporary copies of the inputs before writing to any outputs.
I may be able to add an optional way tilde objects can request that output buffers be distinct from input ones sometime in the future - but this is a couple of steps away for me right now :)
M
On Fri, Jan 11, 2013 at 03:32:09PM +0100, katja wrote:
Hello,
I'm working on a Pd class with stereo channels (reverb), and the routine happens to be most efficient when iterating over the samples per channel, instead of left and right together in the perform loop. However, when doing two while loops in one object, one for left and one for right, the right channel samples get overwritten because of sample-wise in-place computation. Is this an inescapable truth? I mean, I could write a left channel class and a right channel class (actually did that to verify that it works), but it's inconvenient to use. What could be an efficient way to get them in one object?
Thanks, Katja
Pd-list@iem.at mailing list UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list
Pd-list@iem.at mailing list UNSUBSCRIBE and account-management -> http://lists.puredata.info/listinfo/pd-list