/usr/share/emacs/site-lisp/chess/chess-sound.el is in emacs-chess 2.0b6-1.1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; This is very similar to chess-announce, except it uses specific
;; .WAV files instead of text-to-speech.
;;
(require 'chess-game)
(defgroup chess-sound nil
"Code to play specific sounds when announcing chess moves."
:group 'chess)
(defcustom chess-sound-directory
(expand-file-name "sounds"
(file-name-directory
(or load-file-name buffer-file-name)))
"The directory where chess sounds can be found."
:type 'directory
:group 'chess-sound)
(defcustom chess-sound-play-function (if (fboundp 'play-sound-file)
'play-sound-file
'chess-sound-play)
"Non-nil if chess-sound should play sounds ."
:type 'function
:group 'chess-sound)
(defcustom chess-sound-program (or (executable-find "esdplay")
(executable-find "play"))
"Program used to play sounds, if `play-sound-file' does not exist."
:type 'file
:group 'chess-sound)
(defcustom chess-sound-args nil
"Additional args to pass to `chess-sound-program', before the .WAV file."
:type '(repeat string)
:group 'chess-sound)
(defcustom chess-sound-my-moves nil
"If non-nil, plays the move.wav sound whenever you make a move."
:type 'boolean
:group 'chess-sound)
(defsubst chess-sound (file)
(funcall chess-sound-play-function
(expand-file-name (concat file ".wav")
chess-sound-directory)))
(defsubst chess-sound-play (file)
(apply 'call-process chess-sound-program
nil nil nil (append chess-sound-args (list file))))
(defun chess-sound-handler (game event &rest args)
(cond
((eq event 'initialize)
(and (file-directory-p chess-sound-directory)
(file-readable-p (expand-file-name "move.wav"
chess-sound-directory))
(or (eq chess-sound-play-function 'play-sound-file)
(and chess-sound-program
(file-executable-p chess-sound-program)))))
((eq event 'move)
(let* ((ply (chess-game-ply game (1- (chess-game-index game))))
(pos (chess-ply-pos ply)))
(if (eq (chess-game-data game 'my-color)
(chess-pos-side-to-move pos))
(if chess-sound-my-moves
(chess-sound "move"))
(let* ((source (chess-ply-source ply))
(target (chess-ply-target ply))
(s-piece (and source (chess-pos-piece pos source)))
(t-piece (and target (chess-pos-piece pos target)))
(which (chess-ply-keyword ply :which))
text)
(cond
((chess-ply-keyword ply :castle)
(chess-sound "O-O"))
((chess-ply-keyword ply :long-castle)
(chess-sound "O-O-O"))
((and s-piece t-piece (= t-piece ? ) target)
(if which
(chess-sound (char-to-string which)))
(chess-sound (format "%c_" (downcase s-piece)))
(chess-sound (chess-index-to-coord target)))
((and s-piece t-piece target)
(if which
(chess-sound (char-to-string which)))
(chess-sound (format "%c_" (downcase s-piece)))
(chess-sound "x_")
(chess-sound (format "%c_" (downcase t-piece)))
(chess-sound (chess-index-to-coord target))))
(if (chess-ply-keyword ply :promote)
(chess-sound
(format "%c_" (downcase
(chess-ply-keyword ply :promote)))))
(if (chess-ply-keyword ply :en-passant)
(chess-sound "enpassant"))
(if (chess-ply-keyword ply :check)
(chess-sound "+_"))
(if (chess-ply-keyword ply :checkmate)
(chess-sound "#_"))
(if (chess-ply-keyword ply :stalemate)
(chess-sound "smate"))))))))
(provide 'chess-sound)
;;; chess-sound.el ends here
|