首页 > 解决方案 > 超级强大的循环或loopBetween没有按预期工作

问题描述

我已将 JS 时间拉伸示例修改为循环,但没有使用 loop() 或 loopBetween() 输出任何音频。player.play() 播放整个文件。我可以通过在进程循环中轮询 getPositionMs 和 setPosition 来强制它,但这是一个 hack。我应该做什么?谢谢。

class MyProcessor extends SuperpoweredWebAudio.AudioWorkletProcessor {
    // runs after the constructor
    onReady() {
        this.player = new this.Superpowered.AdvancedAudioPlayer(this.samplerate, 2, 2, 0, 0.501, 2, false);
        SuperpoweredTrackLoader.downloadAndDecode('../123456.mp3', this);
    }

    onMessageFromMainScope(message) {
        if (message.SuperpoweredLoaded) {
            this.player.openMemory(this.Superpowered.arrayBufferToWASM(message.SuperpoweredLoaded.buffer), false, false);
            this.player.loopBetween (   
                1000.0, //double    startMs,
                3000.0, // double   endMs,
                true, // bool   jumpToStartMs,
                255, //unsigned char    pointID,
                false); //bool  synchronisedStart

            this.player.play();
            this.sendMessageToMainScope({ loaded: true });
        }

        if (typeof message.rate !== 'undefined') this.player.playbackRate = message.rate / 10000.0;
        if (typeof message.pitchShift !== 'undefined') this.player.pitchShiftCents = parseInt(message.pitchShift) * 100;
    }

    processAudio(inputBuffer, outputBuffer, buffersize, parameters) {
        if (!this.player.processStereo(outputBuffer.pointer, false, buffersize, 1)) {
            for (let n = 0; n < buffersize * 2; n++) outputBuffer.array[n] = 0;
        };
        if (this.player.getPositionMs() > 3000) {
            this.player.setPosition(1000.0, false, false);

        }
    }
}

标签: javascriptsuperpowered

解决方案


推荐阅读