我正在构建一个具有可选音频支持的应用程序,它将具有某种背景声音(如在每个页面中继续播放的循环音轨)。
我所做的是创建一个音频管理器,让我可以管理我的声音,这应该根据用户的设置静音/取消静音。
不幸的是,这并没有发生,即使用户禁用它,音频也会继续播放。
这是我的代码示例:
public static async Task StartSoundManager()
{
// Get audio stream from app folder
// ...
BackgroundSound.SetSource(currentStream, currentFile.ContentType);
BackgroundSound.IsLooping = true;
ToggleSounds();
}
public static void ToggleSounds()
{
BackgroundSound.IsMuted = !Settings.IsAudioOn;
}
public bool IsAudioOn
{
// standard getter
set
{
// save value
SoundManager.ToggleSounds();
}
}
经过一些测试后,IsMuted
设置正确(我也尝试将音量设置为0)但更改设置时没有任何反应。
你们有没有想过为什么这么简单的任务没有按预期工作?在我看来,在设置源代码后你无法改变音量,这感觉非常错误。
编辑:更完整的课程
public static class AudioManager
{
public const string BACKGROUND = "BACKGROUND.mp3";
private static readonly MediaElement BackgroundSound = new MediaElement();
public static async Task StartSoundManager()
{
// Get folder
var folder =
await (await Package.Current.InstalledLocation.GetFolderAsync("Assets")).GetFolderAsync("Audio");
var currentFile = await folder.GetFileAsync(BACKGROUND);
var currentStream = await currentFile.OpenAsync(FileAccessMode.Read);
BackgroundSound.SetSource(currentStream, currentFile.ContentType);
// Set mode and volume
BackgroundSound.IsLooping = true;
ToggleSounds();
}
public static void ToggleSounds()
{
BackgroundSound.IsMuted = !Settings.IsAudioOn; // IsAudioOn is false, still the sound plays
}
}
答案 0 :(得分:1)
MediaElement是一个XAML控件,为了使MediaElement.IsMuted property正常工作,我们需要将ssh_channel channels[2];
ssh_channel myChannel = ssh_channel_new (ssh_session session);
channels[0] = myChannel;
channels[1] = NULL;
struct timeval timeout = (0, 200000); // 0 seconds, 200 millis
int rc = ssh_select (channels, NULL, NULL, NULL, &timeout);
if (rc > 0) {// There is a pending data.
if (rc < 0) // the ssh_select() error.
if (rc == 0) // You've got a broken connection.
添加到Visual Tree中。例如,在您的代码中,我们可以将MediaElement
更改为公共字段,如:
BackgroundSound
然后在页面(例如MainPage)中将其添加到页面:
public static readonly MediaElement BackgroundSound = new MediaElement();
在此之后,您的protected override async void OnNavigatedTo(NavigationEventArgs e)
{
await AudioManager.StartSoundManager();
rootGrid.Children.Add(AudioManager.BackgroundSound);
}
方法应该可以正常工作。
但是,由于您希望继续在每个页面中播放,因此在页面中添加ToggleSounds
可能不是一个好习惯,我建议您使用MediaPlayer class代替 MediaElement < / strong>喜欢:
MediaElement
有关详细信息,请参阅Play audio and video with MediaPlayer。
答案 1 :(得分:0)
我也有类似情况。我有一个ToggleMenuFlyoutItem,用于打开和关闭整个应用程序中写入本地设置的声音:
这是XAML:
<Button IsTabStop="False" Style="{StaticResource qButtonStyleFinal}" TabIndex="2" x:Name="btnMore" BorderBrush="{x:Null}" Foreground="{x:Null}"
Content="1" Grid.Column="37" Margin="5" HorizontalAlignment="Center" Grid.Row="1" Grid.RowSpan="4" Grid.ColumnSpan="2" MaxWidth="60" MaxHeight="60">
<Button.Background>
<ImageBrush ImageSource="ms-appx:///Assets/more_project.png" Stretch="Uniform" />
</Button.Background>
<Button.Flyout>
<MenuFlyout>
<ToggleMenuFlyoutItem x:Name="mfiToggleSounds" Text="sound effects" IsChecked="{x:Bind Mode=TwoWay, Path=Model.Sounds}"></ToggleMenuFlyoutItem>
<MenuFlyoutItem x:Name="mfiExportExcel" Text="export to Excel" Tapped="mfiExportExcel_Tapped" />
<MenuFlyoutItem x:Name="mfiExportCSV" Text="export to CSV" Tapped="mfiExportCSV_Tapped" />
<MenuFlyoutItem x:Name="mfiEmailDeveloper" Text="email developer" Tapped="mfiEmailDeveloper_Tapped" />
</MenuFlyout>
</Button.Flyout>
</Button>
更改在属性设置事件中处理:
private bool _sounds = true;
public bool Sounds
{
get => _sounds;
set
{
_sounds = value;
NotifyPropertyChanged();
var localSettings = ApplicationData.Current.LocalSettings;
localSettings.Values["sounds"] = _sounds;
}
}
将设置加载到主页Page_Loaded事件中,如下所示:
// retrieve settings
var localSettings = ApplicationData.Current.LocalSettings;
if (localSettings.Values.ContainsKey("sounds"))
{
clsGlobal.statModel.Sounds = (bool)localSettings.Values["sounds"];
}
当我播放声音时,包含一个简单的if条件:
if (clsGlobal.statModel.Sounds && clsGlobal.fileInputs.ContainsKey("problem.wav"))
{
var snd1 = clsGlobal.fileInputs["problem.wav"];
if (snd1 != null)
{
snd1.Reset();
snd1.Start();
}
}
我正在使用AudioGraph API播放声音。比MediaPlayer的路由效果更好,因为那给了我一个奇怪的情况,有时在第一次请求时声音有时无法播放。 AudioGraph对我来说效果更好,而且播放声音的速度确实很快。