c# - Windows IoT Raspberry Pi 3 C#音频播放在不同的页面

标签 c# audio raspberry-pi3 audio-player windows-iot-core-10

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

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

编辑代码:

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...";
        };
    }

最佳答案

您需要在此处使用singleton pattern。单例模式是一种软件设计模式,它将类的实例化限制为一个对象。当仅需要一个对象来协调整个系统中的 Action 时,这很有用。

    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();

    }

关于c# - Windows IoT Raspberry Pi 3 C#音频播放在不同的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46381369/

相关文章:

c# - sql server 和 asp.net 中的窗口身份验证

c# - 后台任务由SocketActivityTrigger激活,但是触发器中的套接字返回null

c# - ASP.NET:CreateDomain(...).CreateInstanceAndUnwrap(...) 或 Assembly.LoadFrom(...).GetExportedTypes() 抛出 FileNotFoundException

c#、System.Data.Sqlite 和 Ñ 字符

c# - 将 Accord 音频库与 Windows Phone 8.1 应用程序(非 Silverlight)一起使用

iphone - 如何在录制时将背景音频静音(使用音频队列服务)

jquery - 从改变位置 'Div' 停止 'hover'

android - Python 与 Android 通信?

linux - 无法通过 Linux 终端中的路径运行文件

raspberry-pi3 - Android Things 是否支持 Raspberry Pi 3 型号 B+?