{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE LambdaCase #-}
module Codec.Audio.FLAC.StreamEncoder.Internal
( withEncoder,
encoderSetChannels,
encoderSetBitsPerSample,
encoderSetSampleRate,
encoderSetCompression,
encoderSetBlockSize,
encoderSetDoMidSideStereo,
encoderSetLooseMidSideStereo,
encoderSetApodization,
encoderSetMaxLpcOrder,
encoderSetQlpCoeffPrecision,
encoderSetDoQlpCoeffPrecisionSearch,
encoderSetDoExhaustiveModelSearch,
encoderSetMinResidualPartitionOrder,
encoderSetMaxResidualPartitionOrder,
encoderSetTotalSamplesEstimate,
encoderSetVerify,
encoderGetState,
encoderInitFile,
encoderFinish,
)
where
import Codec.Audio.FLAC.StreamEncoder.Internal.Types
import Codec.Audio.FLAC.Util
import Control.Monad.Catch
import Data.ByteString (ByteString)
import qualified Data.ByteString as B
import Data.Void
import Foreign
import Foreign.C.String
import Foreign.C.Types
withEncoder :: (Encoder -> IO a) -> IO a
withEncoder :: (Encoder -> IO a) -> IO a
withEncoder f :: Encoder -> IO a
f = IO (Maybe Encoder)
-> (Maybe Encoder -> IO ()) -> (Maybe Encoder -> IO a) -> IO a
forall (m :: * -> *) a c b.
MonadMask m =>
m a -> (a -> m c) -> (a -> m b) -> m b
bracket IO (Maybe Encoder)
encoderNew ((Encoder -> IO ()) -> Maybe Encoder -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Encoder -> IO ()
encoderDelete) ((Maybe Encoder -> IO a) -> IO a)
-> (Maybe Encoder -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \case
Nothing ->
EncoderException -> IO a
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM
(EncoderState -> EncoderException
EncoderFailed EncoderState
EncoderStateMemoryAllocationError)
Just x :: Encoder
x -> Encoder -> IO a
f Encoder
x
encoderNew :: IO (Maybe Encoder)
encoderNew :: IO (Maybe Encoder)
encoderNew = Encoder -> Maybe Encoder
forall a p. Coercible a (Ptr p) => a -> Maybe a
maybePtr (Encoder -> Maybe Encoder) -> IO Encoder -> IO (Maybe Encoder)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO Encoder
c_encoder_new
foreign import ccall unsafe "FLAC__stream_encoder_new"
c_encoder_new :: IO Encoder
encoderDelete :: Encoder -> IO ()
encoderDelete :: Encoder -> IO ()
encoderDelete = Encoder -> IO ()
c_encoder_delete
foreign import ccall unsafe "FLAC__stream_encoder_delete"
c_encoder_delete :: Encoder -> IO ()
encoderSetChannels :: Encoder -> Word32 -> IO Bool
encoderSetChannels :: Encoder -> Word32 -> IO Bool
encoderSetChannels encoder :: Encoder
encoder channels :: Word32
channels =
Encoder -> CUInt -> IO Bool
c_encoder_set_channels Encoder
encoder (Word32 -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
channels)
foreign import ccall unsafe "FLAC__stream_encoder_set_channels"
c_encoder_set_channels :: Encoder -> CUInt -> IO Bool
encoderSetBitsPerSample :: Encoder -> Word32 -> IO Bool
encoderSetBitsPerSample :: Encoder -> Word32 -> IO Bool
encoderSetBitsPerSample encoder :: Encoder
encoder bps :: Word32
bps =
Encoder -> CUInt -> IO Bool
c_encoder_set_bits_per_sample Encoder
encoder (Word32 -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
bps)
foreign import ccall unsafe "FLAC__stream_encoder_set_bits_per_sample"
c_encoder_set_bits_per_sample :: Encoder -> CUInt -> IO Bool
encoderSetSampleRate :: Encoder -> Word32 -> IO Bool
encoderSetSampleRate :: Encoder -> Word32 -> IO Bool
encoderSetSampleRate encoder :: Encoder
encoder sampleRate :: Word32
sampleRate =
Encoder -> CUInt -> IO Bool
c_encoder_set_sample_rate Encoder
encoder (Word32 -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
sampleRate)
foreign import ccall unsafe "FLAC__stream_encoder_set_sample_rate"
c_encoder_set_sample_rate :: Encoder -> CUInt -> IO Bool
encoderSetCompression :: Encoder -> Word32 -> IO Bool
encoderSetCompression :: Encoder -> Word32 -> IO Bool
encoderSetCompression encoder :: Encoder
encoder level :: Word32
level =
Encoder -> CUInt -> IO Bool
c_encoder_set_compression_level Encoder
encoder (Word32 -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
level)
foreign import ccall unsafe "FLAC__stream_encoder_set_compression_level"
c_encoder_set_compression_level :: Encoder -> CUInt -> IO Bool
encoderSetBlockSize :: Encoder -> Word32 -> IO Bool
encoderSetBlockSize :: Encoder -> Word32 -> IO Bool
encoderSetBlockSize encoder :: Encoder
encoder blockSize :: Word32
blockSize =
Encoder -> CUInt -> IO Bool
c_encoder_set_blocksize Encoder
encoder (Word32 -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
blockSize)
foreign import ccall unsafe "FLAC__stream_encoder_set_blocksize"
c_encoder_set_blocksize :: Encoder -> CUInt -> IO Bool
encoderSetDoMidSideStereo :: Encoder -> Bool -> IO Bool
encoderSetDoMidSideStereo :: Encoder -> Bool -> IO Bool
encoderSetDoMidSideStereo = Encoder -> Bool -> IO Bool
c_encoder_set_do_mid_side_stereo
foreign import ccall unsafe "FLAC__stream_encoder_set_do_mid_side_stereo"
c_encoder_set_do_mid_side_stereo :: Encoder -> Bool -> IO Bool
encoderSetLooseMidSideStereo :: Encoder -> Bool -> IO Bool
encoderSetLooseMidSideStereo :: Encoder -> Bool -> IO Bool
encoderSetLooseMidSideStereo = Encoder -> Bool -> IO Bool
c_encoder_set_loose_mid_side_stereo
foreign import ccall unsafe "FLAC__stream_encoder_set_loose_mid_side_stereo"
c_encoder_set_loose_mid_side_stereo :: Encoder -> Bool -> IO Bool
encoderSetApodization :: Encoder -> ByteString -> IO Bool
encoderSetApodization :: Encoder -> ByteString -> IO Bool
encoderSetApodization encoder :: Encoder
encoder specification :: ByteString
specification =
ByteString -> (CString -> IO Bool) -> IO Bool
forall a. ByteString -> (CString -> IO a) -> IO a
B.useAsCString ByteString
specification (Encoder -> CString -> IO Bool
c_encoder_set_apodization Encoder
encoder)
foreign import ccall unsafe "FLAC__stream_encoder_set_apodization"
c_encoder_set_apodization :: Encoder -> CString -> IO Bool
encoderSetMaxLpcOrder :: Encoder -> Word32 -> IO Bool
encoderSetMaxLpcOrder :: Encoder -> Word32 -> IO Bool
encoderSetMaxLpcOrder encoder :: Encoder
encoder value :: Word32
value =
Encoder -> CUInt -> IO Bool
c_encoder_set_max_lpc_order Encoder
encoder (Word32 -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
value)
foreign import ccall unsafe "FLAC__stream_encoder_set_max_lpc_order"
c_encoder_set_max_lpc_order :: Encoder -> CUInt -> IO Bool
encoderSetQlpCoeffPrecision :: Encoder -> Word32 -> IO Bool
encoderSetQlpCoeffPrecision :: Encoder -> Word32 -> IO Bool
encoderSetQlpCoeffPrecision encoder :: Encoder
encoder value :: Word32
value =
Encoder -> CUInt -> IO Bool
c_encoder_set_qlp_coeff_precision Encoder
encoder (Word32 -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
value)
foreign import ccall unsafe "FLAC__stream_encoder_set_qlp_coeff_precision"
c_encoder_set_qlp_coeff_precision :: Encoder -> CUInt -> IO Bool
encoderSetDoQlpCoeffPrecisionSearch :: Encoder -> Bool -> IO Bool
encoderSetDoQlpCoeffPrecisionSearch :: Encoder -> Bool -> IO Bool
encoderSetDoQlpCoeffPrecisionSearch = Encoder -> Bool -> IO Bool
c_encoder_set_qlp_coeff_prec_search
foreign import ccall unsafe "FLAC__stream_encoder_set_do_qlp_coeff_prec_search"
c_encoder_set_qlp_coeff_prec_search :: Encoder -> Bool -> IO Bool
encoderSetDoExhaustiveModelSearch :: Encoder -> Bool -> IO Bool
encoderSetDoExhaustiveModelSearch :: Encoder -> Bool -> IO Bool
encoderSetDoExhaustiveModelSearch = Encoder -> Bool -> IO Bool
c_encoder_set_do_exhaustive_model_search
foreign import ccall unsafe "FLAC__stream_encoder_set_do_exhaustive_model_search"
c_encoder_set_do_exhaustive_model_search :: Encoder -> Bool -> IO Bool
encoderSetMinResidualPartitionOrder :: Encoder -> Word32 -> IO Bool
encoderSetMinResidualPartitionOrder :: Encoder -> Word32 -> IO Bool
encoderSetMinResidualPartitionOrder encoder :: Encoder
encoder value :: Word32
value =
Encoder -> CUInt -> IO Bool
c_encoder_set_min_residual_partition_order Encoder
encoder (Word32 -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
value)
foreign import ccall unsafe "FLAC__stream_encoder_set_min_residual_partition_order"
c_encoder_set_min_residual_partition_order :: Encoder -> CUInt -> IO Bool
encoderSetMaxResidualPartitionOrder :: Encoder -> Word32 -> IO Bool
encoderSetMaxResidualPartitionOrder :: Encoder -> Word32 -> IO Bool
encoderSetMaxResidualPartitionOrder encoder :: Encoder
encoder value :: Word32
value =
Encoder -> CUInt -> IO Bool
c_encoder_set_max_residual_partition_order Encoder
encoder (Word32 -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
value)
foreign import ccall unsafe "FLAC__stream_encoder_set_max_residual_partition_order"
c_encoder_set_max_residual_partition_order :: Encoder -> CUInt -> IO Bool
encoderSetTotalSamplesEstimate :: Encoder -> Word64 -> IO Bool
encoderSetTotalSamplesEstimate :: Encoder -> Word64 -> IO Bool
encoderSetTotalSamplesEstimate = Encoder -> Word64 -> IO Bool
c_encoder_set_total_samples_estimate
foreign import ccall unsafe "FLAC__stream_encoder_set_total_samples_estimate"
c_encoder_set_total_samples_estimate :: Encoder -> Word64 -> IO Bool
encoderSetVerify :: Encoder -> Bool -> IO Bool
encoderSetVerify :: Encoder -> Bool -> IO Bool
encoderSetVerify = Encoder -> Bool -> IO Bool
c_encoder_set_verify
foreign import ccall unsafe "FLAC__stream_encoder_set_verify"
c_encoder_set_verify :: Encoder -> Bool -> IO Bool
encoderGetState :: Encoder -> IO EncoderState
encoderGetState :: Encoder -> IO EncoderState
encoderGetState = (CUInt -> EncoderState) -> IO CUInt -> IO EncoderState
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CUInt -> EncoderState
forall a b. (Integral a, Enum b) => a -> b
toEnum' (IO CUInt -> IO EncoderState)
-> (Encoder -> IO CUInt) -> Encoder -> IO EncoderState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Encoder -> IO CUInt
c_encoder_get_state
foreign import ccall unsafe "FLAC__stream_encoder_get_state"
c_encoder_get_state :: Encoder -> IO CUInt
encoderInitFile ::
Encoder ->
FilePath ->
IO EncoderInitStatus
encoderInitFile :: Encoder -> FilePath -> IO EncoderInitStatus
encoderInitFile encoder :: Encoder
encoder path :: FilePath
path =
FilePath
-> (CString -> IO EncoderInitStatus) -> IO EncoderInitStatus
forall a. FilePath -> (CString -> IO a) -> IO a
withCString FilePath
path ((CString -> IO EncoderInitStatus) -> IO EncoderInitStatus)
-> (CString -> IO EncoderInitStatus) -> IO EncoderInitStatus
forall a b. (a -> b) -> a -> b
$ \cstr :: CString
cstr ->
CUInt -> EncoderInitStatus
forall a b. (Integral a, Enum b) => a -> b
toEnum' (CUInt -> EncoderInitStatus) -> IO CUInt -> IO EncoderInitStatus
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Encoder -> CString -> Ptr Void -> Ptr Void -> IO CUInt
c_encoder_init_file Encoder
encoder CString
cstr Ptr Void
forall a. Ptr a
nullPtr Ptr Void
forall a. Ptr a
nullPtr
foreign import ccall unsafe "FLAC__stream_encoder_init_file"
c_encoder_init_file :: Encoder -> CString -> Ptr Void -> Ptr Void -> IO CUInt
encoderFinish :: Encoder -> IO Bool
encoderFinish :: Encoder -> IO Bool
encoderFinish = Encoder -> IO Bool
c_encoder_finish
foreign import ccall unsafe "FLAC__stream_encoder_finish"
c_encoder_finish :: Encoder -> IO Bool