Я о том что 480 выборок в буфере и дискретность целая (хотя когда смотрел тесты когда hmdi основное звуковое устройство, у меня было 75% delta=0, остальное 480 и 224, иногда что то левое с большими значениями проскакивало)
На Win2003 вообще не работает тест, говорит "Can't create Back-Buffer Surface!"
вот код прототипа-симулятора. 2я колонка показывает реальное число сэмплов в буфере, оно должно стабилизироваться.
Код:# -*- coding: utf-8 -*- import random QUANT=882 # рассчетное число сэмплов в прерывание RES=480 # разрешение указателей звукового буфера bufpos=0 # позиция буфера записи playpos=0 # позиция буфера чтения # put data to buffer def render_frame(n): global bufpos bufpos+=int(n+0.5) # play data from buffer def play_frame(n): global bufpos,playpos n+=random.randint(-5,3) # add some noise to samples number playpos+=n if bufpos<playpos: print "Underrun!" # get rounded position def get_pos(): return playpos/RES*RES # limit value from l to h def lim(v,l,h): return min(h,max(l,v)) render_frame(RES) # пребуфферинг fff=[];fff2=[] # окна фильтров delta=0.0 # добавка к рассчетному числу сэмплов I=0.0 # сост. интегратора avg=0 # среднее зн. числа сэмплов while 1: # "заполняем" буфер, проигрыванием, вычисляем изменение указателя t1=get_pos() render_frame(QUANT+delta) play_frame(QUANT) t2=get_pos() print avg,bufpos-playpos,delta,I # filter 1 fff.append(t2-t1) fff=fff[-200:] avg=float(sum(fff))/len(fff) # filter 2 fff2.append(avg) fff2=fff2[-200:] avg=sum(fff2)/len(fff2) # вычисленное реальное число сэмплов за фрейм # ПИ-регулятор if len(fff)>=200: # работает, если есть статистика по 200 фреймам smps=int(QUANT+delta+0.5) # кол-во положенных сэмплов (то, что ушло в render_frame() в этот раз) err=lim(avg-smps,-5,5) # разница между вычисленным средним и отправленным I+=err*0.01; I=lim(I,-5,5) # ограниченный интегратор P=0.5*err # проп. звено delta=P+I # сумма
Питон это, без знания синтаксиса может жестью показаться
Код:Да разве ж это жесть?
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)