diff options
author | Andrew Cady <d@jerkface.net> | 2015-12-03 21:53:31 -0500 |
---|---|---|
committer | Andrew Cady <d@jerkface.net> | 2015-12-03 21:53:31 -0500 |
commit | 359baa32103902c5d9e734a8dc7bac8c82705f24 (patch) | |
tree | a6f5fb3a22fe7d4078d7cb3d11da6d4caf447212 | |
parent | 6669187d54d52b627b7dfda3dd31691b14a219f3 (diff) |
write sqlite in a separate thread
this doesn't actually seem to make it faster, so something is wrong.
-rw-r--r-- | axis-of-eval.cabal | 2 | ||||
-rw-r--r-- | midi-dump.hs | 28 |
2 files changed, 22 insertions, 8 deletions
diff --git a/axis-of-eval.cabal b/axis-of-eval.cabal index 49ee7f7..73ba50f 100644 --- a/axis-of-eval.cabal +++ b/axis-of-eval.cabal | |||
@@ -26,6 +26,6 @@ executable midi-dump | |||
26 | default-language: Haskell2010 | 26 | default-language: Haskell2010 |
27 | hs-source-dirs: . | 27 | hs-source-dirs: . |
28 | build-depends: | 28 | build-depends: |
29 | base, time, containers, haskore, alsa-seq, alsa-core, mtl, clock, sqlite-simple, bytestring | 29 | base, time, containers, haskore, alsa-seq, alsa-core, mtl, clock, sqlite-simple, bytestring, base-prelude |
30 | main-is: midi-dump.hs | 30 | main-is: midi-dump.hs |
31 | other-modules: AlsaSeq | 31 | other-modules: AlsaSeq |
diff --git a/midi-dump.hs b/midi-dump.hs index a6fd36a..c4e319a 100644 --- a/midi-dump.hs +++ b/midi-dump.hs | |||
@@ -19,6 +19,10 @@ import Database.SQLite.Simple.FromRow | |||
19 | import Data.Int | 19 | import Data.Int |
20 | import Data.ByteString.Char8 (pack) | 20 | import Data.ByteString.Char8 (pack) |
21 | 21 | ||
22 | import Control.Concurrent.Chan | ||
23 | import Prelude hiding ((.)) | ||
24 | import BasePrelude hiding (loop) | ||
25 | |||
22 | verbose = False | 26 | verbose = False |
23 | 27 | ||
24 | main = main' `AlsaExc.catch` handler | 28 | main = main' `AlsaExc.catch` handler |
@@ -41,7 +45,7 @@ data LoopState = LoopState { | |||
41 | } | 45 | } |
42 | 46 | ||
43 | getAbsTime = do | 47 | getAbsTime = do |
44 | (sqlite, startTime, startTimeReal, _, _, _, _, _, _) <- ask | 48 | (_, sqlite, startTime, startTimeReal, _, _, _, _, _, _) <- ask |
45 | now <- liftIO $ getTime Monotonic | 49 | now <- liftIO $ getTime Monotonic |
46 | return $ now - startTime + startTimeReal | 50 | return $ now - startTime + startTimeReal |
47 | 51 | ||
@@ -57,12 +61,13 @@ main' = withAlsaInit $ \h public private q publicAddr privateAddr -> do | |||
57 | 61 | ||
58 | sqlite <- open "test.db" | 62 | sqlite <- open "test.db" |
59 | execute_ sqlite "CREATE TABLE IF NOT EXISTS chunks (id INTEGER PRIMARY KEY, sec INTEGER, nsec INTEGER, midi BLOB)" | 63 | execute_ sqlite "CREATE TABLE IF NOT EXISTS chunks (id INTEGER PRIMARY KEY, sec INTEGER, nsec INTEGER, midi BLOB)" |
64 | saver <- startSaver sqlite | ||
60 | 65 | ||
61 | (_, ()) <- execRWST loop (sqlite, startTime, startTimeReal, h, public, private, q, publicAddr, privateAddr) (emptyLoopState startTime) | 66 | (_, ()) <- execRWST loop (saver, sqlite, startTime, startTimeReal, h, public, private, q, publicAddr, privateAddr) (emptyLoopState startTime) |
62 | return () | 67 | return () |
63 | 68 | ||
64 | loop = do | 69 | loop = do |
65 | (_, startTime, startTimeReal, h, _, _, q, publicAddr, _) <- ask | 70 | (_, _, startTime, startTimeReal, h, _, _, q, publicAddr, _) <- ask |
66 | 71 | ||
67 | oldKeys <- gets keysDown | 72 | oldKeys <- gets keysDown |
68 | let forwardNOW = forwardNoteEvent h q publicAddr | 73 | let forwardNOW = forwardNoteEvent h q publicAddr |
@@ -94,11 +99,20 @@ instance ToRow Chunk where | |||
94 | toRow (Chunk s ns b) = toRow (s, ns, b) | 99 | toRow (Chunk s ns b) = toRow (s, ns, b) |
95 | 100 | ||
96 | saveMidi chunk = do | 101 | saveMidi chunk = do |
97 | (sqlite, _, _, _, _, _, _, _, _) <- ask | 102 | (saver, _, _, _, _, _, _, _, _, _) <- ask |
98 | (TimeSpec s ns) <- gets lastTick | 103 | (TimeSpec s ns) <- gets lastTick |
99 | let bytes = pack $ show chunk | 104 | liftIO $ writeChan saver (s, ns, chunk) |
100 | liftIO $ execute sqlite "INSERT INTO chunks (sec, nsec, midi) VALUES (?,?,?)" (Chunk s ns bytes) | 105 | |
101 | return () | 106 | startSaver sqlite = do |
107 | chan <- liftIO $ newChan | ||
108 | thread <- liftIO $ forkIO (saver sqlite chan) | ||
109 | return chan | ||
110 | where | ||
111 | saver sqlite chan = forever $ do | ||
112 | (s, ns, chunk) <- readChan chan | ||
113 | let bytes = pack $ show chunk | ||
114 | liftIO $ execute sqlite "INSERT INTO chunks (sec, nsec, midi) VALUES (?,?,?)" (Chunk s ns bytes) | ||
115 | return () | ||
102 | 116 | ||
103 | getMidiDesc :: EVENT -> Maybe String | 117 | getMidiDesc :: EVENT -> Maybe String |
104 | getMidiDesc (MidiEvent _ (Event.Cons _ _ _ _ _ _ (Event.NoteEv Event.NoteOn ev))) = return $ ("on:" ++) $ showPitch $ unPitch $ Event.noteNote ev | 118 | getMidiDesc (MidiEvent _ (Event.Cons _ _ _ _ _ _ (Event.NoteEv Event.NoteOn ev))) = return $ ("on:" ++) $ showPitch $ unPitch $ Event.noteNote ev |