[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openbsd-ports
Subject:    www/mozilla-firefox: fix volume controls
From:       Alexandre Ratchov <alex () caoua ! org>
Date:       2018-05-15 21:23:33
Message-ID: 20180515212333.GG16888 () moule ! localdomain
[Download RAW message or body]

Maybe you've noticed that somtimes sound volume in firefox doesn't
match the volume indicator until you touch it.

This is because the firefox audio API has no volume getter and assumes
the initial volume is 1, while sndio saves volumes and allows volume
to be controlled externally, which makes firefox use a wrong
representation of the actual volume.

The workaround is to do like alsa, pulseaudio and other backends: stop
using the native volume control and adjust the volume of the signal in
firefox.

OK?

Index: Makefile
===================================================================
RCS file: /cvs/ports/www/mozilla-firefox/Makefile,v
retrieving revision 1.350
diff -u -p -r1.350 Makefile
--- Makefile	11 May 2018 20:09:01 -0000	1.350
+++ Makefile	15 May 2018 21:08:56 -0000
@@ -2,6 +2,7 @@
 
 COMMENT =	Mozilla web browser
 ONLY_FOR_ARCHS =	amd64 i386
+REVISION = 	0
 
 # Don't forget to bump www/firefox-i18n after updates.
 
Index: patches/patch-media_libcubeb_src_cubeb_sndio_c
===================================================================
RCS file: patches/patch-media_libcubeb_src_cubeb_sndio_c
diff -N patches/patch-media_libcubeb_src_cubeb_sndio_c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-media_libcubeb_src_cubeb_sndio_c	15 May 2018 21:08:56 -0000
@@ -0,0 +1,82 @@
+$OpenBSD$
+
+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.
+
+Index: media/libcubeb/src/cubeb_sndio.c
+--- media/libcubeb/src/cubeb_sndio.c.orig
++++ media/libcubeb/src/cubeb_sndio.c
+@@ -51,17 +51,33 @@ struct cubeb_stream {
+   uint64_t swpos;                 /* number of frames produced/consumed */
+   cubeb_data_callback data_cb;    /* cb to preapare data */
+   cubeb_state_callback state_cb;  /* cb to notify about state changes */
++  float volume;			  /* current volume */
+ };
+ 
+ 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) {
+-    s = lrintf(*(src++) * 32768);
++    s = lrintf(*(src++) * mult);
+     if (s < -32768)
+       s = -32768;
+     else if (s > 32767)
+@@ -169,8 +185,12 @@ sndio_mainloop(void *arg)
+       if (prime > 0)
+         prime--;
+ 
+-      if ((s->mode & SIO_PLAY) && s->conv)
+-          float_to_s16(s->pbuf, nfr * s->pchan);
++      if (s->mode & SIO_PLAY) {
++        if (s->conv)
++          float_to_s16(s->pbuf, nfr * s->pchan, s->volume);
++        else
++          s16_setvol(s->pbuf, nfr * s->pchan, s->volume);
++      }
+ 
+       if (s->mode & SIO_REC)
+         rstart = 0;
+@@ -372,6 +392,7 @@ sndio_stream_init(cubeb * context,
+     if (s->rbuf == NULL)
+       goto err;
+   }
++  s->volume = 1.;
+   *stream = s;
+   DPR("sndio_stream_init() end, ok\n");
+   (void)context;
+@@ -476,7 +497,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;
+ }

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic