Autor Beitrag
Anti
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 31.01.10 00:24 
Also zu aller erst ist der Titel vlt. etwas missverständlich, aber mir ist nix besseres eingefallen ;)

Es geht darum:
ich würde gern mit dem SoundPlayer (unter System.Media) mehrere .wav Dateien hintereinander abspielen, aber dazu muss ich wissen wann der Soundplayer ein wav-Datei vollständig abgespielt hat, damit ich die nächste abspielen kann. Das Problem ist aber, dass der SoundPlayer mit der Methode Play() die wav-Datei in einem neuen Thread öffnet/abspielt, und kein Event bzw. Eigenschaft bereitstellt die zeigt ob die Sounddatei jetzt bis zum ende abgespielt wurde.

Kann mir da einer helfen? (notfalls auch mit einem anderen "player")

(falls es so einen Beitrag schon gibt schickt bitte den Link, weil ich wusste nich genau nach was ich suchen sollte)

Danke im Voraus!

MFG
Andreas ;)
Anti Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 02.02.10 20:56 
Naja hab jetzt ne andere Lösung. Die ist zwar nicht so toll, aber es geht^^
Ich lass jetzt die Soundlänge auslesen und warte einfach so lang^^

das sieht so ungefähr so aus: (mein prog is bisschen anders habs jetzt nur vereinfacht)
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
        [System.Runtime.InteropServices.DllImport("winmm.dll")]
        private static extern uint mciSendString(string command, StringBuilder returnValue, int returnLength, IntPtr winHandle);
        
        private void PlaySound()
        {
                 DateTime dt = DateTime.Now;
                 for (int i = 0; i<PfadzuDatei.Count; i++)
                 {
                        sp = new SoundPlayer(PfadzuDatei[i]);
                        minWain = getWaveLength(PfadzuDatei[i])
                        sp.Load();
                        if ((minWait) - DateTime.Now.Subtract(dt).TotalMilliseconds > 0)
                            Thread.Sleep((int)((minWait) - DateTime.Now.Subtract(dt).TotalMilliseconds));
                        dt = DateTime.Now
                        sp.Play();
                 }
        }

        private static int getWaveLength(string filepath)
        {
            StringBuilder lengthBuf = new StringBuilder(32);

            mciSendString(string.Format("open \"{0}\" type waveaudio alias wave", filepath), null0, IntPtr.Zero);
            mciSendString("status wave length", lengthBuf, lengthBuf.Capacity, IntPtr.Zero);
            mciSendString("close wave"null0, IntPtr.Zero);

            int length = 0;
            int.TryParse(lengthBuf.ToString(), out length);

            return length;
        }


das alles wird in nem neuen Thread geöffnet...
daher hab ich das jetzt die Pausen mit Thread.Sleep gemacht...
gibts da irgend wie was sinnvolleres? mir ist irgendwie nix besseres eingefallen :P

MFG Anti