You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.6 KiB
C++
45 lines
1.6 KiB
C++
//Can I reallocate buffers on the server? Yes I can.
|
|
#include "SC_PlugIn.h"
|
|
|
|
static InterfaceTable *ft;
|
|
|
|
//Can we do buffer resizing in a BufGen. I think so.
|
|
//Goal here is to mimic the NMF case, allowing
|
|
//the dst buffer to be resized accordingly (and not need to
|
|
// precalculate the number of frames in advance lang-side
|
|
void BufferMatch(World *world, struct SndBuf *srcBuf, struct sc_msg_iter *msg)
|
|
{
|
|
size_t srcFrameCount = srcBuf->frames;
|
|
size_t srcChanCount = srcBuf->channels;
|
|
|
|
long dstBufNum = msg->geti();
|
|
size_t rank = msg->geti();
|
|
|
|
if (dstBufNum == -1){
|
|
Print("BufferMatch is not happy because there is no output buffer specified.\n");
|
|
return;
|
|
}
|
|
//This sequence follows what I saw in SC_SequenceCommand.cpp. Pretty much.
|
|
//Get the NRT thread mirror buffer
|
|
SndBuf* dstBufNRT = World_GetNRTBuf(world, dstBufNum);
|
|
//Call the allocation function on that
|
|
SCErr err = ft->fBufAlloc(dstBufNRT, srcChanCount * rank, srcFrameCount,srcBuf->samplerate);
|
|
//If we were posh, we'd check for errors
|
|
//Norhing will happen, unless we (a) assign the allocated data back to the main buffer pool (b?) Tell the server the buffer has changed
|
|
//Get the RT buffer
|
|
SndBuf* dstBuf = World_GetBuf(world, dstBufNum);
|
|
//Assign value to our NRT buffer pointer's value
|
|
*dstBuf = *dstBufNRT;
|
|
//Ping the server
|
|
world->mSndBufUpdates[dstBufNum].writes ++ ;
|
|
}
|
|
|
|
|
|
//typedef void (*BufGenFunc)(struct World *world, struct SndBuf *buf, struct sc_msg_iter *msg);
|
|
|
|
|
|
PluginLoad(BufferFunTime) {
|
|
ft = inTable;
|
|
DefineBufGen("BufMatch", BufferMatch);
|
|
}
|