[pulseaudio-discuss] [PATCH 02/21] device-class: Introduce pa_device_class_t

Tanu Kaskinen tanu.kaskinen at linux.intel.com
Wed Jun 19 08:39:59 PDT 2013


My plan is to use the device class in node names. There is already the
PA_PROP_DEVICE_FORM_FACTOR property, which is almost the same thing as
the device class, but since that property can contain arbitrary
values, I want to have a way to sanitize the property value to some
controlled set of device classes. The way I chose to do that was to
introduce an enumeration with from_string() and to_string()
operations.

I wouldn't be surprised if further uses for the device class
enumeration were found in the future.
---
 src/Makefile.am              |  1 +
 src/pulsecore/device-class.c | 69 +++++++++++++++++++++++++++++++++++++++++++
 src/pulsecore/device-class.h | 70 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 140 insertions(+)
 create mode 100644 src/pulsecore/device-class.c
 create mode 100644 src/pulsecore/device-class.h

diff --git a/src/Makefile.am b/src/Makefile.am
index 2521670..41ff87c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -874,6 +874,7 @@ libpulsecore_ at PA_MAJORMINOR@_la_SOURCES = \
 		pulsecore/core-scache.c pulsecore/core-scache.h \
 		pulsecore/core-subscribe.c pulsecore/core-subscribe.h \
 		pulsecore/core.c pulsecore/core.h \
+		pulsecore/device-class.c pulsecore/device-class.h \
 		pulsecore/fdsem.c pulsecore/fdsem.h \
 		pulsecore/hook-list.c pulsecore/hook-list.h \
 		pulsecore/ltdl-helper.c pulsecore/ltdl-helper.h \
diff --git a/src/pulsecore/device-class.c b/src/pulsecore/device-class.c
new file mode 100644
index 0000000..73f20ae
--- /dev/null
+++ b/src/pulsecore/device-class.c
@@ -0,0 +1,69 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright (c) 2013 Intel Corporation
+  Author: Tanu Kaskinen <tanu.kaskinen at intel.com>
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <pulsecore/core-util.h>
+#include <pulsecore/macro.h>
+
+#include "device-class.h"
+
+static const char * const string_table[PA_DEVICE_CLASS_MAX] = {
+    [PA_DEVICE_CLASS_UNKNOWN] = "unknown",
+    [PA_DEVICE_CLASS_COMPUTER] = "computer",
+    [PA_DEVICE_CLASS_PHONE] = "phone",
+    [PA_DEVICE_CLASS_HEADSET] = "headset",
+    [PA_DEVICE_CLASS_HANDSFREE] = "handsfree",
+    [PA_DEVICE_CLASS_MICROPHONE] = "microphone",
+    [PA_DEVICE_CLASS_SPEAKERS] = "speakers",
+    [PA_DEVICE_CLASS_HEADPHONES] = "headphones",
+    [PA_DEVICE_CLASS_PORTABLE] = "portable",
+    [PA_DEVICE_CLASS_CAR] = "car",
+    [PA_DEVICE_CLASS_SETTOP_BOX] = "set-top-box",
+    [PA_DEVICE_CLASS_HIFI] = "hifi",
+    [PA_DEVICE_CLASS_VCR] = "vcr",
+    [PA_DEVICE_CLASS_VIDEO_CAMERA] = "video-camera",
+    [PA_DEVICE_CLASS_CAMCORDER] = "camcorder",
+    [PA_DEVICE_CLASS_VIDEO_DISPLAY_AND_SPEAKERS] = "video-display-and-speakers",
+    [PA_DEVICE_CLASS_VIDEO_CONFERENCING] = "video-conferencing",
+    [PA_DEVICE_CLASS_GAMING_OR_TOY] = "gaming-or-toy",
+    [PA_DEVICE_CLASS_TUNER] = "tuner"
+};
+
+pa_device_class_t pa_device_class_from_string(const char *str) {
+    unsigned i;
+
+    pa_assert(str);
+
+    for (i = 0; i < PA_DEVICE_CLASS_MAX; i++) {
+        if (pa_streq(str, string_table[i]))
+            return (pa_device_class_t) i;
+    }
+
+    return PA_DEVICE_CLASS_UNKNOWN;
+}
+
+const char *pa_device_class_to_string(pa_device_class_t class) {
+    return string_table[class];
+}
diff --git a/src/pulsecore/device-class.h b/src/pulsecore/device-class.h
new file mode 100644
index 0000000..e820fc2
--- /dev/null
+++ b/src/pulsecore/device-class.h
@@ -0,0 +1,70 @@
+#ifndef fooformfactorhfoo
+#define fooformfactorhfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright (c) 2013 Intel Corporation
+  Author: Tanu Kaskinen <tanu.kaskinen at intel.com>
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+/* One source of device class definitions is the Bluetooth specification:
+ * https://www.bluetooth.org/en-us/specification/assigned-numbers-overview/baseband
+ *
+ * The Bluetooth specification divides device classes to major and minor
+ * classes. We don't list every possible Bluetooth minor device class here.
+ * Instead, the "computer" and "phone" major classes in Bluetooth are mapped to
+ * single "computer" and "phone" classes here. Almost all of the minor classes
+ * in the "audio/video" major class in Bluetooth have their own device class
+ * here. All other Bluetooth major device classes are categorized as "unknown"
+ * (they are not likely to have audio capabilities).
+ *
+ * Even though this list is heavily based on the Bluetooth specification, this
+ * is not intended to be Bluetooth specific in any way. New classes can be
+ * freely added if something is missing. */
+typedef enum {
+    /* This can mean that we don't have enough information about the device
+     * class, or we don't understand the information (e.g. udev can give
+     * arbitrary strings as the form factor). */
+    PA_DEVICE_CLASS_UNKNOWN,
+
+    PA_DEVICE_CLASS_COMPUTER,
+    PA_DEVICE_CLASS_PHONE,
+    PA_DEVICE_CLASS_HEADSET,
+    PA_DEVICE_CLASS_HANDSFREE,
+    PA_DEVICE_CLASS_MICROPHONE,
+    PA_DEVICE_CLASS_SPEAKERS,
+    PA_DEVICE_CLASS_HEADPHONES,
+    PA_DEVICE_CLASS_PORTABLE,
+    PA_DEVICE_CLASS_CAR,
+    PA_DEVICE_CLASS_SETTOP_BOX,
+    PA_DEVICE_CLASS_HIFI,
+    PA_DEVICE_CLASS_VCR,
+    PA_DEVICE_CLASS_VIDEO_CAMERA,
+    PA_DEVICE_CLASS_CAMCORDER,
+    PA_DEVICE_CLASS_VIDEO_DISPLAY_AND_SPEAKERS,
+    PA_DEVICE_CLASS_VIDEO_CONFERENCING,
+    PA_DEVICE_CLASS_GAMING_OR_TOY,
+    PA_DEVICE_CLASS_TUNER, /* XXX: Should there be separate classes for radio and TV tuners? */
+    PA_DEVICE_CLASS_MAX
+} pa_device_class_t;
+
+pa_device_class_t pa_device_class_from_string(const char *str);
+const char *pa_device_class_to_string(pa_device_class_t class);
+
+#endif
-- 
1.8.1.2



More information about the pulseaudio-discuss mailing list