-
Notifications
You must be signed in to change notification settings - Fork 8
AudioContext
Songwonseok edited this page Dec 13, 2020
·
2 revisions
- ๊ฐ๊ฐ์ด AudioNode๋ก ํํ์ด ๋๋ ์๋ก ์ฐ๊ฒฐ๋ ์ค๋์ค ๋ชจ๋์์ ๋น๋ ๋ ์ค๋์ค ์ฒ๋ฆฌ ๊ทธ๋ํ.
- ํ๋์ AudioContext ๋ด์ ์ฌ๋ฌ ๊ฐ์ AudioNode๊ฐ ํฌํจ๋๋ค.
- ๋ ธ๋ ์์ฑ, ์ค๋์ค ์ฒ๋ฆฌ, ๋์ฝ๋ฉ์ ํ๋ค.
- ๋งค๋ฒ ์๋ก์ด ์ค๋์ค ์ฝํ ์คํธ๋ฅผ ๋ง๋๋ ๊ฒ๋ณด๋ค ํ๋๋ฅผ ๋ง๋ค์ด ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ถ์ฒ๋๋ค.
- ์ฌ๋ฌ ๋ค๋ฅธ ์ค๋์ค ์์ค์ ํ์ดํ๋ผ์ธ์ ๋ํด ํ๋์ AudioContext๋ฅผ ์ฐ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
- AudioContext๋ฅผ ๋ซ๊ณ ์ฌ์ฉํ๋ ๋ชจ๋ ์์คํ ์ค๋์ค ์์์ ํด์ ํ๋ค.
- close๊ฐ ๋๋ฉด ์๋ก์ด ๋ ธ๋๋ฅผ ๋ง๋ค ์๋ ์์ง๋ง, audio data๋ฅผ decode ํ๋ ๊ฒ๊ณผ buffer ์์ฑ์ ๊ฐ๋ฅํ๋ค.
- close๋ฅผ ํ๋ค๊ณ ๋ชจ๋ AudioContext ์์ฑ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ํด์ ํด์ฃผ์ง๋ ์๋๋ค. ํ์ง๋ง AudioContext์ ์์ฑ ๋ฐ ์ฌ์ฉ์ ๋ฐฉํดํ ์ ์๋ ์์คํ ์ค๋์ค ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ๋ก ํด์ ํ๊ณ , ์ค๋์ค ์ปจํ ์คํธ์์ ์ค๋์ค ์๊ฐ์ ์งํ์ ์ค๋จํ๋ฉฐ ์ค๋์ค ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ค์งํ๋ค.
- return๋ Promise๋ ๋ชจ๋ AudioContext ์์ฑ ์ฐจ๋จ ๋ฆฌ์์ค๊ฐ ํด์ ๋๋ฉด resolve ๋๋ค.
- OfflineAudioContext์์ ํธ์ถ ์, INVALID_STATE_ERR ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
- return
- promise resolves with void
- ์ด์ ์ ์ผ์ ์ค์ง / ์ผ์ ์ค์ง ๋ ์ค๋์ค ์ปจํ ์คํธ์์ ์๊ฐ์ ์งํ์ ๋ค์ ์์ํ๋ค.
- OfflineAudioContext์์ ๋ถ๋ฆด ์ INVALID_STATE_ERR๋ฅผ ์ผ๊ธฐํ๋ค.
- return
- promise. ์ด๋ฏธ close๊ฐ ๋์ด์์๋ค๋ฉด ๊ฑฐ๋ถ๋๋ค.
susresBtn.onclick = function() {
if(audioCtx.state === 'running') {
audioCtx.suspend().then(function() {
susresBtn.textContent = 'Resume context';
});
} else if(audioCtx.state === 'suspended') {
audioCtx.resume().then(function() {
susresBtn.textContent = 'Suspend context';
});
}
}
- ์ค๋์ค ์ปจํ ์คํธ์์ ์๊ฐ์ ์งํ์ ์ผ์ ์ค๋จํ์ฌ ์ค๋์ค ํ๋์จ์ด ์ก์ธ์ค๋ฅผ ์ผ์์ ์ผ๋ก ์ค์งํ๊ณ ํ๋ก์ธ์ค์์ CPU / ๋ฐฐํฐ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ธ๋ค.
- OfflineAudioContext์์ ๋ถ๋ฆด ์ INVALID_STATE_ERR๋ฅผ ์ผ๊ธฐํ๋ค.
- return
- promise. ์ด๋ฏธ close๊ฐ ๋์ด์์๋ค๋ฉด ๊ฑฐ๋ถ๋๋ค.
-
๋ฉ์๋๋
ArrayBuffer
๋ฅผ ๋ฐ์์AudioBuffer
๋ก ๋ณํํ๋ ๋ฉ์๋์ด๋ค. -
FileReader.readAsArrayBuffer()
๋ฉ์๋๊ฐ ๋ฐํํ๋ArrayBuffer
๋ ํ๋ฒ์ ๋ชจ๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ด ์๋๋ผ ์ฒญํฌ ๋จ์๋ก ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์decodeAudioData
๋ ๋ณํ์ ๋๊ธฐ์ ์ผ๋ก ํด์ฃผ์ง๋ ์๋๋ค. ๊ทธ๋์ ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋๋ ์ฝ๋ฐฑํจ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋Promise
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. -
AudioBuffer
AudioBuffer { length: 12225071, duration: 277.2124943310658, sampleRate: 44100, numberOfChannels: 2 }
-
sampleRate
: ๋น์ฐํ ์ํ ๋ ์ดํธ๋ฅผ ์๋ฏธํ๊ณ ์ด ๊ณก์ ์ํ ๋ ์ดํธ๋44,100hz
์ด๋ค. -
numberOfChannels
: ์ด ์ค๋์ค๊ฐ ๋ช๊ฐ์ ์ฑ๋์ ๊ฐ์ง๊ณ ์๋์ง๋ฅผ ๋ํ๋ด๋๋ฐ ์ด ํ์ผ์ ๋ ๊ฐ์ ์ฑ๋์ด ์๋ ์คํ ๋ ์ค ์ฑ๋ ์ค๋์ค ํ์ผ์ด๋ค. -
length
:ํผํฌ(Peak)
๋ค์ ๊ฐ์๋ฅผ ์๋ฏธํ๋ค. ํผํฌ๋ ์ปดํจํฐ๊ฐ ์ํ๋ง์ ์งํํ ๋ ์ ์์ ์ธก์ ํ ๊ฐ์ ์๋ฏธํ๋ค.-
duration
*sampleRate
์ ๊ฐ๊ณผ ๊ฐ๋ค
-
-
duration
: ์ด ์ค๋์ค ํ์ผ์ ์ฌ์ ๊ธธ์ด๋ฅผ์ด
๋จ์๋ก ํ์ํด์ค๋ค.๊ทธ๋ ๋์์ค๋ฉด
์ ์ฝ277์ด
๋์ ์ฌ์๋๋๋ณด๋ค.
-
- AudioContext์ ๋ถ๋ชจ ์ธํฐํ์ด์ค
- ์ค๋์ค ์ฌ์ ์์ฝ, ํ์๋ผ์ธ ์๊ฐํ ๋ฑ์ ์ฌ์ฉํ ์ ์๋ ์ง์์ ์ผ๋ก ์ฆ๊ฐํ๋ ํ๋์จ์ด ํ์ ์คํฌํ(์ด)๋ฅผ ๋ํ๋ด๋ double๋ฅผ ๋ฐํํ๋ค. 0์์ ์์ํ๋ค.
var curTime = baseAudioContext.currentTime;
- ready only
- audioContext๋ฅผ ๋ง๋ค์์ ๋ count ์์๋๋ค.
- audioContext.suspend() ์ ๋ฉ์ถ๋ค.
- audioContext.resume() ์์ ์ฌ ์คํ๋๋ค.
- ํ์ฌ ์ค๋์ค์ ์ฌ์ ์๊ฐ ์ ๋ณด๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ ์๋๋ค.
- ๋น์ด์๋ ์ AudioBuffer ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
- ๋ค์ ๋ฐ์ดํฐ๋ก ์ฑ์ฐ๊ณ AudioBufferSourceNode๋ฅผ ํตํด ์ฌ์ํ ์ ์๋ค.
- AudioBuffer ๊ฐ์ฒด์ ํฌํจ ๋ ์ค๋์ค ๋ฐ์ดํฐ๋ฅผ ์ฌ์ํ๊ณ ์กฐ์ํ๋ ๋ฐ ์ฌ์ฉํ ์์๋ AudioBufferSourceNode๋ฅผ ๋ง๋ ๋ค.
- AudioBuffer๋ AudioContext.createBuffer๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋๊ฑฐ๋ ์ค๋์ค ํธ๋์ ์ฑ๊ณต์ ์ผ๋ก ๋์ฝ๋ฉ ํ ๋ AudioContext.decodeAudioData์ ์ํด ๋ฐํ๋๋ค.
๐ Week1 Meeting Log
๐ Week2 Meeting Log
๐ Week3 Meeting Log
๐ Week4 Meeting Log
๐ Week5 Meeting Log
๐ References
- Official Docs
- Blogs