Форум: "Media";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизКак проигрывать звук по частям? Найти похожие ветки
← →
Wolfram © (2006-04-27 09:29) [0]Я должен получать по сети пакеты, содержащие куски 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-04-27 13:14) [1]
> WaitForSingleObject(Evt, 1000)
Где анализ результата этого вызова ?
Почему именно секунду ждешь ?
← →
Wolfram © (2006-04-27 14:27) [2]>Где анализ результата этого вызова ?
И без него можно обойтись
>Почему именно секунду ждешь ?
Потому, что я точно знаю, что каждый блок должен играть меньше секунды.Раньше было INFINITE, но это могло бы привести к зависанию.
Я уже сделал работающий код, через callback функцию и с двумя буферами
← →
Сергей М. © (2006-04-27 15:39) [3]
> И без него можно обойтись
Ну-ну..
> Потому, что я точно знаю, что каждый блок должен играть
> меньше секунды
> но это могло бы привести к зависанию
Чушь.
> с двумя буферами
Что ж раньше-то не догадался ?
← →
Константинов © (2006-05-02 00:04) [4]Я делал несколько буферов ( непример 8 шт. по 20 мсек каждый ) перед запуском воспроизведения загонял инфу во ВСЕ буферы, а потом использовал CALLBACK процедуру и дописывал инфу в отыгравший буфер и ставил его вновь в очередь на воспроизведение.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.046 c