aboutsummaryrefslogtreecommitdiff
path: root/mail/thunderbird/files/patch-cubeb-sndio
diff options
context:
space:
mode:
Diffstat (limited to 'mail/thunderbird/files/patch-cubeb-sndio')
-rw-r--r--mail/thunderbird/files/patch-cubeb-sndio113
1 files changed, 113 insertions, 0 deletions
diff --git a/mail/thunderbird/files/patch-cubeb-sndio b/mail/thunderbird/files/patch-cubeb-sndio
new file mode 100644
index 000000000000..974af005402b
--- /dev/null
+++ b/mail/thunderbird/files/patch-cubeb-sndio
@@ -0,0 +1,113 @@
+https://github.com/kinetiknz/cubeb/commit/a71f116501fe39962599c435ef65066f7e7ea9f5
+https://github.com/kinetiknz/cubeb/commit/3025cbec70f3ed097ec9a2f33a4823316a29efc4
+https://github.com/kinetiknz/cubeb/commit/bb2735fa2ff680fdc615edbb363b19ff4a759503
+https://github.com/kinetiknz/cubeb/pull/564
+
+diff --git a/src/cubeb_sndio.c b/src/cubeb_sndio.c
+index 4a05bd84..34b3513d 100644
+--- media/libcubeb/src/cubeb_sndio.c
++++ media/libcubeb/src/cubeb_sndio.c
+@@ -32,6 +32,7 @@
+ X(sio_eof) \
+ X(sio_getpar) \
+ X(sio_initpar) \
++ X(sio_nfds) \
+ X(sio_onmove) \
+ X(sio_open) \
+ X(sio_pollfd) \
+@@ -124,6 +125,23 @@ s16_to_float(void *ptr, long nsamp)
+ *(--dst) = (1. / 32768) * *(--src);
+ }
+
++static const char *
++sndio_get_device()
++{
++#ifdef __linux__
++ /*
++ * On other platforms default to sndio devices,
++ * so cubebs other backends can be used instead.
++ */
++ const char *dev = getenv("AUDIODEVICE");
++ if (dev == NULL || *dev == '\0')
++ return "snd/0";
++ return dev;
++#else
++ return SIO_DEVANY;
++#endif
++}
++
+ static void
+ sndio_onmove(void *arg, int delta)
+ {
+@@ -135,18 +153,23 @@ sndio_onmove(void *arg, int delta)
+ static void *
+ sndio_mainloop(void *arg)
+ {
+-#define MAXFDS 8
+- struct pollfd pfds[MAXFDS];
++ struct pollfd *pfds;
+ cubeb_stream *s = arg;
+ int n, eof = 0, prime, nfds, events, revents, state = CUBEB_STATE_STARTED;
+ size_t pstart = 0, pend = 0, rstart = 0, rend = 0;
+ long nfr;
+
++ nfds = WRAP(sio_nfds)(s->hdl);
++ pfds = calloc(nfds, sizeof (struct pollfd));
++ if (pfds == NULL)
++ return NULL;
++
+ DPR("sndio_mainloop()\n");
+ s->state_cb(s, s->arg, CUBEB_STATE_STARTED);
+ pthread_mutex_lock(&s->mtx);
+ if (!WRAP(sio_start)(s->hdl)) {
+ pthread_mutex_unlock(&s->mtx);
++ free(pfds);
+ return NULL;
+ }
+ DPR("sndio_mainloop(), started\n");
+@@ -274,6 +297,7 @@ sndio_mainloop(void *arg)
+ s->hwpos = s->swpos;
+ pthread_mutex_unlock(&s->mtx);
+ s->state_cb(s, s->arg, state);
++ free(pfds);
+ return NULL;
+ }
+
+@@ -281,6 +305,9 @@ sndio_mainloop(void *arg)
+ sndio_init(cubeb **context, char const *context_name)
+ {
+ void * libsndio = NULL;
++ struct sio_hdl *hdl;
++
++ assert(context);
+
+ #ifndef DISABLE_LIBSNDIO_DLOPEN
+ libsndio = dlopen("libsndio.so.7.0", RTLD_LAZY);
+@@ -305,8 +332,17 @@ sndio_init(cubeb **context, char const *context_name)
+ #undef LOAD
+ #endif
+
++ /* test if sndio works */
++ hdl = WRAP(sio_open)(sndio_get_device(), SIO_PLAY, 1);
++ if (hdl == NULL) {
++ return CUBEB_ERROR;
++ }
++ WRAP(sio_close)(hdl);
++
+ DPR("sndio_init(%s)\n", context_name);
+- *context = malloc(sizeof(*context));
++ *context = malloc(sizeof(**context));
++ if (*context == NULL)
++ return CUBEB_ERROR;
+ (*context)->libsndio = libsndio;
+ (*context)->ops = &sndio_ops;
+ (void)context_name;
+@@ -377,7 +413,7 @@ sndio_stream_init(cubeb * context,
+ goto err;
+ }
+ s->context = context;
+- s->hdl = WRAP(sio_open)(NULL, s->mode, 1);
++ s->hdl = WRAP(sio_open)(sndio_get_device(), s->mode, 1);
+ if (s->hdl == NULL) {
+ DPR("sndio_stream_init(), sio_open() failed\n");
+ goto err;