diff --git a/dom/media/AudioDeviceInfo.cpp b/dom/media/AudioDeviceInfo.cpp new file mode 100644 index 000000000000..d9cb577a1a59 --- /dev/null +++ b/dom/media/AudioDeviceInfo.cpp @@ -0,0 +1,167 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "AudioDeviceInfo.h" + +NS_IMPL_ISUPPORTS(AudioDeviceInfo, nsIAudioDeviceInfo) + +AudioDeviceInfo::AudioDeviceInfo(const nsAString& aName, + const nsAString& aGroupId, + const nsAString& aVendor, + uint16_t aType, + uint16_t aState, + uint16_t aPreferred, + uint16_t aSupportedFormat, + uint16_t aDefaultFormat, + uint32_t aMaxChannels, + uint32_t aDefaultRate, + uint32_t aMaxRate, + uint32_t aMinRate, + uint32_t aMaxLatency, + uint32_t aMinLatency) + : mName(aName) + , mGroupId(aGroupId) + , mVendor(aVendor) + , mType(aType) + , mState(aState) + , mPreferred(aPreferred) + , mSupportedFormat(aSupportedFormat) + , mDefaultFormat(aDefaultFormat) + , mMaxChannels(aMaxChannels) + , mDefaultRate(aDefaultRate) + , mMaxRate(aMaxRate) + , mMinRate(aMinRate) + , mMaxLatency(aMaxLatency) + , mMinLatency(aMinLatency) +{ + MOZ_ASSERT(mType == TYPE_UNKNOWN || + mType == TYPE_INPUT || + mType == TYPE_OUTPUT, "Wrong type"); + MOZ_ASSERT(mState == STATE_DISABLED || + mState == STATE_UNPLUGGED || + mState == STATE_ENABLED, "Wrong state"); + MOZ_ASSERT(mPreferred == PREF_NONE || + mPreferred == PREF_ALL || + mPreferred & (PREF_MULTIMEDIA | PREF_VOICE | PREF_NOTIFICATION), + "Wrong preferred value"); + MOZ_ASSERT(mSupportedFormat & (FMT_S16LE | FMT_S16BE | FMT_F32LE | FMT_F32BE), + "Wrong supported format"); + MOZ_ASSERT(mDefaultFormat == FMT_S16LE || + mDefaultFormat == FMT_S16BE || + mDefaultFormat == FMT_F32LE || + mDefaultFormat == FMT_F32BE, "Wrong default format"); +} + +/* readonly attribute DOMString name; */ +NS_IMETHODIMP +AudioDeviceInfo::GetName(nsAString& aName) +{ + aName = mName; + return NS_OK; +} + +/* readonly attribute DOMString groupId; */ +NS_IMETHODIMP +AudioDeviceInfo::GetGroupId(nsAString& aGroupId) +{ + aGroupId = mGroupId; + return NS_OK; +} + +/* readonly attribute DOMString vendor; */ +NS_IMETHODIMP +AudioDeviceInfo::GetVendor(nsAString& aVendor) +{ + aVendor = mVendor; + return NS_OK; +} + +/* readonly attribute unsigned short type; */ +NS_IMETHODIMP +AudioDeviceInfo::GetType(uint16_t* aType) +{ + *aType = mType; + return NS_OK; +} + +/* readonly attribute unsigned short state; */ +NS_IMETHODIMP +AudioDeviceInfo::GetState(uint16_t* aState) +{ + *aState = mState; + return NS_OK; +} + +/* readonly attribute unsigned short preferred; */ +NS_IMETHODIMP +AudioDeviceInfo::GetPreferred(uint16_t* aPreferred) +{ + *aPreferred = mPreferred; + return NS_OK; +} + +/* readonly attribute unsigned short supportedFormat; */ +NS_IMETHODIMP +AudioDeviceInfo::GetSupportedFormat(uint16_t* aSupportedFormat) +{ + *aSupportedFormat = mSupportedFormat; + return NS_OK; +} + +/* readonly attribute unsigned short defaultFormat; */ +NS_IMETHODIMP +AudioDeviceInfo::GetDefaultFormat(uint16_t* aDefaultFormat) +{ + *aDefaultFormat = mDefaultFormat; + return NS_OK; +} + +/* readonly attribute unsigned long maxChannels; */ +NS_IMETHODIMP +AudioDeviceInfo::GetMaxChannels(uint32_t* aMaxChannels) +{ + *aMaxChannels = mMaxChannels; + return NS_OK; +} + +/* readonly attribute unsigned long defaultRate; */ +NS_IMETHODIMP +AudioDeviceInfo::GetDefaultRate(uint32_t* aDefaultRate) +{ + *aDefaultRate = mDefaultRate; + return NS_OK; +} + +/* readonly attribute unsigned long maxRate; */ +NS_IMETHODIMP +AudioDeviceInfo::GetMaxRate(uint32_t* aMaxRate) +{ + *aMaxRate = mMaxRate; + return NS_OK; +} + +/* readonly attribute unsigned long minRate; */ +NS_IMETHODIMP +AudioDeviceInfo::GetMinRate(uint32_t* aMinRate) +{ + *aMinRate = mMinRate; + return NS_OK; +} + +/* readonly attribute unsigned long maxLatency; */ +NS_IMETHODIMP +AudioDeviceInfo::GetMaxLatency(uint32_t* aMaxLatency) +{ + *aMaxLatency = mMaxLatency; + return NS_OK; +} + +/* readonly attribute unsigned long minLatency; */ +NS_IMETHODIMP +AudioDeviceInfo::GetMinLatency(uint32_t* aMinLatency) +{ + *aMinLatency = mMinLatency; + return NS_OK; +} diff --git a/dom/media/AudioDeviceInfo.h b/dom/media/AudioDeviceInfo.h new file mode 100644 index 000000000000..0ef992bae0fe --- /dev/null +++ b/dom/media/AudioDeviceInfo.h @@ -0,0 +1,53 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_AudioDeviceInfo_H +#define MOZILLA_AudioDeviceInfo_H + +#include "nsIAudioDeviceInfo.h" +#include "nsString.h" + +// This is mapped to the cubeb_device_info. +class AudioDeviceInfo final : public nsIAudioDeviceInfo +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSIAUDIODEVICEINFO + + explicit AudioDeviceInfo(const nsAString& aName, + const nsAString& aGroupId, + const nsAString& aVendor, + uint16_t aType, + uint16_t aState, + uint16_t aPreferred, + uint16_t aSupportedFormat, + uint16_t aDefaultFormat, + uint32_t aMaxChannels, + uint32_t aDefaultRate, + uint32_t aMaxRate, + uint32_t aMinRate, + uint32_t aMaxLatency, + uint32_t aMinLatency); + +private: + virtual ~AudioDeviceInfo() = default; + + nsString mName; + nsString mGroupId; + nsString mVendor; + uint16_t mType; + uint16_t mState; + uint16_t mPreferred; + uint16_t mSupportedFormat; + uint16_t mDefaultFormat; + uint32_t mMaxChannels; + uint32_t mDefaultRate; + uint32_t mMaxRate; + uint32_t mMinRate; + uint32_t mMaxLatency; + uint32_t mMinLatency; +}; + +#endif // MOZILLA_AudioDeviceInfo_H diff --git a/dom/media/moz.build b/dom/media/moz.build index 30aeaa3b7162..47f5db27a435 100644 --- a/dom/media/moz.build +++ b/dom/media/moz.build @@ -77,6 +77,7 @@ if CONFIG['MOZ_WEBRTC']: WEBRTC_SIGNALLING_TEST_MANIFESTS += ['tests/mochitest/steeplechase_long/steeplechase_long.ini'] XPIDL_SOURCES += [ + 'nsIAudioDeviceInfo.idl', 'nsIDOMNavigatorUserMedia.idl', 'nsIMediaManager.idl', ] @@ -173,6 +174,7 @@ IPDL_SOURCES += [ ] EXPORTS.mozilla.dom += [ + 'AudioDeviceInfo.h', 'AudioStreamTrack.h', 'AudioTrack.h', 'AudioTrackList.h', @@ -200,6 +202,7 @@ UNIFIED_SOURCES += [ 'AudioChannelFormat.cpp', 'AudioCompactor.cpp', 'AudioConverter.cpp', + 'AudioDeviceInfo.cpp', 'AudioSegment.cpp', 'AudioStream.cpp', 'AudioStreamTrack.cpp', diff --git a/dom/media/nsIAudioDeviceInfo.idl b/dom/media/nsIAudioDeviceInfo.idl new file mode 100644 index 000000000000..507c4d39c4d1 --- /dev/null +++ b/dom/media/nsIAudioDeviceInfo.idl @@ -0,0 +1,54 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nsISupports.idl" + +[scriptable, uuid(feb979a8-f8cc-4522-9dff-6c055ca50762)] +interface nsIAudioDeviceInfo : nsISupports +{ + readonly attribute DOMString name; + + readonly attribute DOMString groupId; + + readonly attribute DOMString vendor; + + // type: Unknown/Input/Output + const unsigned short TYPE_UNKNOWN = 0; + const unsigned short TYPE_INPUT = 1; + const unsigned short TYPE_OUTPUT = 2; + readonly attribute unsigned short type; + + // state: Disabled/Unplugged/Enabled + const unsigned short STATE_DISABLED = 0; + const unsigned short STATE_UNPLUGGED = 1; + const unsigned short STATE_ENABLED = 2; + readonly attribute unsigned short state; + + // preferred: None/Multimedia/Voice/Notification/All + const unsigned short PREF_NONE = 0x00; + const unsigned short PREF_MULTIMEDIA = 0x01; + const unsigned short PREF_VOICE = 0x02; + const unsigned short PREF_NOTIFICATION = 0x04; + const unsigned short PREF_ALL = 0x0F; + readonly attribute unsigned short preferred; + + // supported format, default format: S16LE/S16BE/F32LE/F32BE + const unsigned short FMT_S16LE = 0x0010; + const unsigned short FMT_S16BE = 0x0020; + const unsigned short FMT_F32LE = 0x1000; + const unsigned short FMT_F32BE = 0x2000; + readonly attribute unsigned short supportedFormat; + readonly attribute unsigned short defaultFormat; + + // Max number of channels: [1, 255] + readonly attribute unsigned long maxChannels; + + readonly attribute unsigned long defaultRate; + readonly attribute unsigned long maxRate; + readonly attribute unsigned long minRate; + + readonly attribute unsigned long maxLatency; + readonly attribute unsigned long minLatency; +};