Files
bsdports/_oldver/palemoon/files/patch-sndio
2019-12-26 07:26:06 +00:00

146 lines
3.9 KiB
Plaintext

Bug 1153151 - make libcubeb sndio use non-blocking i/o
Bug 1153179 - fix latency reporting in libcubeb sndio
From cubeb:
From 5ffce9e91b2fde70ba532ea215e3e9e7eed3d41a Mon Sep 17 00:00:00 2001
From: Alexandre Ratchov <alex@caoua.org>
Date: Thu, 2 Apr 2015 13:09:22 +1300
Subject: [PATCH] sndio: improve and clamp float->s16 conversion.
https://marc.info/?l=openbsd-ports&m=152641946326955&w=2
Apply volume in software as do other backends. This is necessary
because sndio volume may be controlled externally and there's no
volume getter in libcubeb to notify the caller about volume
changes.
--- media/libcubeb/src/cubeb_sndio.c.orig 2018-05-24 13:59:58 UTC
+++ media/libcubeb/src/cubeb_sndio.c
@@ -4,6 +4,7 @@
* This program is made available under an ISC-style license. See the
* accompanying file LICENSE for details.
*/
+#include <math.h>
#include <poll.h>
#include <pthread.h>
#include <sndio.h>
@@ -41,17 +42,39 @@ struct cubeb_stream {
uint64_t wrpos; /* number of written frames */
cubeb_data_callback data_cb; /* cb to preapare data */
cubeb_state_callback state_cb; /* cb to notify about state changes */
+ float volume; /* current volume */
void *arg; /* user arg to {data,state}_cb */
};
static void
-float_to_s16(void *ptr, long nsamp)
+s16_setvol(void *ptr, long nsamp, float volume)
{
int16_t *dst = ptr;
+ int32_t mult = volume * 32768;
+ int32_t s;
+ while (nsamp-- > 0) {
+ s = *dst;
+ s = (s * mult) >> 15;
+ *(dst++) = s;
+ }
+}
+
+static void
+float_to_s16(void *ptr, long nsamp, float volume)
+{
+ int16_t *dst = ptr;
float *src = ptr;
+ float mult = volume * 32768;
+ int s;
- while (nsamp-- > 0)
- *(dst++) = *(src++) * 32767;
+ while (nsamp-- > 0) {
+ s = lrintf(*(src++) * mult);
+ if (s < -32768)
+ s = -32768;
+ else if (s > 32767)
+ s = 32767;
+ *(dst++) = s;
+ }
}
static void
@@ -59,7 +82,7 @@ sndio_onmove(void *arg, int delta)
{
cubeb_stream *s = (cubeb_stream *)arg;
- s->rdpos += delta;
+ s->rdpos += delta * s->bpf;
}
static void *
@@ -103,7 +126,9 @@ sndio_mainloop(void *arg)
break;
}
if (s->conv)
- float_to_s16(s->buf, nfr * s->pchan);
+ float_to_s16(s->buf, nfr * s->pchan, s->volume);
+ else
+ s16_setvol(s->buf, nfr * s->pchan, s->volume);
start = 0;
end = nfr * s->bpf;
}
@@ -127,7 +152,7 @@ sndio_mainloop(void *arg)
state = CUBEB_STATE_ERROR;
break;
}
- s->wrpos = 0;
+ s->wrpos += n;
start += n;
}
}
@@ -179,7 +204,7 @@ sndio_stream_init(cubeb *context,
if (s == NULL)
return CUBEB_ERROR;
s->context = context;
- s->hdl = sio_open(NULL, SIO_PLAY, 0);
+ s->hdl = sio_open(NULL, SIO_PLAY, 1);
if (s->hdl == NULL) {
free(s);
DPR("sndio_stream_init(), sio_open() failed\n");
@@ -242,6 +267,7 @@ sndio_stream_init(cubeb *context,
free(s);
return CUBEB_ERROR;
}
+ s->volume = 1.;
*stream = s;
DPR("sndio_stream_init() end, ok\n");
(void)context;
@@ -318,7 +344,7 @@ sndio_stream_get_position(cubeb_stream *s, uint64_t *p
{
pthread_mutex_lock(&s->mtx);
DPR("sndio_stream_get_position() %lld\n", s->rdpos);
- *p = s->rdpos;
+ *p = s->rdpos / s->bpf;
pthread_mutex_unlock(&s->mtx);
return CUBEB_OK;
}
@@ -328,7 +354,11 @@ sndio_stream_set_volume(cubeb_stream *s, float volume)
{
DPR("sndio_stream_set_volume(%f)\n", volume);
pthread_mutex_lock(&s->mtx);
- sio_setvol(s->hdl, SIO_MAXVOL * volume);
+ if (volume < 0.)
+ volume = 0.;
+ else if (volume > 1.0)
+ volume = 1.;
+ s->volume = volume;
pthread_mutex_unlock(&s->mtx);
return CUBEB_OK;
}
@@ -338,7 +368,7 @@ sndio_stream_get_latency(cubeb_stream * stm, uint32_t
{
// http://www.openbsd.org/cgi-bin/man.cgi?query=sio_open
// in the "Measuring the latency and buffers usage" paragraph.
- *latency = stm->wrpos - stm->rdpos;
+ *latency = (stm->wrpos - stm->rdpos) / stm->bpf;
return CUBEB_OK;
}