diff --git a/fdBufferExperiments/CMakeLists.txt b/fdBufferExperiments/CMakeLists.txt new file mode 100755 index 0000000..390d0a8 --- /dev/null +++ b/fdBufferExperiments/CMakeLists.txt @@ -0,0 +1,114 @@ +####### added the eingenmf +set(FLUID_DECOMP_DIR ../../fluid_decomposition) + +include_directories( + "${FLUID_DECOMP_DIR}" + "${FLUID_DECOMP_DIR}/include" + "${FLUID_DECOMP_DIR}/3rdparty" +) + +####### original SC Cmake file starts here +set(FILENAME "fdBufferExperiments.cpp") #specify the .cpp file here +cmake_minimum_required (VERSION 2.8) +get_filename_component(PROJECT ${FILENAME} NAME_WE) #automatically sets project name from the filename +message(STATUS "Project name is ${PROJECT}") +project (${PROJECT}) + +include_directories(${SC_PATH}/include/plugin_interface) +include_directories(${SC_PATH}/include/common) +include_directories(${SC_PATH}/common) + +set(CMAKE_SHARED_MODULE_PREFIX "") +if(APPLE OR WIN32) +set(CMAKE_SHARED_MODULE_SUFFIX ".scx") +endif() + +option(SUPERNOVA "Build plugins for supernova" OFF) +if (SUPERNOVA) + include_directories(${SC_PATH}/external_libraries/nova-tt) + # actually just boost.atomic + include_directories(${SC_PATH}/external_libraries/boost) + include_directories(${SC_PATH}/external_libraries/boost_lockfree) + include_directories(${SC_PATH}/external_libraries/boost-lockfree) +endif() + +option(CPP11 "Build with c++11." ON) + +if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(CMAKE_COMPILER_IS_CLANG 1) +endif() + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG) + add_definitions(-fvisibility=hidden) + + include (CheckCCompilerFlag) + include (CheckCXXCompilerFlag) + + CHECK_C_COMPILER_FLAG(-msse HAS_SSE) + CHECK_CXX_COMPILER_FLAG(-msse HAS_CXX_SSE) + + if (HAS_SSE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse") + endif() + if (HAS_CXX_SSE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse") + endif() + + CHECK_C_COMPILER_FLAG(-msse2 HAS_SSE2) + CHECK_CXX_COMPILER_FLAG(-msse2 HAS_CXX_SSE2) + + if (HAS_SSE2) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2") + endif() + if (HAS_CXX_SSE2) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2") + endif() + + CHECK_C_COMPILER_FLAG(-mfpmath=sse HAS_FPMATH_SSE) + CHECK_CXX_COMPILER_FLAG(-mfpmath=sse HAS_CXX_FPMATH_SSE) + + if (HAS_FPMATH_SSE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpmath=sse") + endif() + if (HAS_CXX_FPMATH_SSE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpmath=sse") + endif() + + if(NATIVE) + add_definitions(-march=native) + endif() + + if(CPP11) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + if(CMAKE_COMPILER_IS_CLANG) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") + endif() + endif() +endif() +if(MINGW) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mstackrealign") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mstackrealign") +endif() + +####### added the fluid_decomposition +add_library( +${PROJECT} +MODULE +${FILENAME} +"${FLUID_DECOMP_DIR}/3rdparty/HISSTools_FFT/HISSTools_FFT.cpp" +) +if(SUPERNOVA) + add_library(${PROJECT}_supernova MODULE ${FILENAME}) + set_property(TARGET ${PROJECT}_supernova + PROPERTY COMPILE_DEFINITIONS SUPERNOVA) +endif() + +add_custom_command( + TARGET + ${PROJECT} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory "../../release-packaging/${PROJECT}/plugins" + COMMAND ${CMAKE_COMMAND} -E copy $ "../../release-packaging/${PROJECT}/plugins" +) + +target_link_libraries (${PROJECT} "-framework Accelerate") diff --git a/fdBufferExperiments/fdBufferExperiments.cpp b/fdBufferExperiments/fdBufferExperiments.cpp new file mode 100644 index 0000000..382a9d4 --- /dev/null +++ b/fdBufferExperiments/fdBufferExperiments.cpp @@ -0,0 +1,44 @@ +//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); +} diff --git a/fdBufferExperiments/tests.scd b/fdBufferExperiments/tests.scd new file mode 100644 index 0000000..999637f --- /dev/null +++ b/fdBufferExperiments/tests.scd @@ -0,0 +1,11 @@ +s.reboot + +//Quickie test of buffer allocation working +//Read a sound file +a = Buffer.read(s,"/Users/owen/Desktop/denoise_stn/sources/01-mix.wav"); +//Pass buffer to this, along with a rank. It will allocate a new buffer, +//size it appropriately (in our server code) and return the new object +f = FDBufferExperiments.allocMatch(s,a,rank:5); +//Make sure everything is kosher: +a.query +f.query diff --git a/release-packaging/fdBufferExperiments/classes/fdBufferExperiments.sc b/release-packaging/fdBufferExperiments/classes/fdBufferExperiments.sc new file mode 100644 index 0000000..989a48b --- /dev/null +++ b/release-packaging/fdBufferExperiments/classes/fdBufferExperiments.sc @@ -0,0 +1,17 @@ +// adds an instance method to the Buffer class +FDBufferExperiments { + + *allocMatch{|server, srcbuf, rank=1| + var dstbuf,srcbufnum; + "Rank" + rank.postln; + srcbufnum = srcbuf.bufnum; + + server = server ? Server.default; + dstbuf = Buffer.new(server:server,numFrames:0,numChannels:1); + + server.listSendMsg( + [\b_gen, srcbufnum, "BufMatch",dstbuf.bufnum, rank] + ); + ^dstbuf; + } +}