لا يتم تشغيل حدث Web Audio "انتهى" عند تشغيل جزء من المخزن المؤقت المصدر

StackOverflow https://stackoverflow.com//questions/25077703

  •  02-01-2020
  •  | 
  •  

سؤال

لدينا وظيفة مساعد صوتي على الويب تقوم بتشغيل الأصوات من ورقة صوتية، وتتيح لنا معرفة وقت الانتهاء منها.في الماضي كنا نستخدم playbackState في حلقة تحديث للتحقق من انتهاء العقدة من تشغيلها، ولكن نظرًا لأن Chrome 36 يستخدم الآن المواصفات الحالية، والتي لا تدعم playbackState لقد قمنا بتحديث الكود لاستخدام 'ended' حدث.

ومع ذلك، لا يبدو أن هذا سيتم طرده.

ما يلي هو وظيفة playAudio لدينا:-

playAudio: function(trackName){
    var node = this._atx.createBufferSource();
    node.buffer = this._buffer;

    var gain = this._atx.createGain();

    node.connect(gain);
    gain.connect(this._atx.destination);

    var start = this._tracks[trackName][0];
    var length = this._tracks[trackName][1] - start;

    node.start(0, start, length);

    var sound = {name: trackName, srcNode: node, gainNode: gain, startTime: this._atx.currentTime, duration: length, loop: false, playHeadStart: start};

    if (this._features.hasEvents) {
        //node.addEventListener("ended", function () {
        //   this._soundEnded(sound)
        //}.bind(this));
        node.onended = function(){
            this._soundEnded(sound);
        }.bind(this);
    }

    this._playingSounds[++this._soundId] = sound;
    return this._soundId;
},
_soundEnded: function (sound) {
    this._playingSounds[sound] = null;
    delete this._playingSounds[sound];
}

ال this._features.hasEvents يتم تعيين المتغير عن طريق التحقق من node.onended !== null على عقدة الصوت التي تم إنشاؤها أثناء التحميل.يتم إنشاء المخزن المؤقت عن طريق XHR'ing ملف.يمكن أن يكون هذا إما mp3 أو m4a، اعتمادًا على ما نلعب عليه.

ما هو السبب الذي _soundedEnded لا يتم استدعاء الدالة؟لقد حاولت على حد سواء node.onended = function(){...} و node.addEventListener("ended", function(){..}) بناء الجملة، مع عدم وجود حظ من أي منهما.يبدو أن لدينا نفس السلوك في كل من iOS 7 Safari وسطح المكتب/Android Chrome.

هل كانت مفيدة؟

المحلول

لقد قمت بحل هذه المشكلة للتو، بعد أن أدركت أنني كنت أفعل شيئًا غبيًا.الخطأ ليس في WebAudio، ولكن بدلاً من ذلك في وظيفة رد الاتصال التي كان من المفترض أن تزيل كائن الصوت من _playingSounds مجموعة مصفوفة.

هذا الجزء من الكود:

var sound = {name: trackName, srcNode: node, gainNode: gain, startTime:     this._atx.currentTime, duration: length, loop: false, playHeadStart: start};

if (this._features.hasEvents) {
    //node.addEventListener("ended", function () {
    //   this._soundEnded(sound)
    //}.bind(this));
    node.onended = function(){
        this._soundEnded(sound);
    }.bind(this);
}

this._playingSounds[++this._soundId] = sound;
return this._soundId;

كان ينبغي أن يكون أكثر من هذا القبيل:

var sound = {name: trackName, srcNode: node, gainNode: gain, startTime: this._atx.currentTime, duration: length, loop: false, playHeadStart: start};
var soundId = ++this._soundId;
if (this._features.hasEvents) {

    node.onended = function(){
        this._soundEnded(soundId);
    }.bind(this);
}

this._playingSounds[soundId] = sound;
return soundId;

كنت أحاول إزالة الكائن حسب القيمة، بدلاً من المفتاح، والذي من الواضح أنه لا يعمل.يقوم الرمز الآن بتمرير المفتاح إلى الوظيفة، وسيعمل كل شيء مرة أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top