Month: February 2008

  • [Ratkaisu] Subwoofer ei toimi ilman Duplicate Frontin valitsemista

    Lähtökohta
    Asennuksen jälkeen tietokoneeni äänet toimivat, eli esimerkiksi sisäänkirjautumisen yhteydessä soiva äänitehoste kuulu etukaiuttimista. Tietokoneeni, Shuttle SN45G jossa on nForce2-piirisarjalla varustettu FN45-emolevy, tarjoaa surround-äänet eli äänikanavat kahdelle etukaiuttimelle, yhdelle keskikaiuttimelle, kahdelle surround-kaiuttimelle ja lisäksi LFE-kanavan subwooferille. Olen kytkenyt 5.1 -kaiuttimiston tietokoneeseen sen takapaneelissa olevien ääniliittimien kautta ja käynnistänyt tietokoneen lisäksi kaiuttimiston sen virtakatkaisijasta. Olen kirjautunut sisään työpöydälleni. Olen avannut Rytmilaatikko-musiikkisoittimen ja pannut musiikkikappaleen soimaan.
    Ongelma
    Subwooferista ei kuulu ääntä.
    Jos merkitsen Äänenvoimakkuuden hallinnassa, Kytkimet-välilehdellä Duplicate Front -kohdan valituksi, subwooferista kuuluu ääntä, mutta silloin etukanavien ääni toistetaan etukaiuttimien lisäksi takakaiuttimista. Haluan, että LFE-kanava toimii niin, että etukanavien ääni toistetaan ainoastaan etukaiuttimissa vaikka LFE-kanava toistetaankin subwooferissa.
    Ongelman syy
    Asetukset Äänenvoimakkuuden hallinnassa ovat pielessä.
    Ratkaisu
    Otan Äänenvoimakkuuden hallinnassa Muokkaa-valikosta esille Asetukset, ja otan listalta valituksi merkitsemällä pääikkunassa esiin seuraavat raidat:

    • Pää
    • PCM
    • Surround
    • Surround Jack Mode
    • Center
    • LFE
    • Linjatulo
    • CD
    • Mikrofoni
    • Mikrofoni Kaappaus
    • Mic Boost (+20dB)
    • PC-kaiutin
    • Kaappaus
    • Mix
    • Channel Mode
    • Duplicate Front
    • Exchange Center/LFE
    • Swap Surround Slot

    Suljen asetusikkunan.

    Äänenvoimakkuuden hallinnan Toisto-välilehdellä asetan liukusäätimien alapuolella olevia kaiuttimenkuvia käyttämällä PC-kaiuttimen mykistetyksi (jonka merkkinä kaiuttimen päälle tulee punainen ruksi) ja muut pois mykistystilasta (jolloin kaiuttimen päällä ei ole punaista ruksia). Varmistan lisäksi, että Linjatuloa ja PC-kaiutinta lukuunottamatta kaikki välilehden liukusäätimet on asetettu maksimiinsa (yläasentoon).

    Nauhoitetaan-välilehdellä varmistan, että Kaappaus ei ole mykistetty kaiuttimen eikä mikrofonin osalta, ja säädän liukusäätimet maksimiinsa.

    Kytkimet-välilehdellä merkitsen valituiksi kohdat Mikrofoni Kaapppaus, Mic Boost (+20dB), ja Exchange Center/LFE. Valitsemattomiksi jätän kohdat Mix, Duplicate Front ja Swap Surround Slot.

    Asetukset-välilehdellä valitsen Surround Jack Mode -valitsimen alasvetovalikosta kohdan Independent. Channel Mode -valitsimen alasvetovalikosta valitsen kohdan 6ch.

    Suljen Äänenvoimakkuuden hallinnan. Tämän jälkeen LFE-kanavan toisto subwooferilla toimii ilman, että etukanavien signaali toistettaisiin takakaiuttimista etukaiuttimien lisäksi.

    Huomautus
    Äänikanavia voi testata komennolla speaker-test -Dplug:surround51 -c6 -l1 -twav, joka toistaa ääninäytteitä kultakin kanavalta erikseen, vuoron perään.
  • [Ratkaisu] Speaker-test ilmoittaa äänentoiston avausvirheestä

    Lähtökohta
    Olen kirjautunut sisään työpöydälleni, käynnistänyt Rytmilaatikko-musiikkisoittimen ja pannut sen soittamaan podcast-jaksoa. Olen keskeyttänyt jakson soiton ennen sen loppumista jatkaakseni kuuntelua myöhemmin. Olen avannut Päätteen. Haluan testata äänentoistolaitteistoni toimintaa, joten komennan päätteestä speaker-test -Dplug:surround51 -c6 -l1 -twav.
    Ongelma
    Kaiutintestisovellus speaker-test ilmoittaa seuraavaa:

    Äänentoistolaite on plug:surround51
    Stream parameters are 48000Hz, S16_LE, 6 channels
    WAV tiedosto(t)
    Äänentoiston avausvirhe: -16, Device or resource busy
    Äänentoiston avausvirhe: -16, Device or resource busy
    Äänentoiston avausvirhe: -16, Device or resource busy

    Äänentoistolaitteen avausvirheestä ilmoittava rivi tulostuu yhä uudelleen kunnes keskeytän speaker-testin ajon näppäinyhdistelmällä Control + C. Haluan, että virheilmoituksen sijasta speaker-test toistaa kaiuttimien testaamiseksi ääninäytteitä eri kanavilta.

    Ongelman syy
    Speaker-test ei kykene jakamaan äänentoistolaitteistoa toisen ohjelman kanssa, ja Rytmilaatikko on varannut äänentoistolaitteiston käyttöönsä.
    Ratkaisu
    Suljen Rytmilaatikon. Sen jälkeen komennan speaker-testiä uudestaan, jolloin se toimii haluamallani tavalla.
  • Rytmilaatikko ei muista viimeksi soitettua kappaletta

    Lähtökohta
    Olen käynnistänyt Rytmilaatikko-musiikkisoittimen ja valinnut Sivupaneelista Podcastit-näkymän. Olen soittanut aiemmin lataamaani podcast-jaksoa ja pysäyttänyt sen sitten ennen jakson loppumista. Suljen Rytmilaatikon. Myöhemmin käynnistän Rytmilaatikon uudestaan, sillä haluan kuunnella aiemmin aloittamani podcast-jakson loppuun.
    Ongelma
    Haluan, että Rytmilaatikko palaa käynnistyessään takaisin näkymään, jossa olin. Haluan, että Rytmilaatikko valitsee valmiiksi viimeksi kesken jättämäni podcast-jakson. Haluan, että Rytmilaatikko muistaa podcast-jaksosta kohdan, johon edellisellä kuuntelukerrallani jäin. Käynnistyessään Rytmilaatikko on kuitenkin avannut Musiikki-näkymän. Kun menen takaisin Podcastit-näkymään, viimeksi kesken jättämäni podcast-jakso ei ole valmiiksi valittuna puhumattakaan, että Rytmilaatikko muistaisi jaksosta kohdan, jossa kuunteluni viimeksi keskeytyi.
    Ongelman syy
    Rytmilaatikossa ei vielä ole haluamiani ominaisuuksia.
    Ratkaisu
    Ei vielä tiedossa.
  • [Ratkaisu] Web-kamerakuvan lähettäminen www-palvelimella näytettäväksi

    Lähtökohta
    Olen kytkenyt web-kameran tietokoneeseeni. Kameralle on ajurit, ja se toimii, eli pystyn katsomaan kameran ottamaa kuvaa paikallisesti esimerkiksi xawtv:llä.
    Minulla on käyttäjätunnus ja salasana ftp-palvelimelle, ja niitä käyttäen pystyn päivittämään web-sivuiltani maailmalle näkyvää sisältöä. Palvelimella on web-sivu, joka näyttää palvelintilaani tallennetun webcam.jpg -nimisen tiedoston, ja päivittää, eli lataa kuvan automaattisesti uudestaan kerran minuutissa.
    Omalla koneellani, kotihakemistossani on bin-alihakemisto ja se on määritelty komentojenhakupolkujen (PATH-muuttuja) joukkoon komentoriviprofiilissani. Olen tallentanut bin-hakemistoon rhythmbox-print-playing -komentojonotiedoston ja todennut sen toimivan.
    Pakettienhallinnassa ftp, came, imagemagick ja rhythmbox ovat asennettuna.
    Ongelma
    Haluan, että tietokoneeni tallentaa web-kamerani näkymän kuvatiedostoon, lisää tiedostoon tallennetun kuvan päälle tekstinä kuvanottohetken ja lisäksi tiedot samalla hetkellä Rytmilaatikko-musiikkisoittimessa soivasta kappaleesta, ja lähettää sen jälkeen kuvasta kopion web-palvelimelle. Haluan, että näin tapahtuu automaattisesti kerran minuutissa sen jälkeen, kun olen antanut käskyn, ja aina siihen saakka, että annan kieltävän käskyn.
    Ratkaisu
    1. Luon komennolla kotihakemistooni .camE -alihakemiston. Hakemiston luomiseen käytän mkdir ~/.camE -komentoa. Tähän hakemistoon tallennan jatkossa osan tarvittavista tiedostoista.
    2. Luon camE:lle kuvan ottamiseen liittyvät parametrit määrittelevän asetustiedoston.
      Avaan komennolla gedit ~/.camE/camErc asetustiedoston muokattavaksi. Tiedoston sisältö on seuraavassa:

      [ftp]
      do = 0
      
      [grab]
      archive_shot_every = 0
      logfile = /home/jani/.camE/camElog
      device = /dev/video0
      temp_file = /home/jani/.camE/webcam.png
      blockfile = /home/jani/.camE/BLOCK
      
      # lag reduction, takes 5 shots, discards
      # the first 4, thus clearing mmap buffers
      lag_reduce = 5
      
      width  = 320
      height = 240
    3. Luon kuvan web-palvelimelle lataamista varten ftp-asetustiedoston.
      1. Avaan komennolla gedit ~/.netrc asetustiedoston muokattavaksi. Tiedoston sisältö on seuraavassa:
        machine ftp.palvelin.com
        login tunnukseni
        password salasanani
        
        macdef putcampic
        	prompt off
        	lcd /home/jani/.camE
        	cd kuvakansio
        	bin
        	put webcam.jpg
        	quit
      2. Muutan komennolla chmod 600 ~/.netrc asetustiedoston oikeuksia niin, että kukaan muu kuin minä ei voi sitä avata, sillä tiedosto sisältää ftp-palvelimen salasanani salaamattomassa muodossa.
    4. Luon komentojonotiedoston kuvan päälle tulevien tekstien latomiseen.
      1. Avaan komennolla gedit ~/bin/camprint komentojonotiedoston muokattavaksi. Tiedoston sisältö on seuraavassa:
        #!/bin/sh
        
        # kirjasimen voi säätää tästä.
        FONT="-font Helvetica -pointsize 10"
        
        # ladotaan komentorivillä annetut tekstit.
        # ensimmäinen parametri ladotaan ylälaitaan,
        # toinen alalaitaan.
        convert webcam.png \
        	-gravity north -stroke '#000C' -strokewidth -2 \
        	$FONT -annotate 0 "$1" \
        	-stroke none $FONT -fill white -annotate 0 "$1" \
        	-gravity south -stroke '#000C' -strokewidth -2 \
        	$FONT -annotate 0 "$2" \
        	-stroke none $FONT -fill white -annotate 0 "$2" \
        	-quality 80 webcam.jpg

        Lataa camprint (498 tavun komentojonotiedosto)

      2. Muutan komennolla chmod +x ~/bin/camprint komentojonotiedoston oikeuksia niin, että siitä tulee suoritettava.
    5. Luon komentojonotiedoston, joka kerää toiminnot yhteen. Se ottaa kameralla kuvan, latoo kuvan päälle tekstit ja lataa kuvatiedoston sen jälkeen web-palvelimelle.
      1. Avaan komennolla gedit ~/.camE/camEsh komentojonotiedoston muokattavaksi. Tiedoston sisältö on seuraavassa:
        #!/bin/sh
        
        cd /home/jani/.camE/
        
        if [ -f BLOCK ]
        then
          exit
        fi
        
        # napataan kuva.
        camE -s -c camErc
        
        # parhaillaan soivan kappaleen esittely.
        NP="`/home/jani/bin/rhythmbox-print-playing`"
        
        # kuvanottohetki.
        DT=$(date -d "`stat -c %y webcam.png | cut -d. -f1`" | \
        	cut -d+ -f1 | sed 's/[ ]*$//')
        
        # ladotaan tekstit.
        /home/jani/bin/camprint "$NP" "$DT"
        
        # jos kuvan luominen on onnistunut,
        # siirretään se palvelimelle.
        if [ -f webcam.jpg ]
        then
          # tämä vaatii toimivan, putcampic-nimisen
          # makron ~/.netrc:ssä.
          echo "\$ putcampic" | ftp mummila.atspace.com
          rm webcam.jpg webcam.png
        fi
      2. Muutan komennolla chmod +x ~/.camE/camEsh komentojonotiedoston oikeuksia niin, että siitä tulee suoritettava.
    6. Luon komentojonotiedostot kamerakuvan lähetyksen käynnistystä ja lopettamista varten.
      1. Avaan komennolla gedit ~/bin/camon käynnistyskomentojonotiedoston muokattavaksi. Tiedoston sisältö on seuraavassa:
        #!/bin/sh
        
        rm -f /home/jani/.camE/BLOCK
      2. Avaan komennolla gedit ~/bin/camoff lopetuskomentojonotiedoston muokattavaksi. Tiedoston sisältö on seuraavassa:
        #!/bin/sh
        
        touch /home/jani/.camE/BLOCK
      3. Muutan molempien komentojonotiedostojen oikeuksia komennolla chmod +x ~/bin/camon ; chmod +x ~/bin/camoff niin, että niistä tulee suoritettavia.
      4. Asetan lopuksi komennolla camoff kuvien lähettämisen pois päältä -tilaan.
    7. Luon crontab-tiedostoon rivin, joka suorittaa tehtävät kerran minuutissa aina silloin kun olen niin määrännyt.
      Avaan komennolla crontab -e crontab-tiedostoni muokattavaksi. Lisään tiedostoon seuraavan rivin:

      * * * * * /home/jani/.camE/camEsh

    Kaikkien näiden toimenpiteiden jälkeen kuvan ottaminen ja web-palvelimelle päivittäminen tapahtuu kerran minuutissa sen jälkeen, kun olen komentanut camon, ja jatkuu kunnes komennan camoff.

    Huomautuksia
    • Tämän ratkaisun lähtökohdissa mainittu webkamerakuvaa näyttävä sivuni löytyy webistä.
    • CamE osaa itsekin latoa tekstiä ottamansa kuvan päälle ja kopioida kuvan palvelimelle ftp:tä käyttäen. Jälkikäsittelymahdollisuuksia on kuitenkin enemmän, kun jälkikäsittelyyn käytetään ImageMagickia. Tässä ratkaisussa käytin melkein kaikkein yksinkertaisinta tekstinladontatapaa, joka ei juurikaan poikkea siitä mihin camE pystyisi. ImageMagickin mahdollistamia erilaisia hienoja ladontatapoja on esitelty Examples of ImageMagick Usage -oppaassa.
    • Komennolla camE -s -c ~/.camE/camErc voi testata CamE:n asetustiedoston, ~/.camE/camErc:n toimivuutta. Komennon ajamisen jälkeen asetustiedostossa olevan temp_file -parametrin määrittelemässä paikassa pitäisi olla web-kameran ottama kuva.
    • Komennolla echo "\$ putcampic" | ftp ftp.palvelin.com voi testata ftp-asetustiedoston, ~/.netrc:n toimivuutta sen jälkeen, kun ~/.camE -hakemistossa on webcam.jpg -niminen tiedosto.
  • [Ratkaisu] Cronin suorittama komentojonotiedosto ei toimi

    Lähtökohta
    Olen luonut komentojonotiedoston komentojono1, joka kutsuu komentojonotiedostoa komentojono2 seuraavanlaisella rivillä:

    komentojono2 parametri1 parametri2

    Olen tallentanut molemmat komentojonotiedostot kotihakemistoni alla olevaan bin-alihakemistoon. Bin-alihakemisto on määritelty komentojenhakupolkujen (PATH-muuttuja) joukkoon komentoriviprofiilissani. Olen muuttanut molempien komentojonotiedostojen oikeuksia niin, että molemmat toimivat komentoriviltä suoritettuina.
    Olen lisännyt komentojono1:n crontab-tiedostooni siten, että se suoritetaan kerran minuutissa:

    * * * * * /home/jani/bin/komentojono1
    Ongelma
    Kerran minuutissa automaattisesti suoritettuna komentojono1 ei toimi odottamallani tavalla, niin kuin se toimii komentoriviltä suoritettuna.
    Ongelman syy
    Olen kutsunut komentojono1:ssä komentojono2:ta ilman täyttä hakemistopolkua sen edessä. Kun cron suorittaa komentojono1:n, se ei lue komentoriviprofiiliani sitä ennen, eikä siksi tiedä etsiä komentojono2:ta kotihakemistoni alla olevasta bin-hakemistosta.
    Ratkaisu
    Muutan komentojono1:tä niin, että komentojono2:n kutsu tehdään käyttämällä täyttä hakemistopolkua itse tiedoston nimen edessä:

    /home/jani/bin/komentojono2 parametri1 parametri2

    Tämän jälkeen komentojono1:n automaattinen suoritus toimii tarkoittamallani tavalla.

    Huomautuksia
    • Yleisesti ottaen cronin suoritus poikkeaa vuorovaikutteisesta komentorivisuorituksesta siksi, että Ubuntussa käytettävien vuorovaikutteisten komentorivien tulkkina toimii Bash, ja cron taas puolestaan käyttää /bin/sh -komentoa, joka on symbolinen linkki dash-tulkkiin. Kun cron ajaa dashin ei-vuorovaikutteisena, se ei lue mitään profiilitiedostoja, ja siten nämä kaksi ympäristöä (crontab ja vuorovaikutteinen komentorivitulkkisovellus kuten Pääte) voivat poiketa toisistaan huomattavastikin.
    • Pitemmän päälle tässä kuvattua elegantimpi ratkaisu olisi luultavasti luoda komentojonotiedosto cron-suoritus, joka ottaa parametrinä komentojonotiedoston parametreineen. Cron-suoritus lukisi komentoriviprofiilini ja lisäksi selvittäisi DBUS_SESSION_BUS_ADDRESS -muuttujan arvon ennen kuin suorittaisi sille komentorivillä annetun komentojonotiedoston parametreineen.

      Sen jälkeen lisäisin /home/jani/bin/cron-suoritus -komentojonon aina varsinaisen komentojonotiedoston ja sen parametrien eteen aina, kun haluaisin suorittaa komentojonotiedoston crontabin kautta automaattisesti. Silloin crontabin suorittamien komentojonotiedostojen ajo muistuttaisi enemmän niiden suorittamista komentoriviltä ilman, että jokaiseen komentojonotiedostoon täytyisi tehdä crontabista ajamisen huomioonottavia tarkennuksia ja erityisehtoja.

      Koska cron-suoritus lukisi komentoriviprofiilini ennen sille annetun komentojonon suorittamista, ei tämän komentojonon eteen tarvitsisi crontabissa lisätä täyttä hakemistopolkua:

      * * * * * /home/jani/bin/cron-suoritus komentojono parametri
  • [Ratkaisu] Cron ei pidä lokikirjaa

    Lähtökohta
    Olen lisännyt tavallisen käyttäjän tiliini liittyvään crontab-tiedostooni kerran minuutissa suoritettavan komentojonon.
    Olen muokannut /etc/syslog.conf -tiedostoa siten, että siinä on seuraavat rivit:

    cron.*				/var/log/cron.log

    ja

    *.=info;*.=notice;*.=warn;\
    	auth,authpriv.none;\
    	cron,daemon.none;\
    	mail,news.none		-/var/log/messages

    Olen tämän jälkeen käynnistänyt cronin uudestaan komentamalla sudo /etc/init.d/cron restart. Haluan, että cron kirjaa lokia /var/log/cron.log -tiedostoon.

    Ongelma
    Tiedostoa /var/log/cron.log ei ole, eli cron ei pidä lokia lainkaan, tai se ei pidä lokia haluamassani tiedostossa.
    Ongelman syy
    En ole käynnistänyt syslogd:tä uudestaan.
    Ratkaisu
    Käynnistän syslogd:n uudestaan komentamalla sudo /etc/init.d/sysklogd restart. Sen jälkeen /var/log/cron.log alkaa täyttyä cronin lokitiedoilla.
    Huomautus
    Syslogd ilmoitti uudelleenkäynnistyksen yhteydessä seuraavaa:

    chown: tiedostoa "/var/log/cron.log" ei voi käsitellä: No such file or directory

    Ilmeisesti tämä ei kuitenkaan haittaa. Käynnistin syslogd:n välittömästi toisen kerran uudestaan, ja tällä kertaa se ei antanut virheilmoitusta.

  • [Ratkaisu] Cronin suorittama rhythmbox-client –print-playing-format ei toimi

    Lähtökohta
    Olen asentanut notification-daemon-paketin. Minulla on komentojonotiedosto, joka ajaa rhythmbox-client-ohjelman --print-playing-format -parametrilla, joka tulostaa muuttujaan tallennettavaksi Rytmilaatikko-musiikkisoittimen suoritushetkellä soittaman kappaleen nimen. Komentoriviltä suoritettuna komentojonotiedosto tulostaa kappaleen nimen muuttujaan tarkoittamallani tavalla. Olen asettanut komentojonotiedoston crontab-tiedostossani suoritettavaksi kerran minuutissa.
    Ongelma
    Cronin suorittaessa komentojonotiedostoni kappaleen nimi ei tulostu muuttujaan. Haluan sen tulostuvan muuttujaan samalla tavalla kuin komentoriviltä suoritettaessa.
    Ongelman syy
    Rytmilaatikko vaatii toimiakseen, että DBUS_SESSION_BUS_ADDRESS -niminen muuttuja on asetettu. Cronin suorittaessa komentojonotiedostoani muuttujaa ei kuitenkaan ole asetettu.
    Ratkaisu
    Teen komentojonotiedoston, joka lukee käynnissä olevan rhythmbox-client -prosessin näkemän DBUS_SESSION_BUS_ADDRESS -muuttujan arvon ja ajaa uuden rhythmbox-clientin halutuilla parametreilla.

    #!/bin/sh
    
    user=`whoami`
    pid=`pgrep -u $user notification-da | cut -d' ' -f 1`
    
    # find DBUS session bus for this session
    DBUS_SESSION_BUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS \
    	/proc/$pid/environ |sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'`
    
    # if it was successfull, then we either print it,
    # or export it or whatever, if we want
    if [ "x$DBUS_SESSION_BUS_ADDRESS" != "x" ]; then
        export DBUS_SESSION_BUS_ADDRESS
        # and we start using rhythmbox-client
        rhythmbox-client --no-start --print-playing-format "%aa: %tt"
    fi

    Lataa rhythmbox-print-playing (530 tavun komentojonotiedosto)

    Tallennan komentojonotiedoston tiedostonimellä rhythmbox-print-playing kotihakemistossani olevaan bin-alihakemistoon, minkä jälkeen muutan sen oikeuksia chmod +x ~/bin/rhythmbox-print-playing -komennolla niin, että voin suorittaa sen. Sitten muutan Lähtökohta-otsikon alla mainitsemaani, alun perin rhythmbox-clientia suoraan kutsunutta komentojonotiedostoa niin, että rhythmbox-clientin sijaan se suorittaa nyt rhythmbox-print-playing -tiedostoni. Sen jälkeen parhaillaan soiva kappale tulostuu komentojonossa muuttujaan myös silloin, kun komentojonon suoritus tapahtuu cronin tekemänä.

    Huomautus
    Mikään löytämistäni valmiista komentojonotiedostoista (esimerkki 1, 2) ei toiminut sellaisenaan. Yllä oleva komentojonotiedosto on niiden perusteella tekemäni oma sovellus.