;
; Toplevel configuration for the ALSA Ordinary Mixer Interface
;
; Copyright (c) 2003 Jaroslav Kysela <perex@perex.cz>
; License: GPL v2 (http://www.gnu.org/licenses/gpl.html)
;

(defun sndo_include (hctl stream)
  (setq info (Acall "ctl_card_info" (Acall "hctl_ctl" hctl)))
  (if (= (Aerror info) 0)
    (progn
      (setq info (Aresult info))
      (setq driver (cdr (assq "driver" (unsetq info))))
      (setq file (concat (path "data") "/alsa/cards/" (snd_card_alias driver) "/sndo" stream "-mixer.alisp"))
      (setq r (include file))
      (when (= r -2) (Asyserr "unable to find file " file))
    )
    (setq r (Aerror info))
  )
  (unsetq info driver file r)
)

(defun sndo_mixer_open_fcn (hctl stream pcm)
  (setq fcn (concat "sndo" stream "_mixer_open"))
  (setq r (if (exfun fcn) (funcall fcn hctl pcm) 0))
  (when (= r 0)
    (setq hctls (if hctls (cons hctls (cons hctl)) hctl))
  )
  (unsetq fcn r)
)

(defun sndo_mixer_open_hctl (name stream pcm)
  (setq hctl (Acall "hctl_open" name nil))
  (setq r (Aerror hctl))
  (when (= r 0)
    (setq hctl (Aresult hctl))
    (setq r (sndo_include hctl stream))
    (if (= r 0)
       (setq r (sndo_mixer_open_fcn hctl stream pcm))
       (Acall "hctl_close" hctl)
    )
  )
  (unsetq hctl r)
)

(defun sndo_mixer_open_virtual (name stream pcm)
  (setq file (concat (path "data") "/alsa/virtual/" name "/sndo" stream "-mixer.alisp"))
  (setq r (include file))
  (when (= r -2) (Asyserr "unable to find file " file))
  (when (= r 0) (setq r (sndo_mixer_open_fcn nil stream pcm)))
  (unsetq file r)
)

(defun sndo_mixer_open1 (name stream)
  (if (compare-strings name 0 2 "hw:" 0 2)
    (sndo_mixer_open_hctl name stream nil)
    (sndo_mixer_open_virtual name stream nil)
  )
)

(defun sndo_mixer_open (pname cname)
  (setq r (sndo_mixer_open1 pname "p"))
  (when (= r 0) (setq r (sndo_mixer_open1 cname "c")))
  (when (!= r 0) (sndo_mixer_close))
  (unsetq sndo_mixer_open
	  sndo_mixer_open_pcm sndo_mixer_open_pcm1
          sndo_mixer_open_virtual sndo_mixer_open_fcn
	  sndo_include r)
)

(defun sndo_mixer_open_pcm1 (pcm stream)
  (setq info (Acall "pcm_info" pcm))
  (setq r (Aerror info))
  (when (= r 0)
    (setq info (Aresult info))
    (setq card (cdr (assq "card" info)))
    (setq r
      (if (< card 0)
	(sndo_mixer_open_virtual (Acall "pcm_name" pcm) stream pcm)
        (sndo_mixer_open_hctl (format "hw:%i" card) stream pcm)
      )
    )
  )
  (unsetq info card r)
)

(defun sndo_mixer_open_pcm (ppcm cpcm)
  (setq r (sndo_mixer_open_pcm1 ppcm "p"))
  (when (= r 0) (setq r (sndo_mixer_open_pcm1 cpcm "c")))
  (when (!= r 0) (sndo_mixer_close))
  (unsetq sndo_mixer_open
	  sndo_mixer_open_pcm sndo_mixer_open_pcm1
          sndo_mixer_open_virtual sndo_mixer_open_fcn
	  sndo_include r)
)

(defun sndo_mixer_close1 (hctl stream)
  (when hctl
    (progn
      (setq fcn (concat "sndo" stream "_mixer_close"))
      (when (exfun fcn) (funcall fcn hctl))
      (unsetq fcn)
      (Acall "hctl_close" hctl)
    )
  )
)

(defun sndo_mixer_close nil
  (sndo_mixer_close1 (nth 1 hctls) "c")
  (sndo_mixer_close1 (nth 0 hctls) "p")
  (snd_card_alias_unset)
  (unsetq hctls)
)

(include (concat (path "data") "/alsa/cards/aliases.alisp"))
