2017-09-23 4 views
0

Ich mache eine App auf Rasp Pi 3, wo ich eine Schaltfläche auf "Playback Page" aktivieren kann, um eine Audio-Wiedergabe mit MediaPlayer auf einer Seite zu aktivieren. Sobald ich auf eine andere Seite umschalte, wird der Ton im Hintergrund weiter abgespielt, aber sobald ich zurück zur "Playback Page" navigiere, läuft der Ton noch, aber ich habe die Kontrolle über den MediaPlayer verloren wegen meinem mediaPlayer = new MediaPlayer(); Linie. Wenn es im Wiederholungsmodus ist, kann ich nicht aufhören zu spielen &, wenn ich eine andere Nachricht trigger, beide neue & bestehende Nachricht wird gleichzeitig abgespielt.Windows IoT Raspberry Pi 3 C# Audiowiedergabe in verschiedenen Seiten

Wie stelle ich sicher, dass immer nur ein MediaPlayer gleichzeitig abgespielt wird, auch wenn ich zwischen den Seiten wechsle. Bitte helfen. Vielen Dank.

Edited Code:

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

Alter Code:

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

Antwort

1

Sie benötigen singleton pattern here.The Singletonmuster zu verwenden, ist ein Software-Design-Muster, das die Instanziierung einer Klasse ein Objekt beschränkt. Dies ist nützlich, wenn genau ein Objekt zum Koordinieren von Aktionen im System benötigt wird.

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

Dank. Ich werde das ausprobieren. Ich bin neugierig, dass die Verwendung von Pivot fast das gleiche Ergebnis liefert, dass die Mediaplayer-Deklaration keinen Konflikt wie meinen Fall kostet? – mylim

+0

Hallo Ich habe den Code & als ich auf die Schaltfläche auf der Seite, lief es in "Ausnahme User-Unhandled" wo Lock (syncobj) - Wert kann nicht null sein. Ich verstehe nicht. – mylim

+0

Hi mylim, syncObj sollte ein neues Objekt sein. –

Verwandte Themen