jackd, timidity werken alleen als root

Beste mensen,

Ik kan na lang (wekenlang) zoeken en proberen eindelijk rosegarden draaien met een combi van jackd en timidity. Maar alleen als ik eerst jackd en dan timidity beide als root laadt. Ik zoek een oplossing waarbij de commando’s ook werken als user dit doet. Of als dat niet kan: jackd en timidity laten autostarten, zodat mijn vrouw rosegarden kan gebruiken zonder dat ze allerlei commando’s in moet voeren als root.

Mijn systeem: opensuse 11.3 met KDE 4.5.5, kernel 2.6.34.7 -desktop i686, AMD Athlon XP 1800+, RAM 1,5GiB.
Ik boot met de desktopkernel, want die is ingesteld op realtime, zag ik toen ik de instellingen ging bekijken.

Tevens heb ik in /etc/security/limits.conf staan:
@audio - rtprio 90
@audio - memlock 4000000
(ik had ooit rtprio op 99 en memlock op unlimited staan, maar dat maakte geen verschil in het probleem).
En alle users zijn lid van audio.

Ik laad jackd als volgt:

sudo /usr/bin/jackd -R -dalsa -dhw:0 -r48000 -p1024 -n2
root's password:
jackdmp 1.9.5
Copyright 2001-2005 Paul Davis and others.
Copyright 2004-2009 Grame.
jackdmp 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 server starting in realtime mode with priority 10
Engine profiling activated, beware 197 MBytes are needed to record profiling points...
creating alsa driver ... hw:0|hw:0|1024|2|48000|0|0|nomon|swmeter|-|32bit
Using ALSA driver ENS1371 running on card 0 - Ensoniq AudioPCI ENS1371 at 0xec00, irq 18
configuring for 48000Hz, period = 1024 frames (21.3 ms), buffer = 2 periods
ALSA: final selected sample format for capture: 16bit little-endian
ALSA: use 2 periods for capture
ALSA: final selected sample format for playback: 16bit little-endian
ALSA: use 2 periods for playback

Daarna laad ik timidity als midiserver:

sudo timidity -iA
sh: arts-start: opdracht niet gevonden
jack_client_new: deprecated
jack_client_new: deprecated
TiMidity starting in ALSA server mode
Opening sequencer port: 128:0 128:1 128:2 128:3

Daarna start ik rosegarden, en kan ik midibestanden afspelen zonder enig probleem.

Het idiote van het hele geval is dat als ik alleen (zonder jackd) timidity als gewone gebruiker start (dus: timidity -iA), dan kan ik windowsprogramma’s Notation Player en Sweet Midi Player zonder enig probleem gebruiken onder wine (geluid ingesteld op alsa kunnen ze de timidity midi-poorten zien en gebruiken). En dat onder de pae kernel, niks te realtime of low latency gedoe, het werkt gewoon. Rosegarden doet het dan niet (speelt af zonder enig geluid, ondanks het feit dat alle instellingen goed staan).

Ook het transgalactisch liftershandboek gaf geen uitkomst, dus daar sta ik dan met mijn handdoekje.

Enige hulp wordt op prijs gesteld.

Ik heb nog wat zaken vergeten.
Waarom gebruik ik Rosegarden, om midi af te spelen? Ik zoek een programma waarbij het tijdens het afspelen mogelijk is de notenbalken te bekijken en de volumes per spoor aan te passen. Ik heb ook andere programma’s bekeken, zoals lmms en qtractor maar die deden het niet en ik kon op internet geen oplossing vinden.

Voor troubleshooting is het wellicht handig te weten wat er gebeurt als ik jackd en timidity laadt als gewone gebruiker:

