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:
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