module Sound.Libcdio.Read.Data
(
Foreign.Lsn
, Foreign.Whence ( .. )
, Foreign.DiscMode ( .. )
, Foreign.isCdRom
, Foreign.isDvd
, discMode
, discJolietLevel
, lastAddress
, lastSessionAddress
, audioTimestamp
, catalogue
, isrc
, seek
, readRaw
, readAudio
, readData
, readXa
, Foreign.framesPerSec
, maxCdSectors
, maxCdMinutes
, defaultPregapSectors
, defaultPostgapSectors
) where
import qualified Data.ByteString as BS
import qualified Data.Text as T
import qualified Foreign.Libcdio.Device as Foreign
import qualified Foreign.Libcdio.Disc as Foreign
import qualified Foreign.Libcdio.Read as Foreign
import qualified Foreign.Libcdio.Sector as Foreign
import qualified Foreign.Libcdio.Track as Foreign
import Sound.Libcdio.Device
import Sound.Libcdio.Types.Cdio
discMode :: Cdio (Maybe Foreign.DiscMode)
discMode :: Cdio (Maybe DiscMode)
discMode = (Cdio -> IO (Maybe DiscMode)) -> Cdio (Maybe DiscMode)
forall a. (Cdio -> IO a) -> Cdio a
liftCdio Cdio -> IO (Maybe DiscMode)
Foreign.discMode
discJolietLevel :: Cdio (Maybe Word)
discJolietLevel :: Cdio (Maybe Word)
discJolietLevel = (Cdio -> IO (Maybe Word)) -> Cdio (Maybe Word)
forall a. (Cdio -> IO a) -> Cdio a
liftCdio Cdio -> IO (Maybe Word)
Foreign.discJolietLevel
lastAddress :: Cdio (Maybe Foreign.Lsn)
lastAddress :: Cdio (Maybe Lsn)
lastAddress = (Cdio -> IO (Maybe Lsn)) -> Cdio (Maybe Lsn)
forall a. (Cdio -> IO a) -> Cdio a
liftCdio Cdio -> IO (Maybe Lsn)
Foreign.lastLsn
lastSessionAddress :: Cdio (Either DriverReturnCode Foreign.Lsn)
lastSessionAddress :: Cdio (Either DriverReturnCode Lsn)
lastSessionAddress = (Cdio -> IO (Either DriverReturnCode Lsn))
-> Cdio (Either DriverReturnCode Lsn)
forall a. (Cdio -> IO a) -> Cdio a
liftCdio Cdio -> IO (Either DriverReturnCode Lsn)
Foreign.lastSession
defaultPregapSectors :: Word
defaultPregapSectors :: Word
defaultPregapSectors = Word
Foreign.pregapSectors
defaultPostgapSectors :: Word
defaultPostgapSectors :: Word
defaultPostgapSectors = Word
Foreign.postgapSectors
audioTimestamp :: Foreign.Lsn -> T.Text
audioTimestamp :: Lsn -> Text
audioTimestamp = String -> Text
T.pack (String -> Text) -> (Lsn -> String) -> Lsn -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Msf -> String
Foreign.msfToStr (Msf -> String) -> (Lsn -> Msf) -> Lsn -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lsn -> Msf
Foreign.lsnToMsf
maxCdSectors :: Word
maxCdSectors :: Word
maxCdSectors = Word
Foreign.maxSectors
maxCdMinutes :: Word
maxCdMinutes :: Word
maxCdMinutes = Word
Foreign.cdMins
catalogue :: Cdio (Maybe T.Text)
catalogue :: Cdio (Maybe Text)
catalogue = (Cdio -> IO (Maybe Text)) -> Cdio (Maybe Text)
forall a. (Cdio -> IO a) -> Cdio a
liftCdio ((Cdio -> IO (Maybe Text)) -> Cdio (Maybe Text))
-> (Cdio -> IO (Maybe Text)) -> Cdio (Maybe Text)
forall a b. (a -> b) -> a -> b
$ \Cdio
c -> (String -> Text) -> Maybe String -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Text
T.pack (Maybe String -> Maybe Text)
-> IO (Maybe String) -> IO (Maybe Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Cdio -> IO (Maybe String)
Foreign.cdMcn Cdio
c
isrc :: Foreign.Track -> Cdio (Maybe T.Text)
isrc :: Track -> Cdio (Maybe Text)
isrc Track
t = (Cdio -> IO (Maybe Text)) -> Cdio (Maybe Text)
forall a. (Cdio -> IO a) -> Cdio a
liftCdio ((Cdio -> IO (Maybe Text)) -> Cdio (Maybe Text))
-> (Cdio -> IO (Maybe Text)) -> Cdio (Maybe Text)
forall a b. (a -> b) -> a -> b
$ \Cdio
c -> (String -> Text) -> Maybe String -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap String -> Text
T.pack (Maybe String -> Maybe Text)
-> IO (Maybe String) -> IO (Maybe Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Cdio -> Track -> IO (Maybe String)
Foreign.trackIsrc Cdio
c Track
t
seek :: Int -> Foreign.Whence -> Cdio Foreign.Lsn
seek :: Int -> Whence -> Cdio Lsn
seek Int
o Whence
w = (Cdio -> IO (Either CdioError Lsn)) -> Cdio Lsn
forall a. (Cdio -> IO (Either CdioError a)) -> Cdio a
liftCdioError ((Cdio -> IO (Either CdioError Lsn)) -> Cdio Lsn)
-> (Cdio -> IO (Either CdioError Lsn)) -> Cdio Lsn
forall a b. (a -> b) -> a -> b
$ \Cdio
c -> do
Either DriverReturnCode Word
o' <- Cdio -> Int -> Whence -> IO (Either DriverReturnCode Word)
Foreign.seek Cdio
c (Int
o Int -> Int -> Int
forall a. Num a => a -> a -> a
* Word -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word
Foreign.sectorSize) Whence
w
Either DriverReturnCode Word
pos <- case (Word -> Word -> Word) -> Word -> Word -> Word
forall a b c. (a -> b -> c) -> b -> a -> c
flip Word -> Word -> Word
forall a. Integral a => a -> a -> a
mod Word
Foreign.sectorSize (Word -> Word)
-> Either DriverReturnCode Word -> Either DriverReturnCode Word
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Either DriverReturnCode Word
o' of
Right Word
drift | Word
drift Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
/= Word
0 -> Cdio -> Int -> Whence -> IO (Either DriverReturnCode Word)
Foreign.seek Cdio
c (Word -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word -> Int) -> Word -> Int
forall a b. (a -> b) -> a -> b
$ Word -> Word
forall a. Num a => a -> a
negate Word
drift) Whence
Foreign.SeekCurrent
Either DriverReturnCode Word
_ -> Either DriverReturnCode Word -> IO (Either DriverReturnCode Word)
forall (m :: * -> *) a. Monad m => a -> m a
return Either DriverReturnCode Word
o'
Either CdioError Lsn -> IO (Either CdioError Lsn)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either CdioError Lsn -> IO (Either CdioError Lsn))
-> (Either DriverReturnCode Lsn -> Either CdioError Lsn)
-> Either DriverReturnCode Lsn
-> IO (Either CdioError Lsn)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Either DriverReturnCode Lsn -> Either CdioError Lsn
forall a. String -> Either DriverReturnCode a -> Either CdioError a
packCdioError' String
"seek" (Either DriverReturnCode Lsn -> IO (Either CdioError Lsn))
-> Either DriverReturnCode Lsn -> IO (Either CdioError Lsn)
forall a b. (a -> b) -> a -> b
$ Word -> Lsn
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word -> Lsn) -> (Word -> Word) -> Word -> Lsn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Word -> Word -> Word) -> Word -> Word -> Word
forall a b c. (a -> b -> c) -> b -> a -> c
flip Word -> Word -> Word
forall a. Integral a => a -> a -> a
div Word
Foreign.sectorSize (Word -> Lsn)
-> Either DriverReturnCode Word -> Either DriverReturnCode Lsn
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Either DriverReturnCode Word
pos
readRaw :: Word -> Cdio BS.ByteString
readRaw :: Word -> Cdio ByteString
readRaw Word
l = (Cdio -> IO (Either CdioError ByteString)) -> Cdio ByteString
forall a. (Cdio -> IO (Either CdioError a)) -> Cdio a
liftCdioError ((Cdio -> IO (Either CdioError ByteString)) -> Cdio ByteString)
-> (Cdio -> IO (Either CdioError ByteString)) -> Cdio ByteString
forall a b. (a -> b) -> a -> b
$ \Cdio
c -> do
Maybe ByteString
bs <- Cdio -> Word -> IO (Maybe ByteString)
Foreign.readBytes Cdio
c (Word
l Word -> Word -> Word
forall a. Num a => a -> a -> a
* Word
Foreign.sectorSize)
Either CdioError ByteString -> IO (Either CdioError ByteString)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either CdioError ByteString -> IO (Either CdioError ByteString))
-> (Either DriverReturnCode ByteString
-> Either CdioError ByteString)
-> Either DriverReturnCode ByteString
-> IO (Either CdioError ByteString)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String
-> Either DriverReturnCode ByteString
-> Either CdioError ByteString
forall a. String -> Either DriverReturnCode a -> Either CdioError a
packCdioError' String
"readAudio" (Either DriverReturnCode ByteString
-> IO (Either CdioError ByteString))
-> Either DriverReturnCode ByteString
-> IO (Either CdioError ByteString)
forall a b. (a -> b) -> a -> b
$ Either DriverReturnCode ByteString
-> (ByteString -> Either DriverReturnCode ByteString)
-> Maybe ByteString
-> Either DriverReturnCode ByteString
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (DriverReturnCode -> Either DriverReturnCode ByteString
forall a b. a -> Either a b
Left DriverReturnCode
Foreign.DriverError) ByteString -> Either DriverReturnCode ByteString
forall a b. b -> Either a b
Right Maybe ByteString
bs
readAudio :: Word -> Cdio BS.ByteString
readAudio :: Word -> Cdio ByteString
readAudio Word
l = Int -> Whence -> Cdio Lsn
seek Int
0 Whence
Foreign.SeekCurrent Cdio Lsn -> (Lsn -> Cdio ByteString) -> Cdio ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Cdio -> Lsn -> IO (Either CdioError ByteString))
-> Lsn -> Cdio ByteString
forall a b. (Cdio -> a -> IO (Either CdioError b)) -> a -> Cdio b
liftCdioError' (\Cdio
c Lsn
o ->
String
-> Either DriverReturnCode ByteString
-> Either CdioError ByteString
forall a. String -> Either DriverReturnCode a -> Either CdioError a
packCdioError' String
"readAudio" (Either DriverReturnCode ByteString -> Either CdioError ByteString)
-> IO (Either DriverReturnCode ByteString)
-> IO (Either CdioError ByteString)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Cdio -> Lsn -> Word -> IO (Either DriverReturnCode ByteString)
Foreign.readAudioSectors Cdio
c Lsn
o Word
l)
readData
:: Bool
-> Word
-> Cdio BS.ByteString
readData :: Bool -> Word -> Cdio ByteString
readData Bool
m Word
l = Int -> Whence -> Cdio Lsn
seek Int
0 Whence
Foreign.SeekCurrent Cdio Lsn -> (Lsn -> Cdio ByteString) -> Cdio ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Cdio -> Lsn -> IO (Either CdioError ByteString))
-> Lsn -> Cdio ByteString
forall a b. (Cdio -> a -> IO (Either CdioError b)) -> a -> Cdio b
liftCdioError' (\Cdio
c Lsn
o ->
String
-> Either DriverReturnCode ByteString
-> Either CdioError ByteString
forall a. String -> Either DriverReturnCode a -> Either CdioError a
packCdioError' String
"readData" (Either DriverReturnCode ByteString -> Either CdioError ByteString)
-> IO (Either DriverReturnCode ByteString)
-> IO (Either CdioError ByteString)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Cdio
-> Lsn -> Bool -> Word -> IO (Either DriverReturnCode ByteString)
Foreign.readDataModeSectors Cdio
c Lsn
o Bool
m Word
l)
readXa
:: Bool
-> Word
-> Cdio BS.ByteString
readXa :: Bool -> Word -> Cdio ByteString
readXa Bool
f Word
l = Int -> Whence -> Cdio Lsn
seek Int
0 Whence
Foreign.SeekCurrent Cdio Lsn -> (Lsn -> Cdio ByteString) -> Cdio ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Cdio -> Lsn -> IO (Either CdioError ByteString))
-> Lsn -> Cdio ByteString
forall a b. (Cdio -> a -> IO (Either CdioError b)) -> a -> Cdio b
liftCdioError' (\Cdio
c Lsn
o ->
String
-> Either DriverReturnCode ByteString
-> Either CdioError ByteString
forall a. String -> Either DriverReturnCode a -> Either CdioError a
packCdioError' String
"readXA" (Either DriverReturnCode ByteString -> Either CdioError ByteString)
-> IO (Either DriverReturnCode ByteString)
-> IO (Either CdioError ByteString)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Cdio
-> Lsn -> Bool -> Word -> IO (Either DriverReturnCode ByteString)
Foreign.readXaModeSectors Cdio
c Lsn
o Bool
f Word
l)