packages feed

mp 0.1.3 → 0.2.0

raw patch · 5 files changed

+103/−27 lines, 5 files

Files

mp.cabal view
@@ -1,5 +1,5 @@ name:               mp-version:            0.1.3+version:            0.2.0 cabal-version:      >=1.16 build-type:         Simple author:             Piotr Borek <piotrborek@op.pl>@@ -9,6 +9,7 @@ synopsis:           Music player for linux. description:        Music player for linux. category:           Sound+homepage:           http://code.google.com/p/linux-music-player  data-files:   gen_gettext@@ -53,4 +54,3 @@     Mp.Utils.Shuffle     Mp.Utils.Colors     Mp.Utils.Network-
src/Mp/Player/Client.hs view
@@ -41,7 +41,8 @@     clientSendSeekBackward,     clientSendGetFlags,     clientSendToggleRepeat,-    clientSendToggleShuffle+    clientSendToggleShuffle,+    clientSendSaveState ) where  import System.FilePath.Posix@@ -162,3 +163,6 @@  clientSendToggleShuffle :: IO () clientSendToggleShuffle = withConnection $ sendMessage_ "ToggleShuffle"++clientSendSaveState :: IO ()+clientSendSaveState = withConnection $ sendMessage_ "SaveState"
src/Mp/Player/Server.hs view
@@ -58,6 +58,12 @@     state <- readMVar serverState     encodeFile (cfgDir </> "server.state") state +saveServerIndex :: MVar ServerState -> IO ()+saveServerIndex serverState = do+    cfgDir <- configDirFilePath+    state <- readMVar serverState+    encodeFile (cfgDir </> "server.index") (PlayingIndex $ getPlaying state)+ startServerBlocking :: String -> IO () startServerBlocking socName = do     player <- initGstPlayer@@ -90,16 +96,19 @@     where         readServerState player serverState = do             cfgDir <- configDirFilePath-            let file = cfgDir </> "server.state"-            exists <- doesFileExist file-            when exists $ do-                modifyMVar_ serverState $ \_ -> do-                    state <- readStateFromFile file :: IO ServerState-                    gstPlayerSetVolume player $ getVolume state-                    when (getStatus state == "Playing") $ do-                        let f = getPlaylist state !! (shuffleFunc state) (getPlaying state)-                        gstPlayerPlay player f-                    return state+            let file0 = cfgDir </> "server.state"+            let file1 = cfgDir </> "server.index"+            modifyMVar_ serverState $ \_ -> do+                state0                <- readStateFromFile file0 :: IO ServerState+                (PlayingIndex index)  <- readIndexFromFile file1 :: IO PlayingIndex+                let state = state0 {+                    getPlaying = index+                }+                gstPlayerSetVolume player $ getVolume state+                when (getStatus state == "Playing") $ do+                    let f = getPlaylist state !! (shuffleFunc state) (getPlaying state)+                    gstPlayerPlay player f+                return state          schedulePlayerInfo player serverState =             gstPlayerTimeoutAdd 100 $ do@@ -145,6 +154,8 @@                 else                     modifyPlayerStop st player +    saveServerIndex serverState+ modifyPlayerStop :: ServerState -> GstPlayer -> IO ServerState modifyPlayerStop st player = do     gstPlayerStop player@@ -173,7 +184,6 @@ talkBlocking :: MVar ServerState -> GstPlayer -> Socket -> IO () talkBlocking serverState player sock = do     _ <- try' processMessages-    saveServerState serverState     gstPlayerStop player     gstPlayerQuit player @@ -203,12 +213,18 @@                 "GetFlags"       -> talkGetFlags serverState conn                 "ToggleRepeat"   -> talkToggleRepeat serverState conn                 "ToggleShuffle"  -> talkToggleShuffle serverState player conn+                "SaveState"      -> talkSaveState serverState conn                 "Quit"           -> sendString conn "OK"                 _                -> sendString conn "NOK"              close conn              when (msg /= "Quit") processMessages++talkSaveState :: MVar ServerState -> Socket -> IO ()+talkSaveState serverState conn = do+    sendString conn "OK"+    saveServerState serverState  talkGetPlaylist :: MVar ServerState -> Socket -> IO () talkGetPlaylist serverState conn = do
src/Mp/Player/ServerState.hs view
@@ -30,6 +30,8 @@ import Mp.Utils.Shuffle import Mp.Utils.Exception +data PlayingIndex = PlayingIndex Int+ data ServerState = ServerState {     getPlaylist        :: ![String],     getCurrentPosition :: !Integer,@@ -44,11 +46,32 @@     shuffleData        :: !ShuffleData } +instance Binary PlayingIndex where+    put (PlayingIndex i) = do+        put (20150221 :: Word32)+        put (0 :: Int)+        put i++    get = do+        magic <- get :: Get Word32+        if magic /= 20150221+            then return defaultPlayingIndex+            else do+                version <- get :: Get Int+                case version of+                    0 -> getVersion0+                    _ -> return defaultPlayingIndex+        where+            getVersion0 = do+                index <- get+                return $ PlayingIndex index++            defaultPlayingIndex = PlayingIndex 0+ instance Binary ServerState where     put st = do         put (1113 :: Word32)-        put (0 :: Int)-        put $ getPlaying st+        put (1 :: Int)         if getStatus st == "Paused"             then put "Playing"             else put $ getStatus st@@ -66,8 +89,15 @@                 version <- get :: Get Int                 case version of                     0 -> getVersion0+                    1 -> getVersion1                     _ -> return defaultServerState         where+            generateShuffle shuffleMode r playlist = let g = mkStdGen r+                                          in+                                              if shuffleMode then+                                                  State.runState (shuffleFilled $ length playlist) $ shuffleInitial g+                                              else+                                                  (id, shuffleInitial g)             getVersion0 = do                 playing     <- get                 status      <- get@@ -77,11 +107,7 @@                 shuffleMode <- get                 r           <- get -                let g = mkStdGen r-                let (f, d) = if shuffleMode then-                                 State.runState (shuffleFilled $ length playlist) $ shuffleInitial g-                             else-                                 (id, shuffleInitial g)+                let (f, d) = generateShuffle shuffleMode r playlist                  return ServerState {                     getPlaylist = playlist,@@ -97,6 +123,30 @@                     shuffleData = d                 } +            getVersion1 = do+                status      <- get+                volume      <- get+                playlist    <- get+                repeatMode  <- get+                shuffleMode <- get+                r           <- get++                let (f, d) = generateShuffle shuffleMode r playlist++                return ServerState {+                    getPlaylist = playlist,+                    getCurrentPosition = 0,+                    getCurrentDuration = 0,+                    getStatus = status,+                    getPlaying = 0,+                    getVolume = volume,+                    isRepeatMode = repeatMode,+                    isShuffleMode = shuffleMode,+                    randomInitializer = r,+                    shuffleFunc = f,+                    shuffleData = d+                }+ defaultServerState :: ServerState defaultServerState = ServerState {     getPlaylist = [],@@ -114,3 +164,6 @@  readStateFromFile :: String -> IO ServerState readStateFromFile file = decodeFile file `catchAny` (\_ -> return defaultServerState)++readIndexFromFile :: String -> IO PlayingIndex+readIndexFromFile file = decodeFile file `catchAny` (\_ -> return $ PlayingIndex 0)
src/Mp/UI/Main.hs view
@@ -45,12 +45,15 @@ import Mp.Utils.I18N import Mp.Player.Client +exitUI :: IO ()+exitUI = clientSendSaveState >> shutdownUi+ makeAndRunUI :: IO () makeAndRunUI = do-    _ <- installHandler sigINT  (Catch $ schedule shutdownUi) Nothing-    _ <- installHandler sigHUP  (Catch $ schedule shutdownUi) Nothing-    _ <- installHandler sigABRT (Catch $ schedule shutdownUi) Nothing-    _ <- installHandler sigTERM (Catch $ schedule shutdownUi) Nothing+    _ <- installHandler sigINT  (Catch $ schedule exitUI) Nothing+    _ <- installHandler sigHUP  (Catch $ schedule exitUI) Nothing+    _ <- installHandler sigABRT (Catch $ schedule exitUI) Nothing+    _ <- installHandler sigTERM (Catch $ schedule exitUI) Nothing      conf <- readConfiguration @@ -107,8 +110,8 @@                     KASCII '['  -> do                         clientSendVolumeDown                         return True-                    KASCII 'q'  -> exitSuccess-                    KASCII 'Q'  -> clientSendQuitMessage >> exitSuccess+                    KASCII 'q'  -> clientSendSaveState >> exitSuccess+                    KASCII 'Q'  -> clientSendSaveState >> clientSendQuitMessage >> exitSuccess                     KASCII '1'  -> makeActive 0 >> return True                     KASCII '2'  -> makeActive 1 >> return True                     KASCII '3'  -> makeActive 2 >> playlistReset playlistPage >> return True