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