/usr/bin/jackd -dalsa -dhw:0 -r48000 -p1024 -n2
jackdmp 1.9.5
Copyright 2001-2005 Paul Davis and others.
Copyright 2004-2009 Grame.
jackdmp 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 server starting in realtime mode with priority 10
Engine profiling activated, beware 197 MBytes are needed to record profiling points...
creating alsa driver ... hw:0|hw:0|1024|2|48000|0|0|nomon|swmeter|-|32bit
Using ALSA driver ENS1371 running on card 0 - Ensoniq AudioPCI ENS1371 at 0xec00, irq 18
configuring for 48000Hz, period = 1024 frames (21.3 ms), buffer = 2 periods
ALSA: final selected sample format for capture: 16bit little-endian
ALSA: use 2 periods for capture
ALSA: final selected sample format for playback: 16bit little-endian
ALSA: use 2 periods for playback

Dat ziet er dacht ik hetzelfde uit.

Dan timidity als gewone gebruiker:

timidity -iA
Requested buffer size 32768, fragment size 8192
ALSA pcm 'default' set buffer size 32768, period size 8192 bytes
TiMidity starting in ALSA server mode
Opening sequencer port: 128:0 128:1 128:2 128:3
Requested buffer size 32768, fragment size 8192
ALSA pcm 'default' set buffer size 32768, period size 8192 bytes

Hier is de output anders en Rosegarden speelt af zonder geluid (terwijl volumes goed staan en de timidity port 128:0 is geselecteerd). Ik weet echter niet wat ik hiervan moet maken.
Als jullie dat willen, kan ik ook de output van Rosegarden geven, maar dat is een enorme lap tekst.

groetjes,

Om te beginnen, ik ken geen van de programma’s die je noemt en heb slechts een vaag idee van wat ze kunnen en wat je wilt bereiken.

De naamgeving jackd doet mij vermoeden dat het hier om een daemon gaat. een daemon is een syteem process dat draait gedurende de gehele keventijd van het systeem (van boot tot shutdown). Daemons kunnen bijvoorbeeld services verlenen over het netwerk (denk aan Apache voor HTTP, svftpd voor FTP, sshd voor SSH), maar ook voor inwendige diensten. Ik heb het idee dat jouw jackd een dienst verleent voor gebruikers van je systeem.

Nog steeds ervan uitgaande dat ik een beetje gelijk heb met mijn veronderstellingen, zo’n daemon wordt altijd gestart onder root. Anders kan niet iedere ingelogde gebruiker er gebruik van maken (hij kan na de start overigens wel zichzelf “verlagen” tot een gewone gebruiker uit veiligheidsoverwegingen, zo worden alle aktieve apache processen van wwwrun)… Zulke daemons worden natuurlijk niet met de hand gestart (behalve bij testen), maar als service bij boot in een bepaald runlevel (waarschijnlijk runlevel 5 in jouw geval).

Dit starten gebeurt via een vrij ingewikkeld mechanisme in* /etc/init.d*.

Als ik gelijk heb, kunnen we je helpen met zo’n start/stop script te maken, op de juiste plaats te zetten en te activeren.

Als je dat wilt doen, stel ik dat op prijs. Ik heb op forums van fedora, ubuntu studio, etc. gezien hoe mensen dat regelen in /etc/init.d. Maar omdat ik dan niet weet wat ik aan het doen ben, heb ik er me niet aan gewaagd instellingen uit andere distro’s over te nemen. Ook vraag ik me af of het echt noodzakelijk is, maar goed.
Wat ik aan het doen ben, is ook een goede vraag. Midi onder linux aan de praat krijgen, en dat is niet eenvoudig. Op internet doen allerlei stappenplannen de ronde, die elkaar vaak tegenspreken. Ik kreeg uiteindelijk door dat mijn geluidskaart geen midi had en ik dus een “softsynth” nodig had om midi te emuleren. Ik heb er drie geprobeerd (fluidsynth, timidity, Zapnogwat) maar uiteindelijk kreeg ik alleen timidity werkend.
Timidity is een midi sequencer, een bestandsconverter en een midi-server.
Rosegarden is een midisequencer en een muziek compositie programma. De instructies op de website van dit programma volgend, kwam ik uiteindelijk op de combi van jack en timidity.

