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

Avoid setting the rate when we are not already playing -- any non-zero rate starts playback

Zachary Kotlarek 13 лет назад
Родитель
Сommit
b7ef9972ce
1 измененных файлов с 110 добавлено и 72 удалено
  1. 110 72
      dmx/rifftrax.pl

+ 110 - 72
dmx/rifftrax.pl

@@ -22,6 +22,9 @@ my $JUMP_THRESHOLD = 5;
 # Prototypes
 sub playRiff();
 sub pauseRiff();
+sub getRiffRate();
+sub setRiffRate($);
+sub parseConfig($$);
 
 # App config
 my $DATA_DIR     = DMX::dataDir();
@@ -37,72 +40,6 @@ if ($ENV{'DEBUG'}) {
 	$DEBUG = 1;
 }
 
-# Read the config
-opendir(CONF, $CONFIG_PATH)
-  or die('Unable to open config directory: ' . $! . "\n");
-foreach my $file (readdir(CONF)) {
-
-	# Skip silly files
-	if ($file =~ /^\._/) {
-		next;
-	}
-
-	if ($file =~ /\.riff$/) {
-		my $path = $CONFIG_PATH . '/' . $file;
-
-		# Slurp the contents
-		my $text = '';
-		if (!open(my $fh, $path)) {
-			warn('Unable to open ' . $path . "\n");
-		} else {
-			local $/;
-			$text = <$fh>;
-			close($fh);
-		}
-
-		# Parse out the data we care about
-		my %data = ();
-		if ($text =~ /^\s*Name:\s*(\S.*\S)\s*$/mi) {
-			$data{'name'} = $1;
-		}
-		if ($text =~ /^\s*File:\s*(\S.*\S)\s*$/mi) {
-			$data{'file'} = $1;
-		}
-		if ($text =~ /^\s*Offset:\s*([\-\+]?\d+(?:\.\d+)?)\s*$/mi) {
-			$data{'offset'} = $1;
-		}
-		if ($text =~ /^\s*Rate:\s*(\d+(?:\.\d+)?)\s*$/mi) {
-			$data{'rate'} = $1;
-		}
-
-		# Ensure we have a valid record
-		if (!$data{'name'} || !$data{'file'}) {
-			die('Invalid riff file: ' . $file . ' => ' . $data{'name'} . "\n");
-		}
-
-		# Construct an absolute path
-		if ($data{'file'} =~ /^\//) {
-			$data{'path'} = $data{'file'};
-		} else {
-			$data{'path'} = $RIFF_PATH . '/' . $data{'file'};
-		}
-
-		# Ensure the path is valid
-		if (!-r $data{'path'}) {
-			die('Invalid riff path: ' . $file . ' => ' . $data{'path'} . "\n");
-		}
-
-		# Debug
-		if ($DEBUG) {
-			print STDERR 'Added RiffTrax: ' . $data{'name'} . "\n\tFile: " . $data{'file'} . "\n\tOffset: " . $data{'offset'} . "\n\tRate: " . $data{'rate'} . "\n";
-		}
-
-		# Push the data up the chain
-		$RIFFS{ $data{'name'} } = \%data;
-	}
-}
-closedir(CONF);
-
 # Sockets
 DMX::stateSocket($STATE_SOCK);
 DMX::stateSubscribe($STATE_SOCK);
@@ -122,6 +59,9 @@ my $lastSync  = time();
 my $playing   = 0;
 my $delay     = $DELAY;
 
+# Read the config
+parseConfig($CONFIG_PATH, \%RIFFS);
+
 # Loop forever
 while (1) {
 
@@ -187,8 +127,7 @@ while (1) {
 			$riff  = $title;
 			$delay = 1;
 			Audio::addLoad('RIFF', $RIFFS{$riff}->{'path'});
-			Audio::rate('RIFF', $RIFFS{$riff}->{'rate'});
-			playRiff();
+			setRiffRate($RIFFS{$riff}->{'rate'});
 			DMX::say('RiffTrax initiated');
 		}
 	}
