summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2015-12-04 05:58:46 -0500
committerAndrew Cady <d@jerkface.net>2015-12-04 05:58:46 -0500
commit507d7eea79bd52dcf3e5ae75a112532b7d89a5e8 (patch)
treebf53fbe92948d4538585e480a165aaa2b12d6691
parent804d48fe9b4613c81759e192c8a04c41b571bf8e (diff)
add command "exit"
-rw-r--r--midi-dump.hs23
1 files changed, 13 insertions, 10 deletions
diff --git a/midi-dump.hs b/midi-dump.hs
index 09da6b6..c77ef00 100644
--- a/midi-dump.hs
+++ b/midi-dump.hs
@@ -18,7 +18,7 @@ import Database.SQLite.Simple
18import Database.SQLite.Simple.FromRow () 18import Database.SQLite.Simple.FromRow ()
19 19
20import BasePrelude hiding (loop) 20import BasePrelude hiding (loop)
21import Control.Concurrent.Chan 21import Control.Concurrent.Chan ()
22import Prelude hiding (id, (.)) 22import Prelude hiding (id, (.))
23 23
24import qualified Sound.ALSA.Sequencer 24import qualified Sound.ALSA.Sequencer
@@ -43,11 +43,14 @@ getTS (MidiEvent ts _) = ts
43getTS (Silence ts) = ts 43getTS (Silence ts) = ts
44 44
45data LoopState = LoopState { 45data LoopState = LoopState {
46 _wantExit :: Bool,
46 keysDown :: MidiPitchSet, 47 keysDown :: MidiPitchSet,
47 inputHistory :: [EVENT], 48 inputHistory :: [EVENT],
48 lastTick :: TimeSpec 49 lastTick :: TimeSpec
49} 50}
50 51
52emptyLoopState = LoopState False Set.empty []
53
51data LoopEnv = LoopEnv { 54data LoopEnv = LoopEnv {
52 _saver :: Chan (Int64, Int64, [EVENT]), 55 _saver :: Chan (Int64, Int64, [EVENT]),
53 _sqlite :: Connection, 56 _sqlite :: Connection,
@@ -69,8 +72,6 @@ getAbsTime = do
69 now <- liftIO $ getTime Monotonic 72 now <- liftIO $ getTime Monotonic
70 return $ now - startTime + startTimeReal 73 return $ now - startTime + startTimeReal
71 74
72emptyLoopState = LoopState Set.empty []
73
74main' = withAlsaInit $ \h public private q publicAddr privateAddr -> do 75main' = withAlsaInit $ \h public private q publicAddr privateAddr -> do
75 cmdlineAlsaConnect h public 76 cmdlineAlsaConnect h public
76 77
@@ -89,16 +90,20 @@ main' = withAlsaInit $ \h public private q publicAddr privateAddr -> do
89 90
90 (_, ()) <- execRWST loop env (emptyLoopState startTime) 91 (_, ()) <- execRWST loop env (emptyLoopState startTime)
91 return () 92 return ()
93 where
94 loop = do
95 maybeReadLine >>= maybe processMidi processCommand
96 wantExit <- gets _wantExit
97 unless wantExit loop
92 98
93loop = do 99processCommand "exit" = modify $ \s -> s { _wantExit = True }
94 startTime <- asks _startTime 100processCommand str = liftIO $ putStrLn $ "Unknown command: " ++ str
95 startTimeReal <- asks _startTimeReal 101
102processMidi = do
96 h <- asks _h 103 h <- asks _h
97 q <- asks _q 104 q <- asks _q
98 publicAddr <- asks _publicAddr 105 publicAddr <- asks _publicAddr
99 106
100 mapM_ (liftIO . putStrLn . ("got line: " ++)) =<< maybeReadLine
101
102 oldKeys <- gets keysDown 107 oldKeys <- gets keysDown
103 let forwardNOW = forwardNoteEvent h q publicAddr 108 let forwardNOW = forwardNoteEvent h q publicAddr
104 (events, newKeys) <- liftIO $ parseAlsaEvents' h oldKeys forwardNOW 109 (events, newKeys) <- liftIO $ parseAlsaEvents' h oldKeys forwardNOW
@@ -128,8 +133,6 @@ loop = do
128 when doSave $ gets inputHistory >>= saveMidi >> return () 133 when doSave $ gets inputHistory >>= saveMidi >> return ()
129 modify $ \s -> s { inputHistory = [] } 134 modify $ \s -> s { inputHistory = [] }
130 135
131 loop
132
133maybeReadLine = asks _lineReader >>= liftIO . tryTakeMVar 136maybeReadLine = asks _lineReader >>= liftIO . tryTakeMVar
134startLineReader = do 137startLineReader = do
135 mv <- liftIO newEmptyMVar 138 mv <- liftIO newEmptyMVar