bedankt voor je snelle reactie.

Die hele midi zaak zegt me weinig, maar daarom niet getreurd. We gaan proberen om die jackd als systeem daemon te draaien en dan kan je zelf zien of dat iets voor je oplost. Het feit dat in andere distributies ook zoiets gebeurt wijst erop dat ik goed heb gegokt.

Het is misschien minder moeilijk dan je denk. Daar gaan we.

In /etc/init.d staan de zogenaamde start/stop scripts. Die moeten aan bepaalde eisen voldoen. Bovendien staat er in deze scripts commentaar (regels die met een # beginnen) dat voor de shell (bash die het script interpreteert) wel commentaar is, maar het is echte informatie voor de installatie van het script. Om het makkelijk te maken is er een skelet /etc/init.d/skeleton. Die gaan we gebruiken. Je kunt het best eerst een kopie maken naar een plek bij je normale user. Noem de kopie jackd. Ik weet niet hoe goed je in engels bent en ook niet hoe goed in shell scripting, maar lees eerst even wat er in staat.

Allereerst is het volgende stuk belangrijk:

### BEGIN INIT INFO
# Provides:          FOO
# Required-Start:    $syslog $remote_fs
# Should-Start:      $time ypbind smtp
# Required-Stop:     $syslog $remote_fs
# Should-Stop:       ypbind smtp
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Short-Description: FOO XYZ daemon providing ZYX
# Description:       Start FOO to allow XY and provide YZ
#       continued on second line by '#<TAB>'
#       should contain enough info for the runlevel editor
#       to give admin some idea what this service does and
#       what it's needed for ...
#       (The Short-Description should already be a good hint.)
### END INIT INFO

Dit bepaalt straks wanneer jackd gestart/stopt wordt. Ik heb begrepen dat het door mensen die vanuit de GUI werken wordt gebruikt. Dann moet het lopen op runlevel 5. Een voorstel tot wijzigen door mij:

### BEGIN INIT INFO
# Provides:          jackd
# Required-Start:    $ALL
# Required-Stop:     $ALL
# Default-Start:     5
# Default-Stop:      0 1 2 3 6
# Short-Description: jackd daemon voor midi
# Description:       Start the jackd daemon om het gebruik van midi tralalala
### END INIT INFO

Dan wordt het als laatste gestart op runlevel 5. En als eerste gestopt bij shutdown.
Het commentaar is natturlijk jouw eigen tekst :wink:

Volgende stuk:

# Check for missing binaries (stale symlinks should not happen)
# Note: Special treatment of stop for LSB conformance
FOO_BIN=/usr/sbin/FOO
test -x $FOO_BIN || { echo "$FOO_BIN not installed";
        if  "$1" = "stop" ]; then exit 0;
        else exit 5; fi; }

test of de file er is. Dat wordt dus:

# Check for missing binaries (stale symlinks should not happen)
# Note: Special treatment of stop for LSB conformance
FOO_BIN=/usr/bin/jackd
test -x $FOO_BIN || { echo "$FOO_BIN not installed";
        if  "$1" = "stop" ]; then exit 0;
        else exit 5; fi; }

(let op niet alleen jackd, maar ook bin ipv sbin, want daar heb je het kennelijk).
Ik heb lang gedacht over het volgende:

# Check for existence of needed config file and read it
FOO_CONFIG=/etc/sysconfig/FOO
test -r $FOO_CONFIG || { echo "$FOO_CONFIG not existing";
       if  "$1" = "stop" ]; then exit 0;
      else exit 6; fi; }

# Read config
. $FOO_CONFIG

Je hebt geen configuratrie bestand dus dit geheel uitcommentarieren:

