Chrome 71 AudioContext通过Twilio Client恢复

时间:2019-01-07 02:17:11

标签: twilio

随着Chrome 71的更改以挂起状态启动音频上下文,我们需要在用户交互后恢复音频上下文。我们正在通过在网站顶部显示一个红色横幅来处理此问题,该横幅表示我们需要您授予我们允许使用按钮进行呼叫的权限。该按钮符合用户的参与,因此我们可以恢复音频上下文。

我遇到的问题是,当用户单击按钮时,我已经调用过device.setup()的设备没有audioContext可用。

我应该能够通过device.audio.audioContext访问audioContext并在其上调用resume()方法,但是我得到的却是undefined

目前,作为一种解决方法,我正在致电device.audio._audioContext.resume(),但这从未定义并可以正常工作。但是在我看来,似乎有一个错误,即audioContext的公共访问器未在twilio-client库中定义。还是我在这里做错了什么?

在es5编译代码中,我在device.js文件中看到以下内容

Object.defineProperty(Device, "audioContext", {
    /**
     * The AudioContext to be used by {@link Device} instances.
     */
    get: function () {
        return Device._audioContext;
    },
    enumerable: true,
    configurable: true
});

调用此函数时我不确定。但是,device.audio属性是在以下代码中设置的,它在此处将Device.audioContext作为选项传递:

    this.audio = new (this.options.AudioHelper || AudioHelper) 
      (this._updateSinkIds, this._updateInputStream, getUserMedia, {
        audioContext: Device.audioContext,
        enabledSounds: this._enabledSounds,
        logEnabled: !!this.options.debug,
        logWarnings: !!this.options.warnings,
    });

然后在audiohelper.js文件中,构造函数调用:

    Object.defineProperties(this, {
      _audioContext: {
        value: audioContext
      },
      // more stuff
    },

因此,当最初创建device时,似乎Device.audioContext存在并传递给audio._audioContext,但是后来Device.audioContext失去了对音频的引用上下文。

1 个答案:

答案 0 :(得分:2)

这里是Twilio开发人员的传播者。

这可能是文档或通讯失败,但是我想我知道现在发生了什么。

Device.audioContextDevice类的公共方法。正如您在代码中发现的那样,它是在这里定义的:

Object.defineProperty(Device, "audioContext", {
    /**
     * The AudioContext to be used by {@link Device} instances.
     */
    get: function () {
        return Device._audioContext;
    },
    enumerable: true,
    configurable: true
});

请注意,这在audioContext对象本身上定义了Device属性。

但是audioContext的实例上没有Device的定义。这就是为什么您尝试调用state.device.audioContext时发布的要旨中的代码失败的原因。

正如您所指出的那样,audio对象上的device对象是使用Device.audioContext创建的。因此,实际上,您可以使用伪专用device.audio._audioContext删除,而只在需要Device.audioContext时使用公用resume()

我会重写为:

resumeTwilioDevice = async () => {
  Twilio.Device.audioContext.resume();
};