On Sun, Jul 13, 2025 at 04:48:36PM +0200, Alexandre Ratchov wrote:
> Few programs enumerate the audio devices at audio initialization and
> abort if this fails. The net/dino port is one of them, which explains
> why audio phone calls dont work.
> 
> This was discussed in this thread:
> 
> https://marc.info/?l=openbsd-misc&m=173183259932223&w=4
> 

While re-reading above thread, I just noticed there's already such a
diff that was forgotten.

Appologies, Andrzej.

We both ended up with almost the same diff, the only differences is in
the lack of 'internal-name' property (sndio needs no extra properties)
and the returned capabilities.

> This diff adds the missing "device provider" class to the sndio
> plugin. It just returns the defaut device, so programs that need to
> enumerate the audio devices dont fail.
> 
> OK?
> 
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/multimedia/gstreamer1/plugins-base/Makefile,v
> diff -u -p -u -p -r1.122 Makefile
> --- Makefile  27 Jun 2025 10:12:15 -0000      1.122
> +++ Makefile  13 Jul 2025 14:25:14 -0000
> @@ -1,6 +1,7 @@
>  COMMENT=             base elements for GStreamer
>  
>  DISTNAME=            gst-plugins-base-${V}
> +REVISION=            0
>  
>  SHARED_LIBS += gsttag-1.0                7.3 # 0.2603.0
>  SHARED_LIBS += gstfft-1.0                7.3 # 0.2603.0
> Index: files/gstsndio.c
> ===================================================================
> RCS file: /cvs/ports/multimedia/gstreamer1/plugins-base/files/gstsndio.c,v
> diff -u -p -u -p -r1.4 gstsndio.c
> --- files/gstsndio.c  21 Apr 2019 08:49:42 -0000      1.4
> +++ files/gstsndio.c  13 Jul 2025 14:25:14 -0000
> @@ -21,6 +21,7 @@
>  
>  #include <stdio.h>
>  #include "gstsndio.h"
> +#include "sndiodeviceprovider.h"
>  
>  GST_DEBUG_CATEGORY (gst_sndio_debug);
>  #define GST_CAT_DEFAULT gst_sndio_debug
> @@ -40,6 +41,9 @@ plugin_init (GstPlugin * plugin)
>    /* prefer sndiosink over pulsesink (GST_RANK_PRIMARY + 10) */
>    if (!gst_element_register (plugin, "sndiosink", GST_RANK_PRIMARY + 20,
>            gst_sndiosink_get_type()))
> +    return FALSE;
> +  if (!gst_device_provider_register (plugin, "sndiodeviceprovider", 
> GST_RANK_PRIMARY + 20,
> +          gst_sndio_device_provider_get_type()))
>      return FALSE;
>    return TRUE;
>  }
> Index: files/meson.build
> ===================================================================
> RCS file: /cvs/ports/multimedia/gstreamer1/plugins-base/files/meson.build,v
> diff -u -p -u -p -r1.3 meson.build
> --- files/meson.build 25 Jan 2023 08:31:52 -0000      1.3
> +++ files/meson.build 13 Jul 2025 14:25:14 -0000
> @@ -1,5 +1,7 @@
>  sndio_sources = [
>    'gstsndio.c',
> +  'sndiodevice.c',
> +  'sndiodeviceprovider.c',
>    'sndiosink.c',
>    'sndiosrc.c',
>  ]
> Index: files/sndiodevice.c
> ===================================================================
> RCS file: files/sndiodevice.c
> diff -N files/sndiodevice.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ files/sndiodevice.c       13 Jul 2025 14:25:14 -0000
> @@ -0,0 +1,79 @@
> +#include <string.h>
> +#include <gst/gst.h>
> +#include <sndio.h>
> +#include <stdio.h>
> +#include "gstsndio.h"
> +#include "sndiodevice.h"
> +
> +G_DEFINE_TYPE (GstSndioDevice, gst_sndio_device, GST_TYPE_DEVICE);
> +
> +GstDevice *
> +gst_sndio_device_new (const gchar *name, int mode)
> +{
> +  static GstStaticCaps sndio_caps = GST_STATIC_CAPS (GST_SNDIO_CAPS_STRING);
> +  GstSndioDevice *sndio_device;
> +  GstCaps *caps;
> +  GstStructure *props;
> +  const gchar *klass;
> +
> +  klass = (mode == SIO_REC) ? "Audio/Source" : "Audio/Sink";
> +
> +  caps = gst_static_caps_get (&sndio_caps);
> +
> +  props = gst_structure_new ("sndio-proplist",
> +      "device.api", G_TYPE_STRING, "sndio",
> +      "device.class", G_TYPE_STRING, "sound",
> +      NULL);
> +
> +  sndio_device = g_object_new (GST_TYPE_SNDIO_DEVICE,
> +      "display-name", name,
> +      "caps", caps,
> +      "device-class", klass,
> +      "properties", props,
> +      NULL);
> +
> +  sndio_device->mode = mode;
> +
> +  /* sndio_device owns 'caps' and 'props', so free ours */
> +
> +  gst_structure_free (props);
> +  gst_caps_unref (caps);
> +
> +  return GST_DEVICE (sndio_device);
> +}
> +
> +static GstElement *
> +gst_sndio_device_create_element (GstDevice *device, const gchar *name)
> +{
> +  GstSndioDevice *sndio_device = GST_SNDIO_DEVICE (device);
> +  GstElement *element;
> +  const char *element_name;
> +
> +  element_name = (sndio_device->mode == SIO_REC) ? "sndiosrc" : "sndiosink";
> +
> +  element = gst_element_factory_make (element_name, name);
> +  g_object_set (element, "device", gst_device_get_display_name(device), 
> NULL);
> +
> +  return element;
> +}
> +
> +static void
> +gst_sndio_device_finalize (GObject *object)
> +{
> +  G_OBJECT_CLASS (gst_sndio_device_parent_class)->finalize (object);
> +}
> +
> +static void
> +gst_sndio_device_class_init (GstSndioDeviceClass *klass)
> +{
> +  GstDeviceClass *dev_class = GST_DEVICE_CLASS (klass);
> +  GObjectClass *object_class = G_OBJECT_CLASS (klass);
> +
> +  dev_class->create_element = gst_sndio_device_create_element;
> +  object_class->finalize = gst_sndio_device_finalize;
> +}
> +
> +static void
> +gst_sndio_device_init (GstSndioDevice *device)
> +{
> +}
> Index: files/sndiodevice.h
> ===================================================================
> RCS file: files/sndiodevice.h
> diff -N files/sndiodevice.h
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ files/sndiodevice.h       13 Jul 2025 14:25:14 -0000
> @@ -0,0 +1,40 @@
> +#ifndef __GST_SNDIODEVICE_H__
> +#define __GST_SNDIODEVICE_H__
> +
> +#include <gst/gst.h>
> +
> +G_BEGIN_DECLS
> +
> +typedef struct _GstSndioDevice GstSndioDevice;
> +typedef struct _GstSndioDeviceClass GstSndioDeviceClass;
> +
> +#define GST_TYPE_SNDIO_DEVICE \
> +     (gst_sndio_device_get_type())
> +#define GST_IS_SNDIO_DEVICE(obj) \
> +     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SNDIO_DEVICE))
> +#define GST_IS_SNDIO_DEVICE_CLASS(klass) \
> +     (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SNDIO_DEVICE))
> +#define GST_SNDIO_DEVICE_GET_CLASS(obj) \
> +     (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_SNDIO_DEVICE, 
> GstSndioDeviceClass))
> +#define GST_SNDIO_DEVICE(obj) \
> +     (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SNDIO_DEVICE, 
> GstSndioDevice))
> +#define GST_SNDIO_DEVICE_CLASS(klass) \
> +     (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEVICE, 
> GstSndioDeviceClass))
> +#define GST_SNDIO_DEVICE_CAST(obj) \
> +     ((GstSndioDevice *)(obj))
> +
> +struct _GstSndioDevice {
> +  GstDevice parent;
> +  int mode;
> +};
> +
> +struct _GstSndioDeviceClass {
> +  GstDeviceClass parent_class;
> +};
> +
> +GstDevice *gst_sndio_device_new (const gchar *, int);
> +GType gst_sndio_device_get_type (void);
> +
> +G_END_DECLS
> +
> +#endif
> Index: files/sndiodeviceprovider.c
> ===================================================================
> RCS file: files/sndiodeviceprovider.c
> diff -N files/sndiodeviceprovider.c
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ files/sndiodeviceprovider.c       13 Jul 2025 14:25:14 -0000
> @@ -0,0 +1,50 @@
> +#include <string.h>
> +#include <gst/gst.h>
> +#include <sndio.h>
> +#include <stdio.h>
> +#include "sndiodeviceprovider.h"
> +#include "sndiodevice.h"
> +
> +G_DEFINE_TYPE (GstSndioDeviceProvider, gst_sndio_device_provider, 
> GST_TYPE_DEVICE_PROVIDER);
> +
> +static GList *
> +gst_sndio_device_provider_probe (GstDeviceProvider *provider)
> +{
> +  GList *list = NULL;
> +  GstDevice *device;
> +  struct sio_hdl *hdl;
> +
> +  /*
> +   * There's no way to discover all devices on the network, so
> +   * just return the default device. The user can point it to
> +   * any device.
> +   */
> +
> +  device = gst_sndio_device_new (SIO_DEVANY, SIO_PLAY);
> +  if (device)
> +    list = g_list_prepend (list, device);
> +
> +  device = gst_sndio_device_new (SIO_DEVANY, SIO_REC);
> +  if (device)
> +    list = g_list_prepend (list, device);
> +
> +  return list;
> +}
> +
> +static void
> +gst_sndio_device_provider_class_init (GstSndioDeviceProviderClass *klass)
> +{
> +  GstDeviceProviderClass *dm_class = GST_DEVICE_PROVIDER_CLASS (klass);
> +
> +  dm_class->probe = gst_sndio_device_provider_probe;
> +
> +  gst_device_provider_class_set_static_metadata (dm_class,
> +      "Sndio Device Provider", "Sink/Source/Audio",
> +      "List and provide sndio source and sink devices",
> +      "Alexandre Ratchov <a...@caoua.com>");
> +}
> +
> +static void
> +gst_sndio_device_provider_init (GstSndioDeviceProvider *self)
> +{
> +}
> Index: files/sndiodeviceprovider.h
> ===================================================================
> RCS file: files/sndiodeviceprovider.h
> diff -N files/sndiodeviceprovider.h
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ files/sndiodeviceprovider.h       13 Jul 2025 14:25:14 -0000
> @@ -0,0 +1,38 @@
> +#ifndef __GST_SNDIODEVICEPROVIDER_H__
> +#define __GST_SNDIODEVICEPROVIDER_H__
> +
> +#include <gst/gst.h>
> +
> +G_BEGIN_DECLS
> +
> +typedef struct _GstSndioDeviceProvider GstSndioDeviceProvider;
> +typedef struct _GstSndioDeviceProviderClass GstSndioDeviceProviderClass;
> +
> +#define GST_TYPE_SNDIO_DEVICE_PROVIDER \
> +     (gst_sndio_device_provider_get_type())
> +#define GST_IS_SNDIO_DEVICE_PROVIDER(obj) \
> +     (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SNDIO_DEVICE_PROVIDER))
> +#define GST_IS_SNDIO_DEVICE_PROVIDER_CLASS(klass) \
> +     (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SNDIO_DEVICE_PROVIDER))
> +#define GST_SNDIO_DEVICE_PROVIDER_GET_CLASS(obj) \
> +     (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_SNDIO_DEVICE_PROVIDER, 
> GstSndioDeviceProviderClass))
> +#define GST_SNDIO_DEVICE_PROVIDER(obj) \
> +     (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SNDIO_DEVICE_PROVIDER, 
> GstSndioDeviceProvider))
> +#define GST_SNDIO_DEVICE_PROVIDER_CLASS(klass) \
> +     (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DEVICE_PROVIDER, 
> GstSndioDeviceProviderClass))
> +#define GST_SNDIO_DEVICE_PROVIDER_CAST(obj) \
> +     ((GstSndioDeviceProvider *)(obj))
> +
> +struct _GstSndioDeviceProvider {
> +  GstDeviceProvider parent;
> +};
> +
> +struct _GstSndioDeviceProviderClass {
> +  GstDeviceProviderClass parent_class;
> +};
> +
> +GType gst_sndio_device_provider_get_type (void);
> +
> +G_END_DECLS
> +
> +#endif
> 
> 

Reply via email to