1 ; 2 ; Toplevel configuration for the ALSA Ordinary Mixer Interface 3 ; 4 ; Copyright (c) 2003 Jaroslav Kysela <perex (a] perex.cz> 5 ; License: GPL v2 (http://www.gnu.org/licenses/gpl.html) 6 ; 7 8 (defun sndo_include (hctl stream) 9 (setq info (Acall "ctl_card_info" (Acall "hctl_ctl" hctl))) 10 (if (= (Aerror info) 0) 11 (progn 12 (setq info (Aresult info)) 13 (setq driver (cdr (assq "driver" (unsetq info)))) 14 (setq file (concat (path "data") "/alsa/cards/" (snd_card_alias driver) "/sndo" stream "-mixer.alisp")) 15 (setq r (include file)) 16 (when (= r -2) (Asyserr "unable to find file " file)) 17 ) 18 (setq r (Aerror info)) 19 ) 20 (unsetq info driver file r) 21 ) 22 23 (defun sndo_mixer_open_fcn (hctl stream pcm) 24 (setq fcn (concat "sndo" stream "_mixer_open")) 25 (setq r (if (exfun fcn) (funcall fcn hctl pcm) 0)) 26 (when (= r 0) 27 (setq hctls (if hctls (cons hctls (cons hctl)) hctl)) 28 ) 29 (unsetq fcn r) 30 ) 31 32 (defun sndo_mixer_open_hctl (name stream pcm) 33 (setq hctl (Acall "hctl_open" name nil)) 34 (setq r (Aerror hctl)) 35 (when (= r 0) 36 (setq hctl (Aresult hctl)) 37 (setq r (sndo_include hctl stream)) 38 (if (= r 0) 39 (setq r (sndo_mixer_open_fcn hctl stream pcm)) 40 (Acall "hctl_close" hctl) 41 ) 42 ) 43 (unsetq hctl r) 44 ) 45 46 (defun sndo_mixer_open_virtual (name stream pcm) 47 (setq file (concat (path "data") "/alsa/virtual/" name "/sndo" stream "-mixer.alisp")) 48 (setq r (include file)) 49 (when (= r -2) (Asyserr "unable to find file " file)) 50 (when (= r 0) (setq r (sndo_mixer_open_fcn nil stream pcm))) 51 (unsetq file r) 52 ) 53 54 (defun sndo_mixer_open1 (name stream) 55 (if (compare-strings name 0 2 "hw:" 0 2) 56 (sndo_mixer_open_hctl name stream nil) 57 (sndo_mixer_open_virtual name stream nil) 58 ) 59 ) 60 61 (defun sndo_mixer_open (pname cname) 62 (setq r (sndo_mixer_open1 pname "p")) 63 (when (= r 0) (setq r (sndo_mixer_open1 cname "c"))) 64 (when (!= r 0) (sndo_mixer_close)) 65 (unsetq sndo_mixer_open 66 sndo_mixer_open_pcm sndo_mixer_open_pcm1 67 sndo_mixer_open_virtual sndo_mixer_open_fcn 68 sndo_include r) 69 ) 70 71 (defun sndo_mixer_open_pcm1 (pcm stream) 72 (setq info (Acall "pcm_info" pcm)) 73 (setq r (Aerror info)) 74 (when (= r 0) 75 (setq info (Aresult info)) 76 (setq card (cdr (assq "card" info))) 77 (setq r 78 (if (< card 0) 79 (sndo_mixer_open_virtual (Acall "pcm_name" pcm) stream pcm) 80 (sndo_mixer_open_hctl (format "hw:%i" card) stream pcm) 81 ) 82 ) 83 ) 84 (unsetq info card r) 85 ) 86 87 (defun sndo_mixer_open_pcm (ppcm cpcm) 88 (setq r (sndo_mixer_open_pcm1 ppcm "p")) 89 (when (= r 0) (setq r (sndo_mixer_open_pcm1 cpcm "c"))) 90 (when (!= r 0) (sndo_mixer_close)) 91 (unsetq sndo_mixer_open 92 sndo_mixer_open_pcm sndo_mixer_open_pcm1 93 sndo_mixer_open_virtual sndo_mixer_open_fcn 94 sndo_include r) 95 ) 96 97 (defun sndo_mixer_close1 (hctl stream) 98 (when hctl 99 (progn 100 (setq fcn (concat "sndo" stream "_mixer_close")) 101 (when (exfun fcn) (funcall fcn hctl)) 102 (unsetq fcn) 103 (Acall "hctl_close" hctl) 104 ) 105 ) 106 ) 107 108 (defun sndo_mixer_close nil 109 (sndo_mixer_close1 (nth 1 hctls) "c") 110 (sndo_mixer_close1 (nth 0 hctls) "p") 111 (snd_card_alias_unset) 112 (unsetq hctls) 113 ) 114 115 (include (concat (path "data") "/alsa/cards/aliases.alisp")) 116