A synchronous choice getUserMedia options. Problem RTCPeerConnection requires MediaStreams (and...
-
Upload
luke-stevenson -
Category
Documents
-
view
215 -
download
0
Transcript of A synchronous choice getUserMedia options. Problem RTCPeerConnection requires MediaStreams (and...
a synchronous choice
getUserMedia options
Problem
• RTCPeerConnection requires MediaStreams (and MediaStreamTracks) in order to negotiate streams
• MediaStreams can currently only exist when the user has provided consent
• This leads to a problem where negotiation can’t continue without consent, which leads to clipping on answer
Proposed Solution (Common)
• Provide placeholder MediaStreams that can be used as a basis for negotiation– The object is real, but unconnected or disabled
somehow prior to the user providing consent– The SSRCs that can be generated are stable [sic]– Negotiation can continue prior to consent being
granted using the placeholder
Option 1
• getUserMedia returns streams that do not start until consent is granted.
var stream = navigator.getUserMedia(constraints);stream.audioTracks[0].onstart = grantedCb;stream.audioTracks[0].onend = deniedCb;pc.addStream(stream);
• Consent events are communicated on the tracks– A new started event is added to tracks.– The reasons for the end event are expanded to include
all the error conditions for getUserMedia:• nodevice, permissiondenied, deviceerror
Option 2
• As option 1, except the return value is a wrapper:var streamBucket = navigator.getUserMedia(constraints);streamBucket.onsuccess = grantedCb;streamBucket.onfailure = deniedCb;pc.addStream(streamBucket.stream);
• Returned tracks are ‘muted’ until consent is granted• Extra arguments to gUM create a signature that is
identical in usage to existing asynchronous gUM– also possible with Option 1
Option 3
• Stream placeholders are instantiated and “connected” to devices by getUserMedia
var audioTrack = new AudioMediaStreamTrack(constraints);var stream = new MediaStream(audioTrack);navigator.getUserMedia(stream, grantedCb, deniedCb);pc.addStream(stream);
• Constraints are attached directly to tracks– Nascent until the device is connected– Turn into settings once the device is connected
• Backward compat (if desired) with overload
Option 4
• Leave it asynchronous • Don’t change anything• Ensures that users don’t get an object that
isn’t “working”• Avoid programmer errors that arise due to bad
assumptions about consent, device availability, constraints, etc…
Preferences
• Synchronous Option 3:– 3 fits better with the new settings work– 1 and 2 are functionally equivalent, with some
stylistic differences, and some usability issues– 4 doesn’t solve the problem
• No backward compatibility hack– Overloading gUM might be possible to replicate
old behavior, but that’s just extra API cruft