Source code

Revision control

Copy as Markdown

Other Tools

/* -*- 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 */
#ifndef __MINGW32__
# include <functional>
# include <Windows.Media.h>
# include <wrl.h>
# include "mozilla/dom/FetchImageHelper.h"
# include "mozilla/dom/MediaController.h"
# include "mozilla/dom/MediaControlKeySource.h"
# include "mozilla/UniquePtr.h"
using ISMTC = ABI::Windows::Media::ISystemMediaTransportControls;
using SMTCProperty = ABI::Windows::Media::SystemMediaTransportControlsProperty;
using ISMTCDisplayUpdater =
using ABI::Windows::Foundation::IAsyncOperation;
using ABI::Windows::Storage::Streams::IDataWriter;
using ABI::Windows::Storage::Streams::IRandomAccessStream;
using ABI::Windows::Storage::Streams::IRandomAccessStreamReference;
using Microsoft::WRL::ComPtr;
class WindowsSMTCProvider final : public mozilla::dom::MediaControlKeySource {
bool IsOpened() const override;
bool Open() override;
void Close() override;
void SetPlaybackState(
mozilla::dom::MediaSessionPlaybackState aState) override;
void SetMediaMetadata(
const mozilla::dom::MediaMetadataBase& aMetadata) override;
void SetSupportedMediaKeys(const MediaKeysArray& aSupportedKeys) override;
void SetPositionState(
const mozilla::Maybe<mozilla::dom::PositionState>& aState) override;
void UnregisterEvents();
bool RegisterEvents();
void OnButtonPressed(mozilla::dom::MediaControlKey aKey) const;
// Enable the SMTC interface
bool EnableControl(bool aEnabled) const;
// Sets the play, pause, next, previous, seekto buttons on the SMTC interface
// by mSupportedKeys
bool UpdateButtons();
bool IsKeySupported(mozilla::dom::MediaControlKey aKey) const;
bool EnableKey(mozilla::dom::MediaControlKey aKey, bool aEnable) const;
void OnPositionChangeRequested(double aPosition) const;
bool InitDisplayAndControls();
// Sets the Metadata for the currently playing media and sets the playback
// type to "MUSIC"
bool SetMusicMetadata(const nsString& aArtist, const nsString& aTitle);
// Sets one of the artwork to the SMTC interface asynchronously
void LoadThumbnail(const nsTArray<mozilla::dom::MediaImage>& aArtwork);
// Stores the image at index aIndex of the mArtwork to the Thumbnail
// asynchronously
void LoadImageAtIndex(const size_t aIndex);
// Stores the raw binary data of an image to mImageStream and set it to the
// Thumbnail asynchronously
void LoadImage(const char* aImageData, uint32_t aDataSize);
// Sets the Thumbnail to the image stored in mImageStream
bool SetThumbnail(const nsAString& aUrl);
void ClearThumbnail();
bool UpdateThumbnail(const nsAString& aUrl);
void CancelPendingStoreAsyncOperation() const;
void ClearMetadata();
bool mInitialized = false;
// A bit table indicating what keys are enabled
uint32_t mSupportedKeys = 0;
ComPtr<ISMTC> mControls;
ComPtr<ISMTCDisplayUpdater> mDisplay;
// Use mImageDataWriter to write the binary data of image into mImageStream
// and refer the image by mImageStreamReference and then set it to the SMTC
// interface
ComPtr<IDataWriter> mImageDataWriter;
ComPtr<IRandomAccessStream> mImageStream;
ComPtr<IRandomAccessStreamReference> mImageStreamReference;
ComPtr<IAsyncOperation<unsigned int>> mStoreAsyncOperation;
// mThumbnailUrl is the url of the current Thumbnail
// mProcessingUrl is the url that is being processed. The process starts from
// fetching an image from the url and then storing the fetched image to the
// mImageStream. If mProcessingUrl is not empty, it means there is an image is
// in processing
// mThumbnailUrl and mProcessingUrl won't be set at the same time and they can
// only be touched on main thread
nsString mThumbnailUrl;
nsString mProcessingUrl;
// mArtwork can only be used in main thread in case of data racing
CopyableTArray<mozilla::dom::MediaImage> mArtwork;
size_t mNextImageIndex;
mozilla::UniquePtr<mozilla::dom::FetchImageHelper> mImageFetcher;
HWND mWindow; // handle to the invisible window
// EventRegistrationTokens are used to have a handle on a callback (to remove
// it again)
EventRegistrationToken mButtonPressedToken;
EventRegistrationToken mSeekRegistrationToken;
#endif // __MINGW32__