branch: elpa/subed commit 07812858d58715938f5a36857ec5bf64779ab13a Author: Random User <rnd...@posteo.de> Commit: Random User <rnd...@posteo.de>
Make mpv RPC socket and client buffer unique per buffer This makes theoretically possible to work on multiple subtitle files with multiple video players open. It works mostly, but there is some interference with point-player synchronization. --- subed/subed-config.el | 2 +- subed/subed-mpv.el | 38 ++++++++++++++++++++++++++------------ tests/test-subed-mpv.el | 8 +++++--- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/subed/subed-config.el b/subed/subed-config.el index f9e6fd7..daf3742 100644 --- a/subed/subed-config.el +++ b/subed/subed-config.el @@ -177,7 +177,7 @@ was moved by the user." remembers whether it was originally enabled by the user.") -(defcustom subed-mpv-socket "/tmp/mpv-socket" +(defcustom subed-mpv-socket-base "/tmp/subed-mpv-socket" "Path to Unix IPC socket that is passed to mpv --input-ipc-server." :type 'file :group 'subed) diff --git a/subed/subed-mpv.el b/subed/subed-mpv.el index 02426a5..e1cccd5 100644 --- a/subed/subed-mpv.el +++ b/subed/subed-mpv.el @@ -45,10 +45,7 @@ "Running mpv process.") (defvar-local subed-mpv--client-proc nil - "IPC socket process that communicates over `subed-mpv-socket'.") - -(defvar-local subed-mpv--client-buffer " *subed-mpv-buffer*" - "Buffer for JSON responses from server.") + "IPC socket process that communicates over `subed-mpv--socket'.") (defconst subed-mpv--client-test-request (json-encode (list :command '(get_property mpv-version))) @@ -57,19 +54,26 @@ (defconst subed-mpv--retry-delays ;; Sums up to 5 seconds in total before failing '(0.1 0.1 0.1 0.1 0.2 0.2 0.3 0.4 0.5 0.5 0.5 0.5 0.5 0.5 0.5) - "List of delays between attemps to connect to `subed-mpv-socket'.") + "List of delays between attemps to connect to `subed-mpv--socket'.") (defvar-local subed-mpv--client-command-queue nil - "Commands to call when connection to `subed-mpv-socket' is established.") + "Commands to call when connection to `subed-mpv--socket' is established.") ;;; Server (mpv process that provides an IPC socket) +(defun subed-mpv--socket () + "Path to mpv's RPC socket for a particular buffer. +See also `subed-mpv-socket-base'." + (format "/tmp/subed-mpv-socket:%s-%s" + (file-name-base (or (buffer-file-name) "unnamed")) + (buffer-hash))) + (defun subed-mpv--server-start (&rest args) "Run mpv in JSON IPC mode." (subed-mpv--server-stop) (let ((argv (append (list subed-mpv-executable - (format "--input-ipc-server=%s" subed-mpv-socket) + (format "--input-ipc-server=%s" (subed-mpv--socket)) "--idle") args))) (subed-debug "Running %s" argv) @@ -95,18 +99,28 @@ ;;; Client (elisp process that connects to server's IPC socket) +(defun subed-mpv--client-buffer () + "Unique name of buffer that stores RPC responses." + (if subed--debug-enabled + (format "*subed-mpv-buffer:%s-%s*" + (file-name-base (or (buffer-file-name) "unnamed")) + (buffer-hash)) + (format " *subed-mpv-buffer:%s-%s*" + (file-name-base (or (buffer-file-name) "unnamed")) + (buffer-hash)))) + (defun subed-mpv--client-connect (delays) - "Try to connect to `subed-mpv-socket'. + "Try to connect to `subed-mpv--socket'. If a connection attempt fails, wait (car delays) seconds and try again, passing (cdr delays)." - (subed-debug "Attempting to connect to IPC socket: %s" subed-mpv-socket) + (subed-debug "Attempting to connect to IPC socket: %s" (subed-mpv--socket)) (subed-mpv--client-disconnect) ;; NOTE: make-network-process doesn't fail when the socket file doesn't exist (let ((proc (make-network-process :name "subed-mpv-client" :family 'local - :service subed-mpv-socket + :service (subed-mpv--socket) :coding '(utf-8 . utf-8) - :buffer (get-buffer-create subed-mpv--client-buffer) + :buffer (subed-mpv--client-buffer) :filter #'subed-mpv--client-filter :noquery t :nowait t))) @@ -155,7 +169,7 @@ CMD to `subed-mpv--client-command-queue' which is evaluated by (process-send-string subed-mpv--client-proc (concat request-data "\n")) (error (subed-mpv-kill) - (error "Unable to send commands via %s: %s" subed-mpv-socket (cdr err)))) + (error "Unable to send commands via %s: %s" (subed-mpv--socket) (cdr err)))) t) (when (subed-mpv--server-started-p) (subed-debug "Queueing command: %s" cmd) diff --git a/tests/test-subed-mpv.el b/tests/test-subed-mpv.el index 1d39b25..bd7c8fb 100644 --- a/tests/test-subed-mpv.el +++ b/tests/test-subed-mpv.el @@ -4,10 +4,11 @@ (describe "Starting mpv" (it "passes arguments to make-process." (spy-on 'make-process) + (spy-on 'subed-mpv--socket :and-return-value "/mock/path/to/socket") (subed-mpv--server-start "foo" "--bar") (expect 'make-process :to-have-been-called-with :command (list subed-mpv-executable - (format "--input-ipc-server=%s" subed-mpv-socket) + "--input-ipc-server=/mock/path/to/socket" "--idle" "foo" "--bar") :name "subed-mpv-server" :buffer nil :noquery t)) (it "sets subed-mpv--server-proc on success." @@ -51,13 +52,14 @@ (it "correctly calls make-network-process." (spy-on 'make-network-process) (spy-on 'process-send-string) + (spy-on 'subed-mpv--socket :and-return-value "/mock/path/to/socket") (subed-mpv--client-connect '(0 0 0)) (expect 'make-network-process :to-have-been-called-with :name "subed-mpv-client" :family 'local - :service subed-mpv-socket + :service (subed-mpv--socket) :coding '(utf-8 . utf-8) - :buffer (get-buffer-create subed-mpv--client-buffer) + :buffer (subed-mpv--client-buffer) :filter #'subed-mpv--client-filter :noquery t :nowait t))