Главная страница
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.035 c
4-1153681128
cando
2006-07-23 22:58
2006.12.10
Контроль над процессами


8-1146034876
Devider
2006-04-26 11:01
2006.12.10
Изменение размера изображения при видеозахвате.


2-1163850359
Виталик 2006
2006-11-18 14:45
2006.12.10
Не присваиваются значения!


15-1164214148
Andy BitOff
2006-11-22 19:49
2006.12.10
Не сочтите зп рекламу, но ...


15-1163872173
POP
2006-11-18 20:49
2006.12.10
Типы данных, cardinal