Browse Source

channelhandler bugfixed, monostable mode for flipflop, help window fixes, spiralloop link error

master
nebogeo 22 years ago
parent
commit
1ca689500e
8 changed files with 166 additions and 39 deletions
  1. +5
    -1
      SpiralSound/ChannelHandler.C
  2. +60
    -18
      SpiralSound/Plugins/FlipflopPlugin/FlipflopPlugin.C
  3. +5
    -2
      SpiralSound/Plugins/FlipflopPlugin/FlipflopPlugin.h
  4. +40
    -1
      SpiralSound/Plugins/FlipflopPlugin/FlipflopPluginGUI.C
  5. +6
    -0
      SpiralSound/Plugins/FlipflopPlugin/FlipflopPluginGUI.h
  6. +6
    -0
      SpiralSound/Plugins/SpiralLoopPlugin/Makefile.in
  7. +37
    -16
      SpiralSound/Plugins/SpiralPluginGUI.C
  8. +7
    -1
      SpiralSound/Plugins/SpiralPluginGUI.h

+ 5
- 1
SpiralSound/ChannelHandler.C View File

@@ -93,7 +93,7 @@ void ChannelHandler::UpdateDataNow()
// one off request type // one off request type
case OUTPUT_REQUEST : case OUTPUT_REQUEST :
{ {
if (m_BulkID==i->first)
if (m_BulkID==i->first && ch->requested)
{ {
if (m_BulkPos!=-1) if (m_BulkPos!=-1)
{ {
@@ -103,6 +103,7 @@ void ChannelHandler::UpdateDataNow()
// last transfer // last transfer
#ifdef CHANNEL_DEBUG #ifdef CHANNEL_DEBUG
cerr<<"memcpy (last) bulk output channel: ["<<i->first<<"]"<<endl; cerr<<"memcpy (last) bulk output channel: ["<<i->first<<"]"<<endl;
cerr<<"pos:"<<m_BulkPos<<" size:"<<m_BulkSize<<" chsize:"<<ch->size<<endl;
#endif #endif
memcpy(ch->data_buf,((char*)m_BulkSrc)+m_BulkPos,m_BulkSize-m_BulkPos); memcpy(ch->data_buf,((char*)m_BulkSrc)+m_BulkPos,m_BulkSize-m_BulkPos);
m_BulkPos=-1; m_BulkPos=-1;
@@ -111,11 +112,13 @@ void ChannelHandler::UpdateDataNow()
{ {
#ifdef CHANNEL_DEBUG #ifdef CHANNEL_DEBUG
cerr<<"memcpy bulk output channel: ["<<i->first<<"]"<<endl; cerr<<"memcpy bulk output channel: ["<<i->first<<"]"<<endl;
cerr<<"pos:"<<m_BulkPos<<" size:"<<m_BulkSize<<endl;
#endif #endif
memcpy(ch->data_buf,((char*)m_BulkSrc)+m_BulkPos,ch->size); memcpy(ch->data_buf,((char*)m_BulkSrc)+m_BulkPos,ch->size);
m_BulkPos+=ch->size; m_BulkPos+=ch->size;
} }
ch->updated=true; ch->updated=true;
ch->requested=false;
} }
} }
else else
@@ -128,6 +131,7 @@ void ChannelHandler::UpdateDataNow()
#endif #endif
memcpy(ch->data_buf,ch->data,ch->size); memcpy(ch->data_buf,ch->data,ch->size);
ch->updated=true; ch->updated=true;
ch->requested=false;
} }
} }
} break; } break;


+ 60
- 18
SpiralSound/Plugins/FlipflopPlugin/FlipflopPlugin.C View File

@@ -46,20 +46,24 @@ string GetGroupName()
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////


