aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/audio_parser.c107
1 files changed, 78 insertions, 29 deletions
diff --git a/src/audio_parser.c b/src/audio_parser.c
index 2f38e23f6..0b3474ab3 100644
--- a/src/audio_parser.c
+++ b/src/audio_parser.c
@@ -36,27 +36,17 @@ audio_parser_quark(void)
return g_quark_from_static_string("audio_parser");
}
-bool
-audio_format_parse(struct audio_format *dest, const char *src,
- GError **error_r)
+static bool
+parse_sample_rate(const char *src, uint32_t *sample_rate_r,
+ const char **endptr_r, GError **error_r)
{
- char *endptr;
unsigned long value;
- uint32_t rate;
- uint8_t bits, channels;
-
- audio_format_clear(dest);
-
- /* parse sample rate */
+ char *endptr;
value = strtoul(src, &endptr, 10);
if (endptr == src) {
g_set_error(error_r, audio_parser_quark(), 0,
- "Sample rate missing");
- return false;
- } else if (*endptr != ':') {
- g_set_error(error_r, audio_parser_quark(), 0,
- "Sample format missing");
+ "Failed to parse the sample rate");
return false;
} else if (!audio_valid_sample_rate(value)) {
g_set_error(error_r, audio_parser_quark(), 0,
@@ -64,19 +54,22 @@ audio_format_parse(struct audio_format *dest, const char *src,
return false;
}
- rate = value;
+ *sample_rate_r = value;
+ *endptr_r = endptr;
+ return true;
+}
- /* parse sample format */
+static bool
+parse_sample_format(const char *src, uint8_t *bits_r,
+ const char **endptr_r, GError **error_r)
+{
+ unsigned long value;
+ char *endptr;
- src = endptr + 1;
value = strtoul(src, &endptr, 10);
if (endptr == src) {
g_set_error(error_r, audio_parser_quark(), 0,
- "Sample format missing");
- return false;
- } else if (*endptr != ':') {
- g_set_error(error_r, audio_parser_quark(), 0,
- "Channel count missing");
+ "Failed to parse the sample format");
return false;
} else if (!audio_valid_sample_format(value)) {
g_set_error(error_r, audio_parser_quark(), 0,
@@ -84,19 +77,75 @@ audio_format_parse(struct audio_format *dest, const char *src,
return false;
}
- bits = value;
+ *bits_r = value;
+ *endptr_r = endptr;
+ return true;
+}
- /* parse channel count */
+static bool
+parse_channel_count(const char *src, uint8_t *channels_r,
+ const char **endptr_r, GError **error_r)
+{
+ unsigned long value;
+ char *endptr;
- src = endptr + 1;
value = strtoul(src, &endptr, 10);
- if (*endptr != 0 || !audio_valid_channel_count(value)) {
+ if (endptr == src) {
+ g_set_error(error_r, audio_parser_quark(), 0,
+ "Failed to parse the channel count");
+ return false;
+ } else if (!audio_valid_channel_count(value)) {
+ g_set_error(error_r, audio_parser_quark(), 0,
+ "Invalid channel count: %lu", value);
+ return false;
+ }
+
+ *channels_r = value;
+ *endptr_r = endptr;
+ return true;
+}
+
+bool
+audio_format_parse(struct audio_format *dest, const char *src,
+ GError **error_r)
+{
+ uint32_t rate;
+ uint8_t bits, channels;
+
+ audio_format_clear(dest);
+
+ /* parse sample rate */
+
+ if (!parse_sample_rate(src, &rate, &src, error_r))
+ return false;
+
+ if (*src++ != ':') {
g_set_error(error_r, audio_parser_quark(), 0,
- "Invalid channel count: %s", src);
+ "Sample format missing");
return false;
}
- channels = value;
+ /* parse sample format */
+
+ if (!parse_sample_format(src, &bits, &src, error_r))
+ return false;
+
+ if (*src++ != ':') {
+ g_set_error(error_r, audio_parser_quark(), 0,
+ "Channel count missing");
+ return false;
+ }
+
+ /* parse channel count */
+
+ if (!parse_channel_count(src, &channels, &src, error_r))
+ return false;
+
+ if (*src != 0) {
+ g_set_error(error_r, audio_parser_quark(), 0,
+ "Extra data after channel count: %s", src);
+ return false;
+ }
audio_format_init(dest, rate, bits, channels);