So, gefühlte hundert Stunden später habe ich vermutlich eine Lösung für mein Problem gefunden.
Zwar kann ich immer noch nicht vernünftig mit dem MediaElement umgehen, aber ich kann die Töne laden und abspielen, also das was ich wollte.
Die Klasse die ich dafür verwendet habe ist SoundEffect. SoundEffect kann nur mit wav umgehen, also habe ich erst mal meine mp3s konvertiert.
Dann erstelle ich die SoundEffect Objekte oberhalb des Konstruktors. Dafür nutzt man die Funktion SoundEffectInstance
Bei mir kommen die wav Dateien aus den Ressourcen und das sieht dann so aus:
C#-Quelltext
1: 2: 3: 4:
| SoundEffectInstance effect1 = SoundEffect.FromStream(Application.GetResourceStream(new Uri("Resources/Sounds/kurz_1.wav", UriKind.RelativeOrAbsolute)).Stream).CreateInstance(); SoundEffectInstance effect2 = SoundEffect.FromStream(Application.GetResourceStream(new Uri("Resources/Sounds/kurz_2.wav", UriKind.RelativeOrAbsolute)).Stream).CreateInstance(); SoundEffectInstance effect3 = SoundEffect.FromStream(Application.GetResourceStream(new Uri("Resources/Sounds/kurz_3.wav", UriKind.RelativeOrAbsolute)).Stream).CreateInstance(); SoundEffectInstance effect4 = SoundEffect.FromStream(Application.GetResourceStream(new Uri("Resources/Sounds/kurz_4.wav", UriKind.RelativeOrAbsolute)).Stream).CreateInstance(); |
In meiner Asynchronen PageLoaded Methode stelle ich dann die Lautstärke für die Soundeffecte ein. Im Gegensatz zu dem MediaElement geht die Lautstärke für SoundEffects von 0-1 der Wert muss ein float sein. (MedieElemet hat einen Wertebereich von 0,5 bis 1 und erwartet das in einem double mitgeteilt zu bekommen

)
In meinem Fall sind die Werte über eine Klasse settings gespeichert. Alle Töne haben die gleiche Lautstärke.
C#-Quelltext
1: 2: 3: 4:
| effect1.Volume = (float)settings.LautstärkeSetting; effect2.Volume = (float)settings.LautstärkeSetting; effect3.Volume = (float)settings.LautstärkeSetting; effect4.Volume = (float)settings.LautstärkeSetting; |
In einer switch case Anweisung prüfe ich ob der entsprechende Ton gerade läuft sonst spiele ich ihn ab.
(Ich wusste mir nicht anders zu helfen. Ich habe einen schnelllaufenden dispatcherTimer für die Zeit und lasse den Ton plumb abspielen, wenn ein bestimmter Zahlenwert erreicht ist. Der bleibt aber eine Sekunde stehen so dass die Töne dann schlimmstenfalls etliche Male abgespielt werden würden.
C#-Quelltext
1: 2: 3: 4:
| if (effect1.State != SoundState.Playing) { effect1.Play(); } |
Irgendwo im Programm muss ich die SoundEffets auch mal stoppen, macht man mit
C#-Quelltext
Vielleicht noch zu den MediaElementen.
Ich hatte mich ja schon damit abgefunden nur drei Souunds laden zu können, leider wurde mir aber gemeldet dass die Töne immer wieder mal aussetzten. Beim rumtesten, stellte ich dann fest, dass die Töne aus dem Speicher fliegen, wenn das Programm in den Hintergrund gelegt wird. Da ich es schon die ganze Zeit nicht hin bekommen hatte die Elemete über den C# Code zu laden, habe ich recht schnell aufgegeben in Application_Activated was zu schreiben um die MediaElements wieder in den Speicher zu bekommen.
Bei der Suche nach den Möglichkeiten ist mir dann der SoundEffect untergekommen, der ancheinen wesentlich einfacher zu handhaben ist. Wie viele Effekte man laden kann habe ich nicht überprüft weil mir die vier jetzt erst mal reichten. Die SoundEffets bleiben auch nutzbar, wenn die App pasiert, ohne das man aufwendig was dafür schreiben muss.
Also alles popeleinfach, nur woher nimmt man das Wissen.
Und was soll ich sagen, ich könnte mir vorstellen ich habe immer noch tausend Sachen nicht gefunden, die zu dem Thema gehören
Dies also der Vollständigkeit halber, falls jemand mal die gleiche bekloppte Frage hat
