Cordova Phonegap в приложении теряет функциональность File Api

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

Я сделал следующее, чтобы достичь этого.

ref = window.open('record.html', '_self'); Откроется страница record.html в Cordova WebView в соответствии с https://wiki.apache.org/cordova/InAppBrowser

1 window.open ('local-url.html'); // загружается в Cordova WebView
2 window.open ('local-url.html', '_self');
// загружается в Cordova WebView

Страница record.html загружает файл javascript, который запускает операции, которые я хочу запустить. Вот файл recordLoad.js, который выполняет некоторые вызовы собственных операций (собственный API доступен только в том случае, если он загружен в Cordova Webview, и, как вы можете видеть, мне нужен доступ к файловой системе, так что это единственный способ увидеть сделай это.

    window.onload = createAudioContext;
ref = null;

function createAudioContext(){
    console.log('createAudioContext');
    window.AudioContext = window.AudioContext || window.webkitAudioContext;
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
    window.URL = window.URL || window.webkitURL;
    audioContext = new AudioContext;

    getDirectory();
}

function getDirectory(){
    console.log('getDirectory');
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, getFileSystem, fail);

}

function getFileSystem(directory){
    console.log('getFileSystem');
    var audioPath = localStorage.getItem('audioPath');
    directory.root.getFile(audioPath, null, getVocalFile, fail);

}

function getVocalFile(fileEntry){
    console.log('getVocalFile');
    fileEntry.file(readVocalsToBuffer, fail);

}

function readVocalsToBuffer(file){
    console.log('readVocalsToBuffer');
    var reader = new FileReader();
    reader.onloadend = function(evt){
        var x = audioContext.decodeAudioData(evt.target._result, function(buffer){
            if(!buffer){
                console.log('error decoding file to Audio Buffer');
                return;
            }
            window.voiceBuffer = buffer;
            buffer = null;
            loadBuffers();
        });

    }
    reader.readAsArrayBuffer(file);
}

//web
function loadBuffers(){
    console.log('loadBuffers');
    var srcSong = localStorage.getItem('srcSong');
    try{
        var bufferLoader = new BufferLoader(
            audioContext,
            [
                "."+srcSong
            ],
            createOffLineContext
        );
        bufferLoader.load()
    }
    catch(e){
        console.log(e.message);
    }
}


//
function createOffLineContext(bufferList){
    console.log('createOfflineContext');
    offline = new webkitOfflineAudioContext(2, window.voiceBuffer.length, 44100);
    var vocalSource = offline.createBufferSource();
    vocalSource.buffer = window.voiceBuffer;
    vocalSource.connect(offline.destination);

    var backing = offline.createBufferSource();
    backing.buffer = bufferList[0];
    backing.connect(offline.destination);

    vocalSource.start(0);
    backing.start(0);

    offline.oncomplete = function(ev){
        bufferList = null;
        console.log('audioContext');
        console.log(audioContext);
        audioContext = null;
        console.log(audioContext);
        vocalSource.stop(0);
        backing.stop(0);
        vocalSource.disconnect(0);
        backing.disconnect(0);
        vocalSource = null;
        backing = null;
        window.voiceBuffer = null;
        window.renderedFile = ev.renderedBuffer;
        var bufferR = ev.renderedBuffer.getChannelData(0);
        var bufferL = ev.renderedBuffer.getChannelData(1);
        var interleaved = interleave(bufferL, bufferR);
        var dataview = encodeWAV(interleaved);
        window.audioBlob = new Blob([dataview], {type: 'Wav'});

        saveFile();
    }

    offline.startRendering();

}

// Этот файл очень длинный, но как только он закончит смешивать два аудио буфера, он записывает новый файл в файловую систему. И когда эта операция завершена, я использую

function gotFileWriter(writer){
console.log('gotFileWriter');
writer.onwriteend = function(evt){
    console.log('onwriteEnd');
    console.log(window.audioBlob);
    delete window.audioBlob;
    console.log(window.audioBlob);
   // checkDirectory();
    var ref = window.open('index.html', '_self');
   // ref.addEventListener('exit', windowClose);

}
writer.write(audioBlob);

}

Я возвращаюсь обратно в исходный файл index.html. Это решает проблемы с памятью. Однако, однажды я пытаюсь выполнить ту же операцию во второй раз. т.е. загрузить в файл record.html и запустить файл recordLoad.js Я получаю сообщение об ошибке ReferenceError: Не могу найти переменную: LocalFileSystem

Похоже, что в reload index.html некоторые, но не все ссылки на Cordova API были потеряны. Я все еще могу, например, использовать Media Api, но не File Api. Я понимаю, что это немного хакерский способ (открывать и закрывать окна) для устранения утечки памяти, но я не могу найти другого способа сделать это. Мне действительно нужна помощь с этим. Так что любые указатели очень и очень приветствуются.

0 ответов

Другие вопросы по тегам