๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[๋ฆฌ๋ ์ค ๋ฉํฐ๋ฏธ๋์ด ํ๋ก๊ทธ๋๋ฐ] ๋ฉํฐ๋ฏธ๋์ด์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด ๋ณธ๋ฌธ
[๋ฆฌ๋ ์ค ๋ฉํฐ๋ฏธ๋์ด ํ๋ก๊ทธ๋๋ฐ] ๋ฉํฐ๋ฏธ๋์ด์ ๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด
์ง์ง์ํ์นด 2024. 2. 13. 00:36<์์์ง ๋์ ์ฌ๋ฌผ์ธํฐ๋ท์ ์ํ ๋ฆฌ๋ ์ค ํ๋ก๊ทธ๋๋ฐ with ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ์์ ์ ์ฐธ๊ณ ํด์ ์์ฑํ์์ต๋๋ค :-)>
โญ ๋ฉํฐ๋ฏธ๋์ด
์ธ๊ฐ์ด ์ค๊ฐ์ผ๋ก ์ธ์ํ๋ ์ฌ๋ฌ ๋งค์ฒด๋ค์ ํผํฉ์ ์๋ฏธ
'๋ง์', '๋ค์ํ' ์ด๋ผ๋ ๋ป์ ๊ฐ์ง ๋ฉํฐ (Multi) ์ ์ ๋ฌ ๋ฑ์ ์๋จ, ๋ฐฉ๋ฒ, ๋งค์ฒด ๋ค์ ๋ปํ๋ ๋ฏธ๋์ด (Media) ์ ํฉ์ฑ์ด
์ธ๊ฐ์ ๊ฐ๊ฐ๊ธฐ๊ด์ ์ด์ฉํด์ ์๋ฆฌ, ์ด๋ฏธ์ง ๋ฑ์ ์ ๋ณด๋ฅผ ๋ฐ์๋ค์ด๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ค์ด๊ธฐ ์ํด ๋, ๊ท, ์ฝ, ํ, ํผ๋ถ ์ ์ค๊ฐ์ ์ฌ์ฉํ๋ค
์ธ๊ฐ์ ๊ฐ๊ฐ๊ธฐ๊ด์ ํตํด์ ์ธ์๋๋ ์ ๋ณด๋ฅผ ๋ฏธ๋์ด๋ผ๋ ๋จ์ด๋ก ํํํ ์ ์๋ค
๋์งํธ ๋ฏธ๋์ด๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋์ ๋ฏธ๋์ด๋ง ์ฌ์ฉ๋์ง ์๊ณ ์์ฑ, ์๋ฆฌ, ๋ฌธ์, ๊ทธ๋ฆผ, ๋์์ ๋ฑ์ ๋ฏธ๋์ด๊ฐ ํผํฉ๋ ํํ๋ก ์ฌ์ฉ๋๋๋ฐ, ์ด๋ฅผ ๋ฉํฐ ๋ฏธ๋์ด ๋ผ๊ณ ๋ถ๋ฅธ๋ค
๋์งํธ ๋ฏธ๋์์๋ ์ฌ๋ฌ ๋ฏธ๋์ด ์ค์์๋ ์ฃผ๋ก ์๊ฐ๊ณผ ์ฒญ๊ฐ์ ์ฌ์ฉํ๊ณ ์๋ค
โญ ์์ ์ฒด๊ณ
์์์ ๋น์ด ๋ฌผ์ฒด์ ์ํด์ ๋ฐ์ฌ๋์ด์ ์ฌ๋์ ๋์ ๊ด์ฐฐ๋ ๋น์ ํ๋์ ์๋ฏธํ๋ค
์์ฐ๊ณ์์ ์กด์ฌํ๊ณ ์๋ ์์์ ์ปดํจํฐ, ๋ชจ๋ํฐ, ์ปฌ๋ฌ ํ๋ฆฐํฐ ๋ฑ ์ฅ๋น๋ก ํํํ๋ ๋ฐ ํ๊ณ๊ฐ ์๋ค
์ด๋ฌํ ์์๋ค์ ํํํ๊ณ ์ ์ฌ๋ฌ ์์ ๋ชจ๋ธ๋ค์ด ๋ง๋ค์ด์ก์ง๋ง, ๊ฐ ๋ชจ๋ธ๋ณ๋ก ํํํ ์ ์๋ ์์์ ๋ฒ์์ ์ ํ์ด ์๋ค
๋ง์ด ์ฌ์ฉ๋๋ ๋ชจ๋ํฐ (RGB ๋ชจ๋)์ ์ธ์๋ฌผ (CMYK ๋ชจ๋) ์์์ ํํ ๋ฐฉ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋์ผํ๊ฒ ํํ๋์ง ์๋๋ค
์์, ์ฑ๋, ๋ช ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ HSI ์์ ๋ชจํ์ ์์ ์ฒ๋ฆฌ์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ค
์์ ์ ๋ ฅ ๋๋ฐ์ด์ค๋ YUV ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋๋ฐ, ์์์ ์์ถ์ ๋ง์ด์ฌ์ฉ๋๋ JPEG, MPEG ๊ฐ์ ์ฝ๋ฑ์์๋ YUV๋ฅผ ์ฌ์ฉํ๋ค
โ๏ธ RGB ์์ ๋ชจ๋ธ
๋น์ ํํํ๊ธฐ ์ํด์๋ RGB ์์ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ฉฐ, ์ด๋ ๋นจ๊ฐ์, ์ด๋ก์, ํ๋์ ์ ์ธ ๊ฐ์ง ์์ผ๋ก ํํ๋๋ค
์ด๋ฅผ ๋น์ ์ผ์์ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค
์ปดํจํฐ์์ ํ์๋ฅผ ์ํด์ ์ฃผ๋ก ์ฌ์ฉ๋๋ ์์ ๋ชจ๋ธ์ด๋ฉฐ, ๋ชจ๋ํฐ๋ ์ํ๊ด ๋ฑ์์ ์ฌ์ฉ๋๋ ๋น์ ํผํฉ์ ์ํ ์์ ๋ชจ๋ธ์ด๋ค
โ๏ธ CMY/CYMK ์์ ๋ชจ๋ธ
์ฒญ๋ก์, ์ํ์, ๋ ธ๋์์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ด๋ฅผ ์์ ์ผ์์ ์ด๋ผ ๋ถ๋ฅธ๋ค
์ธ ๊ฐ์ง ์์ ๋ชจ๋ ํฉํ๋ฉด ๊ฒ์์์ด ๋์์ผ ํ์ง๋ง, ์ค์ ์ ์ผ๋ก ์งํ ํ์์ด ๋์ค๋ฏ๋ก ๊ฒ์ ์์ ์ถ๊ฐํด์ CYMK ๋ชจ๋ธ์ ์ฌ์ฉํ๋ค
โ๏ธ HSI/HSV ์์ ๋ชจ๋ธ
์์, ์ฑ๋, ๋ช ๋ ์ ์ธ ๊ฐ์ง๋ฅผ ์ด์ฉํด์ ์์์ ๋ํ๋ธ๋ค
์์์ ์์ ๋ชจ๋ธ์ ์์ผ๋ก ๋ค์ํ ํ์ฅ์ด ๊ด์ธก์์๊ฒ์ ๋๊ปด์ง๋ ๋๋
์ฑ๋๋ ๋ฐฑ์์ผ๋ก ํฌ์๋์ง ์๋ ์๊น์ ์ ๋ (์์์ฑ, ํํ ์ ๋)
๋ช ๋๋ ๋น์ด ๋ฌผ์ฒด์ ๋ฐ์ฌ๋์ด ๋๊ฒจ์ง๋ ๋ฐ๊ธฐ์ ๊ฐ๋
โ๏ธ YUV ์์ ๋ชจ๋ธ
์์ ๊ณต๊ฐ์ ์ปฌ๋ฌ TV ์์ ์ฌ์ฉ๋๋ ์ ํํ ๋ฐฉ์์ผ๋ก YUV, YIQ ๋ ์๋ ๋ก๊ทธ์์ ์ฌ์ฉํ๊ณ YCbCr ์ JPEG/MPEG ์ฝ๋ฑ์ด๋ ๋์งํธ ๋ฐฉ์ก์์ ์ฌ์ฉํ๋ค
Y๋ ๋ฐ๊ธฐ ์ ๋์ธ ํ๋
IQ/UV/CrCb๋ ๋น๋์ค ์ ํธ์ ์์ ์ ๋ณด๋ฅผ ํ์ฑํ๋ฉฐ ์์ ์ด๋ผ ํ๋ค
์ปฌ๋ฌ์ ํ์๋ฅผ ์ํด์ ์ฌ์ฉํ๋ RGB ์์ ๋ชจ๋ธ์ ํ๋ฐฑ TV ์์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค
์ด๋ฅผ ์ํด YUV ๋ชจ๋ธ์ด ๋์ด. ์ปฌ๋ฌ ๋ฐฉ์ก์ YIQ ๋ก ์ก์ถํ๋๋ฐ, ์ฌ๊ธฐ์ Y๊ฐ ๋ฐ๋ก ํ๋ฐฑ TV ์์ ์ฌ์ฉํ๋ ๋ฐ๊ธฐ์ ๋์ผํ ์ ํธ์ด๋ฏ๋ก YUV ๋ฅผ ์ฌ์ฉํด์ ํ๋ฐฑ TV ์์ ํธํ์ฑ์ ์ ์งํ ์ ์์๋ค
โญ ์ฌ์ด๋
์๋ฆฌ๋ ์ธ๊ฐ์ด ๋งํ๋ ์์ฑ์ด๋ ์ ๊ธฐ๊ฐ ๋ด๋ ์ ๊ธฐ์ ๋ฑ์ ๋ค์ํ ํํ๊ฐ ์กด์ฌํ๋ค
์๋ฆฌ๋ ๊ณต๊ธฐ ์ ์์ ๋ณด์ด์ง ์๋ ์ง๋์ผ๋ก ์์ํ ์๋ฉด์ ๋์ ๋์ก์ ๋ ๋ณผ ์ ์๋ ๋ฌผ๊ฒฐ์ฒ๋ผ ๊ณต๊ธฐ ์ค์์ ํผ์ ธ๊ฐ๋ค
์๋ฆฌ์ ์ ํ๋ ๊ณต๊ธฐ์ ์๋ฐ๋ก ํ์ํ ์ ์๋๋ฐ, ์ด๋ ์ฌ์ธ (sine) ํํ์ ํ๋์ผ๋ก ๋ํ๋ผ ์ ์๊ณ , ์ด๋ฌํ ํ๋์ ์ฃผํ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค
ํ๋์ ์ฃผํ์ ์ค์ ์ธ๊ฐ์ด ๋ค์ ์ ์๋ ๋ฒ์๋ฅผ ์๋ฆฌ ๋ผ๊ณ ํ๋ค
์ฌ๋์ ์ฒญ๊ฐ ๋ฒ์ 9๊ฐ์ฒญ ์ฃผํ์)๋ 20Hz ~ 20KHz
์ผ๋ฐ ์ฌ๋์ด ๋งํ ์ ์๋ ์ธ์ด์ ์ง๋ ์๋ 1 ~ 3KHz
์ฌ๋์ด ๋ผ ์ ์๋ ์ฃผํ์ ๋ 100Hz ~ 6KHz
โ๏ธ ์๋ ๋ก๊ทธ / ๋์งํธ ์ ํธ ๋ณํ
์ค์ํ์์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ค๋์ค๋ ์ด๋ฏธ์ง์ ํํ๋ ๋ฐ์ดํฐ์ ๊ฐ์ด ์๊ฐ์ ๋ณํ์ ๋ฐ๋ผ์ ์์ฐจ์ ์ผ๋ก ๋ณํํ๋ ์๋ ๋ก๊ทธ ํ๋์ ํํ๋ก ๋ํ๋ผ ์ ์๋ค
์ปดํจํฐ์์๋ ๋์งํธ ํํ์ ๋ฐ์ดํฐ๋ง ์ดํดํ๊ธฐ ๋๋ฌธ์ ์ปดํจํฐ์์์ ์ฒ๋ฆฌ๋ฅผ ์ํด ์๋ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋์งํธ ํํ๋ก ๋ณํํ๋ ๊ณผ์ ์ด ํ์ํ๋ค
โ๏ธ ๋์งํธ ๋ณํ
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์๋ฆฌ, ์์ ๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ ์๋ ๋ก๊ทธ ์ ํธ
์๋ ๋ก๊ทธ ์ ํธ๋ ๋์งํธ ์ ํธ์๋ ๋ฌ๋ฆฌ ์๊ฐ์ ๋ฐ๋ผ์ ์ฐ์์ ์ผ๋ก ๊ฐ์ด ๋ณํ
๋์งํธ ์ ํธ๋ ์์ ๋ฒ์๋ก ๋๋์ด์ง ์๊ฐ์ ์์ญ์์ ์ด์ฐ์ ์ธ ๊ฐ์ ๊ฐ์ง๋ค
์๋ ๋ก๊ทธ ์ ํธ๋ฅผ ๋์งํธ ์ ํธ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ ํ๋ณธํ (Sampling), ์์ํ (Quantization), ๋ถํธํ (Encoding) ์ ์ธ ๊ฐ์ง ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค
๋จผ์ ์๋ ๋ก๊ทธ ์ ํธ๋ฅผ ๋์งํธ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ์ ์๋๋ก ํ๋ณธํ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋๋ฐ, ์๊ฐ ์์ญ (x์ถ) ์ ์ผ์ ํ ๊ตฌ์ญ์ผ๋ก ๋๋๊ณ ๊ฐ ๊ตฌ์ญ๋ง๋ค ์ ํธ์ ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ตฌํ๋ค
์์ํ ๊ณผ์ ์์ ๊ตฌํด์ง ์ํ ๋ฐ์ดํฐ์ ํฌ๊ธฐ (y์ถ)๋ฅผ ๋์งํธ ๋จ์๋ก ๋ฐ๊พผ ํ, ๋ง์ง๋ง์ผ๋ก ๋์งํธ ๋จ์์ ํฌ๊ธฐ๋ฅผ 0๊ณผ 1์ ๋ถํธ (์์ถ)๋ก ์ค์ด๋ ๋ถํธํ ๊ณผ์ ์ ๊ฑฐ์ณ์ ๋์งํธ ์ ํธ๋ก ๋ฐ๋๊ฒ ๋๋ค
โ๏ธ ์ค๋์ค ๋ฐ์ดํฐ์ ๋์งํธ ๋ณํ
์ค๋์ค ๋ฐ์ดํฐ์ ํ๋ณธํ๋ ์ํ๋ง ๋ ์ดํธ๋ผ๋ ์ํ์ ๋จ๊ณ (๊ฐ์) ๋ฅผ ๊ตฌํ๋ ๋จ๊ณ๋ก x ์ถ์ ๋จ์๋ฅผ ์ ํ๋ ๊ฒ
์์ํ๋ y์ถ์ ๋จ์๋ฅผ ์ ํ๋ ๊ฒ์ธ๋ฐ ๋ณดํต 8๋นํธ, 16๋นํธ๋ฅผ ์ฌ์ฉํ์ง๋ง, ๊ณ ํ์ง ์ค๋์ค๋ 24๋นํธ ์ด์ฉํจ
โ๏ธ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ํ๋ณธํ
์์ ์ด๋ฏธ์ง๋ ์ค์บ๋๋ ๋์งํธ ๋๋ฉ๋ผ์ ์๋ ์ด๋ฏธ์ง ์ผ์๋ฅผ ํตํด์ ์ ๊ธฐ์ ์ธ ์ ํธ๋ก ๋ณ๊ฒฝ๋๋ค
์ ๊ธฐ์ ์ธ ์ ํธ๋ก ๋ณ๊ฒฝ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋์งํธํํ๊ธฐ ์ํด์๋ ๋จผ์ ํ๋ณธํ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค
ํ๋ณธํ ๊ณผ์ ์์ ์ด๋ฏธ์ง์ ๋ถ์ฐ์์ ์ธ ์ ์ ํฝ์ (pixel) ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค
์ด๋ฏธ์ง๋ 2์ฐจ์์ ์ธ ๊ตฌ์กฐ๋ก ์ด๋ค์ ธ์๊ธฐ ๋๋ฌธ์ 2์ฐจ์์ ์ธ ๊ณต๊ฐ (x์ถ๊ณผ y์ถ) ์ ๋์์ ํ๋ณธํํด์ผ ํ๋ค
์ ์ฒด ์ด๋ฏธ์ง์ x์ถ๊ณผ y์ถ์ ํฝ์ ์ ํฌ๊ธฐ๋ฅผ ํด์๋ (Resolution) ์ด๋ผ ๋ถ๋ฅธ๋ค
ํฐ ํด์๋๋ฅผ ๊ฐ์ง๋ ์ด๋ฏธ์ง๋ ๋ ๋ง์ ์ ์ฅ ๊ณต๊ฐ์ ํ์๋ก ํ๋ค
โ๏ธ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ์์ํ
ํ๋ณธํ์์ ์ด๋ฏธ์ง์ ํด์๋๊ฐ ๊ฒฐ์ ๋๋ฉด ์์ํ ๋จ๊ณ์์๋ ํฝ์ ์ ๋ฐ๊ธฐ ๊ฐ์ ์์ํํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค
๊ฐ ํฝ์ ์ ๋ํ ์์น ๊ฐ์ ์์์ด ๋๋๋ฐ ํฌ๋ฌ ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ RGB ๊ฐ์ด ๋๊ณ , ํ๋ฐฑ ์ด๋ฏธ์ง ๊ฒฝ์ฐ ๋น์ ๊ฐ๋ ์ฆ ๋ฐ๊ธฐ์ ๊ฐ์ด ๋๋ค
์์ํ์์ ๊ฐ๊ฐ์ ํฝ์ ์ ๋ฐ๊ธฐ ๊ฐ์ผ๋ก ์ผ๋ง์ ๋นํธ๋ฅผ ํ ๋นํ ๊ฒ์ ๊ฒฐ์ ํด์ผ ํ๋ค
ํํํ ์ ์๋ ์์์ ์๊ฐ 2^G ์ธ ๊ฒฝ์ฐ G๋นํธ ์์ํ๋ผ๊ณ ํ๋ค
์์ํ ๋จ๊ณ์์ ์์์ ์๋ฅผ ์ค์ด๋ ์ด์ ๋ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํฌ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์กฐ์ ํด์ ์ ์ฅ๋๋ ์์ ์ค์ด๊ธฐ ์ํด์์ด๋ค
โ๏ธ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ๋ถํธํ
์ผ๋ฐ์ ์ธ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ ํด์๋์ ๊ฐ ํฝ์ ์ ํ ๋น๋ ๋นํธ ์๋ก ๊ณ์ฐํ ์ ์๋ค
์ด๋ฏธ์ง์ ์์ํ ๋จ๊ณ๊ฐ ๋๋๋ฉด ๋ถํธํ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๊ฒ ๋๋ค
๋ถํธํ๋ฅผ ํตํด์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ค์ผ ์ ์๋๋ฐ, ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ฏธ์ง์์ ์ฌ๋์ ๋์ ๋ฏผ๊ฐํ์ง ์๋ ๋ถ๋ถ์ ์ญ์ ํ๋ ๋ฐฉ๋ฒ๊ณผ ์์ ๋งต์ ์ฌ์ฉํ์ฌ ๊ฐ ํฝ์ ์ ๋ค์ด๊ฐ๋ ๋นํธ ์ (์์์ ์)๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ ๋ฑ์ด ์ฌ์ฉ๋๊ณ ์๋ค
โญ ๋ฆฌ๋ ์ค ๋ฉํฐ๋ฏธ๋์ด ์์คํ
๋ฆฌ๋ ์ค ์ปค๋์์๋ ๋ฉํฐ๋ฏธ๋์ด๋ฅผ ์ํด ๋ค์ํ ์์คํ ํธ์ถ์ ์ ๊ณตํ๋ค
โญ ๋ฆฌ๋ ์ค ์ฌ์ด๋ ํ๋ก๊ทธ๋๋ฐ
์ปค๋ ์์ค์์ ์ค๋์ ์ถ๋ ฅ์ ์ํด OSS์ ALSA ์์คํ ์ ์ง์ํ์์ผ๋ฉฐ,
X ์๋์์ ๋ฉํฐ๋ฏธ๋์ด ํ๊ฒฝ์ ์ ๊ณตํ๊ธฐ ์ํด aRits ๋ EsounD ๋ฑ ์ฌ์ด๋ ์์คํ ์์ JACK, PolyAudio ๋ก ๋ณ๊ฒฝ๋จ
โ๏ธ ๋ฆฌ๋ ์ค ์ฌ์ด๋ ์์คํ
์ ๋์ค์์๋ ํ์ผ, ๋๋ ํฐ๋ฆฌ, ๋๋ฐ์ด์ค ๋ชจ๋ ๊ฐ์ ํ์ผ ์์คํ ์ ํตํด์ ํ์ผ๋ก ์ทจ๊ธ๋๋ค
OSS ๋ ๋ฆฌ๋ ์ค์ ์ ๋์ค ํ๋ซํผ์์๋ ์ฌ์ฉํ ์ ์๋ค
ALSA ๋ ๊ณ ํ์ง์ ๋ฆฌ๋ ์ค ์๋ฒ ์์คํ ์ ๊ฐ๋ฐํ์ฌ, ๋ฉํฐ์ค๋ ๋์ 2๊ฐ ์ด์์ CPU๋ฅผ ์ฌ์ฉํ๋ ๋์นญํ ๋ค์ค์ฒ๋ฆฌ (SMP) ์์์ ๋ฌธ์ ์ ๋ค์ ๊ฐ์ ํจ
ALSA ๋ ๊ธฐ์กด์ ์กด์ฌํ๋ OSS ์์ฉ ํ๋ก๊ทธ๋จ ์ง์์ ์ํด ์ ๋ฎฌ๋ ์ด์ ๋ํผ (wrapper) ๋ผ์ด๋ธ๋ฌ๋ฆฌ (liboss) ๋ฅผ ์ ๊ณตํ๋ค
๋ฏน์, ์ฌ์ด๋ ํ๋ ์ด์ด ๋ฑ ๋ง์ ์ฝ์ ๊ธฐ๋ฐ์ ์ ํธ๋ฆฌํฐ ๋๊ตฌ๋ค์ ์ ๊ณตํ๋ค
// ALSA ์์ OSS ์ฌ์ฉํ๊ธฐ
sudo apt-get install oss-compat alsa-oss
โ๏ธ ALSA ์ ํธ๋ฆฌํฐ
๋ฉํฐ๋ฏธ๋์ด ์ฌ์ฉ๊ณผ ๊ด๋ จ๋ amizer, alamixer, alsactl, aply ๋ฑ ๋ค์ํ ์ ํธ๋ฆฌํฐ๋ฅผ ์ ๊ณตํ๋ค
๋ณผ๋ฅจ์ ์กฐ์ ํ๊ณ ์ถ์ผ๋ฉด alsamixer
์ค๋์ค ํ์ผ์ ์ฌ์ํ๊ณ ์ถ์ผ๋ฉด aplay
๋ผ์ฆ๋ฒ ๋ฆฌ ํ์ด์์ ์ฌ์ด๋๊ฐ ๋์ค๋์ง ํ์ธํ๊ณ ์ถ์ผ๋ฉด speaker-test
๋ผ์ฆ๋ฒ ๋ฆฌํ์ด์์๋ ์ฌ์ด๋์ ์ถ๋ ฅ๋ง์ ์ง์ํ๊ณ ๋ น์์ ์ํ ์ค๋์ค ๋๋ฐ์ด์ค๊ฐ ์๋ค
์ฌ์ด๋๋ฅผ ์ ๋ ฅํ๊ธฐ ์ํด์๋ ์ธํ์จ Pi ์ค๋์ค ์นด๋๋, USB ์ฌ์ด๋ ์นด๋ ๊ฐ์ ํ๋์จ์ด๊ฐ ํ์ํ๋ค
โ๏ธ ALSA ๊ตฌ์กฐ
๋ง์ ์ข ๋ฅ์ ์ฌ์ด๋ ์นด๋๋ค์ ์ง์ํ๊ธฐ ์ํ ์ปค๋ ๋๋ฐ์ด์ค ๋๋ผ์ด๋ธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ตฌ์ฑ๋์ด ์๋ค
์ ์ด ์ธํฐํ์ด์ค: ์ฌ์ฉ๊ฐ๋ฅํ ๋๋ฐ์ด์ค๋ค์ ๋ํ ์ ๋ณด ํ์๋ ์ํ๊ฐ ๋ณํ๋ฉด ์๋ ค์ฃผ๊ธฐ
PCM ์ธํฐํ์ด์ค: ์ค๋์ค ์ ์ถ๋ ฅ์ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋๋ฐ์ด์ค
๋ฏน์ ์ธํฐํ์ด์ค: ์ฌ์ด๋ ๋ณผ๋ฅจ์ ์ค์ ๊ณผ ์ ๋ ฅ ๋๋ฐ์ด์ค์ ์ ํ ๊ธฐ๋ฅ ์ ๊ณต
Raw MIDI ์ธํฐ๋ฒ ์ด์ค: ๋ฏธ๋ ํ์ค ์ธํฐํ์ด์ค๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ ๊ณต
ํ์ด๋จธ ์ธํฐํ์ด์ค: ์ค๋์ค ๋๋ฐ์์ค์์ ์ฌ์ด๋ ์ด๋ฒคํธ์ ๋๊ธฐํ์ ์ฌ์ฉ๋๋ ๋ด๋ถ ํ์ด๋จธ ์ฌ์ฉ
์ํ์ ์ธํฐํ์ด์ค: ํด๋ผ์ด์ธํธ์ ํฌํธ ๊ฐ์ ๋ฏธ๋ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์ฌ์ฉ
โญ ์ฌ์ด๋ ํ๋ก๊ทธ๋๋ฐ
ALSA ๋ ์ค๋์ค๋ฅผ ์ํ PCM ๋ฐ์ดํฐ๋ฅผ ๋ น์ํ๊ณ ์ถ๋ ฅํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค
์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํ๋ API ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ asoundlib.h ํค๋ ํ์ผ์ ํฌํจํ๋ค
1. ๋ น์์ด๋ ์ฌ์์ ์ํ ์ธํฐํ์ด์ค ์ด๊ธฐ (snd_pcm_open() ํจ์)
2. ์ค๋์ค ๋๋ฐ์ด์ค์ ๋งค๊ฐ ๋ณ์ (์ ๊ทผ๋ชจ๋, ๋ฐ์ดํฐ ํฌ๋งท, ์ฑ์ปฌ, ์ํ๋ง ๋ ์ดํธ) ์ค์ ํ๋ค
3. ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ ์ค์ด๋ผ๋ฉด PCM ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ PCM ๋ฐ์ดํฐ๋ฅผ ์ด๋ค (snd_pcm_writei() ํจ์)
4. ์์ ๊ณผ์ ์ด ๋ชจ๋ ๋๋๋ฉด ์ธํฐํ์ด์ค๋ฅผ ๋ซ๋๋ค (snd_pcm_close() ํจ์)
// alsapcm.c
#include <stdio.h> /* perror( ) ์์คํ
ํธ์ถ์ ์ํด ์ฌ์ฉ */
#include <limits.h> /* SHRT_MAX ์์๋ฅผ ์ํด์ ์ฌ์ฉ */
#include <math.h> /* sin( ) ํจ์๋ฅผ ์ํด์ ์ฌ์ฉ */
#include <alsa/asoundlib.h> /* ALSA ์ฌ์ด๋ ์์คํ
์ ํค๋ ํ์ผ */
#define BITS 2 /* ์ํ๋น 16๋นํธ์ ํฌ๊ธฐ : 2 × 8 = 16bit */
#define FRAGMENT 8
#define DURATION 5.0 /* sec */
#define MODE 1 /* ์ฑ๋ ์: mono */
#define FREQ 44100 /* ์ํ๋ง ๋ ์ดํธ */
#define BUFSIZE (int)(BITS*FREQ*DURATION*MODE) /* ์์ Duration ๊ธฐ๊ฐ์ ์ฌ์ํ ์ ์๋ ๋ฒํผ์ ํฌ๊ธฐ */
int setupDSP(snd_pcm_t *dev, int buf_size, int format, int sampleRate, int channels);
int main(int argc, char **argv)
{
snd_pcm_t *playback_handle;
double total = DURATION, t; /* ์ฌ์ ์๊ฐ์ 5์ด */
int freq = 440; /* ์ฌ์์์ ์ฃผํ์๋ 440Hz(A) */
int i, frames, count = 1; /* ๋ฐ๋ณต ํ์ */
char *snd_dev_out = "plughw:0,0"; /* ์ค๋์ค ๋๋ฐ์ด์ค์ ์ด๋ฆ */
short buf[BUFSIZE]; /* ์
์ถ๋ ฅ ์ค๋์ค๋ฅผ ์ํ ๋ฒํผ */
/* ALSA ์ค๋์ค ๋๋ฐ์ด์ค ์ด๊ธฐ */
if(snd_pcm_open(&playback_handle, snd_dev_out, SND_PCM_STREAM_PLAYBACK, 0) < 0) {
perror("Cound not open output audio dev");
return -1;
}
/* ์ค๋์ค ๋๋ฐ์ด์ค ์ค์ */
if(setupDSP(playback_handle, BUFSIZE, SND_PCM_FORMAT_S16_LE, FREQ, MODE) < 0) {
perror("Cound not set output audio device");
return -1;
}
/* ์ ํํ ๋ฐ์ดํฐ ์์ฑ */
printf("Make Sine wave!!!\n");
for(i = 0; i < BUFSIZE; i++) {
t = (total / BUFSIZE) * i;
buf[i] = SHRT_MAX * sin((int)(2.0 * M_PI * freq * t));
}
frames = BUFSIZE / (MODE * BITS);
while(count--) {
/* ์ค๋์ค ์ถ๋ ฅ์ ์ํ ์ค๋น */
snd_pcm_prepare(playback_handle);
/* ์ค๋์ค ๋ฐ์ดํฐ๋ฅผ ๋๋ฐ์ด์ค๋ก ์ถ๋ ฅ(์ฐ๊ธฐ) */
snd_pcm_writei(playback_handle, buf, frames);
}
/* ์ค๋์ค ๋ฒํผ ๋ฒ๋ฆฌ๊ธฐ */
snd_pcm_drop(playback_handle);
/* ์ค๋์ค ๋๋ฐ์ด์ค ๋ซ๊ธฐ */
snd_pcm_close(playback_handle);
return 0;
}
int setupDSP(snd_pcm_t *dev, int buf_size, int format, int sampleRate, int channels)
{
snd_pcm_hw_params_t* hw_params; /* ์ค๋์ค ๋๋ฐ์ด์ค ์ค์ ์ ์ํ ๋งค๊ฐ๋ณ์ */
snd_pcm_uframes_t frames; /* ์ฌ์ด๋ ์นด๋์ ๋ฒํผ ํ๋ ์ */
int fragments = FRAGMENT;
int bits = (format == SND_PCM_FORMAT_S16_LE)?2:1;
/* ์ค๋์ค ๋๋ฐ์ด์ค์ ๋งค๊ฐ๋ณ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น */
if(snd_pcm_hw_params_malloc(&hw_params) < 0) {
perror("Cound not allocate parameter");
return -1;
}
/* ์ค๋์ค ๋๋ฐ์ด์ค์ ๋งค๊ฐ๋ณ์๋ค์ ์ด๊ธฐํํ๋ค. */
if(snd_pcm_hw_params_any(dev, hw_params) < 0) {
perror("Cound not initialize parameter");
return -1;
}
/* ์ค๋์ค ๋ฐ์ดํฐ์ ์ ๊ทผ(access) ํ์
(์ธํฐ๋ฆฌ๋ธ๋, ๋
ผ์ธํฐ๋ฆฌ๋ธ๋)์ ์ค์ ํ๋ค. */
if(snd_pcm_hw_params_set_access(dev, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) {
perror("Cound not set access type");
return -1;
}
/* ์ํ์ ํฌ๋งท์ ์ค์ ํ๋ค: ๋ถํธ ์๋ 16๋นํธ ๋ฆฌํ ์๋์ */
if(snd_pcm_hw_params_set_format(dev, hw_params, format) < 0) {
perror("Cound not set sample format");
return -1;
}
/* ์ํ๋ง ๋ ์ดํธ๋ฅผ ์ค์ ํ๋ค: 44.1KHz(CD ์์ค์ ํ์ง) */
if(snd_pcm_hw_params_set_rate_near(dev, hw_params, &sampleRate, 0) < 0) {
perror("Cound not set sample rate");
return -1;
}
/* ์ฑ๋ ์ค์ : MONO(1) */
if(snd_pcm_hw_params_set_channels(dev, hw_params, channels) < 0) {
perror("Cound not set channel count");
return -1;
}
/* ํ๋ ์ ์ฃผ๊ธฐ ์ค์ */
if(snd_pcm_hw_params_set_periods_near(dev, hw_params, &fragments, 0) < 0) {
perror("Count not set fragments");
return -1;
}
/* ๋ฒํผ์ ํฌ๊ธฐ ์ค์ */
frames = (buf_size * fragments) / (channels * bits);
if(snd_pcm_hw_params_set_buffer_size_near(dev, hw_params, &frames) < 0) {
perror("Count not set buffer_size");
return -1;
}
buf_size = frames * channels * bits / fragments;
/* ์์์ ์ค์ ํ ์ค๋์ค ๋๋ฐ์ด์ค์ ๋งค๊ฐ๋ณ์๋ฅผ ALSA ์์คํ
์ ์ ์ฉ */
if(snd_pcm_hw_params(dev, hw_params) < 0) {
perror("Count not set HW params");
return -1;
}
return 0;
}
/*
์๋ฆฌ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด์๋ ์ถ๋ ฅ์ ์ํ ๋ฒํผ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํ๋ค
ํ์ํ ๋ฏธ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ค์์ ๊ณต์์ ์ด์ฉํด์ ๊ณ์ฐํ ์ ์๋ค
์ค๋์ค์ ํฌ๊ธฐ = ํ๋ณธํ์จ X ์์ํ ๋ํผ์ ํฌ๊ธฐ (๋นํธ ์) X ๋ชจ๋ (๋ชจ๋
ธ/์คํ
๋ ์ค) X ์๊ฐ (์ด)
PCM ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ํ์ํ ๋ฒ์ ํฌ๊ธฐ๋ฅผ ๋งคํฌ๋ก๋ก ์ ํฌํ์๋ค
์์ํ ๋นํธ 16๋นํธ, ์ํ๋ง ์ฃผํ์ 44.1KHz, ์ฑ๋์ ๋ชจ๋
ธ (1)์ ์ฌ์ฉํ๋ค
*/