Proposal for output device selection

WG,

With the work done on 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 Monday, 12 August 2013 23:44:12 UTC