[PD-dev] [ pure-data-Patches-2978457 ] -nogui audio initialization problems under Debian
SourceForge.net
noreply at sourceforge.net
Wed Jun 9 18:49:07 CEST 2010
Patches item #2978457, was opened at 2010-03-29 06:01
Message generated for change (Comment added) made by eighthave
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=478072&aid=2978457&group_id=55736
Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: puredata
Group: bugfix
Status: Open
Resolution: Works For Me
Priority: 7
Private: No
Submitted By: Nobody/Anonymous (nobody)
Assigned to: Miller Puckette (millerpuckette)
Summary: -nogui audio initialization problems under Debian
Initial Comment:
The [delread~] in the attached patch fails to initialize to the correct samplerate when started with -nogui under Debian and Pd 0.41.4 or 0.42-5. It seems to initialize to a samplerate of 0 instead. This problem persists independently from the audio driver used (ALS vs OSS). The patch works fine under Windows XP, however.
The patch contains a workaround which has been suggested on the Pd-list, i.e. to loadbang a [switch~] object to 0 and then set it to 1 when neded. However, this did not help in the current situation.
The patch also delays the loadbanged [;pd dsp 1( message by a [del 1000. This is a workaround addressing another manifestation of the audio initialisation problems with -nogui under Debian. If the [del 1000] is removed, the patch fails to load under -nogui with a "dev/dsp (read/write): Device or resource busy" message.
IOhannes has suggested on the list to set the samplerate explicitely at startup, i.e. by
pd -nogui -r 44100
However, I cannot confirm this workaround to work with the attached patch.
Please note that the attached patch works fine under Windows XP and with -nogui enabled; also if the [del 1000] and [switch~] objects are omitted.
best,
flo.H
----------------------------------------------------------------------
>Comment By: Hans-Christoph Steiner (eighthave)
Date: 2010-06-09 12:49
Message:
committed to Pd-extended 0.42.5 here:
http://pure-data.svn.sourceforge.net/viewvc/pure-data?view=rev&revision=13631
----------------------------------------------------------------------
Comment By: Hans-Christoph Steiner (eighthave)
Date: 2010-06-09 12:46
Message:
Nice example Pd patch illustrating the bug, thanks for that. Its almost a
little composition! I also tested this issue on Mac OS X 10.5.8/Intel and
it exists there. The attached patch from Matju seems to fix the problem.
IOhannes checked it out and ok'ed it too.
----------------------------------------------------------------------
Comment By: Nobody/Anonymous (nobody)
Date: 2010-06-05 11:15
Message:
this diff ought to be included in pd-extended 0.42 test builds ASAP.
----------------------------------------------------------------------
Comment By: Nobody/Anonymous (nobody)
Date: 2010-06-05 11:13
Message:
the diff is in the patchtracker.
----------------------------------------------------------------------
Comment By: Nobody/Anonymous (nobody)
Date: 2010-05-17 19:00
Message:
move sigdelwrite_updatesr(delwriter, sp[0]->s_sr); inside if (delwriter) or
else you will get crashes due to null-pointer error.
----------------------------------------------------------------------
Comment By: Nobody/Anonymous (nobody)
Date: 2010-05-16 17:56
Message:
--- d_delay.c (révision 13558)
+++ d_delay.c (copie de travail)
@@ -24,6 +24,7 @@
{
t_object x_obj;
t_symbol *x_sym;
+ t_float x_deltime; /* delay in msec */
t_delwritectl x_cspace;
int x_sortno; /* DSP sort number at which this was last put on
chain */
int x_rsortno; /* DSP sort # for first delread or write in chain */
@@ -34,6 +35,21 @@
#define XTRASAMPS 4
#define SAMPBLK 4
+static void sigdelwrite_updatesr (t_sigdelwrite *x, t_float sr)
+{
+ int nsamps = x->x_deltime * sr * (t_float)(0.001f);
+ if (nsamps < 1) nsamps = 1;
+ nsamps += ((- nsamps) & (SAMPBLK - 1));
+ nsamps += DEFDELVS;
+ if (x->x_cspace.c_n != nsamps) {
+ x->x_cspace.c_vec = (t_sample *)resizebytes(x->x_cspace.c_vec,
+ (x->x_cspace.c_n + XTRASAMPS) * sizeof(t_sample),
+ ( nsamps + XTRASAMPS) * sizeof(t_sample));
+ x->x_cspace.c_n = nsamps;
+ x->x_cspace.c_phase = XTRASAMPS;
+ }
+}
+
/* routine to check that all delwrites/delreads/vds have same vecsize
*/
static void sigdelwrite_checkvecsize(t_sigdelwrite *x, int vecsize)
{
@@ -54,19 +70,13 @@
static void *sigdelwrite_new(t_symbol *s, t_floatarg msec)
{
- int nsamps;
t_sigdelwrite *x = (t_sigdelwrite *)pd_new(sigdelwrite_class);
if (!*s->s_name) s = gensym("delwrite~");
pd_bind(&x->x_obj.ob_pd, s);
x->x_sym = s;
- nsamps = msec * sys_getsr() * (t_float)(0.001f);
- if (nsamps < 1) nsamps = 1;
- nsamps += ((- nsamps) & (SAMPBLK - 1));
- nsamps += DEFDELVS;
- x->x_cspace.c_n = nsamps;
- x->x_cspace.c_vec =
- (t_sample *)getbytes((nsamps + XTRASAMPS) * sizeof(t_sample));
- x->x_cspace.c_phase = XTRASAMPS;
+ x->x_deltime = msec;
+ x->x_cspace.c_n = 0;
+ x->x_cspace.c_vec = getbytes(XTRASAMPS * sizeof(t_sample));
x->x_sortno = 0;
x->x_vecsize = 0;
x->x_f = 0;
@@ -109,6 +119,7 @@
dsp_add(sigdelwrite_perform, 3, sp[0]->s_vec, &x->x_cspace,
sp[0]->s_n);
x->x_sortno = ugen_getsortno();
sigdelwrite_checkvecsize(x, sp[0]->s_n);
+ sigdelwrite_updatesr(x, sp[0]->s_sr);
}
static void sigdelwrite_free(t_sigdelwrite *x)
@@ -180,6 +191,7 @@
int delsamps = *(int *)(w[3]);
int n = (int)(w[4]);
int phase = c->c_phase - delsamps, nsamps = c->c_n;
+
t_sample *vp = c->c_vec, *bp, *ep = vp + (c->c_n + XTRASAMPS);
if (phase < 0) phase += nsamps;
bp = vp + phase;
@@ -197,6 +209,7 @@
t_sigdelwrite *delwriter =
(t_sigdelwrite *)pd_findbyclass(x->x_sym, sigdelwrite_class);
x->x_sr = sp[0]->s_sr * 0.001;
+ sigdelwrite_updatesr(delwriter, sp[0]->s_sr);
x->x_n = sp[0]->s_n;
if (delwriter)
{
@@ -206,8 +219,7 @@
sigdelread_float(x, x->x_deltime);
dsp_add(sigdelread_perform, 4,
sp[0]->s_vec, &delwriter->x_cspace, &x->x_delsamps,
sp[0]->s_n);
- }
- else if (*x->x_sym->s_name)
+ } else if (*x->x_sym->s_name)
error("delread~: %s: no such delwrite~",x->x_sym->s_name);
}
----------------------------------------------------------------------
Comment By: Nobody/Anonymous (nobody)
Date: 2010-05-16 14:03
Message:
the bug is actually deeper than that, as delread does a bunch of "Invalid
read of size 4" according to valgrind, after this fix.
----------------------------------------------------------------------
Comment By: Nobody/Anonymous (nobody)
Date: 2010-05-16 13:48
Message:
the previous fix is leaking memory.
----------------------------------------------------------------------
Comment By: Nobody/Anonymous (nobody)
Date: 2010-05-16 13:45
Message:
--- d_delay.c (révision 13539)
+++ d_delay.c (copie de travail)
@@ -24,6 +24,7 @@
{
t_object x_obj;
t_symbol *x_sym;
+ t_float x_deltime; /* delay in msec */
t_delwritectl x_cspace;
int x_sortno; /* DSP sort number at which this was last put on
chain */
int x_rsortno; /* DSP sort # for first delread or write in chain */
@@ -54,19 +55,13 @@
static void *sigdelwrite_new(t_symbol *s, t_floatarg msec)
{
- int nsamps;
t_sigdelwrite *x = (t_sigdelwrite *)pd_new(sigdelwrite_class);
if (!*s->s_name) s = gensym("delwrite~");
pd_bind(&x->x_obj.ob_pd, s);
x->x_sym = s;
- nsamps = msec * sys_getsr() * (t_float)(0.001f);
- if (nsamps < 1) nsamps = 1;
- nsamps += ((- nsamps) & (SAMPBLK - 1));
- nsamps += DEFDELVS;
- x->x_cspace.c_n = nsamps;
- x->x_cspace.c_vec =
- (t_sample *)getbytes((nsamps + XTRASAMPS) * sizeof(t_sample));
- x->x_cspace.c_phase = XTRASAMPS;
+ x->x_deltime = msec;
+ x->x_cspace.c_n = 0;
+ x->x_cspace.c_vec = 0;
x->x_sortno = 0;
x->x_vecsize = 0;
x->x_f = 0;
@@ -106,6 +101,18 @@
static void sigdelwrite_dsp(t_sigdelwrite *x, t_signal **sp)
{
+ int nsamps = x->x_deltime * sp[0]->s_sr * (t_float)(0.001f);
+ post("sigdelwrite_dsp: %f ms, with sr=%f",x->x_deltime,sys_getsr());
+ if (nsamps < 1) nsamps = 1;
+ nsamps += ((- nsamps) & (SAMPBLK - 1));
+ nsamps += DEFDELVS;
+ if (x->x_cspace.c_n != nsamps) {
+ x->x_cspace.c_n = nsamps;
+ x->x_cspace.c_vec =
+ (t_sample *)getbytes((nsamps + XTRASAMPS) * sizeof(t_sample));
+ x->x_cspace.c_phase = XTRASAMPS;
+ }
+
dsp_add(sigdelwrite_perform, 3, sp[0]->s_vec, &x->x_cspace,
sp[0]->s_n);
x->x_sortno = ugen_getsortno();
sigdelwrite_checkvecsize(x, sp[0]->s_n);
----------------------------------------------------------------------
Comment By: Nobody/Anonymous (nobody)
Date: 2010-05-16 13:40
Message:
this also goes with another bug : [delwrite~] doesn't honour the sampling
rate set by [block~]
----------------------------------------------------------------------
Comment By: Nobody/Anonymous (nobody)
Date: 2010-05-16 13:20
Message:
this goes with another bug : [delwrite~] doesn't honour any change of
sampling rate (e.g. 44100 to 22050).
those bugs are related because the reason [delwrite~] doesn't work with
this, is that [delwrite~] is created while sys_getsr() still reports
sampling rate to be "0", because sys_dacsr has not been assigned to.
----------------------------------------------------------------------
Comment By: Nobody/Anonymous (nobody)
Date: 2010-05-16 13:00
Message:
if you load your patch using a «; pd open $1 .» message from a [delay]ed
[loadbang], the patch runs correctly.
----------------------------------------------------------------------
Comment By: Nobody/Anonymous (nobody)
Date: 2010-05-16 12:53
Message:
you can replace the [delay 1000] by just [delay], that is, [delay 0].
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=478072&aid=2978457&group_id=55736
More information about the Pd-dev
mailing list