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

问题描述:

我在Raspi Pi 3上制作了一个应用程序,可以在“播放页面”上触发一个按钮,以在页面中使用MediaPlayer激活音频播放。一旦我切换到另一个页面,音频将继续在后台播放,但是一旦我回到“播放页面”,音频仍在播放,但由于我的mediaPlayer = new MediaPlayer(),我失去了对MediaPlayer的控制。线。如果它在重复模式我不能停止播放&如果我触发另一条消息,两个新的&现有的消息将同时播放。Windows IoT Raspberry Pi 3 c#在不同页面中播放音频

即使在页面之间切换时,如何确保一次只能播放一个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更换预定Singleton模式是限制类的实例化一个对象的设计模式。当需要确切的一个对象来协调系统中的操作时,这非常有用。

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

    } 
+0

感谢。我会试试看。我很好奇,使用数据透视表给出的结果几乎与mediaplayer声明不会像我的情况一样会导致代价冲突。 – mylim

+0

嗨我跑的代码&当我点击按钮到页面,它会遇到“异常用户未处理”其中锁定(syncobj) - 值不能为空。我不明白。 – mylim

+0

嗨mylim,syncObj应该是新的一个对象。 –