(setq load-path (append load-path '("D:\\Workshop\\svm-mode"))) (setq auto-mode-alist (cons '("\\.[Dd][Ee][Ss]$" . svm-mode) auto-mode-alist)) (autoload 'svm-mode "svm-mode" "Statechart description mode for SVM" t) # changed Thomas' mp3 to audio to match with my statechart # Should change state chart to add ACTIVE in both gui and audio MACRO: FILE = MP3Player/burdocks_popcult.mp3 SetButtons(PP, ST, FF, FB) = \ gui.b_playpause.config(state=[PP]); \ # multiline Python command requires ending ';' gui.b_stop.config(state=[ST]); \ gui.b_ffwd.config(state=[FF]); \ gui.b_fback.config(state=[FB]); BlankDelay = 0.5 NoDelay = 0.1 SeekDelay = 0.05 INITIALIZER: from DefaultUI import * from MP3Library import MP3Handler from sys import exit if "[FILE]"=="": print 'usage: svm MP3Player.des "FILE=[.mp3]"' exit(1) audio = MP3Handler(eventhandler) audio.start_bgthread() audio.load("[FILE]") INTERACTOR: from MP3PlayerGUI import MP3PlayerGUI root = Tk() root.title("MP3 player") gui = MP3PlayerGUI(root, eventhandler) eventhandler.start() root.mainloop() FINALIZER: audio.stop_bgthread() root.destroy() STATECHART: DEAD [FS] MP3 [DS] GUI [DS] [CS] STOP [DS] ACTIVE [HS] PLAY [DS] [HS] PLAYING PAUSE SHOW [DS] HIDE FF RW AUDIO [DS] [CS] STOP [DS] ACTIVE PLAY [DS] [HS] PAUSE PLAYING FF FFNOW [DS] FFWAIT RW RWWAIT RWNOW [DS] TRANSITION: S: MP3.GUI.STOP N: MP3.GUI.ACTIVE.PLAY.PLAYING E: GUI Play/Pause C: 1 O: gui.show_time() [SetButtons(NORMAL, NORMAL, NORMAL, NORMAL)] [DUMP('GUI: From STOP to PLAYING')] TRANSITION: [HS] S: MP3.GUI.ACTIVE N: MP3.GUI.ACTIVE T: [SeekDelay][RTT] C: 1 O:t = audio.get_time() gui.timestr.set(t) [DUMP('GUI: ACTIVE TO ACTIVE -- TIME ADVANCE')] TRANSITION: S: MP3.GUI.ACTIVE.PLAY.PLAYING N: MP3.GUI.STOP E: Playing Stopped C: 1 O: gui.hide_time() [SetButtons(NORMAL, DISABLED, DISABLED, DISABLED)] [DUMP('GUI: PLAYING TO STOP -- Playing Stopped')] TRANSITION: S: MP3.GUI.ACTIVE N: MP3.GUI.STOP E: GUI Stop C: 1 O: gui.hide_time() [SetButtons(NORMAL, DISABLED, DISABLED, DISABLED)] [DUMP('GUI: PLAYING TO STOP -- GUI Stop')] TRANSITION: S: MP3.GUI.ACTIVE.PLAY.PAUSE.SHOW N: MP3.GUI.ACTIVE.PLAY.PAUSE.HIDE T: [BlankDelay][RTT] C: 1 O: gui.hide_time() [DUMP('GUI: PAUSE.SHOW TO PAUSE.HIDE -- delay')] TRANSITION: S: MP3.GUI.ACTIVE.PLAY.PAUSE.HIDE N: MP3.GUI.ACTIVE.PLAY.PAUSE.SHOW T: [BlankDelay][RTT] C: 1 O: gui.show_time() [DUMP('GUI: PAUSE.HIDE TO PAUSE.SHOW -- delay')] TRANSITION: S: MP3.GUI.ACTIVE.PLAY.PAUSE N: MP3.GUI.ACTIVE.PLAY.PLAYING E: GUI Play/Pause C: 1 O: gui.show_time() [DUMP('GUI: PAUSE TO PLAYING -- GUI Play/Pause')] TRANSITION: S: MP3.GUI.ACTIVE.PLAY N: MP3.GUI.ACTIVE.FF E: GUI Forward Pressed C: 1 O: gui.show_time() [SetButtons(DISABLED, DISABLED, NORMAL, DISABLED)] [DUMP('GUI: PLAYING TO FF -- GUI Forward Pressed')] TRANSITION: [HS] S: MP3.GUI.ACTIVE.FF N: MP3.GUI.ACTIVE.PLAY E: GUI Forward Released C: 1 O: [DUMP('GUI: FF TO PLAY -- GUI Forward Released')] [SetButtons(NORMAL, NORMAL, NORMAL, NORMAL)] TRANSITION: S: MP3.GUI.ACTIVE.PLAY.PLAYING N: MP3.GUI.ACTIVE.PLAY.PAUSE E: GUI Play/Pause C: 1 O: [DUMP('GUI: PLAY TO PAUSE -- GUI Play/Pause')] TRANSITION: S: MP3.ACTIVE.GUI.PLAY N: MP3.ACTIVE.GUI.RW E: GUI Backward Pressed C: 1 O: gui.show_time() [SetButtons(DISABLED, DISABLED, DISABLED, NORMAL)] [DUMP('GUI: PLAY TO RW -- GUI Backward Pressed')] TRANSITION: [HS] S: MP3.ACTIVE.GUI.RW N: MP3.ACTIVE.GUI.PLAY E: GUI Backward Released C: 1 O: [DUMP('GUI: RW TO PLAY -- GUI Backward Released')] [SetButtons(NORMAL, NORMAL, NORMAL, NORMAL)] TRANSITION: S: MP3.AUDIO.STOP N: MP3.AUDIO.ACTIVE.PLAY.PLAYING E: GUI Play/Pause C: 1 O: audio.play() [DUMP('AUDIO: STOP TO PLAYING -- GUI Play/Pause')] TRANSITION: S: MP3.AUDIO.ACTIVE.PLAY.PLAYING N: MP3.AUDIO.STOP E: Playing Stopped C: 1 O: audio.stop() [DUMP('AUDIO: PLAYING TO STOP -- Playing Stopped')] TRANSITION: S: MP3.AUDIO.ACTIVE.PLAY.PLAYING N: MP3.AUDIO.ACTIVE.PLAY.PAUSE E: GUI Play/Pause C: 1 O: audio.pause() [DUMP('AUDIO: PLAYING TO PAUSE -- GUI Play/Pause')] TRANSITION: S: MP3.AUDIO.ACTIVE.PLAY.PAUSE N: MP3.AUDIO.ACTIVE.PLAY.PLAYING E: GUI Play/Pause C: 1 O: audio.resume() [DUMP('AUDIO: PAUSE TO PLAYING -- GUI Play/Paused')] TRANSITION: S: MP3.AUDIO.ACTIVE.FF.FFWAIT N: MP3.AUDIO.ACTIVE.FF.FFNOW T: [NoDelay][RTT] C: 1 O: audio.forward(1) [DUMP('AUDIO: FFWAIT TO FFNOW -- delay')] TRANSITION: S: MP3.AUDIO.ACTIVE.FF.FFNOW N: MP3.AUDIO.ACTIVE.FF.FFWAIT T: [SeekDelay][RTT] C: 1 O: [DUMP('AUDIO: FFNOW TO FFWAIT -- delay')] TRANSITION: S: MP3.AUDIO.ACTIVE.RW.RWWAIT N: MP3.AUDIO.ACTIVE.RW.RWNOW T: [NoDelay][RTT] C: 1 O: audio.backward(1) [DUMP('AUDIO: RWWAIT TO RWNOW -- delay')] TRANSITION: S: MP3.AUDIO.ACTIVE N: MP3.AUDIO.STOP E: GUI Stop C: 1 O: audio.stop() audio.rewind() [DUMP('AUDIO: PLAYING TO STOP -- GUI Stop')] TRANSITION: S: MP3.AUDIO.ACTIVE.PLAY N: MP3.AUDIO.STOP E: Playing Stopped O: audio.stop() audio.rewind() TRANSITION: S: MP3.AUDIO.ACTIVE.PLAY N: MP3.AUDIO.ACTIVE.FF E: GUI Forward Pressed C: 1 O: [DUMP('AUDIO: PLAY TO FF -- GUI Forward Pressed')] TRANSITION: S: MP3.AUDIO.ACTIVE.PLAY N: MP3.AUDIO.ACTIVE.RW E: GUI Backward Pressed C: 1 O: [DUMP('AUDIO: PLAY TO RW -- GUI Backward Pressed')] TRANSITION: [HS] S: MP3.AUDIO.ACTIVE.FF N: MP3.AUDIO.ACTIVE.PLAY E: GUI Forward Released C: 1 O: [DUMP('AUDIO: FF TO PLAY -- GUI Forward Released')] TRANSITION: S: MP3.AUDIO.ACTIVE.RW.RWNOW N: MP3.AUDIO.ACTIVE.RW.RWWAIT T: [SeekDelay][RTT] C: 1 O: [DUMP('AUDIO: RWNOW TO RWWAIT -- delay')] TRANSITION: [HS] S: MP3.AUDIO.ACTIVE.RW N: MP3.AUDIO.ACTIVE.PLAY E: GUI Backward Released C: 1 O: [DUMP('AUDIO: RW TO PLAY -- GUI Backward Released')] TRANSITION: S: MP3 N: DEAD E: GUI Quit C: 1 O: audio.stop() exit [DUMP('MP3: to DEAD -- GUI Quit')]