--------------------------------------------------------------------------------
-- |
-- Module    : Sound.ALSA.Sequencer.Queue.Tempo
-- 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.Tempo
  ( T
  , get
  , set
  , copy
  , clone

  , getQueue
  , getTempo
  , getPPQ
  , getSkew
  , getSkewBase

  , setTempo
  , setPPQ
  , setSkew
  , setSkewBase
  ) where

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

import Foreign.Ptr (Ptr, )
import Foreign.C.Types (CInt, )
import Data.Word (Word, )


type T = Area.QueueTempo
type T_ = Area.QueueTempo_

get :: Seq.T mode -> Queue.T -> IO T
get (Seq.Cons h) q =
  do tempo <- Area.queue_tempo_malloc
     Exc.checkResult "get_queue_tempo" =<< Area.with_queue_tempo tempo
                                     (snd_seq_get_queue_tempo h (Queue.exp q))
     return tempo

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


set :: Seq.T mode -> Queue.T -> T -> IO ()
set (Seq.Cons h) p tempo =
  Exc.checkResult_ "set_queue_tempo" =<< Area.with_queue_tempo tempo (snd_seq_set_queue_tempo h (Queue.exp p))

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


copy :: T -> T -> IO ()
clone :: T -> IO T
getQueue :: T -> IO Queue.T
getTempo :: T -> IO Word
getPPQ :: T -> IO Int
getSkew :: T -> IO Word
getSkewBase :: T -> IO Word
setTempo :: T -> Word -> IO ()
setPPQ :: T -> Int -> IO ()
setSkew :: T -> Word -> IO ()
setSkewBase :: T -> Word -> IO ()

copy        = Area.queue_tempo_copy
clone       = Area.queue_tempo_clone

getQueue    = Area.queue_tempo_get_queue
getTempo    = Area.queue_tempo_get_tempo
getPPQ      = Area.queue_tempo_get_ppq
getSkew     = Area.queue_tempo_get_skew
getSkewBase = Area.queue_tempo_get_skew_base

setTempo    = Area.queue_tempo_set_tempo
setPPQ      = Area.queue_tempo_set_ppq
setSkew     = Area.queue_tempo_set_skew
setSkewBase = Area.queue_tempo_set_skew_base