-
С микрофона!!
WaveInStart(WaveDev); While Not Terminated Do Begin Res:=WaitForSingleObject(Event,INFINITE); Case Res of WAIT_OBJECT_0: Begin If BufHead.dwFlags and WHDR_DONE<>0 Then Begin Synchronize(OnBufferEvent); End; Err:=WaveInAddBuffer(WaveDev,@BufHead,SizeOf(BufHead)); If Err<>0 Then; End;
End;
Воиспроизведение:
Flag:=True;
While Not Terminated Do Begin If (BufHead.dwFlags and WHDR_DONE<>0)or(Flag) Then Begin If AddBuffer Then Begin WaveOutWrite(WaveDev,@BufHead,SizeOf(BufHead)); Flag:=False; End; End; Res:=WaitForSingleObject(Event,100); Case Res of WAIT_OBJECT_0: Begin If BufHead.dwFlags and WHDR_DONE<>0 Then Begin Flag:=True; End; End; End; End;
Если я при получении буфера отсылаю его на воиспроизведение в другой поток то он воспроизводится но с небольшими заиканиями! И через время нарастает задержка между сказанным и воиспроизведенным бывает до 15сек! У кого есть пример как воиспроизвести правильно звук
-
Мож использовать как в ОГЛ/ДХ графике двойную буферизацию? Пишется напр только полученный звук в буфер, в то время как из другого воспроизводится предыдущий. Затем "передний" и "задний" буфера переключаются.
-
Не получится! У меня звук одновременно отображается в Synchronize(); Т.е. хочеш сказать, что у меня рабочий пример и ошибок и коментарий по коду нет?
-
Вообче ещё не пробовал... Микрофон кудато засовал и забыл куда :) Если найду - протестю, отпишуся.
-
> __Unknown__ (20.07.07 10:43) [2]
> Не получится
Ну тогда и избавиться от "заиканий" не получится.
Рецепт тебе был дан верный:
1. Использовать мультибуферизацию ввода. 2. Отказаться от Synchronize()
-
> __Unknown__
И вообще - не мучайся, возьми готовый фриварный компонент с http://www.droopyeyes.comХоть в кач-ве "черного ящика", хоть для изучения как это делается (исходники доступны).
-
Переделал так! hBuf:=GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE,hBufSize shl 1); BufAddr:=GlobalLock(hBuf); BufAddrArr[0]:=BufAddr; BufAddrArr[1]:=Pointer(Integer(BufAddr)+hBufSize); //----- FBufIndex:=0; BufHead[0].lpData:=BufAddrArr[0]; BufHead[0].dwBufferLength:=hBufSize; BufHead[0].dwFlags:=WHDR_BEGINLOOP; BufHead[1].lpData:=BufAddrArr[1]; BufHead[1].dwBufferLength:=hBufSize; BufHead[1].dwFlags:=WHDR_BEGINLOOP; //----- WaveInPrepareHeader(WaveDev,@BufHead[0],SizeOf(TWAVEHDR)); WaveInPrepareHeader(WaveDev,@BufHead[1],SizeOf(TWAVEHDR)); WaveInAddBuffer(WaveDev,@BufHead[FBufIndex],SizeOf(TWAVEHDR)); WaveInStart(WaveDev); While Not Terminated Do Begin Res:=WaitForSingleObject(Event,INFINITE); Case Res of WAIT_OBJECT_0: Begin FOldIndex:=FBufIndex; FBufIndex:=FBufIndex Xor 1; WaveInAddBuffer(WaveDev,@BufHead[FBufIndex],SizeOf(TWAVEHDR)); If (BufHead[FOldIndex].dwFlags and WHDR_DONE)=WHDR_DONE Then Begin OnBufferEvent; End; End;
End;
End; WaveInReset(WaveDev); WaveInUnPrepareHeader(WaveDev, addr(BufHead[0]), sizeof(TWAVEHDR)); WaveInUnPrepareHeader(WaveDev, addr(BufHead[1]), sizeof(TWAVEHDR)); WaveInClose(WaveDev); GlobalUnlock(hBuf); GlobalFree(hBuf); CloseHandle(Event);
Короче до процедуры OnBufferEvent не доходит! Если убрать проверку флагов, то перед началом воспроизведения стоит свист 1 секунду!
Я пытался передать звук по сети и происходит следующее: Каждый раз увеличивается задержка между сказанным мной и полученным по сети. Может кто подскажет в чем баг? Размер буфера для каждой настройки расчитывается по формуле BufSize:=(SamplesPerSec shr 2)*(BitsPerSample shr 3); Т.е. вне зависимо от качества снимаемого звука задержка на его заполнение (по моему мнению :) ) должна быть одинаковой (1/4 секунды)! И вне зависимости от выборки (4000Нz или 44100Нz) звук начинает запаздывать привоспроизведении.
-
Тоже самое наблюдается при локальной обработке, т.е. считал воспроизвел... Не знаю что делать :( :)
-
> Не знаю что делать
Я ж тебе не зря ссылку на компоненты привел.
Что мешает посмотреть в исх-ках заведомо корректно работающего компонента как это делается правильно ?
-
>Сергей М. © (23.07.07 08:23) [8]
Так ведь там чувак спрашивал про пример Генератора с Королевства Делфи, а ты сказал, что там неправильная система.
-
> Sdubaruhnul (23.07.07 15:23) [9]
> Так ведь там чувак
"там" это где ?
Речь сейчас идет о "здесь")
-
> Тоже самое наблюдается при локальной обработке, т.е. считал > воспроизвел... > Не знаю что делать :( > :)
Локальная - это как??? Куда то считал буфер, сохранил в памяти и воспроизвел???
-
курить синхронизацию процессов! pulseEvent!! считал - записал - пульсанул... <- в одном потоке подождал события - воспроизвел <- в другом потоке и каждый поток в цикле.
|