tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

MediaControlKeySource.cpp (4108B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "MediaControlKeySource.h"
      8 
      9 #include "MediaControlService.h"
     10 #include "MediaControlUtils.h"
     11 #include "MediaController.h"
     12 #include "mozilla/Logging.h"
     13 
     14 namespace mozilla::dom {
     15 
     16 // avoid redefined macro in unified build
     17 #undef LOG_SOURCE
     18 #define LOG_SOURCE(msg, ...)                 \
     19  MOZ_LOG(gMediaControlLog, LogLevel::Debug, \
     20          ("MediaControlKeySource=%p, " msg, this, ##__VA_ARGS__))
     21 
     22 #undef LOG_KEY
     23 #define LOG_KEY(msg, key, ...)                                                 \
     24  MOZ_LOG(gMediaControlLog, LogLevel::Debug,                                   \
     25          ("MediaControlKeyHandler=%p, " msg, this, ToMediaControlKeyStr(key), \
     26           ##__VA_ARGS__));
     27 
     28 void MediaControlKeyHandler::OnActionPerformed(
     29    const MediaControlAction& aAction) {
     30  LOG_KEY("OnActionPerformed '%s'", aAction.mKey);
     31 
     32  RefPtr<MediaControlService> service = MediaControlService::GetService();
     33  MOZ_ASSERT(service);
     34  RefPtr<IMediaController> controller = service->GetMainController();
     35  if (!controller) {
     36    return;
     37  }
     38 
     39  if (aAction.mKey.isNothing()) {
     40    MOZ_ASSERT_UNREACHABLE("Error : undefined media key!");
     41    return;
     42  }
     43  switch (aAction.mKey.value()) {
     44    case MediaControlKey::Focus:
     45      controller->Focus();
     46      return;
     47    case MediaControlKey::Play:
     48      controller->Play();
     49      return;
     50    case MediaControlKey::Pause:
     51      controller->Pause();
     52      return;
     53    case MediaControlKey::Playpause: {
     54      if (controller->IsPlaying()) {
     55        controller->Pause();
     56      } else {
     57        controller->Play();
     58      }
     59      return;
     60    }
     61    case MediaControlKey::Previoustrack:
     62      controller->PrevTrack();
     63      return;
     64    case MediaControlKey::Nexttrack:
     65      controller->NextTrack();
     66      return;
     67    case MediaControlKey::Seekbackward: {
     68      const SeekDetails& details = *aAction.mDetails;
     69      MOZ_ASSERT(details.mRelativeSeekOffset);
     70      controller->SeekBackward(fmin(details.mRelativeSeekOffset.value(), 10.0));
     71      return;
     72    }
     73    case MediaControlKey::Seekforward: {
     74      const SeekDetails& details = *aAction.mDetails;
     75      MOZ_ASSERT(details.mRelativeSeekOffset);
     76      controller->SeekForward(fmin(details.mRelativeSeekOffset.value(), 10.0));
     77      return;
     78    }
     79    case MediaControlKey::Skipad:
     80      controller->SkipAd();
     81      return;
     82    case MediaControlKey::Seekto: {
     83      const SeekDetails& details = *aAction.mDetails;
     84      MOZ_ASSERT(details.mAbsolute);
     85      controller->SeekTo(details.mAbsolute->mSeekTime,
     86                         details.mAbsolute->mFastSeek);
     87      return;
     88    }
     89    case MediaControlKey::Stop:
     90      controller->Stop();
     91      return;
     92    default:
     93      MOZ_ASSERT_UNREACHABLE("Error : undefined media key!");
     94      return;
     95  }
     96 }
     97 
     98 MediaControlKeySource::MediaControlKeySource()
     99    : mPlaybackState(MediaSessionPlaybackState::None) {}
    100 
    101 void MediaControlKeySource::AddListener(MediaControlKeyListener* aListener) {
    102  MOZ_ASSERT(aListener);
    103  LOG_SOURCE("Add listener %p", aListener);
    104  mListeners.AppendElement(aListener);
    105 }
    106 
    107 void MediaControlKeySource::RemoveListener(MediaControlKeyListener* aListener) {
    108  MOZ_ASSERT(aListener);
    109  LOG_SOURCE("Remove listener %p", aListener);
    110  mListeners.RemoveElement(aListener);
    111 }
    112 
    113 size_t MediaControlKeySource::GetListenersNum() const {
    114  return mListeners.Length();
    115 }
    116 
    117 void MediaControlKeySource::Close() {
    118  LOG_SOURCE("Close source");
    119  mListeners.Clear();
    120 }
    121 
    122 void MediaControlKeySource::SetPlaybackState(MediaSessionPlaybackState aState) {
    123  if (mPlaybackState == aState) {
    124    return;
    125  }
    126  LOG_SOURCE("SetPlaybackState '%s'", ToMediaSessionPlaybackStateStr(aState));
    127  mPlaybackState = aState;
    128 }
    129 
    130 MediaSessionPlaybackState MediaControlKeySource::GetPlaybackState() const {
    131  return mPlaybackState;
    132 }
    133 
    134 }  // namespace mozilla::dom