리눅스 커널 2.6 이상을 사용하고 (요즘은 당연히..)  사운드를 제어한다면  ALSA 가 포팅되어 있을것이다.

그런데  막상 볼륨제어라든가 녹음을 위해 설정을 하려고 하면 어떻게 해야할지 막막하다


amixer 를 사용하면 될것인데 이것이 그리 쉽지만은 않다

하지만 개념을 잡고 생각하면 아주 쉽다


요즘나오는 AC97  코덱은 기능도 많아 예전에 알고 있던 형태의 제어만으로는 감당하지 못한다

칩이 새로나오면 요상한 기능들이 마구 추가되는데 이를 제어하는 프로그램이  경직된 인터페이스로는

이런것들을 다루기는 요원한 일 인것이다.


일례로 특정 코덱이 3D 효과를 지원한다고 했을때 이를 켜기 위해서 범용의 유틸리티가 어떻게 이를 할수 있을까?

범용의  유틸프로그램이 2월에 컴파일되었고 신기술이 적용된 칩의 드라이버가 3월에 나왔다면....

제어는 불가능하다고 할수없지만 먼가 유연한 인터페이스가 필요할 것이다.


ALSA 에서는 이런 문제를 문자열로 해결하고 잇다.

amixer 유틸리티는 단순하게 드라이버가 제공하는 기능들을 나열하고 사용자가 제어한 값을 온전히 드라이버에게

전달해주는 역할만을 한다. 드라이버는 전달된 문자열(메세지)를 분석하여 처리하는 것이다.

amixer 자체는 나열된 문자열이 무엇인지 알지 못한다.

드라이버(코덱)는 자신이 해석할 수 있는 문자열을 커널의 ALSA 드라이버에 등록한다.

흠 이로서 유연한 인퍼에이스가 완성되었다.


(네트웍 통신을 하다보면 구조체잡고 크기잡고 이렇게 하기도 하지만 요즘에 문자열을 이용하여 값을 전달하는

 방식을 자주 사용한다.   cmd=abc,100   머 이런방식이다.  amixer 도 이런형태인 것이다.)


amixer 를 아무런 옵션없이 실행하면 제어할수 있는 명령어를 출력한다. (몇개의 값만을 추려서 나열하였다)


 Simple mixer control 'Capture',0
  Capabilities: cvolume cswitch cswitch-joined
  Capture channels: Front Left - Front Right
  Limits: Capture 0 - 31
  Front Left: Capture 15 [48%] [on]
  Front Right: Capture 1 [3%] [on]
  
Simple mixer control 'Capture ADC Boost (+20dB)',0
  Capabilities: pswitch pswitch-joined
  Playback channels: Mono
  Mono: Playback [off]

Simple mixer control 'Capture Volume Steps',0
  Capabilities: enum
  Items: '+1.5dB Steps' '+0.75dB Steps'
  Item0: '+1.5dB Steps'
  Item1: '+1.5dB Steps'

Simple mixer control 'Left Capture Source',0
  Capabilities: enum
  Items: 'Mic 1' 'Mic 2' 'Line' 'Mono In' 'Headphone' 'Speaker' 'Mono Out' 'Zh'
  Item0: 'Mic 1'

Simple mixer control 'Right Capture Source',0
  Capabilities: enum
  Items: 'Mic 1' 'Mic 2' 'Line' 'Mono In' 'Headphone' 'Speaker' 'Mono Out' 'Zh'
  Item0: 'Mic 1'


내용을 설명하면

  Simple mixer control 'Capture',0                           <== 명령어 셋
  Capabilities: cvolume cswitch cswitch-joined        <== 명령어가 하는 역할 설명
  Capture channels: Front Left - Front Right 
  Limits: Capture 0 - 31                                <== 제어할수 있는 값의 범위     
  Front Left: Capture 15 [48%] [on]          <== 제어할수 있는 값을 퍼센트로 정의, 현재의 볼륨값의 상태표시
  Front Right: Capture 1 [3%] [on]

위의 것은 녹음할때의 볼륨을 제어하는 것이다.

아래와 같이 사용한다.


  amixer -c 0 sset 'Capture',0 100% 100% on


  • -c 옵션은 카드의 번호를 나타낸다. 사운드 카드가 여러개 존재할 수 있기 때문이다. 보통의 경우 1개이니 0번 인덱스
  • sset 옵션은 명령어를 나타낸다.  'Capture',0 제어를 하겠다는 뜻이다.  이 문자열은 amixer 에서 배출한 문자열이다.
  • 100% 100% on 는 left, right 볼륨을 각각 최대치로 놓고 켜라는 의미이다. 이것역시 amixer 에서 배출한 문자열이다.


또다른 형태의 명령어을 보자


Simple mixer control 'Left Capture Source',0
  Capabilities: enum
  Items: 'Mic 1' 'Mic 2' 'Line' 'Mono In' 'Headphone' 'Speaker' 'Mono Out' 'Zh'
  Item0: 'Mic 1'

이것은 left 채널의 녹음소스를 어떤것을 사용할지를 결정하는 명령어이다.


  amixer -c 0 sset 'Left Capture Source',0  'Mic 2'


위와 같이 사용하면 입력소스를 Mic 2 로 설정한다.

'Mic 2'  문자열 대시 Items 에 나열된 문자열중 하나를 선택하여 입력할 수 있다.

Item0 라는 곳은 현재 선택된 소스를 보여주고 있다.

이런 형태의 명령어는 enum 이라고 하여 코덱드라이버에 보면 이것들을 나열한 배열을 볼수 있다.


위에 언급한 2가지 형태의 명령어 설명으로 amixer 설명은 끝났다

알고 보면 간단한 것인데 모를때는 영어로 된 문자가 머이리 많이나오냐 하는 ..