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..d24a0c9 --- /dev/null +++ b/MediaPlayerSample/Avalonia.Media.Demo.LinuxFB/Avalonia.Media.Demo.LinuxFB.csproj @@ -0,0 +1,25 @@ + + + Exe + + net8.0 + linux-arm64 + + enable + true + Avalonia.Media.Demo.LinuxFB + + + $(DefineConstants);DEMO_FB + + + + + + + + + + + + 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..967d7dc 100644 --- a/MediaPlayerSample/Avalonia.Media.Demo/Views/MainView.axaml.cs +++ b/MediaPlayerSample/Avalonia.Media.Demo/Views/MainView.axaml.cs @@ -31,6 +31,12 @@ 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. + Dispatcher.UIThread.InvokeAsync(() => { MainVm.SetSource(new UriSource("/home/user/video.mp4")); }, DispatcherPriority.Idle); +#endif + base.OnAttachedToVisualTree(e); } @@ -41,7 +47,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 +89,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; @@ -113,4 +118,4 @@ private async void MediaPlayerControl_OnErrorOccurred(object? sender, MediaPlaye e.Handled = true; await dialog.ShowAsync(); } -} \ No newline at end of file +}