# Check for existence of needed config file and read it
#FOO_CONFIG=/etc/sysconfig/FOO
#test -r $FOO_CONFIG || { echo "$FOO_CONFIG not existing";
#        if  "$1" = "stop" ]; then exit 0;
#        else exit 6; fi; }

# Read config
#. $FOO_CONFIG

EDIT: Er komt meer, ik heb per ongeluk op verzenden gedrukt!

We gaan weer verder.
Ik drukte op Plaats bericht ipv preview. Dus moest nog corrigeren met Edit.

Volgens mij zijn we er nu bijna. Kopieer het nieuwe script als root naar /etc/init.d.d/jackd. Let erop dat eigenaar en access bitjes net zo zijn als van de andere scripts daar* -rw-r–r-- 1 root root*.

Dan ga je naar YaST > System > System services (Runlevel) en als het goed is staat jackd nu in het rijtje. Selecteer hem, klik activeren en als dat is gebeurd klik OK.

Attentie: als je twijfelt, vraag eerst! Beter extra gevraagd dan systeem opgeblazen (hoewel het niet zo’n vaart zal lopen.

Waarschijnlijk krijg je morgen pas antwoord (van mij, een ander kan natuurlijk ook helpen).

Dat kan ik goed volgen en mijn engels is ook voldoende hiervoor, dus dat is mooi.
Ik heb nu met behulp van het bestand skeleton een bestand jackd gemaakt en in /etc/init.d gezet.

Maar tijdens het activeren in runlevel services meldt Yast:
“/etc/init.d/jackd start retourneerde 7 (programma draait niet):”
Het wordt niet geactiveerd.

Als ik de opties -dalsa -dhw:0 -r48000 -p1024 -n2 achter FOO_BIN=/usr/bin/jackd zet in het script jackd, meld YAST tijdens het activeren in runlevel services:
“/etc/init.d/jackd start retourneerde 2 (ongeldige of te veel argumenten):”
Ook nu wordt het niet geactiveerd.

Hoe kan ik jackd met de opties starten? Moet dat dan toch in een configuratiebestand?

Zo ziet script jackd er nu uit, dus zonder opties na jackd op te nemen:

### BEGIN INIT INFO
# Provides:          jackd
# Required-Start:    $ALL
# Required-Stop:     $ALL
# Default-Start:     5
# Default-Stop:      0 1 2 3 6
# Short-Description: jackd daemon voor midi
# Description:       Start jackd als server voor midi van timidity
### END INIT INFO
# 

# Check for missing binaries (stale symlinks should not happen)
# Note: Special treatment of stop for LSB conformance
FOO_BIN=/usr/bin/jackd 
test -x $FOO_BIN || { echo "$FOO_BIN not installed"; 
	if  "$1" = "stop" ]; then exit 0;
	else exit 5; fi; }

# Check for existence of needed config file and read it
#FOO_CONFIG=/etc/sysconfig/FOO
#test -r $FOO_CONFIG || { echo "$FOO_CONFIG not existing";
#	if  "$1" = "stop" ]; then exit 0;
#	else exit 6; fi; }

# Read config	
#. $FOO_CONFIG

Toch weer wat geleerd.

groeten, André

Hoi André,

Vannacht, toen ik me even omdraaide, bedacht ik dat ik die parameters was vergeten. Dat heb je dus ook bedacht. Volgens de beschrijving maakt het aantal parameters niet uit. Ook zie ik niet hoe we die door een config file kunnen veranderen want de config file levert alleen omgevingsvariabelen.

Ik ga e.e.a. nog even rustig bekijken. We zijn wel op de goede weg (had je ooit gedacht dat je iets zou maken dat in YaST staat vermeld?), maar we zijn er nog niet helemaal.

Ik kom terug.

Hallo André,

Ik heb me bedacht. We kunnen hier de nodige inspanning in gaan leveren (en als je dat nof steeds wilt om te kijken hoe we het zo werkend kunnen krijgen ga ik met je mee), maar er is een eenvoudigere manier. Ook standaard, maar meer voor local zaken (en dat is dit).