FlipflopPlugin::FlipflopPlugin() : FlipflopPlugin::FlipflopPlugin() :
m_Count(4),
m_TriggerTime(0.01f),
m_Monostable(false),
m_Current(0), m_Current(0),
m_Triggered(false), m_Triggered(false),
m_CurrentLevel(1.0f)
m_CurrentLevel(1.0f),
m_TriggerSamples(0)
{ {
m_Version = 2;
m_PluginInfo.Name="Flipflop"; m_PluginInfo.Name="Flipflop";
m_PluginInfo.Width=90;
m_PluginInfo.Height=80;
m_PluginInfo.Width=70;
m_PluginInfo.Height=100;
m_PluginInfo.NumInputs=1; m_PluginInfo.NumInputs=1;
m_PluginInfo.NumOutputs=1; m_PluginInfo.NumOutputs=1;
m_PluginInfo.PortTips.push_back("Input"); m_PluginInfo.PortTips.push_back("Input");
m_PluginInfo.PortTips.push_back("Output"); m_PluginInfo.PortTips.push_back("Output");


m_AudioCH->Register("Count",&m_Count);
m_AudioCH->Register("TriggerTime",&m_TriggerTime);
m_AudioCH->Register("Monostable",&m_Monostable);
} }


FlipflopPlugin::~FlipflopPlugin() FlipflopPlugin::~FlipflopPlugin()
@@ -73,32 +77,65 @@ PluginInfo &FlipflopPlugin::Initialise(const HostInfo *Host)


SpiralGUIType *FlipflopPlugin::CreateGUI() SpiralGUIType *FlipflopPlugin::CreateGUI()
{ {
return NULL;
return new FlipflopPluginGUI(m_PluginInfo.Width,
m_PluginInfo.Height,
this,m_AudioCH,m_HostInfo);
} }


void FlipflopPlugin::Execute() void FlipflopPlugin::Execute()
{ {
bool Triggered; bool Triggered;
for (int n=0; n<m_HostInfo->BUFSIZE; n++)
if (m_Monostable)
{ {
if (GetInput(0,n)>0)
for (int n=0; n<m_HostInfo->BUFSIZE; n++)
{ {
if(!m_Triggered)
if (GetInput(0,n)>0)
{ {
m_Triggered=true;
m_CurrentLevel=-m_CurrentLevel;
if(!m_Triggered)
{
m_Triggered=true;
m_CurrentLevel=1.0f;
m_TriggerSamples=(int)(m_TriggerTime*m_HostInfo->SAMPLERATE)+1;
}
} }
}
else
{
if (m_Triggered)
else
{ {
m_Triggered=false; m_Triggered=false;
} }
if (m_TriggerSamples<=0)
{
m_CurrentLevel=-1.0f;
}
if (m_TriggerSamples>0) m_TriggerSamples--;
SetOutput(0,n,m_CurrentLevel);
}
}
else
{
for (int n=0; n<m_HostInfo->BUFSIZE; n++)
{
if (GetInput(0,n)>0)
{
if(!m_Triggered)
{
m_Triggered=true;
m_CurrentLevel=-m_CurrentLevel;
}
}
else
{
if (m_Triggered)
{
m_Triggered=false;
}
}
SetOutput(0,n,m_CurrentLevel);
} }
SetOutput(0,n,m_CurrentLevel);
} }
} }


@@ -108,11 +145,16 @@ void FlipflopPlugin::ExecuteCommands()
void FlipflopPlugin::StreamOut(ostream &s) void FlipflopPlugin::StreamOut(ostream &s)
{ {
s<<m_Version<<endl;
s<<m_Version<<" ";
s<<m_TriggerTime<<" "<<m_Monostable<<" "<<endl;
} }


void FlipflopPlugin::StreamIn(istream &s) void FlipflopPlugin::StreamIn(istream &s)
{ {
int version; int version;
s>>version; s>>version;
if (version>1)
{
s>>m_TriggerTime>>m_Monostable;
}
} }

+ 5
- 2
SpiralSound/Plugins/FlipflopPlugin/FlipflopPlugin.h View File

@@ -35,13 +35,16 @@ public:
virtual void StreamOut(ostream &s); virtual void StreamOut(ostream &s);
virtual void StreamIn(istream &s); virtual void StreamIn(istream &s);


int GetCount() { return m_Count; }
float GetTriggerTime() { return m_TriggerTime; }
bool GetMonostable() { return m_Monostable; }
private: private:
int m_Count;
float m_TriggerTime;
bool m_Monostable;
int m_Current; int m_Current;
bool m_Triggered; bool m_Triggered;
float m_CurrentLevel; float m_CurrentLevel;
int m_TriggerSamples;
}; };


