diff options
author | Andrew Cady <d@jerkface.net> | 2015-12-04 00:20:11 -0500 |
---|---|---|
committer | Andrew Cady <d@jerkface.net> | 2015-12-04 00:20:11 -0500 |
commit | 5ecda50f4aa1123aea0f22c3810336ea963e8e90 (patch) | |
tree | 9f000fa8c84324261f907270672b4778aa700170 | |
parent | f10b0fff42f936fe35adf21306495077b43356a7 (diff) |
add thread to read lines from stdin
-rw-r--r-- | midi-dump.hs | 16 |
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 | ||
67 | getAbsTime = do | 68 | getAbsTime = 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 | ||
135 | maybeReadLine = asks lineReader >>= liftIO . tryTakeMVar | ||
136 | startLineReader = do | ||
137 | mv <- liftIO $ newEmptyMVar | ||
138 | thread <- liftIO $ forkIO (forever $ getLine >>= putMVar mv) | ||
139 | return mv | ||
140 | |||
141 | |||
131 | data Chunk = Chunk Int64 Int64 BS.ByteString | 142 | data Chunk = Chunk Int64 Int64 BS.ByteString |
132 | instance FromRow Chunk where | 143 | instance 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 | |||
153 | getMidiDesc :: EVENT -> Maybe String | 165 | getMidiDesc :: EVENT -> Maybe String |
154 | getMidiDesc (MidiEvent _ (Event.Cons _ _ _ _ _ _ (Event.NoteEv Event.NoteOn ev))) = return $ ("on:" ++) $ showPitch $ unPitch $ Event.noteNote ev | 166 | getMidiDesc (MidiEvent _ (Event.Cons _ _ _ _ _ _ (Event.NoteEv Event.NoteOn ev))) = return $ ("on:" ++) $ showPitch $ unPitch $ Event.noteNote ev |
155 | getMidiDesc (MidiEvent _ (Event.Cons _ _ _ _ _ _ (Event.NoteEv Event.NoteOff ev))) = return $ ("off:" ++) $ showPitch $ unPitch $ Event.noteNote ev | 167 | getMidiDesc (MidiEvent _ (Event.Cons _ _ _ _ _ _ (Event.NoteEv Event.NoteOff ev))) = return $ ("off:" ++) $ showPitch $ unPitch $ Event.noteNote ev |