File squeezeliteserver.pl of Package squeezelite

#!/usr/bin/perl
# quick script to grab Audio card information
# and generate a command line for squeezelite

use strict;

my $IP="127.0.0.1";
my $IP="10.0.1.20";
my $STREAM="8192";
my $OUTPUT="8192";
my $SQUEEZELITE="/usr/bin/squeezelite";
my $squeezename="squeezelite.info";
my $macaddr="macaddress";
my $squeezevar="/var/lib/squeezelite";
#my $squeezevar="/tmp/squeezelite";
my $DEBUG="0";


#  null                           - Discard all samples (playback) or generate zero samples (capture)
#  default                        - Default ALSA Output (currently PulseAudio Sound Server)
#  sysdefault:CARD=Audiophilleocom - Naim DAC-V1. Audiophilleo.com, USB Audio - Default Audio Device
#  front:CARD=Audiophilleocom,DEV=0 - Naim DAC-V1. Audiophilleo.com, USB Audio - Front speakers
#  sysdefault:CARD=PCH            - HDA Intel PCH, ALC3202 Analog - Default Audio Device
#  front:CARD=PCH,DEV=0           - HDA Intel PCH, ALC3202 Analog - Front speakers
#  default:CARD=Mojo
#  front:CARD=Audiophilleocom,DEV=0
#  front:CARD=U20F1,DEV=0

#squeezelite -o "sysdefault:CARD=Audiophilleocom" -m acd:ef:12:34:46 -N 2/name -s 127.0.0.1 -z
#squeezelite -o $AUDIOPERIPH -m $MACADDRESS -N $NAME/squeezelite.name -s $IP -b  $stream>:$output> -z
#/usr/bin/squeezelite -b 4096 8704 -R -u vLE   28 -m 5a 86 7e 05 ff bd -c pcm,flac,mp3,ogg -r 44100 48000 88200 96000 176400 192000 352800 384000 -D 0 dop -d all info -f /run/spacd/c/2/l/0/squeezelite.log -N /mnt/hdd/system/spac/Naim DAC-V1. Audiophilleo.com/device0/squeezelite.name -M Daphile 17.09-b131629 -s 127.0.0.1 -o hw:2,0 -a 100 3 24_3 1 0 -p 45


# Need false mac addresse to identify devices
sub generate_random_mac {
    my $mac;	
    for(my $i = 0; $i < 6; $i++) {
	$mac = $mac.sprintf("%02x", int(rand(256))).":";
    }	
    chop($mac);
    return $mac;
}

sub clean_up {
    my ($var) = @_;
    $var =~ s/^\s*(.*?)\s*$/$1/;
    return $var;
}

sub cat_ {
    open(my $F, $_[0]) or return; my @l = <$F>; wantarray() ? @l : join '', @l;
}

sub main {
my @cmds;	
    my $pid = fork;
    if (!defined $pid) {
	die "Cannot fork: $!";
    }
    elsif ($pid == 0) {
	my @data = `$SQUEEZELITE -l`;
	my $mac;
	my $cmd; my @cmds;
	foreach (@data) {
	    my ($device, $name, $extra) = $_ =~ m/(.*)\s*-\s+(.*),.*-(.*)/i;
	    # only grab sysdefault system
	    $device =~ m/front:CARD=DAC/i or next;
	    $device = clean_up($device);
	    $name = clean_up($name);
#	    if ($DEBUG eq "1") {
#		print "device: $device\n"; print "name: $name\n";
#		print "extra: $extra\n";
#	    }
	    system("mkdir -p $squeezevar/$device");
	    open (NAMEDATA, ">$squeezevar/$device/$squeezename") or die "can't open $_\n";
	    print NAMEDATA $name;
	    close(NAMEDATA);
	    if (! -f "$squeezevar/$device/$macaddr") {
		print "No previous MACADDR found, generate one\n";
		$mac = generate_random_mac();
		open (MACADDR, ">$squeezevar/$device/$macaddr") or die "can't open $_\n";
		print MACADDR $mac;
		close(MACADDR);
	    }
	    # grab previous macaddr
	    ($mac) = cat_("$squeezevar/$device/$macaddr") =~ /(.*)/;
	    $cmd = "squeezelite -o '$device' -m $mac -N $squeezevar/$device/$squeezename -s $IP -b $STREAM:$OUTPUT -d all=info -R -u vLE -U 0 -D 0:dop";
	    #$cmd = "squeezelite -o '$device' -m $mac -N $squeezevar/$device/$squeezename -b $STREAM:$OUTPUT -d all=info";
	    push @cmds, $cmd;
	    next;
	}
	foreach my $cmd (@cmds) {
	    my $pid = fork();
	    if ($pid==0) { # child
	        exec($cmd);
	        die "Exec $cmd failed: $!\n";
	    } elsif (!defined $pid) {
	        warn "Fork $cmd failed: $!\n";
	    }
	}	
	1 while wait() >= 0;
    }
    else {
	print "MAIN Parent process, waiting for child terminating...\n";
	waitpid $pid, 0;
    }    
}

main();
openSUSE Build Service is sponsored by