mirror of
https://github.com/beard7n/bsdports.git
synced 2026-04-14 04:21:18 +02:00
146 lines
3.9 KiB
Plaintext
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;
|
|
}
|
|
|