Last active
December 12, 2015 07:18
-
-
Save gongo/4735603 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; M-x package-install deferred | |
(require 'deferred) | |
;; | |
;; 制限時間内(LIMIT) に生成した乱数が THRESHOLD を越えれば "success!", | |
;; タイムアウトした場合は "timeout..." と表示されます。 | |
;; | |
;; 乱数生成の間隔は INTERVAL です。 | |
;; | |
(defun hogebuffering () | |
(lexical-let ((timeout? nil) | |
(threshold 7) | |
(interval 1000)) | |
(let ((limit 4000) ;; 4sec | |
(d (deferred:lambda (x) | |
(deferred:nextc (deferred:wait interval) | |
(lambda (x) | |
(message "%S" x) | |
(let ((n (random 11))) | |
(message "current number = %2d" n) | |
(cond ((> n threshold) t) | |
(timeout? nil) | |
(t (deferred:nextc (deferred:succeed) self))))))))) | |
(deferred:$ | |
(deferred:timeout | |
limit nil | |
(deferred:next d)) | |
(deferred:nextc it | |
(lambda (x) | |
(setq timeout? t) | |
x)))))) | |
(deferred:nextc (hogebuffering) | |
(lambda (result) | |
(message "%s" (if result "success!" "timeout..")))) | |
;; | |
;; ↑ だけだと 乱数生成するところは deferred じゃなくて while でいいです。 | |
;; というわけで airplay.el に合わせてみる。 | |
;; | |
;; | |
;; 制限時間内(LIMIT) に動画がスタートした場合、"success!" | |
;; タイムアウトした場合は "timeout..." と表示されます。 | |
;; | |
;; 動画がスタートしているかどうかの確認間隔は INTERVAL(sec) です。 | |
;; | |
(defun airplay/video:--buffering? () | |
(lexical-let ((timeout? nil) | |
(interval 1000)) | |
(let ((limit 30000) ;; 30sec | |
(d (deferred:lambda (x) | |
(deferred:nextc (airplay/video:scrub) | |
(lambda (response) | |
(let ((position (plist-get response :position))) | |
(message "current position %S" position) | |
(cond (timeout? nil) | |
((or (null position) (zerop position)) | |
(deferred:nextc (deferred:succeed) interval)) | |
(t t)))))))) | |
(deferred:$ | |
(deferred:timeout | |
limit nil | |
(deferred:next d)) | |
(deferred:nextc it | |
(lambda (x) ;; 動画スタートチェックタスクのストップ処理用 | |
(setq timeout? t) | |
x)))))) | |
(deferred:nextc (airplay/video:--buffering?) | |
(lambda (result) | |
(message "%s" (if result "success!" "timeout..")))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment