|  | ; | 
|  | ; 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")) |