#endif #endif

+ 40
- 1
SpiralSound/Plugins/FlipflopPlugin/FlipflopPluginGUI.C View File

@@ -29,6 +29,20 @@ static const int GUIBG2_COLOUR = 145;
FlipflopPluginGUI::FlipflopPluginGUI(int w, int h,FlipflopPlugin *o,ChannelHandler *ch,const HostInfo *Info) : FlipflopPluginGUI::FlipflopPluginGUI(int w, int h,FlipflopPlugin *o,ChannelHandler *ch,const HostInfo *Info) :
SpiralPluginGUI(w,h,o,ch) SpiralPluginGUI(w,h,o,ch)
{ {
m_TriggerTime = new Fl_Knob(15, 15, 40, 40, "Trigger Time");
m_TriggerTime->color(GUI_COLOUR);
m_TriggerTime->labelsize(8);
m_TriggerTime->maximum(1.0f);
m_TriggerTime->minimum(0.0f);
m_TriggerTime->step(0.0001f);
m_TriggerTime->labelsize(8);
m_TriggerTime->callback((Fl_Callback*)cb_TriggerTime);
m_Monostable = new Fl_Button(5,75,60,20,"Monostable");
m_Monostable->labelsize(8);
m_Monostable->type(1);
m_Monostable->callback((Fl_Callback*)cb_Monostable);
end(); end();
} }


@@ -36,10 +50,35 @@ SpiralPluginGUI(w,h,o,ch)


void FlipflopPluginGUI::UpdateValues(SpiralPlugin *o) void FlipflopPluginGUI::UpdateValues(SpiralPlugin *o)
{ {
FlipflopPlugin* Plugin=(FlipflopPlugin*)o;
m_TriggerTime->value(Plugin->GetTriggerTime());
m_Monostable->value(Plugin->GetMonostable());
} }


//// Callbacks //// //// Callbacks ////
inline void FlipflopPluginGUI::cb_TriggerTime_i(Fl_Knob* o, void* v)
{
m_GUICH->Set("TriggerTime",(float)o->value());
}
void FlipflopPluginGUI::cb_TriggerTime(Fl_Knob* o, void* v)
{ ((FlipflopPluginGUI*)(o->parent()))->cb_TriggerTime_i(o,v);}

inline void FlipflopPluginGUI::cb_Monostable_i(Fl_Button* o, void* v)
{
m_GUICH->Set("Monostable",(bool)o->value());
}
void FlipflopPluginGUI::cb_Monostable(Fl_Button* o, void* v)
{ ((FlipflopPluginGUI*)(o->parent()))->cb_Monostable_i(o,v);}



const string FlipflopPluginGUI::GetHelpText(const string &loc){ const string FlipflopPluginGUI::GetHelpText(const string &loc){
return string("") return string("")
+ "Converts a momentary pulse into a sustained one.";
+ "This plugin has two modes, bistable (the default) converts momentary\n"
+ "pulses into sustained pulses, i.e one pulse to set the output to 1.0,\n"
+ "and another pulse to flip it back to -1.0.\n\n"
+ "Monostable mode is sort of the reverse, any input pulse detected will\n"
+ "cause an output pulse to be generated, the length of which is set by the\n"
+ "trigger time control (out of 1 second max)\n\n"
+ "For a better description, google \"flipflop bistable monostable\" :)";
} }

+ 6
- 0
SpiralSound/Plugins/FlipflopPlugin/FlipflopPluginGUI.h View File

@@ -42,8 +42,14 @@ protected:
const string GetHelpText(const string &loc); const string GetHelpText(const string &loc);


private: private:
Fl_Knob *m_TriggerTime;
Fl_Button *m_Monostable;
//// Callbacks //// //// Callbacks ////
inline void cb_TriggerTime_i(Fl_Knob* o, void*);
static void cb_TriggerTime(Fl_Knob* o, void*);
inline void cb_Monostable_i(Fl_Button* o, void*);
static void cb_Monostable(Fl_Button* o, void*);
}; };


