On Thu, Mar 24, 2022 at 07:11:42AM +0100, Alexandre Ratchov wrote:
> Most audio/video players do a stop/start cycle whenever the play
> position is changed, track is changed, etc. Currently, stopping drains
> the play buffer, which by default is very large (to workaround very
> long kernel non-preemptive code-paths). This makes player controls
> sluggish.
> 
> This diff adds a new sio_flush() function to workaround the jumbo
> buffer sizes: it stops playback immediately, discarding buffered
> data. Basically it's the same as sio_stop() but doesn't wait. The plan
> is to make players use it.
> 
> In the network protocol, sio_flush() is implemented by adding a flag
> to the message corresponding to sio_stop(). Old sndiod servers ignore
> it and just work with new libraries. New sndiod servers see that the
> flag is not set by old libraries and properly drain the play buffer.
> 
> Tested with mplayer, mpv and audacious, if we go this way other ports
> will follow.
> 

Here's the diff to make mplayer, mpv and audacious use the new
function.

As you see, sio_stop() and sio_flush() are perfectly
interchangable. The only difference is the time the function takes to
complete (and the resulting silence).

Index: x11/mplayer/Makefile
===================================================================
RCS file: /cvs/ports/x11/mplayer/Makefile,v
retrieving revision 1.319
diff -u -p -r1.319 Makefile
--- x11/mplayer/Makefile        11 Mar 2022 20:16:48 -0000      1.319
+++ x11/mplayer/Makefile        23 Mar 2022 19:49:08 -0000
@@ -3,7 +3,7 @@ COMMENT=        movie player supporting many fo
 V=             20211106
 FFMPEG_V=      4.4.1
 DISTNAME=      mplayer-${V}
-REVISION=      0
+REVISION=      1
 CATEGORIES=    x11 multimedia
 MASTER_SITES=  https://comstyle.com/source/
 EXTRACT_SUFX=  .tar.xz
Index: x11/mplayer/patches/patch-libao2_ao_sndio_c
===================================================================
RCS file: x11/mplayer/patches/patch-libao2_ao_sndio_c
diff -N x11/mplayer/patches/patch-libao2_ao_sndio_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ x11/mplayer/patches/patch-libao2_ao_sndio_c 23 Mar 2022 19:49:08 -0000
@@ -0,0 +1,21 @@
+Index: libao2/ao_sndio.c
+--- libao2/ao_sndio.c.orig
++++ libao2/ao_sndio.c
+@@ -179,7 +179,7 @@ static void uninit(int immed)
+  */
+ static void reset(void)
+ {
+-    if (!sio_stop(hdl))
++    if (!sio_flush(hdl))
+         mp_msg(MSGT_AO, MSGL_ERR, "ao2: reset: couldn't stop\n");
+     delay = 0;
+     if (!sio_start(hdl))
+@@ -235,7 +235,7 @@ static void audio_pause(void)
+      * sndio can't pause, so just stop
+      */
+     prepause_delay = delay;
+-    if (!sio_stop(hdl))
++    if (!sio_flush(hdl))
+         mp_msg(MSGT_AO, MSGL_ERR, "ao2: pause: couldn't stop\n");
+     delay = 0;
+ }
Index: multimedia/mpv/Makefile
===================================================================
RCS file: /cvs/ports/multimedia/mpv/Makefile,v
retrieving revision 1.81
diff -u -p -r1.81 Makefile
--- multimedia/mpv/Makefile     11 Mar 2022 19:39:24 -0000      1.81
+++ multimedia/mpv/Makefile     23 Mar 2022 19:49:08 -0000
@@ -4,7 +4,7 @@ GH_ACCOUNT =            mpv-player
 GH_PROJECT =           mpv
 GH_TAGNAME =           v0.34.1
 
-REVISION =             0
+REVISION =             1
 
 SHARED_LIBS +=         mpv             0.2 # 1.109
 
Index: multimedia/mpv/patches/patch-audio_out_ao_sndio_c
===================================================================
RCS file: /cvs/ports/multimedia/mpv/patches/patch-audio_out_ao_sndio_c,v
retrieving revision 1.6
diff -u -p -r1.6 patch-audio_out_ao_sndio_c
--- multimedia/mpv/patches/patch-audio_out_ao_sndio_c   11 Mar 2022 19:39:24 
-0000      1.6
+++ multimedia/mpv/patches/patch-audio_out_ao_sndio_c   23 Mar 2022 19:49:09 
-0000
@@ -245,8 +245,8 @@ Index: audio/out/ao_sndio.c
 +    if (p->playing) {
 +        p->playing = false;
 +
-+        if (!sio_stop(p->hdl)) {
-+            MP_ERR(ao, "reset: couldn't sio_stop()\n");
++        if (!sio_flush(p->hdl)) {
++            MP_ERR(ao, "reset: couldn't sio_flush()\n");
 +        }
 +        p->delay = 0;
 +        if (!sio_start(p->hdl)) {
Index: audio/audacious/plugins/Makefile
===================================================================
RCS file: /cvs/ports/audio/audacious/plugins/Makefile,v
retrieving revision 1.10
diff -u -p -r1.10 Makefile
--- audio/audacious/plugins/Makefile    8 Mar 2022 08:53:50 -0000       1.10
+++ audio/audacious/plugins/Makefile    23 Mar 2022 19:49:09 -0000
@@ -1,7 +1,7 @@
 COMMENT =              input and output plugins for Audacious
 
 DISTNAME =             audacious-plugins-${VERSION}
-REVISION =             2
+REVISION =             3
 
 # BSD / GPL
 PERMIT_PACKAGE =       Yes
Index: audio/audacious/plugins/patches/patch-src_sndio_sndio_cc
===================================================================
RCS file: audio/audacious/plugins/patches/patch-src_sndio_sndio_cc
diff -N audio/audacious/plugins/patches/patch-src_sndio_sndio_cc
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ audio/audacious/plugins/patches/patch-src_sndio_sndio_cc    23 Mar 2022 
19:49:09 -0000
@@ -0,0 +1,12 @@
+Index: src/sndio/sndio.cc
+--- src/sndio/sndio.cc.orig
++++ src/sndio/sndio.cc
+@@ -344,7 +344,7 @@ void SndioPlugin::flush ()
+ {
+     pthread_mutex_lock (& m_mutex);
+ 
+-    sio_stop (m_handle);
++    sio_flush (m_handle);
+ 
+     m_frames_buffered = 0;
+     m_last_write_time = timeval ();

Reply via email to