mp 0.1.3 → 0.2.0
raw patch · 5 files changed
+103/−27 lines, 5 files
Files
- mp.cabal +2/−2
- src/Mp/Player/Client.hs +5/−1
- src/Mp/Player/Server.hs +27/−11
- src/Mp/Player/ServerState.hs +60/−7
- src/Mp/UI/Main.hs +9/−6
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