XNA 4 Song.fromUri containing Spaces

十年热恋 提交于 2019-11-27 19:33:49

问题


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?


回答1:


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.)



来源:https://stackoverflow.com/questions/5813657/xna-4-song-fromuri-containing-spaces

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!