Cordova媒体插件 - 何时调用release()?

时间:2016-03-11 23:22:43

标签: cordova cordova-plugins

我刚刚意识到cordova媒体插件中有一个release()函数。我想知道你是否应该在每次play()电话或其他时间之后发布成功回调?

缓存声音效率更高吗?我有大约六种声音效果,所以我可以将媒体对象缓存在一个数组中,而不是每次都创建一个新的媒体对象 - 我应该这样做吗?

我看到this question关于如何发布,有些评论可以缓存而不是发布每个游戏。

这是我的代码(不使用任何缓存):

function playMP3(fileName, callback) {
    if (window.Media) {
        var mp3URL = getMediaURL(fileName);
        var media = new Media(mp3URL, function() {
            // success
            // release the media resource once finished playing here?
            media.release();
            if (callback) {
                callback();
            }
        }, function (err) {
            // error
            jlog("failed to play mp3 file: [" + fileName + "]");
            try {
                // release the media resource once finished playing here too?
                media.release();
            } catch (e) {
                // ignore error on release
            }
            if (callback) {
                callback();
            }
        });
        if (media) media.play();
    }
}

function getMediaURL(s) {
    if (window.device && window.device.platform.toLowerCase() === "android") {
        return "/android_asset/www/sounds/" + s; 
    } else {
        s = "sounds/" + s; //put everything in sounds directory
        return s;
    }
}

1 个答案:

答案 0 :(得分:0)

如果有人正在寻找cordova音效缓存,我会给出更新。我添加了一些缓存以获得良好的衡量标准,它似乎可行,但我不知道它是否会提高内存使用率或其他任何内容。

我的问题是回调会让它变得太复杂(因为回调最终会被缓存),所以我决定简化并只使用一个计时器,因为这就是Speaking Email中大部分声音所需要的。当我需要适当的完成回调时,我跳过缓存。

function playMP3(fileName, callback) {
    if (window.Media) {
        if (!window.soundEffectCache) {
            window.soundEffectCache = {};
        }
        var sfx = window.soundEffectCache[fileName];
        if (!sfx) {
            var mp3URL = getMediaURL(fileName);
            sfx = new Media(mp3URL);
            window.soundEffectCache[fileName] = sfx;
        }
        sfx.play();
    }

    // callback is not really after finishing, just a sec after starting
    if (callback) {
        window.setTimeout(callback, 500);
    }
}