XNA 4 Song.fromUri, содержащий пробелы - PullRequest
2 голосов
/ 28 апреля 2011

Эй, При попытке загрузить песню (через Uri) (Song.fromUri()) с моего жесткого диска (file: /// ...), Mediaplayer выдает исключение. После небольшого поиска я обнаружил, что эта проблема связана с пробелами в Uri, поэтому я попытался ее избежать:

Uri.escapeUriString() не работает, Результатом является новый Объект Uri, содержащий ноль. То же самое на uri.escapeDataString() или других решениях.

Есть ли более простой способ загрузить внешний mp3 в XNA?

1 Ответ

2 голосов
/ 29 апреля 2011

Самый простой способ - использовать отражение, чтобы получить доступ к этому внутреннему конструктору:

internal Song(string name, string filename, int duration);

Вот код, который делает именно это:

var ctor = typeof(Song).GetConstructor(
        BindingFlags.NonPublic | BindingFlags.Instance, null,
        new[] { typeof(string), typeof(string), typeof(int) }, null);
song = (Song)ctor.Invoke(new object[] { "name", @"C:\My Music\Blah.mp3", 0 });

Очевидно, что это не такдействительно идеально.Я не думаю, что среда выполнения XNA обновляет второстепенные версии (то есть, если ваша игра использует XNA 4.0, она всегда одинакова), но я точно не знаю.Благодаря использованию внутреннего конструктора ваша игра полностью зависит от бинарных обновлений от Microsoft.Вам, вероятно, нужен хороший большой обработчик исключений для этого.

Кроме того, я обнаружил, что некоторые MP3-файлы (в буквальном смысле) не воспроизводятся в буквальном смысле.Кроме того, свойство Duration явно не заполняется этим методом.

(Очевидно, это код только для Windows. Но вы все равно не можете получить доступ к случайным битам файловой системы, подобным этому, в WP7 или Xbox.)

...