2013-08-15 6 views
0

Я работаю с Web Audio Api, и это то, что я до сих пор работал для загрузки/буферизации звуковых файлов.Предварительная загрузка с помощью Web Audio Api и XMLHttpRequest

function loadSound(url) { 
      // Load buffer asynchronously 
      var request = new XMLHttpRequest(); 
      request.open("GET", url, true); 
      request.responseType = "arraybuffer"; 

      request.onload = function() { 
       // Asynchronously decode the audio file data 
       context.decodeAudioData(
        request.response, 
        function(buffer) { 
         if (!buffer) { 
          console.log('error decoding file data: ' + url); 
          return; 
         } 
          window.kick = buffer; 
        } 
       ); 
      } 

      request.onerror = function() { 
       console.log('error loading file data: ' + url); 
      } 

      request.send(); 
     } 

Мой вопрос, однако, является то, что я пытаюсь превратить window.kick в параметр в функции LoadSound. Например, loadSound(url, sourceName), где sourceName займет более window.kick. Конечной целью является воспроизведение звука по названию с чем-то вроде note(sourceName); (который работает на данный момент с note(kick); и приведенным выше кодом)

Причина этого заключается в том, что я должен загружать звуки в разное время на протяжении всего приложения, и они не могут быть загружены сразу. Затем они должны быть вызваны по имени после, в отличие от this, который вызывается по индексу и вызывается в начале.

ответ

0
function loadSound(url, sourceName) { 
      // Load buffer asynchronously 
      var request = new XMLHttpRequest(); 
      request.open("GET", url, true); 
      request.responseType = "arraybuffer"; 

      request.onload = function() { 
       // Asynchronously decode the audio file data 
       context.decodeAudioData(
        request.response, 
        function(buffer) { 
         if (!buffer) { 
          console.log('error decoding file data: ' + url); 
          return; 
         } 
          window[sourceName] = buffer; 
        } 
       ); 
      } 

      request.onerror = function() { 
       console.log('error loading file data: ' + url); 
      } 

      request.send(); 
     } 
+0

Нету, по-прежнему возвращает 'null' и«Uncaught TypeError: Значение не типа AudioBuffer», когда я пытаюсь вызвать его вне функции LoadSound –

+0

Это правильное решение, однако, чтобы вызвать функцию SourceName необходимо сбегать с кавычками, такими как 'loadSound (« samples/kicks/bouncy.mp3 »,« kick »);' работать таким образом. –

+0

Также сама переменная должна быть глобальной, если это не подразумевалось. –

Смежные вопросы