Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.053 c
2-1164527238
Chuk &amp; Gek
2006-11-26 10:47
2006.12.10
мыло


4-1154423221
learner
2006-08-01 13:07
2006.12.10
Параметр Flags в SYSTEM_MODULE_INFORMATION


2-1164360980
KyRo
2006-11-24 12:36
2006.12.10
Как узнать создана ли нить


6-1153442710
Glu
2006-07-21 04:45
2006.12.10
Не одно подключение


5-1144928569
BPK
2006-04-13 15:42
2006.12.10
Как создать редактор свойства как для TDBGrid.Columns ?




   Наверх