Добавить поддержку mp3 в SFML.NET
В настоящее время я работаю над аудиобэкендом для моего приложения, которое работает в Mono/.NET. Поэтому я обнаружил, что SFML зависит от платформы, поэтому он подходит. Но нет поддержки mp3 из-за лицензирования.
Поэтому я хотел добавить возможность mp3 для себя в C#. Я использую SFML.Net 2.1 с Mp3Sharp ( http://www.robburke.net/mle/mp3sharp/). Сначала я попробовал это:
Mp3Stream stream = new Mp3Stream("D:\\tmp\\test.mp3");
Music music = new Music(stream);
music.play();
Но это не сработало. Исключение:
AudioCuesheetEditor.AudioBackend.AudioManagerSFML: FATAL | SFML.LoadingFailedException: Failed to load music from memory
at SFML.Audio.Music..ctor(Stream stream)
at AudioCuesheetEditor.AudioBackend.AudioManagerSFML.setMusic() in d:\tmp\AudioCuesheetEditor\src\AudioCuesheetEditor\AudioBackend\AudioManagerSFML.cs
Поэтому я подумал о том, как это сделать в примерах ( https://github.com/LaurentGomila/SFML/wiki/Source%3A-MP3-Player):
Я сделал класс SFMLMp3Stream, который расширяет SoundStream:
public class SFMLMp3Stream : SoundStream
{
private Mp3Stream stream;
public SFMLMp3Stream()
{
stream = null;
}
public Boolean openFromFile(String _filename)
{
//TODO:Check file existence
stream = new Mp3Stream(_filename);
Initialize((uint)stream.ChannelCount,(uint) stream.Frequency);
return true;
}
#region implemented abstract members of SoundStream
protected override bool OnGetData(out short[] samples)
{
if (stream != null)
{
byte[] buffer = new byte[512];
short[] retVal = new short[512];
stream.Read(buffer,0,buffer.Length);
Buffer.BlockCopy(buffer,0,retVal,0,buffer.Length);
samples = retVal;
return true;
}
else
{
samples = null;
return false;
}
}
protected override void OnSeek(TimeSpan timeOffset)
{
if (stream != null)
{
stream.Seek((long)timeOffset.TotalMilliseconds, SeekOrigin.Current);
}
}
#endregion
}
Когда я пытаюсь сейчас это:
musicStream = new SFMLMp3Stream();
musicStream.openFromFile(this.objProgram.getObjCuesheet().getAudiofilePath(true));
music = new Music(musicStream);
Я получаю ошибку компилятора, что Music не может быть инициирована из SFMLMp3Stream (потому что это не строка и не System.IO.Stream. Как я могу расширить SFML для использования Mp3? Кто-нибудь делал это до сих пор?
Спасибо за вашу помощь Свен