2017-09-23 11 views
0

Je crée une application sur Rasp Pi 3 où je peux déclencher un bouton sur "Playback Page" pour activer une lecture audio en utilisant MediaPlayer dans une page. Une fois que je passe à une autre page, l'audio reste en arrière-plan mais une fois que je reviens à la "Playback Page", l'audio est toujours en cours de lecture mais j'ai perdu le contrôle du MediaPlayer = new MediaPlayer(); ligne. si c'est en mode répétition je ne peux pas arrêter de jouer & si je déclenche un autre message, les deux nouveaux messages & seront lus simultanément. Comment puis-je m'assurer qu'il n'y a qu'un seul lecteur MediaPlayer à la fois, même lorsque je passe d'une page à l'autre. S'il vous plaît aider. Je vous remercie.Windows IoT Raspberry Pi 3 C# Lecture audio dans différentes pages

Code Modifié:

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

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

Répondre

1

Vous devez utiliser singleton pattern here.The pattern singleton est un modèle de conception de logiciel qui limite l'instanciation d'une classe à un objet. C'est utile quand exactement un objet est nécessaire pour coordonner les actions à travers le système.

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

Merci. Je vais essayer ça. Je suis curieux que l'utilisation de pivot donne presque le même résultat que la déclaration mediaplayer ne coûtera pas de conflit comme mon cas? – mylim

+0

Salut, j'ai couru le code et comme je clique sur le bouton à la page, il a couru dans "exception User-Unhandled" où la valeur de verrouillage (syncobj) ne peut pas être nulle. Je ne comprends pas. – mylim

+0

Salut mylim, syncObj devrait être un nouvel objet. –