[CM] stop-playing-hook problem

Kjetil Svalastog Matheussen k.s.matheussen@notam02.no
Mon, 24 May 2004 14:27:59 +0200 (CEST)

On Mon, 24 May 2004, Bill Schottstaedt wrote:

>  > Now I pressed the GO button again.
>  > The violine plays again in a loop.
> There are two related problems here.  In several files, add-hook!
> is called whenever that file is loaded, so if the file is loaded
> twice, the hook gets two copies of the added hook function.  This can
> be avoided by adding (if (not (defined...)))  around the
> load-from-path calls (for example, in snd_conffile, many of the dlp
> files are loaded, but they may already have been loaded).  Or we
> could use hook-member (hooks.scm).  But currently there's little attempt to
> protect against redundant functions on the hook list. If one such

Okey, I'll remember to add checks in snd_conffile.scm when loading

> hook is stop-playing-hook and it's getting a function that calls
> (play) to loop, you get an explosion of plays (each time one stops, it
> fires up two more). This works anyway if you just load the dlp stuff,
> but once snd_conffile.scm is also involved, several separate
> stop-hooks start stepping on each other (play.scm's play-until-c-g
> assumes it will be cancelled either via C-g or a function simulating that,
> but other loopers aren't aware that something like that is sitting
> on the hook).  So we shouldn't be using play-until-c-g in dlp/new-buttons.scm,
> but that's just a bandaid.

That is actually not all of the reason. The recent problem with the 
looping is, as I wrote earlier, that the stop-hook has suddenly started 
to be called the same number of times as there are channels in the 
sound-file. I have started snd with -noinit, just added one stop-hook, 
and it gets called 1 time for mono files, 2 times for stereo-files, etc.

> I need to think of some way to make it safe to load these files any
> number of times.  But, the harder problem is that a function that wants
> to add a hook function has no way of knowing (in general) what else is
> already on that hook's function list -- whether for example a looping
> play is already queued up.  I think the whole start|stop-play|dac-hook
> business needs to be redone.  So, I propose to add an argument to the
> various play functions to associate a (stop-)function with that
> particular "play" call, calling that function when that play finishes.
> This way the various additions to the user interface can avoid accidental
> "cross-talk", and there's no problem of "dangling" stop-hook entries.

Yes, this sounds like a very good idea.