2016-08-19 55 views
0

我建设具有可选的音频支持的应用程序,它的特色将某种背景声音(如循环配乐上的每一页打保持)切换音频。在UWP应用

我所做的就是创建一个音频管理器,让我来管理我的声音,这应根据用户的设置静音/取消静音音频。

不幸的是,这不会发生,且音频不断播放即使用户禁用它。

这是我的代码示例:

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

不会停止()/播放()更有意义?至少你会知道代码是否实际运行:) –

+0

不,因为该设置还切换一次性声音。这个想法是将声音逻辑写成好像始终开启,然后使用音量/静音给用户一个选择。另外,我不明白为什么'IsMute'或'Volume'属性不起作用,迫使我过分复杂这件事。 – StepTNT

+0

你正在使用什么'BackgroundSound'?它是一个'MediaElement'吗?我可以用'MediaElement'重现你的问题。 “IsMuted'属性在我身边很好。你能分享一个可以重现你的问题的[mcve]吗? –

回答

1

MediaElement是一个XAML控制,以使MediaElement.IsMuted property工作,我们需要添加MediaElement到Visual树。例如,在你的代码,我们可以改变BackgroundSound到公共领域,如:

public static readonly MediaElement BackgroundSound = new MediaElement(); 

,然后在页面(如的MainPage)将其添加到页面:

protected override async void OnNavigatedTo(NavigationEventArgs e) 
{ 
    await AudioManager.StartSoundManager(); 

    rootGrid.Children.Add(AudioManager.BackgroundSound); 
} 

在此之后,您的ToggleSounds方法应该能够工作。

但既然你想保持在每一页打,加MediaElement到页面可能不是一个好的做法,在这里我建议你使用MediaPlayer class代替的MediaElement,如:

public static class AudioManager 
{ 
    public const string BACKGROUND = "BACKGROUND.mp3"; 

    private static readonly MediaPlayer BackgroundSound = new MediaPlayer(); 

    public static void StartSoundManager() 
    { 
     BackgroundSound.Source = MediaSource.CreateFromUri(new Uri($"ms-appx:///Assets/Audio/{BACKGROUND}")); 

     BackgroundSound.IsLoopingEnabled = true; 

     ToggleSounds(); 

     BackgroundSound.Play(); 
    } 

    public static void ToggleSounds() 
    { 
     BackgroundSound.IsMuted = !Settings.IsAudioOn; // IsAudioOn is false, still the sound plays 
    } 
} 

欲了解更多信息,请参阅Play audio and video with MediaPlayer

+0

我在做一些测试用'MediaPlayer',但它甚至没有编译,因为它说,'MediaPlayer'没有参数的构造函数。 – StepTNT

+0

@StepTNT你使用的是什么操作系统版本? Windows 10周年更新(版本10.0.14393.0)中引入了[MediaPlayer.MediaPlayer构造函数](https://msdn.microsoft.com/en-us/library/windows/apps/windows.media.playback.mediaplayer.mediaplayer) ,您需要最新的Windows 10 SDK并将项目的目标版本设置为“Windows 10 Anniversary Edition(10.0; Build 14393)”。 –

+0

我无法删除那些还没有收到更新(包括我)的人。我怎样才能使这两个10586和AU的工作? – StepTNT