Bug 934425 - Add device info in MediaDevice. r?jib
MediaDevice is the core object for audio device enumeration. By adding AudioDeviceInfo every information of audio devices will be available. In this case device id will be available from the first enumeration and there is no need to enumerate multiple times to get that info.
MozReview-Commit-ID: FGnPp1Nhosz
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -914,50 +914,54 @@ private:
*/
NS_IMPL_ISUPPORTS(MediaDevice, nsIMediaDevice)
MediaDevice::MediaDevice(MediaEngineSource* aSource,
const nsString& aName,
const nsString& aID,
const nsString& aRawID)
: mSource(aSource)
+ , mSinkInfo(nullptr)
, mKind((mSource && MediaEngineSource::IsVideo(mSource->GetMediaSource())) ?
dom::MediaDeviceKind::Videoinput : dom::MediaDeviceKind::Audioinput)
, mScary(mSource->GetScary())
, mType(NS_ConvertUTF8toUTF16(dom::MediaDeviceKindValues::strings[uint32_t(mKind)].value))
, mName(aName)
, mID(aID)
, mRawID(aRawID)
{
MOZ_ASSERT(mSource);
}
-MediaDevice::MediaDevice(const nsString& aName,
- const dom::MediaDeviceKind aKind,
+MediaDevice::MediaDevice(AudioDeviceInfo* aAudioDeviceInfo,
const nsString& aID,
const nsString& aRawID)
: mSource(nullptr)
- , mKind(aKind)
+ , mSinkInfo(aAudioDeviceInfo)
+ , mKind(mSinkInfo->Type() == AudioDeviceInfo::TYPE_INPUT ? dom::MediaDeviceKind::Audioinput
+ : dom::MediaDeviceKind::Audiooutput)
, mScary(false)
, mType(NS_ConvertUTF8toUTF16(dom::MediaDeviceKindValues::strings[uint32_t(mKind)].value))
- , mName(aName)
+ , mName(mSinkInfo->Name())
, mID(aID)
, mRawID(aRawID)
{
// For now this ctor is used only for Audiooutput.
// It could be used for Audioinput and Videoinput
// when we do not instantiate a MediaEngineSource
// during EnumerateDevices.
MOZ_ASSERT(mKind == dom::MediaDeviceKind::Audiooutput);
+ MOZ_ASSERT(mSinkInfo);
}
MediaDevice::MediaDevice(const MediaDevice* aOther,
const nsString& aID,
const nsString& aRawID)
: mSource(aOther->mSource)
+ , mSinkInfo(aOther->mSinkInfo)
, mKind(aOther->mKind)
, mScary(aOther->mScary)
, mType(aOther->mType)
, mName(aOther->mName)
, mID(aID)
, mRawID(aRawID)
{
MOZ_ASSERT(aOther);
--- a/dom/media/MediaManager.h
+++ b/dom/media/MediaManager.h
@@ -71,18 +71,17 @@ public:
NS_DECL_THREADSAFE_ISUPPORTS
NS_DECL_NSIMEDIADEVICE
explicit MediaDevice(MediaEngineSource* aSource,
const nsString& aName,
const nsString& aID,
const nsString& aRawID = NS_LITERAL_STRING(""));
- explicit MediaDevice(const nsString& aName,
- const dom::MediaDeviceKind aKind,
+ explicit MediaDevice(AudioDeviceInfo* aAudioDeviceInfo,
const nsString& aID,
const nsString& aRawID = NS_LITERAL_STRING(""));
explicit MediaDevice(const MediaDevice* aOther,
const nsString& aID,
const nsString& aRawID);
uint32_t GetBestFitnessDistance(
@@ -124,16 +123,17 @@ private:
const dom::ConstrainDOMStringParameters& aParams);
// Assigned on allocation on media thread, then read on the media thread and
// graph thread
RefPtr<AllocationHandle> mAllocationHandle;
public:
const RefPtr<MediaEngineSource> mSource;
+ const RefPtr<AudioDeviceInfo> mSinkInfo;
const dom::MediaDeviceKind mKind;
const bool mScary;
const nsString mType;
const nsString mName;
const nsString mID;
const nsString mRawID;
};
--- a/dom/media/webrtc/MediaEngineWebRTC.cpp
+++ b/dom/media/webrtc/MediaEngineWebRTC.cpp
@@ -246,20 +246,17 @@ MediaEngineWebRTC::EnumerateSpeakerDevic
for (auto& device : devices) {
if (device->State() == CUBEB_DEVICE_STATE_ENABLED) {
MOZ_ASSERT(device->Type() == CUBEB_DEVICE_TYPE_OUTPUT);
nsString uuid(device->Name());
// If, for example, input and output are in the same device, uuid
// would be the same for both which ends up to create the same
// deviceIDs (in JS).
uuid.Append(NS_LITERAL_STRING("_Speaker"));
- aDevices->AppendElement(MakeRefPtr<MediaDevice>(
- device->Name(),
- dom::MediaDeviceKind::Audiooutput,
- uuid));
+ aDevices->AppendElement(MakeRefPtr<MediaDevice>(device, uuid));
}
}
}
void
MediaEngineWebRTC::EnumerateDevices(uint64_t aWindowId,
dom::MediaSourceEnum aMediaSource,