#!if 넘어옴1 != null
''''''{{{#!if 넘어옴2 == null
{{{#!if 넘어옴1[넘어옴1.length - 1] >= 0xAC00 && 넘어옴1[넘어옴1.length - 1] <= 0xD7A3
{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴1[넘어옴1.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴1[넘어옴1.length - 1] < 0xAC00 || 넘어옴1[넘어옴1.length - 1] > 0xD7A3
은(는)}}}}}}{{{#!if 넘어옴2 != null
, ''''''{{{#!if 넘어옴3 == null
{{{#!if 넘어옴2[넘어옴2.length - 1] >= 0xAC00 && 넘어옴2[넘어옴2.length - 1] <= 0xD7A3
{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴2[넘어옴2.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴2[넘어옴2.length - 1] < 0xAC00 || 넘어옴2[넘어옴2.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴3 != null
, ''''''{{{#!if 넘어옴4 == null
{{{#!if 넘어옴3[넘어옴3.length - 1] >= 0xAC00 && 넘어옴3[넘어옴3.length - 1] <= 0xD7A3
{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴3[넘어옴3.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴3[넘어옴3.length - 1] < 0xAC00 || 넘어옴3[넘어옴3.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴4 != null
, ''''''{{{#!if 넘어옴5 == null
{{{#!if 넘어옴4[넘어옴4.length - 1] >= 0xAC00 && 넘어옴4[넘어옴4.length - 1] <= 0xD7A3
{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴4[넘어옴4.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴4[넘어옴4.length - 1] < 0xAC00 || 넘어옴4[넘어옴4.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴5 != null
, ''''''{{{#!if 넘어옴6 == null
{{{#!if 넘어옴5[넘어옴5.length - 1] >= 0xAC00 && 넘어옴5[넘어옴5.length - 1] <= 0xD7A3
{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴5[넘어옴5.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴5[넘어옴5.length - 1] < 0xAC00 || 넘어옴5[넘어옴5.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴6 != null
, ''''''{{{#!if 넘어옴7 == null
{{{#!if 넘어옴6[넘어옴6.length - 1] >= 0xAC00 && 넘어옴6[넘어옴6.length - 1] <= 0xD7A3
{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴6[넘어옴6.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴6[넘어옴6.length - 1] < 0xAC00 || 넘어옴6[넘어옴6.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴7 != null
, ''''''{{{#!if 넘어옴8 == null
{{{#!if 넘어옴7[넘어옴7.length - 1] >= 0xAC00 && 넘어옴7[넘어옴7.length - 1] <= 0xD7A3
{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴7[넘어옴7.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴7[넘어옴7.length - 1] < 0xAC00 || 넘어옴7[넘어옴7.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴8 != null
, ''''''{{{#!if 넘어옴9 == null
{{{#!if 넘어옴8[넘어옴8.length - 1] >= 0xAC00 && 넘어옴8[넘어옴8.length - 1] <= 0xD7A3
{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴8[넘어옴8.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴8[넘어옴8.length - 1] < 0xAC00 || 넘어옴8[넘어옴8.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴9 != null
, ''''''{{{#!if 넘어옴10 == null
{{{#!if 넘어옴9[넘어옴9.length - 1] >= 0xAC00 && 넘어옴9[넘어옴9.length - 1] <= 0xD7A3
{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴9[넘어옴9.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴9[넘어옴9.length - 1] < 0xAC00 || 넘어옴9[넘어옴9.length - 1] > 0xD7A3
은(는)}}}}}}}}}{{{#!if 넘어옴10 != null
, ''''''{{{#!if 넘어옴10[넘어옴10.length - 1] >= 0xAC00 && 넘어옴10[넘어옴10.length - 1] <= 0xD7A3
{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) == 0
는}}}{{{#!if ((넘어옴10[넘어옴10.length - 1] - 0xAC00) % 28) != 0
은}}}}}}{{{#!if 넘어옴10[넘어옴10.length - 1] < 0xAC00 || 넘어옴10[넘어옴10.length - 1] > 0xD7A3
은(는)}}}}}} 여기로 연결됩니다. #!if 설명 == null && 리스트 == null
{{{#!if 설명1 == null
다른 뜻에 대한 내용은 아래 문서를}}}{{{#!if 설명1 != null
{{{#!html 호주의 정보기관}}}에 대한 내용은 [[호주 보안정보국]] 문서{{{#!if (문단1 == null) == (앵커1 == null)
를}}}{{{#!if 문단1 != null & 앵커1 == null
의 [[호주 보안정보국#s-|]]번 문단을}}}{{{#!if 문단1 == null & 앵커1 != null
의 [[호주 보안정보국#|]] 부분을}}}}}}{{{#!if 설명2 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단2 == null) == (앵커2 == null)
를}}}{{{#!if 문단2 != null & 앵커2 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단2 == null & 앵커2 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명3 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단3 == null) == (앵커3 == null)
를}}}{{{#!if 문단3 != null & 앵커3 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단3 == null & 앵커3 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명4 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단4 == null) == (앵커4 == null)
를}}}{{{#!if 문단4 != null & 앵커4 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단4 == null & 앵커4 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명5 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단5 == null) == (앵커5 == null)
를}}}{{{#!if 문단5 != null & 앵커5 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단5 == null & 앵커5 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명6 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단6 == null) == (앵커6 == null)
를}}}{{{#!if 문단6 != null & 앵커6 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단6 == null & 앵커6 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명7 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단7 == null) == (앵커7 == null)
를}}}{{{#!if 문단7 != null & 앵커7 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단7 == null & 앵커7 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명8 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단8 == null) == (앵커8 == null)
를}}}{{{#!if 문단8 != null & 앵커8 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단8 == null & 앵커8 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명9 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단9 == null) == (앵커9 == null)
를}}}{{{#!if 문단9 != null & 앵커9 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단9 == null & 앵커9 != null
의 [[#|]] 부분을}}}}}}{{{#!if 설명10 != null
, {{{#!html }}}에 대한 내용은 [[]] 문서{{{#!if (문단10 == null) == (앵커10 == null)
를}}}{{{#!if 문단10 != null & 앵커10 == null
의 [[#s-|]]번 문단을}}}{{{#!if 문단10 == null & 앵커10 != null
의 [[#|]] 부분을}}}}}}#!if 설명 == null
{{{#!if 리스트 != null
다른 뜻에 대한 내용은 아래 문서를}}} 참고하십시오.#!if 리스트 != null
{{{#!if 문서명1 != null
* {{{#!if 설명1 != null
호주의 정보기관: }}}[[호주 보안정보국]] {{{#!if 문단1 != null & 앵커1 == null
문서의 [[호주 보안정보국#s-|]]번 문단}}}{{{#!if 문단1 == null & 앵커1 != null
문서의 [[호주 보안정보국#|]] 부분}}}}}}{{{#!if 문서명2 != null
* {{{#!if 설명2 != null
: }}}[[]] {{{#!if 문단2 != null & 앵커2 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단2 == null & 앵커2 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명3 != null
* {{{#!if 설명3 != null
: }}}[[]] {{{#!if 문단3 != null & 앵커3 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단3 == null & 앵커3 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명4 != null
* {{{#!if 설명4 != null
: }}}[[]] {{{#!if 문단4 != null & 앵커4 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단4 == null & 앵커4 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명5 != null
* {{{#!if 설명5 != null
: }}}[[]] {{{#!if 문단5 != null & 앵커5 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단5 == null & 앵커5 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명6 != null
* {{{#!if 설명6 != null
: }}}[[]] {{{#!if 문단6 != null & 앵커6 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단6 == null & 앵커6 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명7 != null
* {{{#!if 설명7 != null
: }}}[[]] {{{#!if 문단7 != null & 앵커7 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단7 == null & 앵커7 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명8 != null
* {{{#!if 설명8 != null
: }}}[[]] {{{#!if 문단8 != null & 앵커8 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단8 == null & 앵커8 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명9 != null
* {{{#!if 설명9 != null
: }}}[[]] {{{#!if 문단9 != null & 앵커9 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단9 == null & 앵커9 != null
문서의 [[#|]] 부분}}}}}}{{{#!if 문서명10 != null
* {{{#!if 설명10 != null
: }}}[[]] {{{#!if 문단10 != null & 앵커10 == null
문서의 [[#s-|]]번 문단}}}{{{#!if 문단10 == null & 앵커10 != null
문서의 [[#|]] 부분}}}}}}| 🔊 음향 소프트웨어 | ||
| {{{#!wiki style="margin:0 -10px -5px; min-height:calc(1.5em + 5px); word-break: keep-all" {{{#!folding [ 펼치기 · 접기 ] {{{#!wiki style="margin:-5px -1px -11px; letter-spacing: -.5px" | <colbgcolor=#f6f6f9,#2f3241><colcolor=#000,#fff> DAW | Ableton Live · ACID Pro · Adobe AuditionK · BandLab$BW · Bitwig StudioK · Cubase · FL StudioWK · FL Studio MobileB · Logic ProBK · 디지털 퍼포머 · Pro ToolsK · Reaper · Reason · Studio OneK · Nuendo · AudacityOFK · LMMSOFK · CakewalkF · GarageBandFBK · Music LineMK · Zenbeats$BK |
| 마스터링 분석, 편집 | 골드웨이브K · Steinberg Wavelab · Soundforge · MasVis · Auto-Tune · Melodyne · Ozone | |
| AI 마스터링 | 뮤닛 | |
| 녹음 | Windows 녹음기 · 삼성 음성 녹음 M | |
| 소프트웨어 신디사이저/목록 · 소프트웨어 신디사이저/목록/피아노 | ||
| VOCALOIDK[1] · 보카리나K · 보이스웨어 · 소프토크 · CeVIO · UTAUK[2] · Synthesizer VK | ||
| 시벨리우스$B · FinaleX · MuseScoreOFBK · Notion$BK · NoteWorthy Composer · Dorico$B · Guitar Pro | ||
| DominoF | ||
| 기타 | MAX/MSP · ASIO · VSTO | |
| 관련 문서 | 소프트웨어/목록 · 음악 관련 정보 | |
| B PC/모바일 공동지원 W 웹 기반 M 모바일 전용 O 오픈 소스 K 한국어 지원 F 프리웨어 $ 유·무료 공존 X 단종 | ||
1. 개요
ASIO(Audio Stream Input/Output)는 디지털 오디오 입출력에 대한 API 표준 규격이다. 스타인버그가 제정했으며 낮은 지연속도와 고품질 디지털 오디오 신호 인터페이스를 제공하는 것을 목적으로 한다.ASIO 표준 자체는 실체가 없는 규격이고, 실제 구현은 제조사가 제공한 커널 모드 드라이버와 DLL에 있다.
2. 기능
주로 Microsoft Windows에서 사용된다. DirectSound는 보통 게임을 즐기는 일반적인 사용자를 위해 사용된다면, ASIO는 주로 전문 음악인과 사운드 엔지니어를 위해 사용된다. 다채널, 다입력, 다출력, 여러 프로그램 동시 접근 등을 염두에 두고 설계되었다. 클래식 Mac OS 시절에는 Sound Manager의 레이턴시가 50ms 가까이 되는 등 별로 성능이 좋지 않아 맥에서도 사용되었지만, Mac OS X에서는 OS 자체 API인 Core Audio 쪽이 선호되어 더 이상 지원하지 않고 있다. 윈도우 역시 Windows Vista 이후 등장한 WASAPI가 안정성은 훨씬 좋아서 일반적인 청취 환경에서의 ASIO의 입지가 많이 좁아진 상황이다. 그럼에도, WASAPI는 10ms의 기본값에 해당하는 레이턴시 설정이 사실상 고정 되어 있어, 지연에 민감한 환경에서는 쓰기 까다로워 여전히 ASIO를 고집하는 유저나 스튜디오 환경은 존재한다.오디오 인터페이스와 고급형 사운드 카드가 지원하고 있다. 전문적인 오디오 녹음과 재생에 특화된 장치이며, 일반 사운드 카드보다 훨씬 고급 부품과 회로가 사용되고 실제 스튜디오에서 사용하는 마이크, 여러 전기 신호 크기가 다른 악기, 믹서와 ADAT 등으로 프로용 광단자 입출력 디지털 오디오 장비를 연결할 수 있게 된 것들이 대다수이다. 즉, 비싸다. 하지만 이 역시 입문자를 위해서 간단하게 최소한의 ASIO 입출력만 가능하도록 제작된 오디오 인터페이스도 많이 있다. 기타나 베이스를 연결하거나 콘덴서 마이크를 연결하여 사용하여 녹음을 할 것이 아닌 소프트웨어 신디사이저와 일반적인 오디오 신호 녹음, 재생 전용으로 20만 원 선에서 제품을 고를 수 있다. 그런데 몇몇 저가형 오인페들은 ASIO를 지원하지 않거나 지원해도 비트 량이 너무 적어 사실상 미지원이나 다름없는 제품들도 있으니 주의해야 한다. 베링거 사의 저가 오인페들은 ASIO를 지원하지 않는다. 이것도 구입하기가 어렵다면 ASIO4ALL 같은 가상 ASIO 지원 드라이버를 설치하면 된다. DirectSound의 100~500ms보다 지연시간이 줄기는 하지만, 연주를 해보면 느껴질 정도의 지연은 여전히 존재한다. 또 컴퓨터 사양이 낮으면 소리가 끊기거나 버벅거릴 수 있다.
2020년대 이후 출시되는 메인보드나 노트북들은 Realtek ASIO를 지원하는 경우가 많기 때문에 굳이 ASIO4ALL같은 가상 ASIO 드라이버를 설치하지 않아도 된다. 물론 고가의 사운드 카드나 오디오 인터페이스를 사용하는 것보다는 레이턴시가 높게 잡히지만 ASIO4ALL 등을 사용하는 것보다 훨씬 안정적으로 사용할 수 있다.
3. Low Latency
레이턴시는 소리가 날 때까지 걸리는 지연 시간을 뜻한다. 간단히 말해 처리 시간라고 생각해도 좋다. 실생활에서 Latency의 예는, 초등학교 교장 선생님 훈화에서 스피커마다 소리가 나오는 시간이 달라 듣는 사람이 거슬리는 경우이다. 이것이 각 스피커마다 Latency가 달라서 생기는 현상이다. Latency가 높아지는 원인은 다양하며, 일반적인 아날로그 회로에선 문제가 될 정도로 높아지지 않고, 디지털 체계에서 장치의 처리 속도에 의해 느려지는 경우가 대부분이다.Latency가 높다면 신디사이저를 누르자마자 음이 나오지 않기 때문에 연주할 때 상당히 거슬리게 되며, 일반적으로 10ms 이하면 지연을 거의 느낄 수 없다고 알려져 있고 [1] 다이렉트 모니터가 아닌 네이티브 모니터를 사용하는 경우[2] 인아웃이 합쳐진 라운드 트립 레턴시는 출력 레이턴시의 2배 또는 그 이상이기 때문에 낮으면 낮을수록 좋은 법이다.
DAW와 소프트웨어 신디사이저 등장 초기인 1990년대 중후반부터 Microsoft Windows 환경에서 실시간 오디오 입출력을 하는 것이 이전 대비 대단히 중요해졌다. 그러나 아무리 해도 해결할 수 없는 근본적인 문제가 숨어있었다. Windows 2000/XP에서 프로그램이 일반적인 방식으로 오디오 데이터를 출력하면 아래 그림의 오른쪽과 같은 과정을 거치게 된다.
| |
위 그림의 오른쪽을 보면, 잘 모르겠어도 뭔가 엄청나게 복잡해 보인다. 하드웨어를 추상화하고, 볼륨을 조절하는 믹서를 이렇게 위치시키면 운영체제를 만드는 입장에서는 좋을 것 같기도 하다. 그러나 거쳐야 하는 계층이 많다는 것은 그만큼 시간을 많이 잡아먹는다는 것을 뜻한다. 특히 이 중에 Kernel Wave Audio Mixer(이하 KMixer)가 자동으로 Sampling Rate를 변환하면서(PCM 48 kHz, 16-bit) 시간을 잡아먹는 것으로 악명이 높았다. KMixer를 거치면 Latency가 200 ~ 500 ms, DirectSound를 통해 거치지 않아도 50 ~ 100 ms 수준의 Latency가 발생했다.
그래서 위 그림의 왼쪽처럼 KMixer를 확실하게 우회하고, 중간에 있는 다른 계층을 없애버려서 응용 프로그램이 하드웨어인 사운드 카드에 디지털 오디오 신호를 이전 대비 훨씬 적은 계층을 통해서 전달할 수 있는 방법에 대한 고민이 시작되었고, 회사별로 여러 가지 방식이 쏟아져 나왔다. 이들 중 최종적으로 남은 것이 바로 Steinberg의 ASIO(Audio Streaming Input/Output)이며, 위 그림의 왼쪽과 같이 경로가 단축되면서 문제의 핵심이던 KMixer를 우회하게 되었다.
ASIO가 있는 쪽에 OpenAL이라는 다른 것을 볼 수 있는데, 이것은 ASIO가 사실상 업계 표준이지만 Steinberg에 귀속되어 있는 기술이기 때문에 오픈 소스 진영에서 제정한 Open Audio Library라는 같은 역할을 하는 또다른 표준이다. 이에 대해서는 링크 참고. 당연히 ASIO는 빠르게 시장에 퍼져나가서 사실상 표준이 되었다. 이후에 DirectX에도 KMixer를 우회하여 오디오 데이터를 출력할 수 있는 API가 추가되었다. 위 그림에서 DirectSound가 KMixer를 거치지 않고 우회하는 것이 바로 이것이다.
| |
Windows Vista부터 Microsoft는 WASAPI와, 이것과 같은 목적에 보다 추상화된 WaveRT API를 만들고, 디지털 오디오 출력 부분을 위와 같이 개선하였다. DirectSound나 MME를 사용하는 프로그램이라도 에뮬레이션을 통해 실제로는 WASAPI(Shared Mode)로 처리된다. CPT는 Cross Process Transport로, 디지털 오디오 데이터를 Windows Audio Service로 전달하는 역할을 한다. APO는 Audio Processing Object로, 디지털 오디오 데이터를 처리하기 위한 일종의 DSP 기능을 한다. KST는 Kernel Streaming Transport로, 디지털 오디오 데이터를 현재 실행 중인 컴퓨터에 장착된 오디오 장치에게 전달하기 위해 렌더링을 한다. 동작 구조상 WASAPI 단독 모드(Exclusive Mode)를 사용하면 변환이 일어날 여지가 없다. 출처 물론 WASAPI 자체만 그렇다는 것이고, 프로그램이나 사운드 카드[3]에서 변환이 일어날 가능성은 있다.
4. WASAPI와 비교
WASAPI 공유 모드의 믹서와 음향 효과를 통과하면 공유 모드의 레이턴시가 발생하고 특정 상황이 아니라면 Bit Perfect가 보장되지 않는다.[4] WASAPI 단독 모드의 경우 응용 프로그램에서 바로 오디오 드라이버로 데이터가 넘어가기 때문에 ASIO와 별다른 차이가 없다. 과거에는 대부분의 DAW가 ASIO를 기본 입출력으로 사용하기 때문에 DAW를 사용한다면 ASIO 사용이 사실상 필수적이었으나, Windows 10-11이 사용되는 현재는 대부분의 DAW가 WASAPI를 지원하므로 옛말이다.Windows의 마이크 접근 권한 설정은 WASAPI에만 적용되기 때문에 Windows 설정에서 마이크 접근 권한을 차단하더라도 응용 프로그램이 ASIO를 사용 중이라면 그것을 무시하고 마이크에 접근할 수 있다. 그리고 ASIO를 통해 마이크에 접근하면 마이크를 사용 중이라는 것을 알리는 작업표시줄 아이콘도 뜨지 않는다. 따라서 보안이 매우 중요한 장소라면 ASIO를 사용하는 오디오 인터페이스를 통해 마이크를 연결해두는 것을 기피하는 것이 좋을 수도 있다.[5] Windows 10 부터 추가된 WASAPI 동작 모드중 하나인 Low Latency 모드를 사용할 경우 WASAPI 스택 자체에 걸리는 처리 시간은 Shared 상태에서도 1.3ms에 불과하다.
다만 WASAPI Low Latency모드는 ASIO나 macOS Core Audio와 달리 상대적으로 역사가 짧은 편으로 이를 지원하는 드라이버와 소프트웨어는 매우 드물다. USB Audio 2.0 표준이나 내장 사운드 카드가 사용하는 HDA 규격을 지원해 별도의 드라이버가 없는 환경은 이를 지원하지만 외장 오디오 인터페이스와 같이 별도의 드라이버를 설치해야 사용이 가능한 장치들의 경우 WASAPI는 지원해도 WASAPI Low Latency 모드를 지원하지 않아 WASAPI Low Latency 모드에서 샘플 크기가 480@48kHz (10ms)로 고정되거나 그 아래로 동작하지 않고, 이 경우는 일반 WASAPI 처럼 60ms 이상의 높은 레이턴시를 가져서 DAW와 같이 저지연 환경이 중요한 상황에서는 사용할 수 없어 이런 상황에서는 WASAPI Execlusive 모드를 사용하거나 ASIO를 사용하는 방법밖에는 없다. 이러한 이유 등으로 Windows 기반의 DAW 시스템에서 ASIO의 입지는 macOS 환경과 달리 여전히 확고한 편.
5. 다른 운영체제와 비교
과거 Mac OS에는 Sound Manager라는 것이 있었는데 이것 때문에 50 ms 정도의 Latency가 발생했다. 그러나 Core Audio에는 Latency가 거의 발생하지 않는다. 애초부터 노리고 Latency를 최소화하도록 설계되었기 때문이다. [6]Linux의 경우 커널 드라이버인 ALSA와 유저모드 오디오 서버인 JACK, PulseAudio, PipeWire가 존재하며 극단적인 레이턴시 절감을 위해 ALSA를 바로 사용하는 경우도 있으나 ALSA의 경우 커널 인터페이스라 사용이 복잡한데다 하드웨어에 접근하는 것은 일반적으로 독점 접근(Exclusive)이 되는 관계로 보통 유저모드 서버를 사용하는것이 보통이다. PulseAudio의 경우 가장 많이 사용되던 드라이버였으나 레이턴시가 다소 높은 편이라 DAW와 같은 실시간 처리가 중요한 프로그램은 JACK이라는 인터페이스를 사용하였다. 하지만 JACK은 PulseAudio에 비해 저수준 API로 설계되어 유연성이 떨어지는 문제가 있고, 이 둘은 어쨌든 ALSA위에서 돌아야하므로 ALSA를 지원하는 프로그램을 사용하면 JACK을 동시에 사용할 수 없었고 그 반대도 마찬가지였다. 이에 따라 현대 리눅스 데스크탑들의 경우 이 둘의 장점을 합친 PipeWire가 등장하고 PipeWire는 자체 API는 물론 JACK과 PulseAudio의 호환 레이어를 탑재한데다 개발 자체도 낮은 레이턴시를 목표하고 개발되어 이 둘을 대체하고 표준으로 채택되고 있는 추세이며 이미 Ubuntu, Debian, Fedora등 메이저 배포판들은 PipeWire를 사용하고 있다.
추가적으로 보통 다른 우선순위가 높은 프로세스가 동작하면 자원 점유와 스레드 스케쥴링 문제로 불규칙한 레이턴시가 생기기 때문에 RT 커널을 사용하는 경우도 있으나 일반 커널을 사용해도 크게 문제가 생기거나 하지는 않는다.
데스크톱용 리눅스가 아닌 Android의 경우 레이턴시에 있어 한때 가장 안 좋은 구조를 가지고 있었다. 안드로이드 또한 리눅스 커널을 사용하므로 커널 드라이버 인터페이스인 ALSA를 사용하는것 까지는 같지만, 유저모드에서 프로그램들과 같이 Java기반 인터페이스인 AudioTrack인터페이스가 사용되었으나, 추상화된 구조부터 Java/Kotlin을 위한 가상머신 등으로 인한 오버헤드가 커 레이턴시가 100ms 이상으로 높다. 다만 Java/Kotlin API로 되어 있어 앱 개발자가 바로 사용할 수 있다는 장점으로 지금도 레이턴시가 중요하지 않은 앱은 이 API를 사용해서 돌아간다.
그 외로 네이티브 API인 OpenSL ES를 통해 저지연을 제공하나 저수준 API인 관계로 사용이 상대적으로 까다로운 편이라 8.0 Oreo 부터 AAudio(C)와 Oboe(C++)로 대체되었다.
6. 리듬 게임
ms 단위로 판정이 달라지는 리듬 게임 특성상 Low Latency가 굉장히 중요한데, 이를 보완하기 위해 ASIO가 도입되었다. 원래는 전용 사양이 마련된 오락실 전용 게임에서 드문드문 사용되었고 가정용 게임에서는 게임에서 제공하는 싱크 조절 기능으로 레이턴시를 어느 정도 보완할 수 있었기에 크게 부각되지 않았었다.그러다가 EZ2ON REBOOT : R에서 업데이트를 통해 도입되고 WASAPI에 익숙한 유저가 처음 ASIO 설정을 하고 첫 곡을 플레이 했을 때 정확한 판정보다 늦게 쳤다는 SLOW 판정을 폭탄처럼 맞을 정도로 레이턴시 감소에 아주 큰 효과를 보였다는 게 증명되면서 다른 PC 리듬 게임들에도 빠른 속도로 도입이 되었고, PC 리듬 게임이라면 필수로 도입해야 하는 표준 기능으로 자리잡았다.
대부분의 리듬 게임이 FMOD엔진을 사용한다.
- beatmania IIDX INFINITAS[7]
- beatoraja
- DJMAX RESPECT V
- EZ2ON REBOOT : R
- Lunatic Rave 2[8]
- MASH VP! Re:VISION
- Qwilight
- 사운드 볼텍스 익시드 기어 코나스테
- KALPA: Cosmic Symphony
- Sixtar Gate: STARTRAIL
- PLATiNA :: LAB
- 펌프 잇 업 RISE
7. 관련 링크
[1] Attack 이 긴 오케스트라 라이브러리면 레이턴시가 높아도 크게 문제를 못 느낄 확률이 있으나 Attack이 0에 가까운 악기들의 경우 이 레이턴시에 매우 민감해 차이를 느낄 가능성이 높다.[2] 마이크를 사용한 녹음 뿐만 아닌 하드웨어 신시사이저를 트랙에 집어 넣는 경우 등[3] 일부 사운드 카드는 44.1 kHz 샘플링 레이트를 지원하지 않는다.[4] 응용 프로그램의 비트 심도와 샘플레이트를 공유 모드의 비트 심도와 샘플레이트에 맞추기 위해 음원이 SRC(샘플레이트 변환기)를 통과하거나, 믹서의 볼륨을 100% 미만으로 조정하거나, 이퀄라이저 같은 음향효과를 활성화하거나, 음원이 다른 응용 프로그램의 오디오 출력과 혼합(Mix)될때는 비트 퍼팩트가 보장되지 않는다.[5] 마이크를 물리적으로 분리하거나 오디오 인터페이스에서 해당 마이크 채널을 완전히 음소거시키거나 마이크에 스위치가 있다면 스위치를 꺼 두어야 한다.[6] ASIO와 Core Audio 비교 시 Core Audio 쪽의 레이턴시가 최대 2배 더 많다. (RME 기준.)[7] 코나미제 게이밍 PC인 ARESPEAR나 ASUS SONAR XE 사운드 카드가 아니면 사용 불가능하다. 클라이언트 변조 등의 꼼수를 쓰면 다른 사운드 카드에서도 사용할 수 있지만 정상적인 방법이 아니므로 계정 제재 등의 불이익을 받을 위험이 있다.[8] BMS 구동기 중 최초로 ASIO를 지원한다.