summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2015-12-04 00:20:11 -0500
committerAndrew Cady <d@jerkface.net>2015-12-04 00:20:11 -0500
commit5ecda50f4aa1123aea0f22c3810336ea963e8e90 (patch)
tree9f000fa8c84324261f907270672b4778aa700170
parentf10b0fff42f936fe35adf21306495077b43356a7 (diff)
add thread to read lines from stdin
-rw-r--r--midi-dump.hs16
1 files changed, 14 insertions, 2 deletions
diff --git a/midi-dump.hs b/midi-dump.hs
index b9911c8..dd97d69 100644
--- a/midi-dump.hs
+++ b/midi-dump.hs
@@ -61,7 +61,8 @@ data LoopEnv = LoopEnv {
61 q :: Sound.ALSA.Sequencer.Queue.T, 61 q :: Sound.ALSA.Sequencer.Queue.T,
62 publicAddr :: Sound.ALSA.Sequencer.Address.T, 62 publicAddr :: Sound.ALSA.Sequencer.Address.T,
63 privateAddr :: Sound.ALSA.Sequencer.Address.T, 63 privateAddr :: Sound.ALSA.Sequencer.Address.T,
64 doSave :: Bool 64 doSave :: Bool,
65 lineReader :: MVar (String)
65} 66}
66 67
67getAbsTime = do 68getAbsTime = do
@@ -83,10 +84,11 @@ main' = withAlsaInit $ \h public private q publicAddr privateAddr -> do
83 sqlite <- open "test.db" 84 sqlite <- open "test.db"
84 execute_ sqlite "CREATE TABLE IF NOT EXISTS chunks (id INTEGER PRIMARY KEY, sec INTEGER, nsec INTEGER, midi BLOB)" 85 execute_ sqlite "CREATE TABLE IF NOT EXISTS chunks (id INTEGER PRIMARY KEY, sec INTEGER, nsec INTEGER, midi BLOB)"
85 saver <- startSaver sqlite 86 saver <- startSaver sqlite
87 lineReader <- startLineReader
86 88
87 doSave <- isJust <$> lookupEnv "SAVE_MIDI" 89 doSave <- isJust <$> lookupEnv "SAVE_MIDI"
88 90
89 let env = LoopEnv saver sqlite startTime startTimeReal h public private q publicAddr privateAddr doSave 91 let env = LoopEnv saver sqlite startTime startTimeReal h public private q publicAddr privateAddr doSave lineReader
90 92
91 (_, ()) <- execRWST loop env (emptyLoopState startTime) 93 (_, ()) <- execRWST loop env (emptyLoopState startTime)
92 return () 94 return ()
@@ -98,6 +100,8 @@ loop = do
98 q <- asks q 100 q <- asks q
99 publicAddr <- asks publicAddr 101 publicAddr <- asks publicAddr
100 102
103 mapM_ (liftIO . putStrLn . ("got line: " ++)) =<< maybeReadLine
104
101 oldKeys <- gets keysDown 105 oldKeys <- gets keysDown
102 let forwardNOW = forwardNoteEvent h q publicAddr 106 let forwardNOW = forwardNoteEvent h q publicAddr
103 (events, newKeys) <- liftIO $ parseAlsaEvents' h oldKeys forwardNOW 107 (events, newKeys) <- liftIO $ parseAlsaEvents' h oldKeys forwardNOW
@@ -128,6 +132,13 @@ loop = do
128 132
129 loop 133 loop
130 134
135maybeReadLine = asks lineReader >>= liftIO . tryTakeMVar
136startLineReader = do
137 mv <- liftIO $ newEmptyMVar
138 thread <- liftIO $ forkIO (forever $ getLine >>= putMVar mv)
139 return mv
140
141
131data Chunk = Chunk Int64 Int64 BS.ByteString 142data Chunk = Chunk Int64 Int64 BS.ByteString
132instance FromRow Chunk where 143instance FromRow Chunk where
133 fromRow = Chunk <$> field <*> field <*> field 144 fromRow = Chunk <$> field <*> field <*> field
@@ -150,6 +161,7 @@ startSaver sqlite = do
150 liftIO $ execute sqlite "INSERT INTO chunks (sec, nsec, midi) VALUES (?,?,?)" (Chunk s ns bytes) 161 liftIO $ execute sqlite "INSERT INTO chunks (sec, nsec, midi) VALUES (?,?,?)" (Chunk s ns bytes)
151 return () 162 return ()
152 163
164
153getMidiDesc :: EVENT -> Maybe String 165getMidiDesc :: EVENT -> Maybe String
154getMidiDesc (MidiEvent _ (Event.Cons _ _ _ _ _ _ (Event.NoteEv Event.NoteOn ev))) = return $ ("on:" ++) $ showPitch $ unPitch $ Event.noteNote ev 166getMidiDesc (MidiEvent _ (Event.Cons _ _ _ _ _ _ (Event.NoteEv Event.NoteOn ev))) = return $ ("on:" ++) $ showPitch $ unPitch $ Event.noteNote ev
155getMidiDesc (MidiEvent _ (Event.Cons _ _ _ _ _ _ (Event.NoteEv Event.NoteOff ev))) = return $ ("off:" ++) $ showPitch $ unPitch $ Event.noteNote ev 167getMidiDesc (MidiEvent _ (Event.Cons _ _ _ _ _ _ (Event.NoteEv Event.NoteOff ev))) = return $ ("off:" ++) $ showPitch $ unPitch $ Event.noteNote ev