Wikia

Music Player Daemon Community Wiki

Hack:ices-client

Talk3
514pages on
this wiki
#!/usr/bin/env perl
# File: mpdplaylist.pm
# Author: David Talmage (talmage@acm.org)
#
# This hack for ices uses mpd as a playlist manager.
# The mpd playlist is a queue of songs to play.
#
# SETUP:
#
# 1. Edit $mediaroot so that the path to your music collection is
# correct.  Be sure to put a slash at the end of the path.
#
# 2. Copy this file to wherever ices looks for modules.
#
# 3. Your ices.conf needs this Playlist section:
#
#  <Playlist>
#    <Type>perl</Type>
#    <Module>mpdplaylist</Module>
#    <Crossfade>5</Crossfade>
#  </Playlist>
#
#
# USAGE
#
# 1. Set your mpd to not play.  E.g. with mpc
#
#      mpc stop
#
# 2. Use an mpd client to add to the playlist.  This ought
# to work with any number of clients adding to the
# playlist.
#
# 3. Start ices
#
# HISTORY:
# 20060822 - Initial version
# 20060826 - Two bugs fixed: 
#            1. Correct behavior with leading and trailing spaces in the playlist.
#            2. ices_get_next() blocks when the playlist is empty.  This prevents
#               ices from terminating abnormally.
# 20060831 - New function ices_get_metadata returns artist, title, and
#            album ID3 tags.  Uses MP3::Info perl module.
#            Thanks to Jesse for the idea and original implementation.
# 20070206 - 1. Added fallback playlist option.
#            2. Changed sleep 5 so the fallback list plays before an icecast fallback mount. wgalway@hotmail.com
use strict;
use MP3::Info;

# Directory in which all music is stored.  Note final slash!
# mpd returns the paths to files relative to this directory.
#
# E.g. When the song at the head of the playlist is
#
# /usr/media/MUSICMP3/B.B._King-Completely_Well/01.So_Excited.mp3
#
# mpd returns 
#
# B.B._King-Completely_Well/01.So_Excited.mp3
#
my $mediaroot = "/usr/media/MUSICMP3/";
my $playlistdir = "/usr/share/mpd/";            #Playlist dir from mpd.conf
my $playlistname = "fallbackplaylist";          #Your fallback playlist name. 


my $ext = ".m3u"; #Do not touch
my $playlistfile = $playlistdir.$playlistname.$ext;

# Full path to the song file at the head of the playlist
my $audiofile;

sub ices_init {
    return 1;
}

#Function to remove any beginning and ending white spaces
sub trim {
   my($string)=@_;
   for ($string) {
       s/^\s+//;
       s/\s+$//;
   }
   return $string;
}

# Function called to shutdown your python enviroment.
# Return 1 if ok, 0 if something went wrong.
sub ices_shutdown {
    return 1;
}

# Function called to get the next filename to stream. 
# Should return a string.
sub ices_get_next {
    my $playlist = ""; 	# Relative path to the song file at the head of the playlist

    # Keep asking for the first entry in mpd's playlist until the
    # answer isn't an empty string.  A empty string indicates that
    # there isn't anything in the playlist.

while (1) {
        $playlist = `mpc --format %file% 'playlist' | head -1 |cut -d ")" -f 2`; 
        if (length($playlist) > 0) {
            last;
         } elsif ( -e $playlistfile) {
                 system("mpc load $playlistname");
         } else {
              sleep 5;
         }
}

    $playlist = trim($playlist);
    $audiofile = $mediaroot.$playlist;
    chomp($audiofile);

    # Pops the name off the head of the playlist
    system('mpc del 1');

    return $audiofile;
}

sub ices_get_metadata {
  my $tag = get_mp3tag($audiofile);
  my $album =  trim($tag->{ALBUM});
  my $artist = trim($tag->{ARTIST});
  my $title =  trim($tag->{TITLE});
  my $metadata = "$artist"." - "."$title";

  if (! $album eq ""){
      $metadata = $metadata." ("."$album".")";
  }

  return $metadata;
}

# Function used to put the current line number of
# the playlist in the cue file. If you don't care
# about cue files, just return any integer.
sub ices_get_lineno {
	return 1;
}

return 1;


This is a feasible solution to implement a streaming mp3 server on a FPU-less platform like the Sheevaplug or maybe even the NSLU (not tested). It works without decoding and reencoding the audio stream, simply streaming the original encoded data. These platforms are simply too slow for reencoding the stream - emulating all the floating-point math.

You'll need to compile ices0 from http://www.icecast.org/ices.php ( has mp3 support and does not necessarily reencode the streaming data).

install icecast2 , but dont configure a mpd shout output.

apt-get install build-essential libshout3-dev libperl-dev
wget http://downloads.us.xiph.org/releases/ices/ices-0.4.tar.gz; tar xfz ices-0.4.tar.gz ; cd ices-0.4
./configure --with-faad=no --with-flac=no --with-vorbis=no
make; make install
cp mpdplaylist.pm /usr/local/etc/modules/ices.pm (the script from the post above)
ices -S perl -P icecast_password

fill the mpd playlist and connect your streaming client to your configured icecast mountpoint

Result: < 10% cpu load while streaming from a sheevaplug (with mythbackend, mysqld, mpd etc. running as well)

Advertisement | Your ad here

Around Wikia's network

Random Wiki