Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Basic Media Session UI for Hololens #24927

Merged
merged 5 commits into from Dec 5, 2019
Merged
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Hololens - Trigger MediaSessionActions for play and pause buttons

  • Loading branch information
ferjm committed Dec 5, 2019
commit d5200ba453a5c70780498a894b1194a6398027a7
@@ -607,6 +607,14 @@ pub extern "C" fn click(x: f32, y: f32) {
});
}

#[no_mangle]
pub extern "C" fn media_session_action(action: i32) {
catch_any_panic(|| {
debug!("media_session_action");
call(|s| s.media_session_action(action));
});
}

pub struct WakeupCallback(extern "C" fn());

impl WakeupCallback {
@@ -7,6 +7,7 @@
#include "BrowserPage.h"
#include "BrowserPage.g.cpp"
#include "DefaultUrl.h"
#include "MediaSession.h"

using namespace std::placeholders;
using namespace winrt::Windows::Foundation;
@@ -72,18 +73,20 @@ void BrowserPage::BindServoEvents() {
urlTextbox().GotFocus(std::bind(&BrowserPage::OnURLFocused, this, _1));
servoControl().OnMediaSessionMetadata(
[=](hstring title, hstring artist, hstring album) {});
servoControl().OnMediaSessionPlaybackStateChange([=](const auto &,
int state) {
if (state == 1 /* none */) {
mediaControls().Visibility(Visibility::Collapsed);
return;
}
mediaControls().Visibility(Visibility::Visible);
playButton().Visibility(state == 3 /* paused */ ? Visibility::Visible
: Visibility::Collapsed);
pauseButton().Visibility(state == 3 /* paused */ ? Visibility::Collapsed
: Visibility::Visible);
});
servoControl().OnMediaSessionPlaybackStateChange(
[=](const auto &, int state) {
if (state == servo::PlaybackState::NONE) {
mediaControls().Visibility(Visibility::Collapsed);
return;
}
mediaControls().Visibility(Visibility::Visible);
playButton().Visibility(state == servo::PlaybackState::PAUSED
? Visibility::Visible
: Visibility::Collapsed);
pauseButton().Visibility(state == servo::PlaybackState::PAUSED
? Visibility::Collapsed
: Visibility::Visible);
});
}

void BrowserPage::OnURLFocused(Windows::Foundation::IInspectable const &) {
@@ -159,9 +162,15 @@ void BrowserPage::OnURLEdited(IInspectable const &,

void BrowserPage::OnMediaControlsPlayClicked(
Windows::Foundation::IInspectable const &,
Windows::UI::Xaml::RoutedEventArgs const &) {}
Windows::UI::Xaml::RoutedEventArgs const &) {
servoControl().SendMediaSessionAction(
static_cast<int32_t>(servo::MediaSessionAction::PLAY));
}
void BrowserPage::OnMediaControlsPauseClicked(
Windows::Foundation::IInspectable const &,
Windows::UI::Xaml::RoutedEventArgs const &) {}
Windows::UI::Xaml::RoutedEventArgs const &) {
servoControl().SendMediaSessionAction(
static_cast<int32_t>(servo::MediaSessionAction::PAUSE));
}

} // namespace winrt::ServoApp::implementation
@@ -140,10 +140,6 @@
<CommandBar Grid.Row="3" x:Name="mediaControls" Visibility="Collapsed">
<AppBarButton Icon="Play" Label="Play" x:Name="playButton" Visibility="Collapsed" Click="OnMediaControlsPlayClicked"/>
<AppBarButton Icon="Pause" Label="Pause" x:Name="pauseButton" Click="OnMediaControlsPauseClicked"/>

<CommandBar.Content>
<TextBlock Text="Now playing..." Margin="12,14"/>
</CommandBar.Content>
</CommandBar>
</Grid>

@@ -0,0 +1,21 @@
#pragma once

namespace winrt::servo {
enum PlaybackState {
NONE = 1,
PLAYING,
PAUSED
};

enum MediaSessionAction {
PLAY = 1,
PAUSE,
SEEK_BACKWARD,
SEEK_FORWARD,
PREVIOUS_TRACK,
NEXT_TRACK,
SKIP_AD,
STOP,
SEEK_TO
};
}
@@ -122,6 +122,7 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="logs.h" />
<ClInclude Include="MediaSession.h" />
<ClInclude Include="pch.h" />
<ClInclude Include="App.h">
<DependentUpon>App.xaml</DependentUpon>
@@ -40,6 +40,9 @@
</ClInclude>
<ClInclude Include="DefaultUrl.h" />
<ClInclude Include="XRPkgChecker.h" />
<ClInclude Include="MediaSession.h">
<Filter>ServoControl</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Image Include="Assets\Wide310x150Logo.scale-200.png">
@@ -73,8 +73,7 @@ Servo::Servo(hstring url, hstring args, GLsizei width, GLsizei height,
capi::CInitOptions o;
hstring defaultPrefs = L" --pref dom.webxr.enabled";
o.args = *hstring2char(args + defaultPrefs);
o.url =
"https://ferjm.github.io/web-api-tests/video/mp4.html"; //*hstring2char(url);
o.url = *hstring2char(url);
o.width = mWindowWidth;
o.height = mWindowHeight;
o.density = dpi;
@@ -88,6 +88,9 @@ class Servo {
capi::resize(mWindowWidth, mWindowHeight);
}
}
void SendMediaSessionAction(int32_t action) {
capi::media_session_action(action);
}

private:
ServoDelegate &mDelegate;
@@ -271,6 +271,10 @@ hstring ServoControl::LoadURIOrSearch(hstring input) {
return searchUri;
}

void ServoControl::SendMediaSessionAction(int32_t action) {
RunOnGLThread([=] { mServo->SendMediaSessionAction(action); });
}

void ServoControl::TryLoadUri(hstring input) {
if (!mLooping) {
mInitialURL = input;
@@ -3,6 +3,7 @@
#include "OpenGLES.h"
#include "Servo.h"
#include "DefaultUrl.h"
#include "MediaSession.h"

namespace winrt::ServoApp::implementation {
struct ServoControl : ServoControlT<ServoControl>, public servo::ServoDelegate {
@@ -15,6 +16,7 @@ struct ServoControl : ServoControlT<ServoControl>, public servo::ServoDelegate {
void Stop();
void Shutdown();
hstring LoadURIOrSearch(hstring);
void SendMediaSessionAction(int32_t);

void OnLoaded(IInspectable const &,
Windows::UI::Xaml::RoutedEventArgs const &);
@@ -14,14 +14,15 @@ namespace ServoApp {
void SetTransientMode(Boolean transient);
void SetArgs(String args);
void Shutdown();
void SendMediaSessionAction(UInt32 action);
event EventDelegate OnLoadStarted;
event EventDelegate OnLoadEnded;
event EventDelegate OnCaptureGesturesStarted;
event EventDelegate OnCaptureGesturesEnded;
event HistoryChangedDelegate OnHistoryChanged;
event Windows.Foundation.EventHandler<String> OnTitleChanged;
event Windows.Foundation.EventHandler<String> OnURLChanged;
event MediaSessionMetadataDelegate OnMediaSessionMetadata;
event Windows.Foundation.EventHandler<int> OnMediaSessionPlaybackStateChange;
event MediaSessionMetadataDelegate OnMediaSessionMetadata;
event Windows.Foundation.EventHandler<int> OnMediaSessionPlaybackStateChange;
}
} // namespace ServoApp
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.