@@ -232,8 +171,8 @@ while (1) {
 		$lastSync = time();
 
 		# Get the video and riff playback positions
-		my $rate = Audio::rate('RIFF', undef());
-		my $riffTime = Audio::position('RIFF', undef());
+		my $rate      = getRiffRate();
+		my $riffTime  = Audio::position('RIFF', undef());
 		my $videoTime = $exists{'PLAYING_POSITION'};
 
 		# Convert to seconds
@@ -298,7 +237,7 @@ while (1) {
 					if ($DEBUG) {
 						print STDERR 'Setting rate to: ' . $newRate . "\n";
 					}
-					Audio::rate('RIFF', $newRate);
+					setRiffRate($newRate);
 				}
 
 				# Play/pause as needed, before we adjust
@@ -316,18 +255,117 @@ while (1) {
 
 			# Reset the rate to standard if we're inside sync the window
 			if ($rate != $RIFFS{$riff}->{'rate'}) {
-				Audio::rate('RIFF', $RIFFS{$riff}->{'rate'});
+				setRiffRate($RIFFS{$riff}->{'rate'});
 			}
 		}
 	}
 }
 
 sub playRiff() {
+	if ($DEBUG) {
+		print STDERR "playRiff()\n";
+	}
 	$playing = 1;
 	Audio::background('RIFF');
 }
 
 sub pauseRiff() {
+	if ($DEBUG) {
+		print STDERR "pauseRiff()\n";
+	}
 	$playing = 0;
 	Audio::pause('RIFF');
 }
+
+sub getRiffRate() {
+	if ($DEBUG) {
+		print STDERR "getRiffRate()\n";
+	}
+	my $rate = 0;
+	if ($playing) {
+		$rate = Audio::rate('RIFF', undef());
+	}
+	return $rate;
+}
+
+sub setRiffRate($) {
+	my ($rate) = @_;
+	if ($DEBUG) {
+		print STDERR 'setRiffRate(): ' . $rate . "\n";
+	}
+	if ($playing) {
+		Audio::rate('RIFF', $rate);
+	}
+}
+
+sub parseConfig($$) {
+	my ($conf_path, $riffs) = @_;
+	if ($DEBUG) {
+		print STDERR "parseConfig()\n";
+	}
+
+	opendir(CONF, $conf_path)
+	  or die('Unable to open config directory: ' . $! . "\n");
+	foreach my $file (readdir(CONF)) {
+
+		# Skip silly files
+		if ($file =~ /^\._/) {
+			next;
+		}
+
+		if ($file =~ /\.riff$/) {
+			my $path = $conf_path . '/' . $file;
+
+			# Slurp the contents
+			my $text = '';
+			if (!open(my $fh, $path)) {
+				warn('Unable to open ' . $path . "\n");
+			} else {
+				local $/;
+				$text = <$fh>;
+				close($fh);
+			}
+
+			# Parse out the data we care about
+			my %data = ();
+			if ($text =~ /^\s*Name:\s*(\S.*\S)\s*$/mi) {
+				$data{'name'} = $1;
+			}
+			if ($text =~ /^\s*File:\s*(\S.*\S)\s*$/mi) {
+				$data{'file'} = $1;
+			}
+			if ($text =~ /^\s*Offset:\s*([\-\+]?\d+(?:\.\d+)?)\s*$/mi) {
+				$data{'offset'} = $1;
+			}
+			if ($text =~ /^\s*Rate:\s*(\d+(?:\.\d+)?)\s*$/mi) {
+				$data{'rate'} = $1;
+			}
+
+			# Ensure we have a valid record
+			if (!$data{'name'} || !$data{'file'}) {
+				die('Invalid riff file: ' . $file . ' => ' . $data{'name'} . "\n");
+			}
+
+			# Construct an absolute path
+			if ($data{'file'} =~ /^\//) {
+				$data{'path'} = $data{'file'};
+			} else {
+				$data{'path'} = $RIFF_PATH . '/' . $data{'file'};
+			}
+
+			# Ensure the path is valid
+			if (!-r $data{'path'}) {
+				die('Invalid riff path: ' . $file . ' => ' . $data{'path'} . "\n");
+			}
+
+			# Debug
+			if ($DEBUG) {
+				print STDERR 'Added RiffTrax: ' . $data{'name'} . "\n\tFile: " . $data{'file'} . "\n\tOffset: " . $data{'offset'} . "\n\tRate: " . $data{'rate'} . "\n";
+			}
+
+			# Push the data up the chain
+			$riffs->{ $data{'name'} } = \%data;
+		}
+	}
+	closedir(CONF);
+}