[英]Windows IoT Raspberry Pi 3 c# Audio Playback in Different Pages
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. 我正在Rasp Pi 3上制作一个应用程序,我可以在该页面上触发一个“播放页面”上的按钮以使用MediaPlayer激活音频播放。 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();
一旦切换到另一个页面,音频将继续在后台播放,但是一旦导航回到“播放页面”,音频仍在播放,但是由于我的mediaPlayer = new MediaPlayer(),我失去了对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.
如果处于重复模式,我将无法停止播放;如果触发另一则消息,则新消息和现有消息都将同时播放。
How do I ensure that there is only one MediaPlayer playing at a time even when I switch between pages. 即使在页面之间切换,如何确保一次只播放一个MediaPlayer。 Please help.
请帮忙。 Thank you.
谢谢。
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;
}
}
Old 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...";
};
}
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(); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.