고급 리눅스 사운드 아키텍처(Advanced Linux Sound Architecture, ALSA)


네이버, 다음 등에서 ALSA를 검색해 보면, 관련 글을 찾기 어렵네요. 

Google에서도 영어로 된 글은 쫌 있습니다만, 우리말로 된 글은 찾기 힘드네요. ㅠㅠ

그래서, 시간 날 때마다 조금씩 적어 볼까합니다.


우선, https://ko.wikipedia.org/wiki에는 아래와 같이 ALSA를 소개하고 있네요.


고급 리눅스 사운드 아키텍처(Advanced Linux Sound Architecture, ALSA)는 사운드 카드용 장치 드라이버를 제공하기 위한 리눅스 커널의 구성 요소이다. ALSA 프로젝트의 목표들 가운데 하나는 사운드 카드 하드웨어를 자동으로 구성하고 시스템에 여러 개의 사운드 장치를 멋지게 관리하는 것이다. JACK과 같은 두 개의 다른 프레임워크들은 ALSA를 사용하여 낮은 레이턴시로 고급 수준의 오디오 편집과 소리 조절을 수행할 수 있게 한다. Jaroslav Kysela가 이끄는 이 프로젝트는 1998년의 그레비스 울트라사운드 사운드 드라이버용 리눅스 장치 드라이버로 처음 시작하였으며 2002년에 2.5 개발 버전(2.5.4-2.5.5) 이후부터 리눅스 커널로부터 떨어져나온 뒤에 계속 개발되고 있다. 2.6 버전부터 이전 시스템인 오픈 사운드 시스템(OSS)을 기본으로 대체하고 있다.


원저자: Jaroslav Kysela

개발자: ALSA team

발표일: 1998

최근 버전: 1.1.1 / 2016년 03월 31일

프로그래밍 언어: C

운영 체제: 리눅스

종류: 오디오

라이선스: GPL 및 LGPL

웹사이트: www.alsa-project.org




ALSA PCM interface 메인 웹사이트는 아래와 같다.




위 링크의 ALSA PCM interface 메인 페이지를 열면 아래와 같이 PCM에 대한 기본 설명이 있습니다.


PCM (digital audio) interface


Although abbreviation PCM stands for Pulse Code Modulation, we are understanding it as general digital audio processing with volume samples generated in continuous time periods.


The analog signal is recorded via analog to digital converters (ADC). The digital value (de-facto a volume at a specific time) obtained from ADC can be further processed. The following picture shows a perfect sinus waveform:



Next image shows digitized representation:




As you may see, the quality of digital audio signal depends on the time (recording rate) and voltage resolution (usually in an linear integer representation with basic unit one bit).


The stored digital signal can be converted back to voltage (analog) representation via digital to analog converters (DAC).


One digital value is called sample. More samples are collected to frames (frame is terminology for ALSA) depending on count of converters used at one specific time. One frame might contain one sample (when only one converter is used - mono) or more samples (for example: stereo has signals from two converters recorded at same time). Digital audio stream contains collection of frames recorded at boundaries of continuous time periods.



PCM 이란?


위의 설명에서와 같이, PCM은 Pulse Code Modulation의 약자이고, 아날로그인 음성/소리 신호를 디지털 신호로 변경하는 대표적인 방법입니다.

아날로그를 디지털로 변경해 주는 것을 ADC (Analog to Digital Converter)라고 부르고, 디지털 신호를 아날로그 신호도 다시 복원해 주는 것을 DAC (Digital to Analog Converter)라 합니다.



Sample, Sampling, Sampling rate 란?


아날로그 신호를 디지털로 신호 바꾸기 위해서, 일정한 주기로 신호의 값을 읽어서, 일련의 디지털 값들로 나열하게 됩니다.

이 때, 만들어지는 하나의 디지털 값을 sample이라 하고, 이렇게 sample들을 만드는 과정을 sampling이라고 하며, sampling을 하지는 주기를 sampling rate라고 부릅니다.


(위의 설명에는 없지만, Nyquist–Shannon sampling theorem에서 sampling rate는 원음에서 사용하는 주파수 대역보다 최소한 2배이상이여만 합니다. 그렇지 않을 경우에는 원음으로 복원할 때, 왜곡이 발생하게 됩니다. 

최소한 2배이상이면, 원음에 가까운 음원을 복원할 수 있기는 하지만, sample들의 중간값들은 보간법[interpolation , 補間法]으로 채워야 하기 때문에, 고품질을 원하는 시스템에서는 원음에 보다 더 가깝게 복원하기 위해서 2배보다 더 빠르게 over sampling을 합니다.)



ALSA에서 frame 이란?


sample들이 모여서 frame이 됩니다.

ALSA에서 mono인 경우에는 하나의 frame이 하나의 sample을 가집니다.

(예를들어, stereo의 경우에는 하나의 frame이 두개의 sample을 가질 수 있습니다.)


ALSA API 설명에서 대부분 기본 단위로 frame을 사용하고 있기 때문에, frame이라는 용어를 정확하게 이해를 하고 있는 것이 중요하다고 생각합니다. 

예를 들어, 기본적으로 16bit PCM이 많이 사용되는데, Mono 이고 16bit PCM인 경우라면, 하나의 frame은 2byte가 됩니다.



FramesPeriods


A frame is equivalent of one sample being played, irrespective of the number of channels or the number of bits. e.g.

  • 1 frame of a Stereo 48khz 16bit PCM stream is 4 bytes.
  • 1 frame of a 5.1 48khz 16bit PCM stream is 12 bytes.

A period is the number of frames in between each hardware interrupt. The poll() will return once a period.

The buffer is a ring buffer. The buffer size always has to be greater than one period size. Commonly this is 2*period size, but some hardware can do 8 periods per buffer. It is also possible for the buffer size to not be an integer multiple of the period size.

Now, if the hardware has been set to 48000Hz , 2 periods, of 1024 frames each, making a buffer size of 2048 frames. The hardware will interrupt 2 times per buffer. ALSA will endeavor to keep the buffer as full as possible. Once the first period of samples has been played, the third period of samples is transfered into the space the first one occupied while the second period of samples is being played. (normal ring buffer behaviour).


Additional example


Here is an alternative example for the above discussion.

Say we want to work with a stereo, 16-bit, 44.1 KHz stream, one-way (meaning, either in playback or in capture direction). Then we have:

  • 'stereo' = number of channels: 2
  • 1 analog sample is represented with 16 bits = 2 bytes
  • 1 frame represents 1 analog sample from all channels; here we have 2 channels, and so:
    • 1 frame = (num_channels) * (1 sample in bytes) = (2 channels) * (2 bytes (16 bits) per sample) = 4 bytes (32 bits)
  • To sustain 2x 44.1 KHz analog rate - the system must be capable of data transfer rate, in Bytes/sec:
    • Bps_rate = (num_channels) * (1 sample in bytes) * (analog_rate) = (1 frame) * (analog_rate) = ( 2 channels ) * (2 bytes/sample) * (44100 samples/sec) = 2*2*44100 = 176400 Bytes/sec

(출처 : https://www.alsa-project.org/main/index.php/FramesPeriods)



(그림 출처 : http://www.linuxjournal.com/node/6735/print)










반응형

+ Recent posts