2010-12-27 6 views
0

Ich implementiere MP3-Wiedergabe auf Windows Mobile 6.5. Ich muss die SndPlayAsync API-Funktion verwenden, da ich den aufrufenden Thread nicht blockieren möchte, bis die Datei abgespielt wird (SndPlaySync blockiert, bis die Audiodatei abgespielt wird). Leider verwendet die SndPlayAsync-Methode den Sound-Handle anstelle des Sound-Dateipfads als Parameter, so dass es notwendig ist, das Handle vor und nach der Wiedergabe zu öffnen. Das Problem ist, dass ich keine Informationen über die Wiedergabe-Beendigung in dieser API habe. Hat jemand einen C# -Wrapper für diese API verwendet? Wo kann ich einen bekommen? Ich habe nach OPENNETCF gesucht, aber sie scheinen diese API nicht zu unterstützen.Windows Mobile 6.5 SndPlayAsync - C# -Wrapper?

Grüße

Antwort

0

Wenn Sie .NET CF verwenden, gibt es keinen Grund, einen Wrapper zu erstellen, Sie können einfach die Klasse System.Media.SoundPlayer verwenden, um damit umzugehen. Es gibt mehrere Optionen, einschließlich PlaySync, die den Ton synchron wiedergeben.

Zum Beispiel:

string path = "\\Program Files\\SNAP.App.CE\\Content\\5LongLow.wav"; 
System.Media.SoundPlayer player = new System.Media.SoundPlayer(path); 
player.PlaySync(); 

Sie können auch in einem separaten Thread setzen, wenn Sie wollen, um den UI-Thread nicht blockieren.

+0

Diese Klasse kann keine mp3-Dateien wiedergeben, die ich angegeben habe, ist ein Muss in meiner Anwendung. – cubesoft

1

Sie haben SndOpen rufen zuerst den Griff zu bekommen. Mit Blick auf die docs, wäre die Erklärungen etwas in dieser Richtung:

[DllImport("coredll", SetLastError=true)] 
public static extern int SndOpen(string fileName, out IntPtr handle); 

[DllImport("coredll", SetLastError=true)] 
public static extern int SndPlayAsync (IntPtr handle, int flags); 

[DllImport("coredll", SetLastError=true)] 
public static extern int SndClose(IntPtr handle); 

So würden Sie so etwas wie dieses verwenden es zu nennen:

IntPtr handle; 
var result = SndOpen("myfile.mp3", out handle); 
if(result == 0) SndPlayAsync(handle, 0); 

... 

SndClose(handle); 
+0

Ja, das ist auch für mich offensichtlich. Der Punkt ist, wann SndClose aufrufen? Woher weiß ich, wann die Wiedergabe beendet ist? – cubesoft

+0

Sieh dir SndGetWaitHandle (http://msdn.microsoft.com/en-us/library/bb416690.aspx) an, das "einen Punkt an ein Event zurückgibt, das gesetzt wird, wenn der Sound fertig abgespielt wird." – ctacke

0

Sie können SndGetWaitHandle verwenden, um einen Griff auf eine bekommen Ereignis, das signalisiert wird, wenn der Sound beendet ist. Sie können die WaitForSingleObject-API verwenden, um zu warten oder zu testen, ob das Ereignis festgelegt wurde.

+0

korrekt, aber ich habe beschlossen, jedes Mal, wenn ich mp3 spiele einen separaten Thread spawnen und in diesem Thread rufe ich SndPlaySync-Funktion. – cubesoft