开发者

XNA 4 Song.fromUri containing Spaces

开发者_高级运维Hey, When trying to load a Song (via Uri) (Song.fromUri()) from my HDD (file:///...), The Mediaplayer throws a Exception. After a bit of googling i found out, that this Problem is related to Spaces in the Uri, so i tried escaping it:

Uri.escapeUriString() don't work, the Result is a new Uri Object, containing null. Same Thing on uri.escapeDataString() or different Solutions.

Is there an easier way to load an external mp3 into XNA?


The simplest method would be to use reflection to get access to this internal constructor:

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

Here is some code that does just that:

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 });

Obviously this is not really ideal. I do not think the XNA runtime does minor-version updates (meaning that if your game uses XNA 4.0, it is always the same runtime), but I do not know for sure. By using an internal constructor your game is entirely at the mercy of binary updates by Microsoft. You probably want a nice big exception handler on that.

Additionally, I found that some MP3 files would (literally) silently fail to play. Also the Duration property is obviously not filled in by this method.

(Obviously this is Windows-only code. But you can't really access random bits of the filesystem like this on WP7 or Xbox anyway.)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