Re: Proposal for output device selection

+1 that would be very useful.

Also, would connecting the video sink give us control over multiple 
displays in a similar way to multiple audio outputs?

    // set the output display for the window
   function selectVideoDisplay(sinkId) {
     window.sinkId = sinkId;
   }

Combined with window.open() that would even allow us to open a new 
window onto a specific display.

Not a major issue right now while most devices have a one-to-one mapping 
between window and display. But there have already been a number of 
mobile devices with more than one screen.

roBman


On 13/08/13 09:43, Justin Uberti wrote:
> WG,
>
> With the work done on MediaStreamTrack.getSources
> <http://MediaStreamTrack.getSources> (previously known as
> getSourceInfos/getSourceIds), we now have a clean way to enumerate,
> select, and remember audio and video input devices. However, we are not
> yet able to do this for audio output devices. This is a significant
> problem for scenarios where you want audio output to go to a headset
> that is not the default device, e.g. a USB or Bluetooth headset.
>
> Note that this goes outside the bounds of WebRTC - once we have an
> output device ID, we need a way to tell other HTML5 APIs, such as an
> <audio/> tag or Web Audio context, to use the specified device.
> Therefore locating this output device enumeration API on
> MediaStreamTrack (similar to getSources) is probably not the right fit.
>
> We therefore propose the navigator.getMediaSinks method as an API to use
> for output device enumeration, and a new HTMLMediaElement.sinkId
> property to allow the ids returned by getMediaSinks to be supplied to
> <audio/> and <video/> tags. (See full details below)
>
> getMediaSinks works overall similarly to getSources - it asynchronously
> returns a list of objects that identify devices, and for privacy
> purposes the .label properties are not filled in unless the user has
> consented to device access through getUserMedia.
>
> If we like this design, it may make sense to move
> MediaStreamTrack.getSources to also be on the navigator object, for
> consistency.
>
> ----------------------------------------------------------------------------------------------
>
> *New enumeration API*
>
> // async API, returns results through SinkInfoCallback
> void navigator.getMediaSinks(SinkInfoCallback)
>
> // similar to SourceInfoCallback
> callback SinkInfoCallback = void (sequence<SinkInfo>)
>
> // similar to SourceInfo
> dictionary SinkInfo {
>     DOMString sinkId;
>     DOMString kind;
>     DOMString label;
> };
>
> *New API on HTMLMediaElement*
>
> // when set, specifies the desired audio output device to use
> DOMString HTMLMediaElement.sinkId
>
> *Usage*
>
> // print out the available audio output devices on the console
> function listAudioDevices() {
>    navigator.getMediaSinks(printAudioDevices);
> }
>
> function printAudioDevices(sinks) {
>    for (var i = 0; i < sinks.length; ++i) {
>       if (sinks[i].kind === "audio") {
>         console.log(sinks[i].sinkId + " : " + sinks[i].label);
>       }
>    }
> }
> *
> *
> *// *set the audio output for the <audio/> tag with the id "audio-renderer"
> function selectAudioOutput(sinkId) {*
> *
> **document.getElementByID("audio-renderer").sinkId = sinkId;
> }
>
>

Received on Tuesday, 13 August 2013 02:56:15 UTC