Skip to content

AudioContext

Songwonseok edited this page Dec 13, 2020 · 2 revisions

AudioContext

์ •์˜

  • ๊ฐ๊ฐ์ด AudioNode๋กœ ํ‘œํ˜„์ด ๋˜๋Š” ์„œ๋กœ ์—ฐ๊ฒฐ๋œ ์˜ค๋””์˜ค ๋ชจ๋“ˆ์—์„œ ๋นŒ๋“œ ๋œ ์˜ค๋””์˜ค ์ฒ˜๋ฆฌ ๊ทธ๋ž˜ํ”„.
  • ํ•˜๋‚˜์˜ AudioContext ๋‚ด์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ AudioNode๊ฐ€ ํฌํ•จ๋œ๋‹ค.
  • ๋…ธ๋“œ ์ƒ์„ฑ, ์˜ค๋””์˜ค ์ฒ˜๋ฆฌ, ๋””์ฝ”๋”ฉ์„ ํ•œ๋‹ค.
  • ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์˜ค๋””์˜ค ์ฝ˜ํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค์–ด ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ถ”์ฒœ๋œ๋‹ค.
  • ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ์˜ค๋””์˜ค ์†Œ์Šค์™€ ํŒŒ์ดํ”„๋ผ์ธ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ AudioContext๋ฅผ ์“ฐ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

Methods

AudioContext.close()

  • AudioContext๋ฅผ ๋‹ซ๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์‹œ์Šคํ…œ ์˜ค๋””์˜ค ์ž์›์„ ํ•ด์ œํ•œ๋‹ค.
  • close๊ฐ€ ๋˜๋ฉด ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋Š” ์—†์ง€๋งŒ, audio data๋ฅผ decode ํ•˜๋Š” ๊ฒƒ๊ณผ buffer ์ƒ์„ฑ์€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • close๋ฅผ ํ–ˆ๋‹ค๊ณ  ๋ชจ๋“  AudioContext ์ƒ์„ฑ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ œํ•ด์ฃผ์ง€๋Š” ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ AudioContext์˜ ์ƒ์„ฑ ๋ฐ ์‚ฌ์šฉ์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ ์˜ค๋””์˜ค ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ•์ œ๋กœ ํ•ด์ œํ•˜๊ณ , ์˜ค๋””์˜ค ์ปจํ…์ŠคํŠธ์—์„œ ์˜ค๋””์˜ค ์‹œ๊ฐ„์˜ ์ง„ํ–‰์„ ์ค‘๋‹จํ•˜๋ฉฐ ์˜ค๋””์˜ค ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ค‘์ง€ํ•œ๋‹ค.
  • return๋œ Promise๋Š” ๋ชจ๋“  AudioContext ์ƒ์„ฑ ์ฐจ๋‹จ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•ด์ œ๋˜๋ฉด resolve ๋œ๋‹ค.
  • OfflineAudioContext์—์„œ ํ˜ธ์ถœ ์‹œ, INVALID_STATE_ERR ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
  • return
    • promise resolves with void

AudioContext.resume()

  • ์ด์ „์— ์ผ์‹œ ์ค‘์ง€ / ์ผ์‹œ ์ค‘์ง€ ๋œ ์˜ค๋””์˜ค ์ปจํ…์ŠคํŠธ์—์„œ ์‹œ๊ฐ„์˜ ์ง„ํ–‰์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.
  • 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';
    });  
  }
}

AudioContext.suspend()

  • ์˜ค๋””์˜ค ์ปจํ…์ŠคํŠธ์—์„œ ์‹œ๊ฐ„์˜ ์ง„ํ–‰์„ ์ผ์‹œ ์ค‘๋‹จํ•˜์—ฌ ์˜ค๋””์˜ค ํ•˜๋“œ์›จ์–ด ์•ก์„ธ์Šค๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ค‘์ง€ํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค์—์„œ CPU / ๋ฐฐํ„ฐ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ธ๋‹ค.
  • OfflineAudioContext์—์„œ ๋ถˆ๋ฆด ์‹œ INVALID_STATE_ERR๋ฅผ ์•ผ๊ธฐํ•œ๋‹ค.
  • return
    • promise. ์ด๋ฏธ close๊ฐ€ ๋˜์–ด์žˆ์—ˆ๋‹ค๋ฉด ๊ฑฐ๋ถ€๋œ๋‹ค.

AudioContext.decodeAudioData()

  • ๋ฉ”์†Œ๋“œ๋Š” 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์ดˆ๋™์•ˆ ์žฌ์ƒ๋˜๋‚˜๋ณด๋‹ค.

BaseAudioContext

  • AudioContext์˜ ๋ถ€๋ชจ ์ธํ„ฐํŽ˜์ด์Šค

Properties

BaseAudioContext.currentTime

  • ์˜ค๋””์˜ค ์žฌ์ƒ ์˜ˆ์•ฝ, ํƒ€์ž„๋ผ์ธ ์‹œ๊ฐํ™” ๋“ฑ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์†์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ํ•˜๋“œ์›จ์–ด ํƒ€์ž„ ์Šคํƒฌํ”„(์ดˆ)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” double๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 0์—์„œ ์‹œ์ž‘ํ•œ๋‹ค.

var curTime = baseAudioContext.currentTime;

  • ready only
  • audioContext๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๋•Œ count ์‹œ์ž‘๋œ๋‹ค.
  • audioContext.suspend() ์‹œ ๋ฉˆ์ถ˜๋‹ค.
  • audioContext.resume() ์‹œ์— ์žฌ ์‹คํ–‰๋œ๋‹ค.
  • ํ˜„์žฌ ์˜ค๋””์˜ค์˜ ์žฌ์ƒ ์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฒŒ ์•„๋‹ˆ๋‹ค.

Methods

BaseAudioContext.createBuffer()

  • ๋น„์–ด์žˆ๋Š” ์ƒˆ AudioBuffer ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋กœ ์ฑ„์šฐ๊ณ  AudioBufferSourceNode๋ฅผ ํ†ตํ•ด ์žฌ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

BaseAudioContext.createBufferSource()

  • AudioBuffer ๊ฐœ์ฒด์— ํฌํ•จ ๋œ ์˜ค๋””์˜ค ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ์ƒํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” AudioBufferSourceNode๋ฅผ ๋งŒ๋“ ๋‹ค.
  • AudioBuffer๋Š” AudioContext.createBuffer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์˜ค๋””์˜ค ํŠธ๋ž™์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋””์ฝ”๋”ฉ ํ•  ๋•Œ AudioContext.decodeAudioData์— ์˜ํ•ด ๋ฐ˜ํ™˜๋œ๋‹ค.

๐Ÿ“„ Documents

๐Ÿ“Œ Rules

๐Ÿ“ Agile Process

๐Ÿ“† Week1 Meeting Log
๐Ÿ“† Week2 Meeting Log
๐Ÿ“† Week3 Meeting Log
๐Ÿ“† Week4 Meeting Log
๐Ÿ“† Week5 Meeting Log

๐Ÿ“Ž Research

๐Ÿ” References

๐Ÿ‘ซํ”ผ์–ด์„ธ์…˜

๐Ÿ“† Week2 Peer Session
๐Ÿ“† Week3 Peer Session
๐Ÿ“† Week4 Peer Session

๐Ÿค” ํšŒ๊ณ 

๐Ÿ“ข ๊ธฐ์ˆ ๊ณต์œ 

๐Ÿ”‰ Web Audio API

๐Ÿš€Custom Element

๐Ÿ™ˆ Activity

๐Ÿ—‘๏ธ ํœด์ง€ํ†ต

Clone this wiki locally