Florian Schmidt wrote:
> > since i'm using 2.6.14 , you mean set_rtlimits from
> > http://www.physics.adelaide.edu.au/~jwoithe/set_rtlimits-1.1.0.tgz ?
> >
> > but if i run jack as a user, there are no capture ports, and i have tons of
> > xruns.
>
> Just for completeness sake: You can use the realtime lsm for 2.6.13 and
> above, too. I would even recommend it, since it's much less of a hassle
> to setup (rt_limits being the "correct" solution or not).
I'm a bit puzzled by this statement. lsm requires you get the patch, apply
it to your kernel, configure and compile your kernel, install and boot the
new kernel and then you can start configuring userspace to take advantage of
it.
In contrast, using the rtlimits approach can be as simple as grabbing
set_rtlimits and compiling it (assuming one has a kernel >= 2.6.13 installed
of course). Configuring userspace is via a single simple text file
(documented in the source distribution). Using it then boils down to doing
things like
set_rtlimits -r /usr/local/bin/jackd ...
set_rtlimits -r /usr/local/bin/ardour
etc when starting applications which need it. Aliases can even be used
to hide the set_rtlimits bit if desired. To me this seems a *lot*
easier than messing around with patched kernels.
It *is* true that (on systems which use PAM) PAM can be patched to provide
access to the rtlimits functionality in a transparent way. I will admit
that doing things this way is complex and a hassle. I wrote set_rtlimits
for two reasons:
1) give myself access to the rtlimits functionality - my system doesn't
run PAM, so the PAM patches aren't useful to me personally.
2) provide a much simpler way to get access to the rtlimits functionality
in this interim period until PAM (or login in the case of systems not
using PAM) support rtlimits out the box.
set_rtlimits can also control access to the rtlimit resource on a
per-program basis. A patched login wouldn't be able to do this; PAM may
or may not - I don't know enough about it to comment.
Of course everyone is free to choose the solution which best suits them;
if people prefer lsm that's fine by me.
As a side comment, I'm currently finalising a new version of set_rtlimits.
I've generalised it so it can set other resource limits too -
locked-in-memory size for example - since this can also be useful to control
on a per-program basis. Consequently its name will change to set_rlimits
but the version number will be sequential. Invocation has also been made
easier (absolute paths will no longer need to be specified - they will be
pulled from the configuration file). I expect to have time to finalise it
in the next couple of weeks.
Best regards
jonathan
it happens randomly, while I play a soft synth, that jack XRUNs once,
and the audio become crappy, noisy, like a kinda of digital
effect....bit crusher?
then all synthesizers (all audio apps) sound the same sh*t...
i tried recording with ardour the output, and the output is clean, so I
guess is a problem of sync or something that has to do with the hardware
(soundcard).
in order to record this noise, i had to connect the soundcard output in
its input and record it via analog in:
http://xaero.ath.cx/jackbug_stereo.wav.bz2 (it is a stereo file, with
the clean track panned on the left, and the dirty one on the right).
i hope it could be useful to debug the problem...
what other information I can provide useful for debug?
note that this happens with many version of alsa (1.0.9b, 1.0.10rc2,
1.0.7 or less) and with many kernels (gentoo-sources (slightly patched
for speed improvement), ck-sources, ck-sources+realtime-lsm)
i hope to solve this problem, since my audio desktop is unusable as si,
since audio crasher after playng for just 5 minutes :(
Hi!
I had a similar problem in my laptop when using a USB soundcard
(Edirol UA-25). For me it was not necessarily associated with xruns.
Since ardour doesn't record the noise, I would say that the problem is
not in jack, but in the alsa driver.
It sounded also more like a distortion than noise, since when the
output levels were low the effect was less noticeable.
I found empirically that harddisk writing operations like saving a
file in an application would sometimes make the distortion stop, I'll
be damned if I know why (interrupts?).
Anyway, setting my USB unit to work at 48 kHz made this problem
practically disappear.
HTH,
Luis
> it happens randomly, while I play a soft synth, that jack XRUNs once,
> and the audio become crappy, noisy, like a kinda of digital
> effect....bit crusher?
>
> then all synthesizers (all audio apps) sound the same sh*t...
> i tried recording with ardour the output, and the output is clean, so I
> guess is a problem of sync or something that has to do with the hardware
> (soundcard).
>
> in order to record this noise, i had to connect the soundcard output in
> its input and record it via analog in:
> http://xaero.ath.cx/jackbug_stereo.wav.bz2 (it is a stereo file, with
> the clean track panned on the left, and the dirty one on the right).
>
> i hope it could be useful to debug the problem...
> what other information I can provide useful for debug?
> note that this happens with many version of alsa (1.0.9b, 1.0.10rc2,
> 1.0.7 or less) and with many kernels (gentoo-sources (slightly patched
> for speed improvement), ck-sources, ck-sources+realtime-lsm)
>
> i hope to solve this problem, since my audio desktop is unusable as si,
> since audio crasher after playng for just 5 minutes :(
>
>
I am wondering what the status of the mLAN or something similar is in
linux? I have been able to find some mention of talking with Yamaha
about it, but past that I cant seem to find anything on it. I am
looking for a solution to allow me to connect and stream audio in
realtime over firewire to a Mac Mini to run some VSTs on until VST
support in Linux is worked out completly. Thanks.
Seablade
Thanks for the tip on "diversity reception". Yes, I got the
idea from astronomer's systems. I use the term "invented" the same
way as patenteers: due lack of extensive literary search, I know
at most that the thing is new to me.
Though, I have never seen such a system used in consumer radios.
I'm not sure if it have been used in DX'ing radios either.
My test plan was to record the same music station at two cities
(apart 200km). Then timescale and align the digitized (1 or 2 hours)
recordings manually. And then do the thing.
Juhana
--
http://music.columbia.edu/mailman/listinfo/linux-graphics-dev
for developers of open source graphics software
Hi,
here
http://affenbande.org/~tapas/rt_watchdog.tgz
you find a small program which acts as a watchdog daemon that kills
runaway SCHED_FIFO tasks. It does so by setting up two threads:
- one high priority (99) consumer that runs every 3 seconds
- one low priority (1) producer that runs every second
the producer fills a ringbuffer and the consumer drains it. When the
ringbuffer runs empty a shell script will be run (via the system()
function) that tries to change the scheduling policy of all threads in
the system from SCHED_FIFO to SCHED_OTHER. the offending task may
naturally not run at prio 99, otherwise the watchdog would never get to
run.
Here's a potential problem: The shell script potentially changes its own
scheduling policy to SCHED_OTHER prior to chnaging the offending runaway
task. Ugh! Any hint?
Also all IRQ handler threads also have their policy changed. Dunno
whether that's good or not.
For reference i pasted the script and the c file here:
unfifo_stuff.sh (the two arguments are the two thread id's of the
rt_watchdog threads, as these are not supposed to have their policy
changed).
There's also a small test program in the tarball (compiles to test_rt)
that wastes cycles SCHED_FIFO (locking the system) but exits eventually,
so it's quite safe to test the watchdog with it.
Maybe someone else find's it useful. Recommendations, tips, critique are
all welcome..
unfifo_stuff.sh
#!/bin/bash
for i in $( ps -eL -o pid ); do
if [ "$i" != "$1" -a "$i" != "$2" ]
then
chrt -o -p 0 $i
fi
done
rt_watchdog.c:
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <syslog.h>
#include <signal.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <linux/unistd.h>
#include <errno.h>
_syscall0(pid_t,gettid)
#include "ringbuffer.h"
/* how long to sleep between checks in the high prio thread */
#define SLEEPSECS 3
/* how long to sleep between writing "alive" messages to the ringbuffer
from the low prio thread */
#define LP_SLEEPSECS 1
/* the priority of the high prio thread */
#define PRIO 99
/* the priority of the low prio thread */
#define LP_PRIO 1
/* the ringbuffer used to transfer "alive" messages from low prio producer
to high prio consumer */
jack_ringbuffer_t *rb;
pthread_t low_prio_thread;
/* the thread id's for the low prio and high prio threads.
these get passed to the unfifo_stuff.sh script to make sure
the watchdog doesn't repolicy itself to SCHED_OTHER */
pid_t lp_tid;
pid_t hp_tid;
void signalled(int signal)
{
}
volatile int thread_finish;
/* this is the low prio thread. it simply writes to
the ringbuffer to signal that it got to run, meaning it is still
alive */
void *lp_thread_func(void *arg) {
char data;
struct timespec tv;
lp_tid = gettid();
/* syslog(LOG_INFO, "lp tid: %i", gettid()); */
data = 0 ;
while(!thread_finish) {
/* we simply write stuff to the ringbuffer and go back to sleeping
we can ignore the return value, cause, when it's full, it's ok
the data doesn;t have any meaning. it just needs to be there
running full shouldn't happen anyways */
jack_ringbuffer_write(rb, &data, sizeof(data));
/* then sleep a bit. but less than the watchdog high prio thread */
tv.tv_sec = LP_SLEEPSECS;
tv.tv_nsec = 0;
// sleep(LP_SLEEPSECS);
nanosleep(&tv, NULL);
}
return 0;
}
int main()
{
pid_t pid, sid;
int done;
struct sched_param params;
char data;
int err;
int consumed;
int count;
struct timespec tv;
char unfifo_cmd[1000];
/* Fork off the parent process */
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
/* If we got a good PID, then
we can exit the parent process. */
if (pid > 0) {
exit(EXIT_SUCCESS);
}
/* Change the file mode mask */
umask(0);
/* Open any logs here */
openlog("rt_watchdog", 0, LOG_DAEMON);
syslog(LOG_INFO, "started");
/* Create a new SID for the child process */
sid = setsid();
if (sid < 0) {
/* Log any failure here */
syslog(LOG_INFO, "setsid failed. exiting");
exit(EXIT_FAILURE);
}
/* Change the current working directory */
if ((chdir("/")) < 0) {
/* Log any failure here */
syslog(LOG_INFO, "chdir failed. exiting");
exit(EXIT_FAILURE);
}
/* Close out the standard file descriptors */
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
// syslog(LOG_INFO, "closed fd's");
/* syslog(LOG_INFO, "hp tid: %i", gettid()); */
hp_tid = gettid();
/* not really nessecary, but wtf */
mlockall(MCL_FUTURE);
thread_finish = 0;
done = 0;
/* get ourself SCHED_FIFO with prio PRIO */
params.sched_priority = PRIO;
if (pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶ms)) {
syslog(LOG_INFO, "couldn't set realtime prio for main thread.. exiting..");
exit(EXIT_FAILURE);
}
// syslog(LOG_INFO, "prio set");
/* create a ringbuffer for the low prio thread to signal it's alive */
rb = jack_ringbuffer_create(1024);
// syslog(LOG_INFO, "ringbuffer created");
/* create low prio thread */
err = pthread_create(&low_prio_thread, 0, lp_thread_func, 0);
if(err) {
syslog(LOG_INFO, "couldn't create low prio thread, exiting..");
exit(EXIT_FAILURE);
}
/* dirty. we really need to wait for the lp thread
to have written the lp_tid. (condition variable?) */
sleep(1);
// syslog(LOG_INFO, "created low prio thread");
/* make the low prio thread sched_fifo */
params.sched_priority = LP_PRIO;
if (pthread_setschedparam(low_prio_thread, SCHED_FIFO, ¶ms)) {
syslog(LOG_INFO, "couldn't set realtime prio for lower prio thread.. exiting..");
thread_finish = 1;
pthread_join(low_prio_thread, NULL);
exit(EXIT_FAILURE);
}
/* this is the main loop. we somply check whether the low prio thread
got to run at all by looking into the ringbuffer. If it's empty,
the low prio thread is kinda dead */
count = 0;
while(!done) {
tv.tv_sec = SLEEPSECS;
tv.tv_nsec = 0;
nanosleep(&tv, NULL);
/* sleep(SLEEPSECS); */
count++;
/* syslog(LOG_INFO, "count %i", count); */
/* see if our little brother got to run */
if (jack_ringbuffer_read_space(rb) == 0) {
/* oh oh, it didn't */
syslog(LOG_INFO, "low prio thread seems to be starved, taking measures...");
/* we pass our own TID's to the script, so we are excluded from the
scheduling policy change */
sprintf(unfifo_cmd, "unfifo_stuff.sh %i %i", lp_tid, hp_tid);
syslog(LOG_INFO, "unfifo command:");
syslog(LOG_INFO, unfifo_cmd);
if (system(unfifo_cmd) == -1) {
syslog(LOG_INFO, "unfifo command failed");
}
} else {
/* consume stuff from ringbuffer */
consumed = 0;
while (jack_ringbuffer_read_space(rb)) {
consumed++;
jack_ringbuffer_read(rb, &data, 1);
}
/* syslog(LOG_INFO, "lp alive: %i", consumed); */
}
}
thread_finish = 1;
pthread_join(low_prio_thread, NULL);
syslog(LOG_INFO, "exiting");
exit(EXIT_SUCCESS);
}
test.c:
#include <pthread.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
int main() {
struct sched_param params;
int done = 0;
struct timeval tv;
time_t startsec;
unsigned long int loops;
int outer_loops;
params.sched_priority = 80;
pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶ms);
gettimeofday(&tv,0);
startsec = tv.tv_sec;
#if 0
while(!done) {
gettimeofday(&tv, 0);
if(tv.tv_sec - startsec > 10)
done = 1;
}
#endif
for (outer_loops = 0; outer_loops < 4; ++outer_loops) {
for (loops = 0; loops < 1000000000; loops++) {done += 1;}
}
exit (EXIT_SUCCESS);
}
--
Palimm Palimm!
http://tapas.affenbande.org
Hello Everybody,
DRC 2.6.1 is available at:
http://sourceforge.net/project/showfiles.php?group_id=136217
and soon it will be announced at the usual:
http://freshmeat.net/projects/drc/
Changes:
Minor corrections and improvements have been applied to the documentation
and to the pre-echo truncation inversion procedure. A new target transfer
function definition procedure based on Uniform B Splines has been
introduced. The development environment has been moved to Code::Blocks and
GCC/MinGW.
Best of listening,
--
Denis Sbragion
InfoTecna
Tel: +39 0362 805396, Fax: +39 0362 805404
URL: http://www.infotecna.it
Denemo is a GTK+ front end for GNU Lilypond Music Typesetter.
http://denemo.sourceforge.net
After a long period of time denemo 0.7.4 has been released.
New features include :
Help Documentation
Support for exporting to Lilypond 2.6
All ornaments/articulations added
Replace Mode
Basic Redo/Undo Functionality for individual objects
More Templates available
Export to PDF (via lilypond processing) Courtesy of Jens Askengren
Also, this mail serves as a call for additional contributors to the
project as Lilypond is fast moving
rapid development is required to keep up. A plug-in API is being
developed to enable export to other file formats
or automated composition tools.
Any contribution will be greatly received.
Adam
I'm trying to get a digigram mixart8 aes/ebu working in a dual xeon box.
A RME digi96 card works fine in the same box and the digigram works fine
in a different uni-processor box. I don't know if it's smp related or
just the box or what. booting with nosmp does not help.
The symptom is that aplay fails with EINVAL when trying to open
/dev/snd/pcmC0D0p (or any other device on the card). jackd fails
similarly when trying to open the corresponding capture device.
Elrond:~# aplay /var/snd/999999_000.wav
aplay: main:533: audio open error: Invalid argument
The firmware is loaded. aplay works on the same box with the RME card.
This is debian sarge with 2.6.13 (also tried 2.6.14) and alsa 1.0.9.
Anyone have any thoughts?
--
Eric Dantan Rzewnicki | Systems Administrator
Technical Operations Division | Radio Free Asia
2025 M Street, NW | Washington, DC 20036 | 202-530-4900
CONFIDENTIAL COMMUNICATION
This e-mail message is intended only for the use of the addressee and
may contain information that is privileged and confidential. Any
unauthorized dissemination, distribution, or copying is strictly
prohibited. If you receive this transmission in error, please contact
network(a)rfa.org.
Hello Lists,
I don't know, where ich can fix my little problem. Maybe i 've missed some
explanations and/or haven't read my mails good enough. anyway, i try to
install a linuxbox for audio on slackware
i have installed slackware and patching the kernel 2.6.14 vanilla with
patch-2.6.14-rt2. Then i installed the set_rtlimits1.1.0 software, because
Slackware has no PAM.
First. this must be all for audio in realtime , is this right??
then i have to set the setuid. aus root i have done
bash-3.00$ su
Password:
bash-3.00# chmod ugo+s /usr/local/bin/jackd
bash-3.00# exit
bash-3.00$ ls -la /usr/local/bin/jackd
-rwsr-sr-x 1 root root 206476 2005-11-01 15:23 /usr/local/bin/jackd
bash-3.00$ whoami
soundroom
bash-3.00$ jackd -dalsa&
[1] 3202
bash-3.00$ jackd 0.100.0
Copyright 2001-2005 Paul Davis and others.
jackd comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details
JACK compiled with System V SHM support.
loading driver ..
creating alsa driver ... hw:0|hw:0|1024|2|48000|0|0|nomon|swmeter|-|32bit
control device hw:0
configuring for 48000Hz, period = 1024 frames, buffer = 2 periods
nperiods = 2 for capture
nperiods = 2 for playback
bash-3.00$ ps -aux
[..]
root 3202 0.0 0.4 10472 2380 pts/1 S 12:03 0:00 jackd -dalsa
root 3203 0.0 0.4 10472 2380 pts/1 R 12:03 0:00 jackd -dalsa
root 3204 0.0 0.4 10472 2380 pts/1 S 12:03 0:00 jackd -dalsa
root 3205 0.0 0.4 10472 2380 pts/1 S 12:03 0:00 jackd -dalsa
root 3206 0.2 0.4 10472 2380 pts/1 S 12:03 0:00 jackd -dalsa
[..]
bash-3.00$ jack_lsp
JACK server not running
why i can't use jack an normal user? what have i missed? why there are 5
processes of jack? is this a secure way? do i need every application as suid?