--------------------------------------------------------------------------------
-- |
-- Module    : Sound.ALSA.Sequencer.Queue.Status
-- Copyright : (c) Henning Thielemann, 2010
--             (c) Iavor S. Diatchki, 2007
-- License   : BSD3
--
-- Maintainer: Henning Thielemann
-- Stability : provisional
--
-- This module contains functions for working with sequencer queue.
-- Reference:
-- <http://www.alsa-project.org/alsa-doc/alsa-lib/group___seq_queue.html>
--------------------------------------------------------------------------------

module Sound.ALSA.Sequencer.Queue.Status
  ( T
  , get
  , copy
  , clone

  , getQueue
  , getEvents
  , getTickTime
  , getRealTime
  ) where

import qualified Sound.ALSA.Sequencer.Marshal.Sequencer as Seq
import qualified Sound.ALSA.Sequencer.Marshal.RealTime as RealTime
import qualified Sound.ALSA.Sequencer.Marshal.Queue as Queue
import qualified Sound.ALSA.Sequencer.Area as Area
import qualified Sound.ALSA.Exception as Exc

import Foreign.Ptr (Ptr, )
import Foreign.C.Types (CInt, CUInt, )
import Foreign.Storable (peek, )
import Data.Word (Word32, )


type T = Area.QueueStatus
type T_ = Area.QueueStatus_


get :: Seq.T mode -> Queue.T -> IO T
get (Seq.Cons h) q =
  do status <- Area.queue_status_malloc
     Exc.checkResult_ "get_queue_status" =<< Area.with_queue_status status
                                     (snd_seq_get_queue_status h (Queue.exp q))
     return status

foreign import ccall unsafe "alsa/asoundlib.h snd_seq_get_queue_status"
  snd_seq_get_queue_status :: Ptr Seq.Core -> CInt -> Ptr T_ -> IO CInt



copy :: T -> T -> IO ()
clone :: T -> IO T

copy  = Area.queue_status_copy
clone = Area.queue_status_clone


foreign import ccall unsafe "alsa/asoundlib.h"
   snd_seq_queue_status_get_queue
      :: Ptr T_ -> IO CInt
foreign import ccall unsafe "alsa/asoundlib.h"
   snd_seq_queue_status_get_events
      :: Ptr T_ -> IO CInt
foreign import ccall unsafe "alsa/asoundlib.h"
   snd_seq_queue_status_get_tick_time
      :: Ptr T_ -> IO Word32
foreign import ccall unsafe "alsa/asoundlib.h"
   snd_seq_queue_status_get_real_time
      :: Ptr T_ -> IO (Ptr RealTime.T)
foreign import ccall unsafe "alsa/asoundlib.h"
   snd_seq_queue_status_get_status
      :: Ptr T_ -> IO CUInt


getQueue :: T -> IO Queue.T
getQueue status =
   fmap Queue.imp $
   Area.with_queue_status status snd_seq_queue_status_get_queue

getEvents :: T -> IO Int
getEvents status =
   fmap fromIntegral $
   Area.with_queue_status status snd_seq_queue_status_get_events

getTickTime :: T -> IO Word32
getTickTime status =
   Area.with_queue_status status snd_seq_queue_status_get_tick_time

getRealTime :: T -> IO RealTime.T
getRealTime status =
   peek =<<
   Area.with_queue_status status snd_seq_queue_status_get_real_time

{-
This function shall return status bits of the queue,
but the ALSA headers do not define any bits.
I would prefer a data type that handles this bitfield.
-}
_getStatus :: T -> IO CUInt
_getStatus status =
   Area.with_queue_status status snd_seq_queue_status_get_status