Просмотр исходного кода

Track the commanded audio state, in addition to the physical output device

Zachary Kotlarek 13 лет назад
Родитель
Сommit
ec8a483e24
2 измененных файлов с 30 добавлено и 14 удалено
  1. 29 14
      dmx/audio.pl
  2. 1 0
      dmx/state.pl

+ 29 - 14
dmx/audio.pl

@@ -12,13 +12,16 @@ use lib dirname(abs_path($0));
 use DMX;
 
 # Config
-my $USB_DEV     = 'USB Audio CODEC ';
-my $AMP_DEV     = 'Built-in Output';
-my $DEFAULT_DEV = $USB_DEV;
+my %DEVS = (
+	'AMP'     => 'Built-in Output',
+	'RAVE'    => 'Built-in Output',
+	'DEFAULT' => 'USB Audio CODEC ',
+);
 
 # App config
 my $DATA_DIR     = DMX::dataDir();
 my $OUTPUT_FILE  = $DATA_DIR . 'AUDIO';
+my $OUTPUT_STATE = $OUTPUT_FILE . '_STATE';
 my $STATE_SOCK   = $OUTPUT_FILE . '.socket';
 my $PUSH_TIMEOUT = 20;
 my $PULL_TIMEOUT = $PUSH_TIMEOUT * 3;
@@ -39,16 +42,16 @@ DMX::stateSubscribe($STATE_SOCK);
 
 # State
 my $state      = 'OFF';
-my $device     = '';
-my $deviceLast = '';
-my $cmdDevice  = $device;
+my $stateLast  = $state;
+my $device     = 'OFF';
+my $deviceLast = $device;
 my %exists     = ();
 my $pushLast   = 0;
 my $pullLast   = time();
 my $update     = 0;
 
 # Always force the output to default at launch
-system(@AUDIO_SET, $DEFAULT_DEV);
+system(@AUDIO_SET, $DEVS{'DEFAULT'});
 
 # Loop forever
 while (1) {
@@ -85,12 +88,24 @@ while (1) {
 	}
 
 	# Calculate the new state
+	$stateLast = $state;
 	if ($exists{'RAVE'}) {
-		$cmdDevice = $AMP_DEV;
+		$state = 'RAVE';
 	} elsif ($exists{'AUDIO_AMP'}) {
-		$cmdDevice = $AMP_DEV;
+		$state = 'AMP';
 	} else {
-		$cmdDevice = $DEFAULT_DEV;
+		$state = 'DEFAULT';
+	}
+
+	# If the state has changed, save to disk
+	if ($stateLast ne $state) {
+		if ($DEBUG) {
+			print STDERR 'New output state: ' . $stateLast . ' => ' . $state . "\n";
+		}
+		my ($fh, $tmp) = tempfile($OUTPUT_STATE . '.XXXXXXXX', 'UNLINK' => 0);
+		print $fh $state . "\n";
+		close($fh);
+		rename($tmp, $OUTPUT_STATE);
 	}
 
 	# Force updates on a periodic basis
@@ -104,9 +119,9 @@ while (1) {
 	}
 
 	# Force updates when there is a physical state mistmatch
-	if (!$update && $cmdDevice ne $device) {
+	if (!$update && $DEVS{$state} ne $device) {
 		if ($DEBUG) {
-			print STDERR 'State mismatch: ' . $device . ' => ' . $cmdDevice . "\n";
+			print STDERR 'State mismatch: ' . $device . ' => ' . $DEVS{$state} . "\n";
 		}
 		$update = 1;
 	}
@@ -116,9 +131,9 @@ while (1) {
 
 		# Update
 		if ($DEBUG) {
-			print STDERR 'Setting output to: ' . $cmdDevice . "\n";
+			print STDERR 'Setting output to: ' . $DEVS{$state} . "\n";
 		}
-		system(@AUDIO_SET, $cmdDevice);
+		system(@AUDIO_SET, $DEVS{$state});
 
 		# Update the push time
 		$pushLast = time();

+ 1 - 0
dmx/state.pl

@@ -35,6 +35,7 @@ my %MON_FILES     = (
 	'AMPLIFIER_MODE'  => 'STATUS_VALUE',
 	'AMPLIFIER_INPUT' => 'STATUS_VALUE',
 	'AUDIO'           => 'STATUS_VALUE',
+	'AUDIO_STATE'     => 'STATUS_VALUE',
 
 	$MEDIA_PATH . '/DMX/cmd/GARAGE_CMD' => 'EXISTS_CLEAR',
 );