|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Воспроизвести звук в потоке
По данному примеру в главном потоке все работает http://www.delphisources.ru/forum/sh...ad.php?t=19786
Создаю в потоке Переменную типа TMCIPlayer, при вызове Play ничего не происходит. Как решить? |
#2
|
||||
|
||||
А что такое TMCIPlayer ?
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
Цитата:
Код:
uses MMSystem, type TMCIPlayer = class private FDeviceID: Cardinal; public constructor Create(FileName: String); destructor Destroy; override; procedure Play; procedure Stop; end; { TMCIPlayer } constructor TMCIPlayer.Create(FileName: String); var OpenParms: TMCI_Open_Parms; FFlags: Longint; FError: Longint; Buffer: array [0..$ff] of Char; begin inherited Create; OpenParms.dwCallback:=0; OpenParms.wDeviceID:=0; OpenParms.lpstrDeviceType:=''; OpenParms.lpstrElementName:=PChar(FileName); OpenParms.lpstrAlias:=PChar(IntToStr(GetTickCount)+#0); FFlags:=MCI_WAIT or MCI_OPEN_ELEMENT or MCI_OPEN_ALIAS; FError:=mciSendCommand(0, MCI_OPEN, FFlags, Longint(@OpenParms)); if FError=0 then FDeviceID:=OpenParms.wDeviceID else begin FDeviceID:=0; mciGetErrorString(FError, @Buffer[0], Length(Buffer)); ShowMessage(StrPas(@Buffer[0])); end; end; destructor TMCIPlayer.Destroy; var GenericParms: TMCI_Generic_Parms; FFlags: Longint; begin if FDeviceID<>0 then begin GenericParms.dwCallback:=0; FFlags:=MCI_WAIT; if mciSendCommand(FDeviceID, MCI_CLOSE, FFlags, Longint(@GenericParms))=0 then FDeviceID:=0; end; inherited Destroy; end; procedure TMCIPlayer.Play; var PlayParms: TMCI_Play_Parms; FFlags: Longint; begin if FDeviceID<>0 then begin FFlags:=MCI_NOTIFY; PlayParms.dwCallback:=0; PlayParms.dwFrom:=0; PlayParms.dwTo:=0; mciSendCommand(FDeviceID, MCI_PLAY, FFlags, Longint(@PlayParms)); end; end; procedure TMCIPlayer.Stop; var GenericParms: TMCI_Generic_Parms; FFlags: Longint; begin if FDeviceID<>0 then begin FFlags:=MCI_WAIT; GenericParms.dwCallback:=0; mciSendCommand(FDeviceID, MCI_STOP, FFlags, Longint(@GenericParms)); end; end; Ну и собственно, в конструкторе потока Код:
Asound:= TMCIPlayer.Create('d:\Alert.mp3'); |
#4
|
||||
|
||||
Команды Open и Play посылай в одном потоке.
Пишу программы за еду. __________________ |
#5
|
|||
|
|||
Цитата:
Код:
type TWait = class(TThread) private .... Asound: TMCIPlayer; .... constructor TWait.Create(doLog:Boolean=False ); begin inherited Create; .... Asound:= TMCIPlayer.Create('d:\Alert.mp3') end; procedure TWait.OnHiLite(RepeatAgain, HiLite: boolean); begin if RepeatAgain then ..... if HiLite then begin // Synchronize(Alert); Asound.Play end; end; |
#6
|
||||
|
||||
Execute нет. А зачем вообще тут поток, звук и так асинхронно воспроизводится.
Пишу программы за еду. __________________ |
#7
|
|||
|
|||
Цитата:
Ну да, через Syncronize вызывается,но не удобно т.к событие отсчитывается в потоке, там бы и хотелось вызвать. |
#8
|
|||
|
|||
Цитата:
|
#9
|
||||
|
||||
В dwCallback передается Handle окна, которому приходят MM_MCINOTIFY. Поток не нужен для ММ.
Пишу программы за еду. __________________ |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
nixon232 (12.12.2016)
|