вот лог :)Цитата:
Сообщение от SMT
Вид для печати
вот лог :)Цитата:
Сообщение от SMT
большая часть из-за неподдержки nameless structs/unions в описании Z80. а так мелочи
ну да, по крайней мере это вроде единственное, что требует вмешательства в код, а не только в декларации.Цитата:
Сообщение от SMT
не только. ещё проскочила разок переменная, объявленная в for и ещё кое-какие мелочи
пофиксен глюк с рассинхронизацией AY и других звуковых источников (bepeer, tape, etc), добавлен класс SNDCOUNTER для определения, сколько семплов полностью готово (при генерации от нескольких источников) и откуда из внутреннего буфера надо брать эти семплы. пример использования - в файле sndcounter.h
ура, все работает :)
кстати, предложение -- а почему бы не сделать режим EXTERNAL_BUFFER штатным? то есть передавать в start_frame указатель на буфер и его длину. ИМХО при таком раскладе больше ничего и не надо -- он полностью заменяет нынешний умолчальный режим. а то сейчас чтобы EXTERNAL_BUFFER врубить, приходится лезть в сорцы (тк дефинить его, а потом инклюдить *.h и *.cpp в файл -- неудобно, особенно если такой файл не один ,)
типа: void start_frame(SNDSAMPLE *dst, unsigned dstlen, unsigned dstpos=0);
потому что 1) могут передавать размер - не степень двойки и 2) потеряется несколько десятков тактов внутри цикла заполнения буфера из-за переменных вместо констант (действия с константами MSVC оптимизирует на отлично)Цитата:
кстати, предложение -- а почему бы не сделать режим EXTERNAL_BUFFER штатным?
понятно, я специально вынес это в отдельный файл sndbuffer.h - достаточно исправить там 1-2 строки - указать, в какой переменной лежит буферЦитата:
сейчас чтобы EXTERNAL_BUFFER врубить, приходится лезть в сорцы
з.ы. теперь можно немного упростить обработку звука - start_frame вызывать без параметра, результат end_frame игнорировать (см. пример), объект SNDCOUNTER сам всё считает
не степень 2ки и дефайном можно указать :rolleyes:Цитата:
Сообщение от SMT
тогда еще надо #include "sndcounter.h" в sndcounter.cpp вынести на самый верх, а в sndcounter.h добавить #include "sndbuffer.h" перед ifdef'омЦитата:
Сообщение от SMT
хмм... если важно быстродействие, можно сделать темплейтами с параметрами-константами: медленней не станет, при использовании код править вообще не придется, и если понадобиться с несколькими буферами работать (может пригодиться в плеерах и тп) ничего не помешает.
ЗЫ извини за занудство, просто я маньяк по части интерфейсов, когда вижу отличный код, безумно хочется, чтобы и интерфейс был весь из себя :rolleyes:
это я уже добавил в sndrender.h:Цитата:
не степень 2ки и дефайном можно указать
Код:#ifdef SND_EXTERNAL_BUFFER
#if ((SND_EXTERNAL_BUFFER_SIZE & (SND_EXTERNAL_BUFFER_SIZE-1)) != 0)
#pragma error("SND_EXTERNAL_BUFFER_SIZE must be power of 2")
#endif
#endif
согласенЦитата:
тогда еще надо #include "sndcounter.h" в sndcounter.cpp вынести на самый верх
включается через #include "sndrender.h", который надо вынести наверхЦитата:
а в sndcounter.h добавить #include "sndbuffer.h" перед ifdef'ом
можно, но это надо думать - надо ещё заводить класс-буфер и юзать его как параметр шаблона, что-ли, чтобы все SNDRENDER'ы c одним буфером были одним классомЦитата:
хмм... если важно быстродействие, можно сделать темплейтами с параметрами-константами: медленней не станет, при использовании код править вообще не придется, и если понадобиться с несколькими буферами работать (может пригодиться в плеерах и тп) ничего не помешает
а хуже того, могут с каждым разом передавать разные буферы и размеры, когда всё должно быть одинаково, чтобы SNDCOUNTER правильно работалЦитата:
не степень 2ки и дефайном можно указать