Dat wil zeggen dat je de twee files die je nu hebt in /etc/init.d en etc/sysconfig weer weghaalt (die eerste bewaar je natuurlijk voorlopig ergens).

Daarvoor in de plaats maak je de file /etc/init.d/after.local met als inhoud:

/usr/bin/jackd -R -dalsa -dhw:0 -r48000 -p1024 -n2 &

Let op de & aan het eind!
Doe een reboot en kijk of het iets leuks doet.

Oké, hoe eenvoudiger hoe beter lijkt me. Ik heb in bed ook mijn beste invallen.

Ik heb nu een bestand after.local met daarin de regel jackd met parameters.
En jackd start correct! Het werkt dus.
Echter, nu heb ik wel een probleem met afsluiten. Jackd laat zich tijdens afsluiten van het systeem niet stoppen en belandt in een eindeloze loop van xruns en vruchteloze pogingen om daarvan te herstellen. Hierdoor sluit het systeem niet af.
Er bestaat met jackd vast een parameter voor afsluiten van jackd, maar is er ook een magisch bestand waarin dat geautomatiseerd kan? Niet after.local, maar before.shutdown :wink: ofzoiets?

Bovendien zou ik graag in after.local na het starten van jackd timidity gestart krijgen maar dat lukt niet. Hoezo niet veeleisendrotfl!.

Er staat nu in after.local:

/usr/bin/jackd -R -dalsa -dhw:0 -r48000 -p1024 -n2 &
timidity -iA -Oj &

Ik ben al heel wat verder nu!
groetjes, André

Wacht even, wacht even. jackd is een daemon, te draaien door root, maar wat is timidity?

En dan het stoppen. Je zult uit de documentatie van jackd moeten halen hoe dat moet. Als er niets te vinden is gaan we zelf zoeken, maar dat kan problematisch zijn als het bij shutdown ook niet “vanzelf” gaat.

Wij gebruiken nu after.local, dat is vrij nieuw in de openSUSE omgeving en een beetje primitief. Ik heb de source waar het wordt aangeroepen bekeken en het weet bij nites over runlevels. Maar dat en het stoppen regelen we wel als we weten hoe het stoppen officiëel moet.

WEER een verkeerde knop gedrukt.! zie volgende post.

test "$RUNLEVEL" = "5" && /usr/bin/jackd -R -dalsa -dhw:0 -r48000 -p1024 -n2 &

Verander de code eens in bovenstaande. Dan start het alleen bij runlevel 5 en niet ook als je probeert te stoppen. Graag testen.

Je hebt gelijk: first things first.
Als je wilt weten wat timidity++ is: TiMidity++ - Wikipedia, the free encyclopedia. Ik gebruik het als softsynth en als conversie programma van *.midi naar *.wav/ogg. Er is geen gui om het als midi-server te starten voor zover ik weet, alleen de command line.

Oké, ik heb after.local veranderd. En nu sluit het systeem inderdaad af: jackd stort zich niet in een loop van xruns en skip cycles. Maar tijdens het afsluitproces zie ik af en toe toch nog zo’n melding van jackd ertussen. Het stoort het afsluitproces echter niet. Als je me vertelt waar ik het log kan vinden, kan ik hier laten zien wat er gebeurt (ik kon het log van het afsluiten zo snel niet vinden).

Wat het stoppen van jackd betreft: ik heb nooit een ander commando kunnen vinden dan killall jackd of in dit geval sudo killall jackd. Dat gebruik ik ook voor timidity

Helaas heb ik nu tijdelijk andere verplichtingen: morgenavond bekijk ik het forum weer om te kijken of je een reactie hebt gepost.

groeten, André

test "$RUNLEVEL" = "5" && /usr/bin/jackd -R -dalsa -dhw:0 -r48000 -p1024 -n2 &
test "$RUNLEVEL" = "5" || kilall jackd

