Windows IoT Raspberry Pi 3 c#音频播放在不同的页面 [英] Windows IoT Raspberry Pi 3 c# Audio Playback in Different Pages

查看:95
本文介绍了Windows IoT Raspberry Pi 3 c#音频播放在不同的页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在Rasp Pi 3上制作一个应用程序,在这里我可以触发播放页面"上的按钮以使用页面中的MediaPlayer激活音频播放.一旦我切换到另一个页面,音频将继续在后台播放,但是一旦我导航回播放页面",音频仍在播放,但是由于我的mediaPlayer = new MediaPlayer(),我失去了对MediaPlayer的控制.线.如果处于重复模式,我将无法停止播放&如果我触发了另一条消息,则新的&现有消息将同时播放.

I am making an app on Rasp Pi 3 where I can trigger a button on "Playback Page" to activate an audio playback using MediaPlayer in a page. Once I switch to another page, the audio will remain playing in the background but once I navigate back to the "Playback Page" the audio is still playing but i lost control of the MediaPlayer due to my mediaPlayer = new MediaPlayer(); line. if it's on repeat mode I can't stop playing & if i trigger another message, both new & existing message will play concurrently.

即使在页面之间切换,如何确保一次只播放一个MediaPlayer. 请帮忙.谢谢.

How do I ensure that there is only one MediaPlayer playing at a time even when I switch between pages. Please help. Thank you.

修改后的代码:

public sealed partial class MessagePage : Page
{

   private object syncObj = new object();

   public MessagePage()
       {
           this.InitializeComponent();
           startclock();

           this.Home.Click += Home_Click;
           this.Message.Click += Message_Click;

           //mediaPlayer = new MediaPlayer();
           mediaPlayer = this.GetInstance();

           //mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;
           //mediaPlayer.MediaOpened += MediaPlayer_MediaOpened;
       }

    public MediaPlayer GetInstance()
       {
           lock (syncObj)
           {
               if (mediaPlayer == null)
               {
                   mediaPlayer = new MediaPlayer();
                   mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;
                   mediaPlayer.MediaOpened += MediaPlayer_MediaOpened;
               }
           }

           return mediaPlayer;
       }
   }

旧代码:

public MessagePage()
    {
        this.InitializeComponent();
        startclock();

        this.Home.Click += Home_Click;
        this.Message.Click += Message_Click;

        mediaPlayer = new MediaPlayer();
        mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;

    }

private async void Btn_Click(object sender, RoutedEventArgs e)
    {
        StorageFolder externalDevices = KnownFolders.RemovableDevices;
        IReadOnlyList<StorageFolder> externalDrives = await externalDevices.GetFoldersAsync();
        StorageFolder usbStorage = externalDrives[0];

        if (usbStorage != null)
        {
            StorageFolder storageFolder = KnownFolders.RemovableDevices;
            StorageFile audioFile = await usbStorage.GetFileAsync("message1.mp3");
            mediaPlayer.Source = Windows.Media.Core.MediaSource.CreateFromStorageFile(audioFile);
            mediaPlayer.Play();
            TextBlock.Text = "Playing Message 1...";
        }
        else
        {
            TextBlock.Text = "No USB Storage Detected...";
        };
    }

推荐答案

您需要使用

You need to use singleton pattern here.The singleton pattern is a software design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system.

    private static readonly object syncObj = new object(); 

    public MediaPlayer GetInstance()
    {
        lock (syncObj)
        {
            if (mediaPlayer == null)
            {
                mediaPlayer = new MediaPlayer();
                mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;
            }
        }

        return mediaPlayer;
    }

    public MessagePage()
    {
        this.InitializeComponent();
        startclock();

        this.Home.Click += Home_Click;
        this.Message.Click += Message_Click;

        //mediaPlayer = new MediaPlayer();
        mediaPlayer = this.GetInstance();

    }

这篇关于Windows IoT Raspberry Pi 3 c#音频播放在不同的页面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