Thread: [Audacity-devel] Ladspa problems and diff
A free multi-track audio editor and recorder
Brought to you by:
aosiniao
From: crooney <cr...@pa...> - 2002-03-25 07:57:58
Attachments:
aud_ladspa.diff
|
Hey all, my name's Chris Rooney and I've been looking at the Ladspa stuff in CVS, and there are some issues, some of which I fix with tthe attached diff, but others that require a design decision that I need to ask about before I do anything. First, the original code treated everything as an effect, while many Ladspa plugins are not. Sometimes they just analyze and return info about their input, the Peak Monitors, for instance (all plugins I mention are part of the CMT package available at http://www.ladspa.org/cmt/). These cause segfaults when processing stereo tracks. I just used a wxMessageDialog to give the user the info. Similarly, a plugin may take 2 inputs and have only one output like the CMT Amplitude modulator. And white noise generators or tone generators may have output with no input. These are addressed in the attached diff. Another big problem is that some ladspa plugins require more than two inputs or outputs. In the CMT lib the ambisonic and FHB Format plugins do so, and always segfault. So we have to make a decision here -- we can either not load the plugin, and inform the user somehow, so he doesn't wonder why his plugin doesn't load, refuse to run the plugin, or hook up empty buffers where necessary, and explain that the effect of the plugin is probably not what's intended. Let me know what how I should handle it and i'll fix it, if you want. Less importantly, i think we should have a better strategy for default value assignment (e.g. if there both upper and lower bounds, using (ub-lb/2). Thanks for listening, crooney f657i429s874t P.S. I'm running FreeBSD and can save a project but not open one, I get a segfault in wxWindows string code in WaveTrack::load. Is this a known problem, i.e. does it happen on linux? thanks |
From: Dominic M. <do...@mi...> - 2002-03-25 21:24:57
|
Chris, (Hello again!) Your patch looks good; I'll have a chance to apply it tomorrow evening if nobody else can do it before then (Matt?). It's unfortunate that LADSPA does not automatically provide default values. One good possibility for a default value is (lo+hi)/2, unless lo<0 and hi>0, then 0 is a good default. Is anyone actively talking with LADPSA developers? We should suggest this... As far as larger structural changes: You're right, many useful plug-ins are not "effects". From a user-interface standpoint, we should make that more clear - some plug-ins perform effects, others analyze data and others produce data. Perhaps we should have three menus: "Insert", "Apply Effect", and "Analyze". All three menus would have built-in Audacity functions first, followed by plug-ins of the appropriate type (after a separator bar). To be specific: Insert Noise... Silence... Tone... --- [Any plug-ins that take no input but generate output] Apply Effect Amplify... Bass Boost... ... Wah Wah... --- [Plug-ins which have input and output] Analyze Plot Spectrum --- [Plug-ins which take input but no output (except a string)] This is just a suggestion. Any thoughts? - Dominic crooney wrote: > Hey all, my name's Chris Rooney and I've been looking at the Ladspa stuff > in CVS, and there are some issues, some of which I fix with tthe attached > diff, but others that require a design decision that I need to ask about > before I do anything. > > First, the original code treated everything as an effect, while many > Ladspa plugins are not. Sometimes they just analyze and return info about > their input, the Peak Monitors, for instance (all plugins I mention are > part of the CMT package available at http://www.ladspa.org/cmt/). These > cause segfaults when processing stereo tracks. I just used a > wxMessageDialog to give the user the info. Similarly, a plugin may take 2 > inputs and have only one output like the CMT Amplitude modulator. And > white noise generators or tone generators may have output with no input. > These are addressed in the attached diff. > > Another big problem is that some ladspa plugins require more than two > inputs or outputs. In the CMT lib the ambisonic and FHB Format plugins do > so, and always segfault. So we have to make a decision here -- we can > either not load the plugin, and inform the user somehow, so he doesn't > wonder why his plugin doesn't load, refuse to run the plugin, or hook up > empty buffers where necessary, and explain that the effect of the plugin > is probably not what's intended. Let me know what how I should handle it > and i'll fix it, if you want. > > Less importantly, i think we should have a better strategy for default > value assignment (e.g. if there both upper and lower bounds, using > (ub-lb/2). > > Thanks for listening, > > crooney > f657i429s874t > > P.S. I'm running FreeBSD and can save a project but not open one, I get a > segfault in wxWindows string code in WaveTrack::load. Is this a known > problem, i.e. does it happen on linux? thanks > > > ------------------------------------------------------------------------ > > Index: LadspaEffect.cpp > =================================================================== > RCS file: /cvsroot/audacity/audacity-src/src/effects/ladspa/LadspaEffect.cpp,v > retrieving revision 1.4 > diff -B -b -U3 -r1.4 LadspaEffect.cpp > --- LadspaEffect.cpp 31 Jan 2002 03:28:22 -0000 1.4 > +++ LadspaEffect.cpp 25 Mar 2002 07:18:25 -0000 > @@ -56,9 +56,13 @@ > outputs++; > } > } > - if (LADSPA_IS_PORT_CONTROL(d) && > - LADSPA_IS_PORT_INPUT(d)) { > + if (LADSPA_IS_PORT_CONTROL(d)){ > + if (LADSPA_IS_PORT_INPUT(d)) { > numInputControls++; > + }else{ > + numOutputControls++; > + } > + } > > float val = 1.0; > LADSPA_PortRangeHint hint = mData->PortRangeHints[p]; > @@ -76,7 +80,7 @@ > > inputControls[p] = val; > } > - } > + > } > > LadspaEffect::~LadspaEffect() > @@ -218,12 +222,14 @@ > unsigned long rate = (unsigned long)(left->GetRate() + 0.5); > LADSPA_Handle handle = mData->instantiate(mData, rate); > > + if (inputs) > mData->connect_port(handle, inputPorts[0], fInBuffer[0]); > + if (outputs) > mData->connect_port(handle, outputPorts[0], fOutBuffer[0]); > - if (inputs>1 && outputs>1 && right) { > + if (inputs>1) > mData->connect_port(handle, inputPorts[1], fInBuffer[1]); > + if (outputs>1 && right) > mData->connect_port(handle, outputPorts[1], fOutBuffer[1]); > - } > > unsigned long p; > for(p=0; p<mData->PortCount; p++) { > @@ -262,11 +268,13 @@ > > mData->run(handle, block); > > + if (outputs) { > for (i = 0; i < block; i++) > buffer[i] = (sampleType) (fOutBuffer[0][i] * 32767.); > left->Set(buffer, ls, block); > + } > > - if (right) { > + if (right && outputs > 1) { > for (i = 0; i < block; i++) > buffer[i] = (sampleType) (fOutBuffer[1][i] * 32767.); > right->Set(buffer, rs, block); > @@ -282,6 +290,22 @@ > TrackProgress(count, (ls-lstart)/(double)originalLen); > } > > + // this is not optimal. This may only display results > + // for the last iteration of previous loop. > + // But if we track output value each iteration > + // do we multiply, add, average, take max, etc? > + if (numOutputControls){ > + wxString message; > + for (p = 0; p < mData->PortCount; p++){ > + if (LADSPA_IS_PORT_CONTROL(mData->PortDescriptors[p]) > + && LADSPA_IS_PORT_OUTPUT(mData->PortDescriptors[p])) { > + message += wxString::Format("%s: %f\n",mData->PortNames[p],outputControls[p]); > + } > + } > + wxMessageDialog md(mParent,message,wxString(mData->Name)+_(" results"),wxOK); > + md.ShowModal(); > + } > + > if (mData->deactivate) > mData->deactivate(handle); > > Index: LadspaEffect.h > =================================================================== > RCS file: /cvsroot/audacity/audacity-src/src/effects/ladspa/LadspaEffect.h,v > retrieving revision 1.4 > diff -B -b -U3 -r1.4 LadspaEffect.h > --- LadspaEffect.h 14 Dec 2001 09:19:34 -0000 1.4 > +++ LadspaEffect.h 25 Mar 2002 07:18:25 -0000 > @@ -50,6 +50,7 @@ > int inputs; > int outputs; > int numInputControls; > + int numOutputControls; > unsigned long *inputPorts; > unsigned long *outputPorts; > float *inputControls; > Index: LoadLadspa.cpp > =================================================================== > RCS file: /cvsroot/audacity/audacity-src/src/effects/ladspa/LoadLadspa.cpp,v > retrieving revision 1.5 > diff -B -b -U3 -r1.5 LoadLadspa.cpp > |
From: crooney <cr...@pa...> - 2002-03-26 01:34:08
|
On Mon, 25 Mar 2002, Dominic Mazzoni wrote: > As far as larger structural changes: > > You're right, many useful plug-ins are not "effects". From a > user-interface standpoint, we should make that more clear - some > plug-ins perform effects, others analyze data and others produce > data. > > Perhaps we should have three menus: "Insert", "Apply Effect", > and "Analyze". Sounds fine to me, except I think i would only split between analyzers and appliers; either you are selecting a portion of the track and looking to overwrite it or you are selecting it for analysis. If you intend to overwrite, it doesn't really matter how the output is generated. > It's unfortunate that LADSPA does not automatically provide default > values. One good possibility for a default value is (lo+hi)/2, > unless lo<0 and hi>0, then 0 is a good default. Is anyone actively > talking with LADPSA developers? We should suggest this... As far as the default Ladspa values, the LAD guys are talking about adding it to the 1.1 rev of the spec. They can do it using unused space in the struct, and not break anything using the 1.0 rev. later, crooney f657i429s874t |
From: Dominic M. <do...@mi...> - 2002-03-25 21:26:34
|
> P.S. I'm running FreeBSD and can save a project but not open one, I get a > segfault in wxWindows string code in WaveTrack::load. Is this a known > problem, i.e. does it happen on linux? thanks No, this doesn't happen on Linux (at least, not on my box). Please send me a stack trace (run using gdb, when it crashes type "where"). - Dominic |
From: crooney <cr...@pa...> - 2002-03-26 01:13:38
|
On Mon, 25 Mar 2002, Dominic Mazzoni wrote: > Please send me a stack trace (run using gdb, when it crashes type > "where"). > Here's the stack trace. I'll look into it also and see if anything jumps out at me. Program received signal SIGSEGV, Segmentation fault. 0x289a0aa6 in vfprintf () from /usr/lib/libc_r.so.4 (gdb) bt #0 0x289a0aa6 in vfprintf () from /usr/lib/libc_r.so.4 #1 0x28962e8a in vsnprintf () from /usr/lib/libc_r.so.4 #2 0x283a4d55 in wxString::PrintfV () from /usr/X11R6/lib/libwx_gtk.so #3 0x283a4d1d in wxString::Printf () from /usr/X11R6/lib/libwx_gtk.so #4 0x80e0148 in WaveTrack::Load (this=0x82c2b00, in=0xbfbfee7c, dirManager=0x826b21c) at WaveTrack.cpp:773 #5 0x80c6b84 in TrackList::Load (this=0x8221440, in=0xbfbfee7c, dirManager=0x826b21c) at Track.cpp:244 #6 0x80bc7d2 in AudacityProject::OpenFile (this=0xbfbfef8c, fileName=0xbfbfef8c) at Project.cpp:1279 #7 0x80aed9a in AudacityProject::OnOpen (this=0x826b000, event=@0xbfbff0c0) at Menus.cpp:502 #8 0x80ae870 in AudacityProject::HandleMenuEvent (this=0x826b000, event=@0xbfbff0c0) at Menus.cpp:451 #9 0x80b91c6 in AudacityProject::ProcessEvent (this=0x826b000, event=@0xbfbff0c0) at Project.cpp:723 #10 0x282e80d3 in wxMenuBar::SetLabelTop () from /usr/X11R6/lib/libwx_gtk.so #11 0x2863bedc in gtk_item_factory_callback_marshal () from /usr/X11R6/lib/libgtk12.so.2 #12 0x2864c221 in gtk_marshal_NONE__NONE () from /usr/X11R6/lib/libgtk12.so.2 #13 0x2867ca46 in gtk_handlers_run () from /usr/X11R6/lib/libgtk12.so.2 #14 0x2867beb5 in gtk_signal_real_emit () from /usr/X11R6/lib/libgtk12.so.2 #15 0x28679f0b in gtk_signal_emit () from /usr/X11R6/lib/libgtk12.so.2 #16 0x286b20d4 in gtk_widget_activate () from /usr/X11R6/lib/libgtk12.so.2 #17 0x286548e4 in gtk_menu_shell_activate_item () from /usr/X11R6/lib/libgtk12.so.2 #18 0x28653b5a in gtk_menu_shell_button_release () from /usr/X11R6/lib/libgtk12.so.2 #19 0x2864beab in gtk_marshal_BOOL__POINTER () from /usr/X11R6/lib/libgtk12.so.2 #20 0x2867beee in gtk_signal_real_emit () from /usr/X11R6/lib/libgtk12.so.2 #21 0x28679f0b in gtk_signal_emit () from /usr/X11R6/lib/libgtk12.so.2 #22 0x286b1f84 in gtk_widget_event () from /usr/X11R6/lib/libgtk12.so.2 #23 0x2864bdfd in gtk_propagate_event () from /usr/X11R6/lib/libgtk12.so.2 #24 0x2864af6e in gtk_main_do_event () from /usr/X11R6/lib/libgtk12.so.2 #25 0x286fb894 in gdk_event_dispatch () from /usr/X11R6/lib/libgdk12.so.2 #26 0x2872ccf3 in g_main_dispatch () from /usr/local/lib/libglib12.so.3 #27 0x2872d31c in g_main_iterate () from /usr/local/lib/libglib12.so.3 #28 0x2872d4b4 in g_main_run () from /usr/local/lib/libglib12.so.3 #29 0x2864a82b in gtk_main () from /usr/X11R6/lib/libgtk12.so.2 #30 0x282bd554 in wxApp::MainLoop () from /usr/X11R6/lib/libwx_gtk.so #31 0x284edc7e in wxAppBase::OnRun () from /usr/X11R6/lib/libwx_gtk.so #32 0x282be131 in wxEntry () from /usr/X11R6/lib/libwx_gtk.so #33 0x8071f94 in main (argc=1, argv=0xbfbffb8c) at AudacityApp.cpp:105 #34 0x806b7ad in _start () (gdb) |
From: crooney <cr...@pa...> - 2002-03-27 20:40:18
|
I found the proximate cause of the segfault. The error handling in WaveTrack::Load tries to use message box with in->GetCurrentLine() as a string, but GetCurrentLine() returns the line number, not the string that was previously retrieved with GetNextLine(). It only compiles at all because of the c style cast to const char *. There's another problem, in that the track is already set up as stereo, but the linked track doesn't exist yet, so the OnPaint that creating the messagebox causes segfaults looking for the track. the following diff fixes both problems. the error that causes this code to be executed at all seems to result from a missing line in the aup file. I'm still tracking that down. --- WaveTrack.cpp 18 Feb 2002 06:59:38 -0000 1.16 +++ WaveTrack.cpp 27 Mar 2002 20:23:47 -0000 @@ -770,7 +770,7 @@ wxString msg; msg.Printf(_("The file named \"%s\" is missing from the project."), - (const char *) in->GetCurrentLine()); + (const char *) in->GetLine(in->GetCurrentLine())); wxMessageBox(msg); return false; --- TrackPanel.cpp 25 Mar 2002 16:36:38 -0000 1.51 +++ TrackPanel.cpp 27 Mar 2002 20:23:54 -0000 @@ -1782,7 +1782,7 @@ r = trackRect; bool skipBorder = false; - if (t->GetLinked()) + if (t->GetLinked() && mTracks->GetLink(t)) r.height += mTracks->GetLink(t)->GetHeight(); else if (mTracks->GetLink(t)) skipBorder = true; crooney f657i429s874t On Mon, 25 Mar 2002, Dominic Mazzoni wrote: > > P.S. I'm running FreeBSD and can save a project but not open one, I get a > > segfault in wxWindows string code in WaveTrack::load. Is this a known > > problem, i.e. does it happen on linux? thanks > > No, this doesn't happen on Linux (at least, not on my box). > > Please send me a stack trace (run using gdb, when it crashes type > "where"). > > - Dominic > > > _______________________________________________ > Audacity-devel mailing list > Aud...@li... > https://lists.sourceforge.net/lists/listinfo/audacity-devel > |
From: Dominic M. <do...@mi...> - 2002-03-27 20:46:35
|
Ah - I'm guessing you tried to load an .aup file you saved with a previous version of Audacity. I hacked it together so that it was possible, but I'm not too surprised there are subtle problems like this. Thanks for the fix. I'd really like to use XML as the project file format for version 1.1. Does anyone know of an XML library which both reads and writes XML, and can read as you go (i.e. it doesn't have to parse the whole file first; that would take way too much RAM). - Dominic crooney wrote: > I found the proximate cause of the segfault. The error handling in > WaveTrack::Load tries to use message box with in->GetCurrentLine() as a > string, but GetCurrentLine() returns the line number, not the string that > was previously retrieved with GetNextLine(). It only compiles at all > because of the c style cast to const char *. There's another problem, in > that the track is already set up as stereo, but the linked track doesn't > exist yet, so the OnPaint that creating the messagebox causes segfaults > looking for the track. the following diff fixes both problems. the error > that causes this code to be executed at all seems to result from a missing > line in the aup file. I'm still tracking that down. > > --- WaveTrack.cpp 18 Feb 2002 06:59:38 -0000 1.16 > +++ WaveTrack.cpp 27 Mar 2002 20:23:47 -0000 > @@ -770,7 +770,7 @@ > > wxString msg; > msg.Printf(_("The file named \"%s\" is missing from the > project."), > - (const char *) in->GetCurrentLine()); > + (const char *) in->GetLine(in->GetCurrentLine())); > wxMessageBox(msg); > > return false; > --- TrackPanel.cpp 25 Mar 2002 16:36:38 -0000 1.51 > +++ TrackPanel.cpp 27 Mar 2002 20:23:54 -0000 > @@ -1782,7 +1782,7 @@ > r = trackRect; > > bool skipBorder = false; > - if (t->GetLinked()) > + if (t->GetLinked() && mTracks->GetLink(t)) > r.height += mTracks->GetLink(t)->GetHeight(); > else if (mTracks->GetLink(t)) > skipBorder = true; > > > crooney > f657i429s874t > > On Mon, 25 Mar 2002, Dominic Mazzoni wrote: > > >>>P.S. I'm running FreeBSD and can save a project but not open one, I get a >>>segfault in wxWindows string code in WaveTrack::load. Is this a known >>>problem, i.e. does it happen on linux? thanks >>> >>No, this doesn't happen on Linux (at least, not on my box). >> >>Please send me a stack trace (run using gdb, when it crashes type >>"where"). >> >>- Dominic >> >> >>_______________________________________________ >>Audacity-devel mailing list >>Aud...@li... >>https://lists.sourceforge.net/lists/listinfo/audacity-devel >> >> |
From: crooney <cr...@pa...> - 2002-03-27 21:06:54
|
On Wed, 27 Mar 2002, Dominic Mazzoni wrote: > Ah - I'm guessing you tried to load an .aup file you saved with a > previous version of Audacity. Actually no, it was saved w/ the same version trying to load it (i.e. the most recent cvs). When I tried to load an old file, I got a message box telling me that it was unsupported. > I'd really like to use XML as the project file format for version > 1.1. Does anyone know of an XML library which both reads and > writes XML, and can read as you go (i.e. it doesn't have to parse > the whole file first; that would take way too much RAM). > The Xerces parser from the apache group (xml.apache.org) implements both the DOM (keep the whole tree into memory) and SAX (fire events as parsed) standards. It uses the apache license. crooney f657i429s874t |
From: Dominic M. <do...@mi...> - 2002-03-27 21:30:07
|
>>I'd really like to use XML as the project file format for version >>1.1. Does anyone know of an XML library which both reads and >>writes XML, and can read as you go (i.e. it doesn't have to parse >>the whole file first; that would take way too much RAM). > > The Xerces parser from the apache group (xml.apache.org) implements both > the DOM (keep the whole tree into memory) and SAX (fire events as parsed) > standards. It uses the apache license. Thanks for the pointer. Xerces looks really good, but it also looks very complicated. Linking with xerces would add a lot to the size of the Audacity binary, and we would be using less than 10% of its features. Is it worth it? Maybe if it were possible to link to just Xerces/SAX (plus whatever part of their API does generation)... - Dominic |
From: Joshua H. <jha...@up...> - 2002-03-27 21:51:58
|
* Dominic Mazzoni (do...@mi...) wrote: > Ah - I'm guessing you tried to load an .aup file you saved with a > previous version of Audacity. > > I hacked it together so that it was possible, but I'm not too > surprised there are subtle problems like this. Thanks for the > fix. > > I'd really like to use XML as the project file format for version > 1.1. Does anyone know of an XML library which both reads and > writes XML, and can read as you go (i.e. it doesn't have to parse > the whole file first; that would take way too much RAM). I believe the GNOME XML library is widely used (ardour uses it, as far as sound apps go). It is written in ANSI C, and very portable. Despite being part of GNOME, it does not depend on any libraries, though it will use libz and iconv if they are present. http://xmlsoft.org/ Joshua -- Joshua Haberman <jo...@ha...> |
From: Dominic M. <do...@mi...> - 2002-03-27 21:55:27
|
>>I'd really like to use XML as the project file format for version >>1.1. Does anyone know of an XML library which both reads and >>writes XML, and can read as you go (i.e. it doesn't have to parse >>the whole file first; that would take way too much RAM). > > I believe the GNOME XML library is widely used (ardour uses it, as far as > sound apps go). It is written in ANSI C, and very portable. Despite > being part of GNOME, it does not depend on any libraries, though it will > use libz and iconv if they are present. Yeah, GNOME's libxml looks good, and it looks a little more lightweight, too. - Dominic |