Windows Phone 7: Silverlight и воспроизведение музыки - PullRequest
0 голосов
/ 16 августа 2011

Я построил простую игру в WP7 и пытаюсь добавить в нее фоновую музыку с помощью MediaPlayer.Проблема в том, что это просто бомбы с

{"Произошла непредвиденная ошибка."} System.Exception {System.InvalidOperationException}

Код

try
                {
                    MediaPlayer.Stop();
                    // Timer to run the XNA internals (MediaPlayer is from XNA)
                    DispatcherTimer dt = new DispatcherTimer();
                    dt.Interval = TimeSpan.FromMilliseconds(33);
                    dt.Tick += delegate { try { FrameworkDispatcher.Update(); } catch { } };
                    dt.Start();

                    Uri pathToFile = new Uri("Audio/music.m4a", UriKind.Relative);
                    Song playingSong = Song.FromUri("Music", pathToFile);
                    MediaPlayer.Play(playingSong);
                }
                catch (Exception e)
                {
                    musicFailed = true;
                    Console.WriteLine("Exception: {0}", e.ToString());
                    MessageBox.Show("Warning, music failed to play however you can still continue to play your game.");
                }
            }

Я попыталсянесколько настроек, конвертирование файлов в mp3, разные пути и т. д. Файл помечен для копирования всегда и для типа контента Я также пытался удалить Dispatcher, так как не знаю, для чего он.

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Если вы можете преобразовать ваши аудиофайлы в формат WAV, вы можете попробовать использовать классы XNA SoundEffect и SoundEffectInstance:

SoundEffect se = SoundEffect.FromStream(isolatedStorageFileStream);
SoundEffectInstance sei = se.CreateInstance();
sei.Play();

Чтобы это работало, вам нужно обратиться к библиотеке XNA (Microsoft.XNA.Framework) и инициализировать структуру следующим образом:

App.xaml:

<Application>
    <Application.ApplicationLifetimeObjects>
        <local:XNAFrameworkDispatcherService />
        ...
    </Application.ApplicationLifetimeObjects>    
</Application>

И создайте этот класс где-нибудь в пространстве имен приложения («local» в предыдущем xaml ссылается на это пространство имен):

public class XNAFrameworkDispatcherService : IApplicationService
{
    private DispatcherTimer frameworkDispatcherTimer;
    public XNAFrameworkDispatcherService()
    {
        this.frameworkDispatcherTimer = new DispatcherTimer();
        this.frameworkDispatcherTimer.Interval = TimeSpan.FromTicks(333333);
        this.frameworkDispatcherTimer.Tick += frameworkDispatcherTimer_Tick;
        FrameworkDispatcher.Update();
    }
    void frameworkDispatcherTimer_Tick(object sender, EventArgs e) { FrameworkDispatcher.Update(); }
    void IApplicationService.StartService(ApplicationServiceContext context) { this.frameworkDispatcherTimer.Start(); }
    void IApplicationService.StopService() { this.frameworkDispatcherTimer.Stop(); }
}
0 голосов
/ 16 августа 2011

Ваша проблема в том, что ваш таймер, возможно, не запустил первый тик и FrameworkDispatcher.Update() не запустился.Затем Play добавляет System.InvalidOperationException.

Лучшая диспетчеризация событий XNA global в вашем приложении.

Полное руководство: XNAAsyncDispatcher

...