From 3bc4224bfda5ebf9cd6969ea0f6647b1af3e9da6 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Wed, 11 Feb 2009 18:00:48 +0100
Subject: audio_format: added validation functions

In addition to audio_format_valid(), provide functions which validate
only one attribute of an audio_format.  These functions are reused by
audio_format_parse().
---
 src/audio_format.h | 37 ++++++++++++++++++++++++++++++++++---
 src/audio_parser.c |  6 +++---
 2 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/src/audio_format.h b/src/audio_format.h
index 739fe6c1f..a7ff30830 100644
--- a/src/audio_format.h
+++ b/src/audio_format.h
@@ -40,15 +40,46 @@ static inline bool audio_format_defined(const struct audio_format *af)
 	return af->sample_rate != 0;
 }
 
+/**
+ * Checks whether the sample rate is valid.
+ *
+ * @param sample_rate the sample rate in Hz
+ */
+static inline bool
+audio_valid_sample_rate(unsigned sample_rate)
+{
+	return sample_rate > 0 && sample_rate < (1 << 30);
+}
+
+/**
+ * Checks whether the sample format is valid.
+ *
+ * @param bits the number of significant bits per sample
+ */
+static inline bool
+audio_valid_sample_format(unsigned bits)
+{
+	return bits == 16 || bits == 24 || bits == 8;
+}
+
+/**
+ * Checks whether the number of channels is valid.
+ */
+static inline bool
+audio_valid_channel_count(unsigned channels)
+{
+	return channels == 1 || channels == 2;
+}
+
 /**
  * Returns false if the format is not valid for playback with MPD.
  * This function performs some basic validity checks.
  */
 static inline bool audio_format_valid(const struct audio_format *af)
 {
-	return af->sample_rate > 0 &&
-		(af->bits == 8 || af->bits == 16 || af->bits == 24) &&
-		af->channels >= 1;
+	return audio_valid_sample_rate(af->sample_rate) &&
+		audio_valid_sample_format(af->bits) &&
+		audio_valid_channel_count(af->channels);
 }
 
 static inline bool audio_format_equals(const struct audio_format *a,
diff --git a/src/audio_parser.c b/src/audio_parser.c
index 807a279b3..ee43fd24e 100644
--- a/src/audio_parser.c
+++ b/src/audio_parser.c
@@ -54,7 +54,7 @@ audio_format_parse(struct audio_format *dest, const char *src, GError **error)
 		g_set_error(error, audio_parser_quark(), 0,
 			    "Sample format missing");
 		return false;
-	} else if (value <= 0 || value > G_MAXINT32) {
+	} else if (!audio_valid_sample_rate(value)) {
 		g_set_error(error, audio_parser_quark(), 0,
 			    "Invalid sample rate: %lu", value);
 		return false;
@@ -74,7 +74,7 @@ audio_format_parse(struct audio_format *dest, const char *src, GError **error)
 		g_set_error(error, audio_parser_quark(), 0,
 			    "Channel count missing");
 		return false;
-	} else if (value != 16 && value != 24 && value != 8) {
+	} else if (!audio_valid_sample_format(value)) {
 		g_set_error(error, audio_parser_quark(), 0,
 			    "Invalid sample format: %lu", value);
 		return false;
@@ -86,7 +86,7 @@ audio_format_parse(struct audio_format *dest, const char *src, GError **error)
 
 	src = endptr + 1;
 	value = strtoul(src, &endptr, 10);
-	if (*endptr != 0 || (value != 1 && value != 2)) {
+	if (*endptr != 0 || !audio_valid_channel_count(value)) {
 		g_set_error(error, audio_parser_quark(), 0,
 			    "Invalid channel count: %s", src);
 		return false;
-- 
cgit v1.2.3