Re: Proposal for output device selection

I like this idea a lot, and it is easy to realize that something like 
this would really give the app developer a better control.

But I would really like to get comments from people involved in the 
html5 and media elements work. Exactly the same problem must have been 
detected in that context, and it would be nice to know why they then 
decided to go with playing in the default device.

Stefan

On 2013-08-13 01:44, 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 06:50:32 UTC