Autor Beitrag
m-s
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: So 17.08.14 09:59 
Ich habs schon mal im Microsoft Forum versucht, aber hier gibt’s meist die besseren Antworten, deswegen versuche ich es mal mit einem Crossposting.

Ich habe mit dem Thema sicherlich schon 20 Stunden zugebracht und finde einfach keinen sinnvollen Ansatz.

social.msdn.microsof...um=windowsphonedevde

Eigentlich doch eine völlig einfache Sache würde ich meinen. Ich denke vielleicht wirft Windows Phone die zusätzlichen SoundFiles wieder aus dem Speicher um nicht zu viel Arbeitsspeicher zu belegen oder sowas.?
Ich habe dann gedacht ich lade die Soundfiles erst bei Bedarf, aber das dauert viel zu lange und so kommen die Töne gar nicht würden aber auch nicht zum Richtigen Zeitpunkt kommen. Dann dachte ich, ich muss die Operationen mit den Soundfiles im Hintergrund ausführen, also wenn ich bei 60 Sekunden einen Soundfile brauche, den bei 30 laden oder sowas. Alle meine Versuche irgendwas mit async oder so zu machen sind gescheitert, ich verstehe wohl nicht wirklich wie das funktioniert bzw. es sieht für mich aus als würden nur bestimmte Methoden mit Async zusammenarbeiten.

Eigentlich aber denk ich, dass kann doch nicht so schwer sein, wie ich es mir machen. 4 Signaltöne abspielen, bei 0, 60, 90 und 120 Sekunden muss doch irgendwie ganz simpel zu machen sein?
Vielleicht weiß einer von Euch was ich versuchen kann.

_________________
Gruß Markus
m-s Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: Mi 20.08.14 09:25 
Nach weiterem ewigen Suchen und Lesen meine ich erfahren zu haben, dass man tatsächlich nicht mehr als drei (eigentlich sollen es fünf sein) MediaElemente laden kann. Außerdem scheint es so zu sein, dass MediaElemente nur im XAML aus den Ressourcen laden können. Im C# nur aus dem Web oder Storage.
Letzteres habe ich aber noch nicht versucht.

[Zumindest hatte die Sucherei ein Gutes, ich habe im Ansatz verstanden wie man eigene Methoden in einem anderen Task ausführen kann :)]

Auf jeden Fall bin ich genau keinen Schritt weiter gekommen mit den MediaElementen. Habe das Programm so umgeschrieben, dass es nur drei Elemente lädt.
Eigentlich kann ich mir aber nicht vorstellen, dass man wirklich nicht mehr laden kann, oder denke ich benutze die falsche Methode oder sowas.

Falls also jemand noch was weiß . . .

_________________
Gruß Markus
m-s Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: So 31.08.14 00:44 
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:

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

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

ausblenden 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

ausblenden C#-Quelltext
1:
effect1.Stop();					



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

_________________
Gruß Markus

Für diesen Beitrag haben gedankt: Christian S.