{-
	Sound Source
	HGamer3D Library (A project to enable 3D game development in Haskell)
	Copyright 2015 - 2017 Peter Althainz
	
	Distributed under the Apache License, Version 2.0
	(See attached file LICENSE or copy at 
	http://www.apache.org/licenses/LICENSE-2.0)
 
	file: HGamer3D/Audio/SoundSource.hs
-}

-- | Module providing a Sound Source
module HGamer3D.Audio.SoundSource
where

import Fresco
import Data.Binary.Serialise.CBOR
import Data.Binary.Serialise.CBOR.Decoding
import Data.Binary.Serialise.CBOR.Encoding

import Data.Text
import Data.Monoid
import Control.Applicative

data SoundType = Sound                                                                                                             
    | Sound3D                                                                                                                      
    | Music                                                                                                                        
    deriving (Eq, Read, Show)                                                                                                      
                                                                                                                                   
data SoundSource = SoundSource {                                                                                                   
    soundSourceType::SoundType,                                                                                                    
    soundSourceResource::Text,                                                                                                     
    soundSourceLoop::Bool,                                                                                                         
    soundSourceVolume::Float,                                                                                                      
    soundSourceVolumeGroup::Text                                                                                                   
    } deriving (Eq, Read, Show)                                                                                                    
                                                                                                                                   
ctSoundSource :: ComponentType SoundSource                                                                                         
ctSoundSource = ComponentType 0xafcef7aa41d88c0d                                                                                   
                                                                                                                                   
instance Serialise SoundType where                                                                                                 
    encode (Sound) = encodeListLen 1 <>  encode (0::Int)                                                                           
    encode (Sound3D) = encodeListLen 1 <>  encode (1::Int)                                                                         
    encode (Music) = encodeListLen 1 <>  encode (2::Int)                                                                           
    decode = do                                                                                                                    
        decodeListLen                                                                                                              
        i <- decode :: Decoder s Int                                                                                               
        case i of                                                                                                                  
            0 -> (pure Sound)                                                                                                      
            1 -> (pure Sound3D)                                                                                                    
            2 -> (pure Music)                                                                                                      
                                                                                                                                   
instance Serialise SoundSource where                                                                                               
    encode (SoundSource v1 v2 v3 v4 v5) = encodeListLen 5 <> encode v1 <> encode v2 <> encode v3 <> encode v4 <> encode v5         
    decode = decodeListLenOf 5 >> SoundSource <$> decode <*> decode <*> decode <*> decode <*> decode