![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как проигрывать звук по частям? [D7, Win2k, WinXP]
Wolfram © (2006-04-27 09:29:00)Я должен получать по сети пакеты, содержащие куски wave-файла и тут же их проигрывать. Для начала я решил просто целиком загрузить с диска wave-файл и производить его по частям, т.е. настраиваю указатель на начало буфера, проигрываю кусок размером 4Кб, потом передвигаю указатель на 4Кб вперёд, проигрываю еще 4Кб и т.д. Файл полностью проигрывается, но с сильным «иканием», с задержкой после проигрывания каждого куска. Как добиться непрерывного воспроизведения?
Evt := CreateEvent(nil, False, False, nil);
ZeroMemory(@Hdr, SizeOf(Hdr));
if waveOutOpen(@WO, WAVE_MAPPER, @wfx, Evt, 0, CALLBACK_EVENT) <> MMSYSERR_NOERROR then Halt(1);
Hdr.lpData := WaveData; // в WaveData весь файл
Hdr.dwBufferLength := blocklen; // но проигрываю только 4Кб (blocklen=4000)
waveOutPrepareHeader(WO, @Hdr, SizeOf(Hdr));
ResetEvent(Evt);
curpos:=0;
while curpos+blocklen<DataSize do // еще не дошли до конца
begin
waveOutWrite(WO, @Hdr, SizeOf(Hdr));
WaitForSingleObject(Evt, 1000);
inc(WaveData, blocklen); // передвигаю указатель на след. кусок
inc(curpos, blocklen); // позиция
Hdr.lpData := WaveData;
end;
waveOutUnprepareHeader(WO, @Hdr, SizeOf(Hdr));
waveOutClose(WO);
Я пробовал делать это через Callback функцию и получил тот же результат.
Константинов (2006-05-02 00:04:00) [1]Я делал несколько буферов ( непример 8 шт. по 20 мсек каждый ) перед запуском воспроизведения загонял инфу во ВСЕ буферы, а потом использовал CALLBACK процедуру и дописывал инфу в отыгравший буфер и ставил его вновь в очередь на воспроизведение.
Сергей М. (2006-04-27 15:39:00) [2]
> И без него можно обойтись
Ну-ну..
> Потому, что я точно знаю, что каждый блок должен играть
> меньше секунды
> но это могло бы привести к зависанию
Чушь.
> с двумя буферами
Что ж раньше-то не догадался ?
Wolfram (2006-04-27 14:27:00) [3]>Где анализ результата этого вызова ?
И без него можно обойтись
>Почему именно секунду ждешь ?
Потому, что я точно знаю, что каждый блок должен играть меньше секунды.Раньше было INFINITE, но это могло бы привести к зависанию.
Я уже сделал работающий код, через callback функцию и с двумя буферами
Сергей М. (2006-04-27 13:14:00) [4]
> WaitForSingleObject(Evt, 1000)
Где анализ результата этого вызова ?
Почему именно секунду ждешь ?