Menu

Bob van de Vijver

Daily business

FreeNAS als muziekspeler

Dutch only

Niet iedereen heeft misschien ooit gehoord van FreeNAS. FreeNAS is een afgeslankte vorm van FreeBSD, en is speciaal gemaakt om, je raadt het al, een NAS te draaien. Naast deze NAS functie is het een compleet te personaliseren FreeBSD distributie, wat betekend dat je praktisch alles erop kan draaien. Zo draait mijn FreeNAS (versie 0.7.2 Sabanda (revision 5543), gebaseerd op FreeBSD 7.3-RELEASE-p3) naast de NAS functie, deze website en ook www.mw75.nl;. Ook kan de server Torrents downloaden en is hij trots onderdeel van het CampusNet.

Muziek

Echter, voor mijn badkamer audio heb ik nog een muziek ingang nodig. Aangezien al mijn muziek op deze NAS staat, ligt het voor de hand om deze de muziek te laten afspelen. De keus is hierbij gevallen op MPD (music player daemon) in combinatie met OSS (opensound system). Beide pakketten zijn zeer simpel te installeren in FreeNAS.

pkg_add -r oss
pkg_add -r musicpd

Voor de configuratie van MPD zijn genoeg handleidingen te vinden, dus daar zal ik hier niet op ingaan. Helaas werkte het niet in een keer. Het blijkt namelijk dat MPD niet overweg kan met de laatste versie van OSS (versie 4). Het gaat dan hierbij alleen om de volumeregeling die dan niet aan te passen is via de interface van MPD. Het volume is natuurlijk wel aan te passen via de OSS commando's. Om erachter te komen welk audiodevice je moet aanpassen, moet je even het volgende in de shell uitvoeren:

ossmix

Uit de lijst moet je dan de goede uitgang vinden, in mijn geval was dat "jack.green.front". Om nu ervoor te zorgen dat het volume ook aan te passen is via de webinterface, moet er wat geknutseld worden aan de code van MPD. De gebruikte MPD interface is phpmp2. Omdat mijn PHP niet direct in een shell alle regels code mag uitvoeren, moest daarvoor een apart .sh bestand komen die deze code wel kan uitvoeren. In dit bestand staat:

#!/bin/sh

ossmix jack.green.front $1

Nu moet dit alleen nog worden aangeroepen vanaf de webpagina, in plaats van de standaard MPD volume methode. De "$1" bevat het meegegeven argument voor het volume, en wordt door de php berekent.

In het bestand connection.php worden alle MPD commando's afgehandeld. Het spreekt dan ook voor zich dat daar het setvol commando afgevangen moet worden.Het groene gedeelte moet toegevoegd worden. Je ziet dat er een txt wordt opgeslagen met het huidige volume, omdat deze later nog moet worden opgeslagen in de $mpd_status van phpmp2. Dit moet omdat anders bij elke vernieuwing van de pagina het niet meer zichtbaar is welk volume is ingesteld.

default:
  $command = $_REQUEST["command"];
  if(array_key_exists("arg", $_REQUEST) && strlen($_REQUEST["arg"])>0)
    $command.=" \"".$_REQUEST["arg"]."\"";

  if(do_mpd_command($connection, $command) === true) {
    if(strstr($command, 'setvol')){
      if(strlen($command) > 11){
        $eigen_volume = substr($command, 8, 3);
      }elseif(strlen($command) > 10){
        $eigen_volume = substr($command, 8, 2);
      }else{
        $eigen_volume = substr($command, 8, 1);
      }
      //65 is de max van oss, terwijl die van mpd 100 is.
      $exec_volume = round((($eigen_volume * 65)/100), 1);

      $fd = fopen ("volume.txt", "w");
      fputs ($fd, "$eigen_volume");
      fclose ($fd);
      shell_exec("su root /mnt/HDD1/system/mpd/vol.sh $exec_volume");
      $nieuw_volume = 1;
    }
    $command_successful = true;
  } else {
    $command_successful = false;
  }

Ook onder in het bestand moet er nog wat aangepast worden, om zo het huidige volume door te geven aan de interface.

$mpd_status = do_mpd_command ($connection, "status", null, true);

$fd = fopen ("volume.txt", "r");
$eigen_volume = fread($fd, filesize("volume.txt"));
fclose ($fd);
$mpd_status["volume"] = (int)$eigen_volume;

$is_connected = true;

Er blijft helaas één probleem over, en dat is dat nog niet werkt voor iedere skin. Om dit op te lossen moet in config.php de volgende regel aangepast / gemaakt worden:

"graphical_sliders" => false

Let er wel op dat php mag schrijven in de directory waar je de bestanden tijdelijk opslaat. Ook moet vol.sh uitvoerbaar zijn!

Written by Bob van de Vijver on Sunday March 11, 2012

« Waterdichte speakers / eindversterker - Laserwriter »