随着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
失去了对音频的引用上下文。
答案 0 :(得分:2)
这里是Twilio开发人员的传播者。
这可能是文档或通讯失败,但是我想我知道现在发生了什么。
Device.audioContext
是Device
类的公共方法。正如您在代码中发现的那样,它是在这里定义的:
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();
};