[linux-audio-dev] strange jack ringbuffer problem

Hans Fugal hans at fugal.net
Fri Feb 18 05:58:03 UTC 2005


I've been banging my head against this one all evening. Now I'm going to
go to sleep on it, but I throw it out for the wiser and more experienced
to see if you can see my error.

The code is at http://fugal.net/~fugalh/src/alex which you are welcome
to refer to and critique.

It segfaults on line 171 of jack.cc, but not if I comment out line 158
(or use 0 for the second argument). It seems to segfault once input_rb
is nearly or completely to the end (not full, since it is being drained
by the other thread; it's just as it would wrap around). The autopsy
shows that it is segfaulting because output_rb and consequentially vec
is completely hosed. What I don't understand is how
jack_ringbuffer_write_advance(input_rb, something_plenty_small) could
possibly hose output_rb. something_plenty_small is usually on the order
of 160 bytes. I'm running jackd with a 512 byte buffer at 48000Hz. 

(gdb) bt
#0  0xb7f91253 in src_short_to_float_array () from /usr/lib/libsamplerate.so.0
#1  0x0804a01c in Jack::jack_process (this=0xbffff300, nframes=512, 
    arg=0xbffff300) at jack.cc:171
#2  0x08049d87 in Jack::jack_process_wrapper (nframes=512, arg=0xbffff300)
    at jack.cc:114
#3  0xb7fb255d in jack_stop_freewheel () from /usr/lib/libjack-0.80.0.so.0
#4  0xb7d639b4 in start_thread () from /lib/tls/libpthread.so.0
#5  0x00000000 in ?? ()
(gdb) up
#1  0x0804a01c in Jack::jack_process (this=0xbffff300, nframes=512, 
    arg=0xbffff300) at jack.cc:171
171             src_short_to_float_array((short*)vec[i].buf, buf, vframes);
(gdb) p *output_rb
$1 = {buf = 0xd0b0c860 <Address 0xd0b0c860 out of bounds>, 
  write_ptr = 92858992, read_ptr = 88669736, size = 4291362712, 
  size_mask = 13171512, mlocked = 3735008}
(gdb) p vec
$2 = {{buf = 0xd5f9c688 <Address 0xd5f9c688 out of bounds>, len = 4189256}, {
    buf = 0x804d028 "����", len = 0}}
(gdb) p *input_rb
$3 = {buf = 0x804d028 "����", write_ptr = 16266, read_ptr = 16266, 
  size = 16384, size_mask = 16383, mlocked = 0}

I hope someone can see what I'm doing wrong.

Consider the code under the GPL.

-- 
 .O.  Hans Fugal            | De gustibus non disputandum est.
 ..O  http://hans.fugal.net | Debian, vim, mutt, ruby, text, gpg
 OOO                        | WindowMaker, gaim, UTF-8, RISC, JS Bach
---------------------------------------------------------------------
GnuPG Fingerprint: 6940 87C5 6610 567F 1E95  CB5E FC98 E8CD E0AA D460




More information about the Linux-audio-dev mailing list