#endif #endif

+ 6
- 0
SpiralSound/Plugins/SpiralLoopPlugin/Makefile.in View File

@@ -50,6 +50,7 @@ HEADERS = ../SpiralPlugin.h \
Fl_Trigger.h \ Fl_Trigger.h \
SpiralLoopPlugin.h \ SpiralLoopPlugin.h \
SpiralLoopPluginGUI.h \ SpiralLoopPluginGUI.h \
../Widgets/Fl_DragBar.H \
../Widgets/Fl_Knob.H \ ../Widgets/Fl_Knob.H \
../Widgets/Fl_LED_Button.H ../Widgets/Fl_LED_Button.H
SOURCES = ../SpiralPlugin.C \ SOURCES = ../SpiralPlugin.C \
@@ -61,6 +62,7 @@ SOURCES = ../SpiralPlugin.C \
Fl_Trigger.C \ Fl_Trigger.C \
SpiralLoopPlugin.C \ SpiralLoopPlugin.C \
SpiralLoopPluginGUI.C \ SpiralLoopPluginGUI.C \
../Widgets/Fl_DragBar.cxx \
../Widgets/Fl_Knob.cxx \ ../Widgets/Fl_Knob.cxx \
../Widgets/Fl_LED_Button.cxx ../Widgets/Fl_LED_Button.cxx
OBJECTS = ../SpiralPlugin.o \ OBJECTS = ../SpiralPlugin.o \
@@ -72,6 +74,7 @@ OBJECTS = ../SpiralPlugin.o \
Fl_Trigger.o \ Fl_Trigger.o \
SpiralLoopPlugin.o \ SpiralLoopPlugin.o \
SpiralLoopPluginGUI.o \ SpiralLoopPluginGUI.o \
../Widgets/Fl_DragBar.o \
../Widgets/Fl_Knob.o \ ../Widgets/Fl_Knob.o \
../Widgets/Fl_LED_Button.o ../Widgets/Fl_LED_Button.o
INTERFACES = INTERFACES =
@@ -142,6 +145,9 @@ install:
../SpiralPlugin.h \ ../SpiralPlugin.h \
../../Sample.h ../../Sample.h


../Widgets/Fl_DragBar.o: ../Widgets/Fl_DragBar.cxx \
../Widgets/Fl_DragBar.H

../../Sample.o: ../../Sample.C \ ../../Sample.o: ../../Sample.C \
../../Sample.h \ ../../Sample.h \
../../SpiralInfo.h ../../SpiralInfo.h


+ 37
- 16
SpiralSound/Plugins/SpiralPluginGUI.C View File

@@ -28,9 +28,12 @@ static const int GUI_COLOUR = 154;
static const int GUIBG_COLOUR = 144; static const int GUIBG_COLOUR = 144;
static const int GUIBG2_COLOUR = 145; static const int GUIBG2_COLOUR = 145;


Fl_Double_Window* SpiralPluginGUI::m_HelpWin=NULL;
Fl_Text_Display* SpiralPluginGUI::m_HelpWin_text=NULL;
SpiralPluginGUI* SpiralPluginGUI::Help_owner=NULL;

