Note that there are some explanatory texts on larger screens.

plurals
  1. POHow can I safely make a float *x into a const float *const *y?
    primarykey
    data
    text
    <p>I have a function <code>audioReceived (float * input, int bufferSize, int nChannels)</code> inside of which I want to call a function from a library that needs <code>const float *const *inputBuffers</code>.</p> <p>Obviously casting <code>const float *const *inputBuffers = (const float* const*)input;</code> compiles but is a terrible idea, crashes the program, kills kittens, etc. Nobody ever needs to modify the original <code>float* input</code>, it's incoming audio data that's being processed.</p> <p>How do I do it the right way?</p> <p><strong>EDIT: Here's some more code.</strong> <code>audioReceived</code> is:</p> <pre><code>void testApp::audioReceived (float * input, int bufferSize, int nChannels){ Vamp::RealTime rt = Vamp::RealTime::fromMilliseconds(ofGetSystemTime()); float const *const tmp[] = { input, 0 }; Vamp::Plugin::FeatureSet fs = myPlugin-&gt;process(tmp, rt); } </code></pre> <p>Library function <code>process</code> is virtually defined in base class:</p> <pre><code> /** * Process a single block of input data. * * If the plugin's inputDomain is TimeDomain, inputBuffers will * point to one array of floats per input channel, and each of * these arrays will contain blockSize consecutive audio samples * (the host will zero-pad as necessary). The timestamp in this * case will be the real time in seconds of the start of the * supplied block of samples. * * If the plugin's inputDomain is FrequencyDomain, inputBuffers * will point to one array of floats per input channel, and each * of these arrays will contain blockSize/2+1 consecutive pairs of * real and imaginary component floats corresponding to bins * 0..(blockSize/2) of the FFT output. That is, bin 0 (the first * pair of floats) contains the DC output, up to bin blockSize/2 * which contains the Nyquist-frequency output. There will * therefore be blockSize+2 floats per channel in total. The * timestamp will be the real time in seconds of the centre of the * FFT input window (i.e. the very first block passed to process * might contain the FFT of half a block of zero samples and the * first half-block of the actual data, with a timestamp of zero). * * Return any features that have become available after this * process call. (These do not necessarily have to fall within * the process block, except for OneSamplePerStep outputs.) */ virtual FeatureSet process(const float *const *inputBuffers, RealTime timestamp) = 0; </code></pre> <p>and here in the actual header:</p> <pre><code>FeatureSet process(const float *const *inputBuffers, Vamp::RealTime timestamp); </code></pre> <p>I think the <code>EXC_BAD_ACCESS</code> may be stemming from the library function wanting a zero-padded array, and my not giving it one. (a) Does that sound reasonable, and (b) If so, is it time to ask a different SO question?</p> <p>Thanks all for your help so far, it's very enlightening/clarifying/educational/interesting.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload