Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.10;
Скачать: CL | DM;

Вниз

Как проигрывать звук по частям?   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2006.12.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.049 c
15-1164214148
Andy BitOff
2006-11-22 19:49
2006.12.10
Не сочтите зп рекламу, но ...


4-1154212729
Spirit111
2006-07-30 02:38
2006.12.10
Как получить список всех контейнеров в данном криптопровайдере?


3-1160129268
alucard
2006-10-06 14:07
2006.12.10
Не могу переконвертировать *.db в *.txt


15-1164004463
pssst
2006-11-20 09:34
2006.12.10
win 2003


2-1164549497
AHTOLLlKA
2006-11-26 16:58
2006.12.10
Изменить ресурсы