2010-12-27 2 views
0

Я реализую воспроизведение mp3 на Windows Mobile 6.5. Мне нужно использовать функцию API SndPlayAsync, так как я не хочу блокировать вызов потока до тех пор, пока файл не будет воспроизведен (блоки SndPlaySync будут блокироваться до воспроизведения аудиофайла). К сожалению, метод SndPlayAsync воспринимает звуковой дескриптор вместо пути звукового файла как параметра, поэтому необходимо открыть дескриптор до и отпустить его после воспроизведения. Проблема в том, что у меня нет никакой информации о завершении воспроизведения в этом API. Кто-нибудь использовал оболочку C# для этого API? Где я могу его получить? Я просмотрел OPENNETCF, но они, похоже, не поддерживают этот API.Windows Mobile 6.5 SndPlayAsync - оболочка C#?

С уважением

ответ

0

Если вы используете .NET CF, нет причин создавать оболочку, вы можете просто использовать класс System.Media.SoundPlayer для его обработки. Существует несколько опций, включая PlaySync, который будет воспроизводить звук синхронно.

Например:

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

Вы также можете поместить его в отдельном потоке, если вы не хотите, чтобы блокировать поток пользовательского интерфейса.

+0

Этот класс не может воспроизводить mp3-файлы, которые, как я сказал, являются обязательными в моем приложении. – cubesoft

1

Вы должны вызвать SndOpen первый, чтобы получить ручку. Глядя на документы, заявления, было бы что-то вдоль этих линий:

[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); 

Таким образом, вы бы использовать что-то вроде этого, чтобы назвать его:

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

... 

SndClose(handle); 
+0

Да, это очевидно и для меня. Дело в том, когда звонить SndClose? Как я узнаю, когда воспроизведение закончено? – cubesoft

+0

Посмотрите на SndGetWaitHandle (http://msdn.microsoft.com/en-us/library/bb416690.aspx), который «возвращает дескриптор события, установленного при воспроизведении звука». – ctacke

0

Вы можете использовать SndGetWaitHandle, чтобы получить описатель событие, которое будет сигнализироваться, когда звук закончен. Вы можете использовать API WaitForSingleObject, чтобы ждать или проверить, установлено ли событие.

+0

Правильно, но я решил создать отдельную тему каждый раз, когда я играю в mp3, и в этом потоке я вызываю функцию SndPlaySync. – cubesoft

Смежные вопросы