Не вывести звук (Wav) более одного раза. Где ошибка?
От: asdfgh  
Дата: 09.12.02 14:19
Оценка:
Почему-то неполучается 2 раза сделать Play ! Люди помогите.

Задачка проста: проигрывать звук. Надо как можно проще. Функциональность: play, stop, pause, resume, +callback на окончание проигрывания. Поэтому PlaySound() неподходит.

Пытаюсь воспользоваться функциями mci...()

1) mciSendCommand(0, MCI_OPEN, ...
проходит, возвращает "Всё O.K."
2) err = mciSendCommand(..., MCI_PLAY, ...
проходит! Звук играет как нужно, возвращает "Всё O.K."
3) ждем на всякий случай некоторое время после окончания проигрывания...
4) повторяем 2)
НЕ ПРОХОДИТ! Звук неиграется, однако возвращается опять "Всё O.K."

Почему нельзя звук проиграть дважды?
mciSendCommand(..., MCI_STOP, ... между п3) и п4) непомогает.
MSDN молчит..
Закрыть, потом открыть — помогает. Но это кажется кривым решением.


_______________________________________________
Код, если кому интересно:

MCI_WAVE_OPEN_PARMS open_parms;
DWORD flags = 0;
MCIERROR err;

open_parms.dwCallback = (DWORD_PTR)0;
open_parms.wDeviceID = (MCIDEVICEID)0;
open_parms.lpstrDeviceType = (LPCWSTR)(DWORD)MCI_DEVTYPE_WAVEFORM_AUDIO;
open_parms.lpstrElementName = (LPCWSTR)L"1.wav";
open_parms.lpstrAlias = (LPCWSTR)NULL;
open_parms.dwBufferSeconds = (DWORD)0;

flags = MCI_OPEN_TYPE |
MCI_OPEN_TYPE_ID |
MCI_OPEN_ELEMENT |
MCI_WAIT;

err =
mciSendCommand(0,
MCI_OPEN,
flags,
(DWORD)(LPVOID)open_parms
);

/* some time interval ... */
MCI_PLAY_PARMS playParams;
MCIDEVICEID devID = open_parms.wDeviceID;
playParams.dwCallback = 0;
playParams.dwFrom = 0;
playParams.dwTo = 0;

err = mciSendCommand(devID,
MCI_PLAY,
(DWORD)MCI_WAIT,
(DWORD)(LPVOID)&playParams
); // играет, возвращает 0.

/* some time interval ... (жду пару минут после окончания игры) */
err = mciSendCommand(devID,
MCI_PLAY,
(DWORD)MCI_WAIT,
(DWORD)(LPVOID)&playParams
); // НЕ играет, возвращает тоже 0.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.