Bovenstaand om jackd ook te kiillen (let op: geen &).

Voor timidity. Het gaat mij niet zozeer over wat het doet (iets met geluid kennelijk), maar wie geacht wordt het te draaien. Het gaat hier nog steeds om enerzijds een service gedraaid door het systeem voor alle gebruikers en anderzijds on iets dat een individuele gebruiker voor zichzelf draait.

Zo draait bijvoorbeeld de CUPS daemon vanuit het systeem om printqueueing en printen voor de gebruikers te regelen. De individuele gebruiker gebruikt dan OpenOffice, of een editor, of het* lp* commando om iets te printen.

Als timidity een dienst vereent aan alle gebruikers (die dan zelf dus iets anders aanroepen om er gebruik van te maken) en dus constant onder root moet draaien, gebruik dan inderdaad dezelfde truc als voor jackd.

Bedankt voor deze nieuwe tip: dat werkt inderdaad.

Wat Timidity aangaat, daar denk ik nog een nachtje over na. Het is inderdaad handig als Timidity de softsynth aan alle gebruikers aan kan bieden. Maar dan is er weer een service bij die als root draait. Timidity wordt niet meer ontwikkeld, dus een beveiligingslek wordt niet gedicht (al wordt het zo weinig gebruikt, dat het benutten van een lek weinig vruchten afwerpt).
Ik laat morgen even horen wat ik doe en of het me is gelukt om Timidity zo te draaien en te stoppen.

Belangrijk! Er is een nieuwe thread: Cannot start jack

Ik heb de thread doorgenomen. Ik heb de instellingen voor rtprio al in /etc/init.d. Ik heb verschillende keren gepoogd om met qjackctl te werken, maar dan kreeg ik steeds lappen met meldingen dat allerlei hutseflutsen niet wilden draaien. Tenslotte kwam ik na veel trial and error erachter dat ik jackd ook gewoon zelf kon starten met waarden die in andere threads op het engelstalig opensuse forum werden genoemd. De waarden die ik altijd hanteer werken op mijn systeem het best, is mijn ondervinding. De waarden die op de thread “cannot start jack” voor jackd staan genoemd, heb ik ook gehanteerd, zonder dat dit noemenswaardig verschil leek te maken.

Ik heb trouwens veel berichten op dit forum en andere forums (ubuntu, ubuntu studio, fedora, Gentoo, etc, jackaudio forum) gezien, die elkaar tegenspreken. Zo zou je jackd juist wel of niet als root moeten laden. Timidity moet je wel of juist niet gebruiken. Ik kon daar geen chocola meer van maken, tot ik door toeval ontdekte met welke instellingen jackd en timidity wel onder Rosegarden werken. En dan alleen nog onder de desktop kernel.

Hoe nu verder?

Nou ik denk dat als het “werkt” voor jou, je dat moet doen. Zolang je maar goed ergens noteert wat je precies hebt gedaan zodat je het weer kunt reproduceren.

Heb ik het goed dat je nu alleen nog die timidity aan de praat moet krijgen?

Ik heb timidity nu ook in after.local gezet maar dat werkt jammer genoeg niet. Dus ik moet nog steeds timidity handmatig starten.
Maakt het opstartproces ook een log van het starten van wat in after.local staat? Dan kan ik kijken of in het log iets staat, waar we wat aan hebben.

Je bent er zeker van dat timidity ook als root in de achtergrond moet draaien?

Je kunt de timidity regels even verwijderen (of er een # voorzetten). Dan een boot en NIET inloggen. Ga naar logical console 1 (Ctrl-Alt-F1). Log in als root. Start timidity nu met de hand, dan moet je alles zien wat het uitspuugt.

Als je weer naar normaal wilt: exit om uit te loggen en dan Ctrl-Alt-F7 on weer in je GUI login scherm te komen.