SpiralPluginGUI::SpiralPluginGUI(int w, int h, SpiralPlugin* o, ChannelHandler *ch) : SpiralPluginGUI::SpiralPluginGUI(int w, int h, SpiralPlugin* o, ChannelHandler *ch) :
SpiralGUIType(0,0,w,h,""),
m_HelpWin(NULL)
SpiralGUIType(0,0,w,h,"")
{ {
Fl::visible_focus(false); Fl::visible_focus(false);
@@ -75,29 +78,47 @@ inline void SpiralPluginGUI::cb_Hide_i(Fl_Button* o, void* v)
void SpiralPluginGUI::cb_Hide(Fl_Button* o, void* v) void SpiralPluginGUI::cb_Hide(Fl_Button* o, void* v)
{ ((SpiralPluginGUI*)(o->parent()))->cb_Hide_i(o,v); } { ((SpiralPluginGUI*)(o->parent()))->cb_Hide_i(o,v); }


// Boo - changed to use one 'global' help win. for all plugins, coz Fl_Text_Display
// seems to be too buggy to create and destroy it multiple times.
// (symptom was - ssm crashes after opening/closing plugin help window 4-7 times)
// (i use FLTK 1.1.0 rc7)
inline void SpiralPluginGUI::cb_Help_i(Fl_Button* o, void* v) inline void SpiralPluginGUI::cb_Help_i(Fl_Button* o, void* v)
{ {
//Boo - create 'global' help window
if (m_HelpWin==NULL) if (m_HelpWin==NULL)
{ {
int w=450,h=200;
m_HelpWin = new Fl_Double_Window(w,h,"Help");
int h_w=450,h_h=200;
m_HelpWin = new Fl_Double_Window(h_w,h_h,"Help");


Fl_Text_Display* text = new Fl_Text_Display(0,0,10,10);
text->buffer(new Fl_Text_Buffer);
text->insert(GetHelpText(SpiralInfo::LOCALE).c_str());
text->textsize(12);
m_HelpWin->add(text);
m_HelpWin->resizable(text);
m_HelpWin->show();
text->size(w,h); // hack to get the text widget to appear???
m_HelpWin_text = new Fl_Text_Display(0,0,h_w,h_h);
m_HelpWin_text->buffer(new Fl_Text_Buffer);

m_HelpWin_text->textsize(12);
m_HelpWin->add(m_HelpWin_text);
m_HelpWin->resizable(m_HelpWin_text);
m_HelpWin->callback((Fl_Callback*)cb_Help_close);
} }
else
if(Help_owner!=this)
{ {
m_HelpWin->hide();
delete m_HelpWin;
m_HelpWin=NULL;
m_HelpWin_text->buffer()->text(GetHelpText(SpiralInfo::LOCALE).c_str());
m_HelpWin->show();
Help_owner=this;
} }
else cb_Help_close_i(m_HelpWin, NULL);
} }
void SpiralPluginGUI::cb_Help(Fl_Button* o, void* v) void SpiralPluginGUI::cb_Help(Fl_Button* o, void* v)
{ ((SpiralPluginGUI*)(o->parent()))->cb_Help_i(o,v); } { ((SpiralPluginGUI*)(o->parent()))->cb_Help_i(o,v); }


inline void SpiralPluginGUI::cb_Help_close_i(Fl_Double_Window* w, void* v)
{
w->hide();
Help_owner=NULL;
}

void SpiralPluginGUI::cb_Help_close(Fl_Double_Window* w, void* v)
{ ((SpiralPluginGUI*)(w->parent()))->cb_Help_close_i(w,v); }


+ 7
- 1
SpiralSound/Plugins/SpiralPluginGUI.h View File

@@ -19,6 +19,7 @@
#include <FL/Fl.H> #include <FL/Fl.H>
#include <FL/Fl_Double_Window.H> #include <FL/Fl_Double_Window.H>
#include <FL/Fl_Button.H> #include <FL/Fl_Button.H>
#include <FL/Fl_Text_Display.H>
#include <iostream> #include <iostream>
#include <math.h> #include <math.h>


@@ -50,7 +51,10 @@ protected:
private: private:
Fl_Button* m_Hide; Fl_Button* m_Hide;
Fl_Button* m_Help; Fl_Button* m_Help;
Fl_Double_Window *m_HelpWin;

static Fl_Double_Window* m_HelpWin;
static Fl_Text_Display* m_HelpWin_text;
static SpiralPluginGUI* Help_owner;
string m_Title; string m_Title;
@@ -59,6 +63,8 @@ private:
static void cb_Hide(Fl_Button*, void*); static void cb_Hide(Fl_Button*, void*);
inline void cb_Help_i(Fl_Button* o, void* v); inline void cb_Help_i(Fl_Button* o, void* v);
static void cb_Help(Fl_Button*, void*); static void cb_Help(Fl_Button*, void*);
inline void cb_Help_close_i(Fl_Double_Window* w, void* v);
static void cb_Help_close(Fl_Double_Window*, void*);
}; };


#endif #endif

Loading…
Cancel
Save