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 Data.Void
import Foreign
import Foreign.C.String
import Foreign.C.Types
import qualified Data.ByteString as B
withEncoder :: (Encoder -> IO a) -> IO a
withEncoder f = bracket encoderNew (mapM_ encoderDelete) $ \mencoder ->
case mencoder of
Nothing -> throwM
(EncoderFailed EncoderStateMemoryAllocationError)
Just x -> f x
encoderNew :: IO (Maybe Encoder)
encoderNew = maybePtr <$> c_encoder_new
foreign import ccall unsafe "FLAC__stream_encoder_new"
c_encoder_new :: IO Encoder
encoderDelete :: Encoder -> IO ()
encoderDelete = c_encoder_delete
foreign import ccall unsafe "FLAC__stream_encoder_delete"
c_encoder_delete :: Encoder -> IO ()
encoderSetChannels :: Encoder -> Word32 -> IO Bool
encoderSetChannels encoder channels =
c_encoder_set_channels encoder (fromIntegral 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 bps =
c_encoder_set_bits_per_sample encoder (fromIntegral 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 sampleRate =
c_encoder_set_sample_rate encoder (fromIntegral 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 level =
c_encoder_set_compression_level encoder (fromIntegral 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 blockSize =
c_encoder_set_blocksize encoder (fromIntegral blockSize)
foreign import ccall unsafe "FLAC__stream_encoder_set_blocksize"
c_encoder_set_blocksize :: Encoder -> CUInt -> IO Bool
encoderSetDoMidSideStereo :: Encoder -> Bool -> IO Bool
encoderSetDoMidSideStereo = 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 = 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 specification =
B.useAsCString specification (c_encoder_set_apodization 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 value =
c_encoder_set_max_lpc_order encoder (fromIntegral 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 value =
c_encoder_set_qlp_coeff_precision encoder (fromIntegral 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 = 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 = 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 value =
c_encoder_set_min_residual_partition_order encoder (fromIntegral 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 value =
c_encoder_set_max_residual_partition_order encoder (fromIntegral 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 = 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 = 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 = fmap toEnum' . 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 path =
withCString path $ \cstr ->
toEnum' <$> c_encoder_init_file encoder cstr nullPtr 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 = c_encoder_finish
foreign import ccall unsafe "FLAC__stream_encoder_finish"
c_encoder_finish :: Encoder -> IO Bool