From 72cc0f72839658f1199e8a638ed10a09d8aaa554 Mon Sep 17 00:00:00 2001
From: Jumar Macato <16554748+jmacato@users.noreply.github.com>
Date: Tue, 22 Jul 2025 15:36:43 +0800
Subject: [PATCH 1/4] Update MediaPlayer sample for Avalonia DRM Framebuffer
platform support.
---
Avalonia.Accelerate.Samples.sln | 7 +++++
.../Avalonia.Media.Demo.LinuxFB.csproj | 30 +++++++++++++++++++
.../Avalonia.Media.Demo.LinuxFB/Program.cs | 23 ++++++++++++++
.../Views/MainView.axaml.cs | 13 ++++++--
4 files changed, 71 insertions(+), 2 deletions(-)
create mode 100644 MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Avalonia.Media.Demo.LinuxFB.csproj
create mode 100644 MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Program.cs
diff --git a/Avalonia.Accelerate.Samples.sln b/Avalonia.Accelerate.Samples.sln
index 3f964db..619c99a 100644
--- a/Avalonia.Accelerate.Samples.sln
+++ b/Avalonia.Accelerate.Samples.sln
@@ -40,6 +40,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAuthenticationBrokerSamp
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAuthenticationBrokerSample", "WebAuthenticationBrokerSample\WebAuthenticationBrokerSample\WebAuthenticationBrokerSample.csproj", "{7CFB22DE-B8D6-799B-743C-8AF89E97E88F}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Media.Demo.LinuxFB", "MediaPlayerSample\Avalonia.Media.Demo.LinuxFB\Avalonia.Media.Demo.LinuxFB.csproj", "{649359EA-BB57-4FE2-968D-EE8EDDAF7350}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -90,6 +92,10 @@ Global
{7CFB22DE-B8D6-799B-743C-8AF89E97E88F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7CFB22DE-B8D6-799B-743C-8AF89E97E88F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7CFB22DE-B8D6-799B-743C-8AF89E97E88F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {649359EA-BB57-4FE2-968D-EE8EDDAF7350}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {649359EA-BB57-4FE2-968D-EE8EDDAF7350}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {649359EA-BB57-4FE2-968D-EE8EDDAF7350}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {649359EA-BB57-4FE2-968D-EE8EDDAF7350}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -106,5 +112,6 @@ Global
{A34DCED3-E26F-9DF0-163C-720E3F795031} = {F1654980-CA9F-ACCF-E2A2-9AEE1C29565B}
{C4E89863-6CA3-D3A6-C504-58989B5E7526} = {F1654980-CA9F-ACCF-E2A2-9AEE1C29565B}
{7CFB22DE-B8D6-799B-743C-8AF89E97E88F} = {F1654980-CA9F-ACCF-E2A2-9AEE1C29565B}
+ {649359EA-BB57-4FE2-968D-EE8EDDAF7350} = {D42C37AA-53F4-D48D-0B84-299B5E68CB34}
EndGlobalSection
EndGlobal
diff --git a/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Avalonia.Media.Demo.LinuxFB.csproj b/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Avalonia.Media.Demo.LinuxFB.csproj
new file mode 100644
index 0000000..bfea5a6
--- /dev/null
+++ b/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Avalonia.Media.Demo.LinuxFB.csproj
@@ -0,0 +1,30 @@
+
+
+ Exe
+
+ net8.0
+ linux-arm64
+
+ enable
+ true
+ Avalonia.Media.Demo.LinuxFB
+
+
+ $(DefineConstants);DEMO_FB
+
+
+
+ app.manifest
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Program.cs b/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Program.cs
new file mode 100644
index 0000000..f6066f4
--- /dev/null
+++ b/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Program.cs
@@ -0,0 +1,23 @@
+using System;
+using Avalonia;
+using Avalonia.LinuxFramebuffer;
+
+namespace Avalonia.Media.Demo.LinuxFB;
+
+sealed class Program
+{
+ // Initialization code. Don't use any Avalonia, third-party APIs or any
+ // SynchronizationContext-reliant code before AppMain is called: things aren't initialized
+ // yet and stuff might break.
+ [STAThread]
+ public static void Main(string[] args) => BuildAvaloniaApp()
+ // DRI paths can change. Try all the devices under /dev/dri/* if the default doesn't work.
+ .StartLinuxDrm(args: args, card: "/dev/dri/card1", scaling: 1.0);
+
+ // Avalonia configuration, don't remove; also used by visual designer.
+ public static AppBuilder BuildAvaloniaApp()
+ => AppBuilder.Configure()
+ .UsePlatformDetect()
+ .WithInterFont()
+ .LogToTrace();
+}
diff --git a/MediaPlayerSample/Avalonia.Media.Demo/Views/MainView.axaml.cs b/MediaPlayerSample/Avalonia.Media.Demo/Views/MainView.axaml.cs
index f0ba451..45f84b1 100644
--- a/MediaPlayerSample/Avalonia.Media.Demo/Views/MainView.axaml.cs
+++ b/MediaPlayerSample/Avalonia.Media.Demo/Views/MainView.axaml.cs
@@ -31,6 +31,16 @@ protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
MainVm.DropCommand = new RelayCommand(HandleDrop);
+#if DEMO_FB
+ // TODO: For testing purposes only, since Avalonia DRM backend doesn't support direct keyboard input just yet.
+ // So we "manually" set the media source for immediate playback.
+ Task.Factory.StartNew(async () =>
+ {
+ await Task.Delay(1000);
+ Dispatcher.UIThread.InvokeAsync(() => { MainVm.SetSource(new UriSource("/home/user/video.mp4")); });
+ });
+#endif
+
base.OnAttachedToVisualTree(e);
}
@@ -41,7 +51,6 @@ private void HandleDrop(DragEventArgs? e)
if (files is null || MainVm is null) return;
MainVm.SetSource(new UriSource(files.Path));
-
}
private async void Load_Click(object? _, RoutedEventArgs __)
@@ -84,7 +93,7 @@ private async void Load_Uri_Click(object? sender, Avalonia.Interactivity.RoutedE
var result = await dialog.ShowAsync();
- if(result == ContentDialogResult.Primary)
+ if (result == ContentDialogResult.Primary)
{
if (string.IsNullOrWhiteSpace(input.Text) || MainVm == null) return;
From 1fed6aa346303ffa359943b53e12e0953c1fbcb7 Mon Sep 17 00:00:00 2001
From: Jumar Macato <16554748+jmacato@users.noreply.github.com>
Date: Tue, 22 Jul 2025 15:38:25 +0800
Subject: [PATCH 2/4] remove comment
---
.../Avalonia.Media.Demo.LinuxFB.csproj | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Avalonia.Media.Demo.LinuxFB.csproj b/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Avalonia.Media.Demo.LinuxFB.csproj
index bfea5a6..a0ecedd 100644
--- a/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Avalonia.Media.Demo.LinuxFB.csproj
+++ b/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Avalonia.Media.Demo.LinuxFB.csproj
@@ -1,8 +1,7 @@
Exe
-
+
net8.0
linux-arm64
From 56c668796a69e4e6cb3f00460179a3949b783f0a Mon Sep 17 00:00:00 2001
From: Jumar Macato <16554748+jmacato@users.noreply.github.com>
Date: Tue, 22 Jul 2025 15:39:35 +0800
Subject: [PATCH 3/4] remove manifest
---
.../Avalonia.Media.Demo.LinuxFB.csproj | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Avalonia.Media.Demo.LinuxFB.csproj b/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Avalonia.Media.Demo.LinuxFB.csproj
index a0ecedd..d24a0c9 100644
--- a/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Avalonia.Media.Demo.LinuxFB.csproj
+++ b/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Avalonia.Media.Demo.LinuxFB.csproj
@@ -12,11 +12,7 @@
$(DefineConstants);DEMO_FB
-
-
- app.manifest
-
-
+
From 14c2f02d804abee95d8eda781ba838c13e71ffa9 Mon Sep 17 00:00:00 2001
From: Jumar Macato <16554748+jmacato@users.noreply.github.com>
Date: Fri, 25 Jul 2025 19:24:29 +0800
Subject: [PATCH 4/4] Update MainView.axaml.cs
---
.../Avalonia.Media.Demo/Views/MainView.axaml.cs | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/MediaPlayerSample/Avalonia.Media.Demo/Views/MainView.axaml.cs b/MediaPlayerSample/Avalonia.Media.Demo/Views/MainView.axaml.cs
index 45f84b1..967d7dc 100644
--- a/MediaPlayerSample/Avalonia.Media.Demo/Views/MainView.axaml.cs
+++ b/MediaPlayerSample/Avalonia.Media.Demo/Views/MainView.axaml.cs
@@ -34,11 +34,7 @@ protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
#if DEMO_FB
// TODO: For testing purposes only, since Avalonia DRM backend doesn't support direct keyboard input just yet.
// So we "manually" set the media source for immediate playback.
- Task.Factory.StartNew(async () =>
- {
- await Task.Delay(1000);
- Dispatcher.UIThread.InvokeAsync(() => { MainVm.SetSource(new UriSource("/home/user/video.mp4")); });
- });
+ Dispatcher.UIThread.InvokeAsync(() => { MainVm.SetSource(new UriSource("/home/user/video.mp4")); }, DispatcherPriority.Idle);
#endif
base.OnAttachedToVisualTree(e);
@@ -122,4 +118,4 @@ private async void MediaPlayerControl_OnErrorOccurred(object? sender, MediaPlaye
e.Handled = true;
await dialog.ShowAsync();
}
-}
\ No newline at end of file
+}