summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2015-12-03 21:53:31 -0500
committerAndrew Cady <d@jerkface.net>2015-12-03 21:53:31 -0500
commit359baa32103902c5d9e734a8dc7bac8c82705f24 (patch)
treea6f5fb3a22fe7d4078d7cb3d11da6d4caf447212
parent6669187d54d52b627b7dfda3dd31691b14a219f3 (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.cabal2
-rw-r--r--midi-dump.hs28
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
19import Data.Int 19import Data.Int
20import Data.ByteString.Char8 (pack) 20import Data.ByteString.Char8 (pack)
21 21
22import Control.Concurrent.Chan
23import Prelude hiding ((.))
24import BasePrelude hiding (loop)
25
22verbose = False 26verbose = False
23 27
24main = main' `AlsaExc.catch` handler 28main = main' `AlsaExc.catch` handler
@@ -41,7 +45,7 @@ data LoopState = LoopState {
41} 45}
42 46
43getAbsTime = do 47getAbsTime = 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
64loop = do 69loop = 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
96saveMidi chunk = do 101saveMidi 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 () 106startSaver 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
103getMidiDesc :: EVENT -> Maybe String 117getMidiDesc :: EVENT -> Maybe String
104getMidiDesc (MidiEvent _ (Event.Cons _ _ _ _ _ _ (Event.NoteEv Event.NoteOn ev))) = return $ ("on:" ++) $ showPitch $ unPitch $ Event.noteNote ev 118getMidiDesc (MidiEvent _ (Event.Cons _ _ _ _ _ _ (Event.NoteEv Event.NoteOn ev))) = return $ ("on:" ++) $ showPitch $ unPitch $ Event.noteNote ev