zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit 24019705f1b4ab2eb2230311877777337a503152
parent 5bc1910283103a05c4183790bb7a78ea6980b36c
Author: fundamental <mark.d.mccurry@gmail.com>
Date:   Thu, 18 Aug 2011 14:23:50 -0400

DSSI: Getting system to rebuild

- Minimal changes made to get dssi to compile and run again
- Resampling should be looked into
- Additional change-sets may appear from zynaddsubfx:dssi (experimental) or
  yoshimi git repos

Diffstat:
Msrc/CMakeLists.txt | 25+++++++++++++++++++++++++
Msrc/Misc/Master.cpp | 43+++++++++++++++++++++++++++++++++++++++++++
Msrc/Misc/Master.h | 2+-
Msrc/Output/DSSIaudiooutput.cpp | 30++++++++++++++++++------------
Msrc/Output/DSSIaudiooutput.h | 6+++---
5 files changed, 90 insertions(+), 16 deletions(-)

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt @@ -18,6 +18,8 @@ find_package(OpenGL) #for FLTK # lash pkg_search_module(LASH lash-1.0) mark_as_advanced(LASH_LIBRARIES) +pkg_search_module(DSSI dssi>=0.9.0) +mark_as_advanced(DSSI_LIBRARIES) ######### Settings ########### # NOTE: These cache variables should normally not be changed in this @@ -37,6 +39,8 @@ SET (PaEnable ${PORTAUDIO_FOUND} CACHE BOOL "Enable support for Port Audio System") SET (LashEnable ${LASH_FOUND} CACHE BOOL "Enable LASH Audio Session Handler") +SET (DssiEnable ${DSSI_FOUND} CACHE BOOL + "Enable DSSI Plugin compilation") # Now, handle the incoming settings and set define flags/variables based @@ -153,6 +157,11 @@ else (BuildForDebug) message (STATUS "Building for ${CMAKE_BUILD_TYPE}, flags: ${CMAKE_CXX_FLAGS_RELEASE}") endif (BuildForDebug) +if (DssiEnable) + add_definitions(-fPIC) +endif() + + if(FLTK_FOUND) mark_as_advanced(FORCE FLTK_BASE_LIBRARY) mark_as_advanced(FORCE FLTK_CONFIG_SCRIPT) @@ -272,6 +281,22 @@ target_link_libraries(zynaddsubfx ${OS_LIBRARIES} ) +if (DssiEnable) + add_library(zynaddsubfx_dssi SHARED + Output/DSSIaudiooutput.cpp + ) + + target_link_libraries(zynaddsubfx_dssi + ${NONGUI_LIBRARIES} + ${zlib_LIBRARIES} + ${fftw_LIBRARIES} + ${MXML_LIBRARIES} + ${NIO_LIBRARIES} + ${AUDIO_LIBRARIES} + ${OS_LIBRARIES} + ) +endif() + install(TARGETS zynaddsubfx RUNTIME DESTINATION bin ) diff --git a/src/Misc/Master.cpp b/src/Misc/Master.cpp @@ -423,6 +423,49 @@ void Master::AudioOut(float *outl, float *outr) dump.inctick(); } +//TODO review the respective code from yoshimi for this +//If memory serves correctly, libsamplerate was used +void Master::GetAudioOutSamples(size_t nsamples, + int samplerate, + float *outl, + float *outr) +{ + static float *bufl = new float[SOUND_BUFFER_SIZE], + *bufr = new float[SOUND_BUFFER_SIZE]; + static off_t off = 0; + static size_t smps = 0; + + off_t out_off = 0; + + //Fail when resampling rather than doing a poor job + if(SAMPLE_RATE != samplerate) { + printf("darn it: %d vs %d\n", SAMPLE_RATE, samplerate); + return; + } + + while(nsamples) { + //use all available samples + if(nsamples >= smps) { + memcpy(outl+out_off, bufl+off, sizeof(float) * smps); + memcpy(outr+out_off, bufr+off, sizeof(float) * smps); + + //generate samples + AudioOut(bufl, bufr); + off = 0; + smps = SOUND_BUFFER_SIZE; + + out_off += smps; + nsamples -= smps; + } else { //use some samples + memcpy(outl+out_off, bufl+off, sizeof(float) * nsamples); + memcpy(outr+out_off, bufr+off, sizeof(float) * nsamples); + smps -= nsamples; + off += nsamples; + nsamples = 0; + } + } +} + Master::~Master() { for(int npart = 0; npart < NUM_MIDI_PARTS; npart++) diff --git a/src/Misc/Master.h b/src/Misc/Master.h @@ -100,7 +100,7 @@ class Master /**Audio Output*/ void AudioOut(float *outl, float *outr); /**Audio Output (for callback mode). This allows the program to be controled by an external program*/ - void GetAudioOutSamples(int nsamples, + void GetAudioOutSamples(size_t nsamples, int samplerate, float *outl, float *outr); diff --git a/src/Output/DSSIaudiooutput.cpp b/src/Output/DSSIaudiooutput.cpp @@ -33,6 +33,9 @@ #include "../Misc/Bank.h" #include <limits.h> +using std::string; +using std::vector; + // // Static stubs for LADSPA member functions // @@ -345,10 +348,10 @@ void DSSIaudiooutput::selectProgram(unsigned long bank, unsigned long program) { initBanks(); // cerr << "selectProgram(" << (bank & 0x7F) << ':' << ((bank >> 7) & 0x7F) << "," << program << ")" << '\n'; - if(bank < MAX_NUM_BANKS && program < BANK_SIZE) + if(bank < master->bank.banks.size() && program < BANK_SIZE) { - char* bankdir = master->bank.banks[ bank ].dir; - if(bankdir != NULL) + const std::string bankdir = master->bank.banks[ bank ].dir; + if(!bankdir.empty()) { pthread_mutex_lock(&master->mutex); @@ -454,15 +457,15 @@ void DSSIaudiooutput::runSynth(unsigned long sample_count, snd_seq_event_t *even { if(events[event_index].type == SND_SEQ_EVENT_NOTEON) { - master->NoteOn(events[event_index].data.note.channel, events[event_index].data.note.note, events[event_index].data.note.velocity); + master->noteOn(events[event_index].data.note.channel, events[event_index].data.note.note, events[event_index].data.note.velocity); } else if(events[event_index].type == SND_SEQ_EVENT_NOTEOFF) { - master->NoteOff(events[event_index].data.note.channel, events[event_index].data.note.note); + master->noteOff(events[event_index].data.note.channel, events[event_index].data.note.note); } else if(events[event_index].type == SND_SEQ_EVENT_CONTROLLER) { - master->SetController(events[event_index].data.control.channel, events[event_index].data.control.param, events[event_index].data.control.value); + master->setController(events[event_index].data.control.channel, events[event_index].data.control.param, events[event_index].data.control.value); } else { @@ -516,7 +519,7 @@ DSSI_Descriptor* DSSIaudiooutput::initDssiDescriptor() DSSI_Descriptor* newDssiDescriptor = new DSSI_Descriptor; LADSPA_PortDescriptor* newPortDescriptors; - char** newPortNames; + const char** newPortNames; LADSPA_PortRangeHint* newPortRangeHints; if (newDssiDescriptor) @@ -532,7 +535,7 @@ DSSI_Descriptor* DSSIaudiooutput::initDssiDescriptor() newLadspaDescriptor->Copyright = "GNU General Public License v.2"; newLadspaDescriptor->PortCount = 2; - newPortNames = new char *[newLadspaDescriptor->PortCount]; + newPortNames = new const char *[newLadspaDescriptor->PortCount]; newPortNames[0] = "Output L"; newPortNames[1] = "Output R"; newLadspaDescriptor->PortNames = newPortNames; @@ -593,6 +596,8 @@ DSSIaudiooutput* DSSIaudiooutput::getInstance(LADSPA_Handle instance) */ DSSIaudiooutput::DSSIaudiooutput(unsigned long sampleRate) { + SAMPLE_RATE = sampleRate; + this->sampleRate = sampleRate; this->banksInited = false; @@ -662,7 +667,7 @@ bool DSSIaudiooutput::mapNextBank() pthread_mutex_lock(&master->mutex); Bank& bank = master->bank; bool retval; - if(bankNoToMap >= MAX_NUM_BANKS || bank.banks[bankNoToMap].dir == NULL) + if(bankNoToMap >= (int)bank.banks.size() || bank.banks[bankNoToMap].dir.empty()) { retval = false; } @@ -671,10 +676,11 @@ bool DSSIaudiooutput::mapNextBank() bank.loadbank(bank.banks[bankNoToMap].dir); for(unsigned long instrument = 0; instrument < BANK_SIZE; instrument++) { - char* insName = bank.getname(instrument); - if(insName != NULL && insName[0] != '\0' && insName[0] != ' ') + string insName = bank.getname(instrument); + if(!insName.empty() && insName[0] != '\0' && insName[0] != ' ') { - programMap.push_back(ProgramDescriptor(bankNoToMap,instrument,insName)); + programMap.push_back(ProgramDescriptor(bankNoToMap,instrument, + const_cast<char*>(insName.c_str()))); } } bankNoToMap ++; diff --git a/src/Output/DSSIaudiooutput.h b/src/Output/DSSIaudiooutput.h @@ -76,7 +76,7 @@ public: { unsigned long bank; unsigned long program; - string name; + std::string name; ProgramDescriptor(unsigned long _bank, unsigned long _program, char* _name); }; @@ -94,9 +94,9 @@ private: long sampleRate; Master* master; static DSSI_Descriptor* dssiDescriptor; - static string bankDirNames[]; + static std::string bankDirNames[]; static - vector <ProgramDescriptor> programMap; + std::vector <ProgramDescriptor> programMap; /** * Flag controlling the list of bank directories