Сообщение от
Sinus
короче вот результаты моиз изголений:
несмотря на то, что /*max 8 fragments*/
у меня лучший результат достигается про значениях 11-12 (я убрал пока логарифм нафих).
и в старой версии wavplay.cpp установка размера фрагмента шла в самом конце, а в новом- где-то посредине. это так надо?
я перенёс в конец- ничего вроде не поменялось.
и вообще, лучше всего себя вела SDL - почти чистый звук.
установка размера фрагмента должна быть сразу после открытия устройства, иначе с большой вероятностью не сработает, см доки по OSS. комментарий про "8 макс" означал, что именно в этом конкретном случае фрагментов стоит 8, а не что их больше не должно быть.
размер фрагмента равен двойке в степени младшего слова числа, передаваемого ioctl'у SNDCTL_DSP_SETFRAGMENT (то есть в младшем слове -- log2 от требуемого размера). тут я тупо слажал, забыл двойку на конце log -__-.
итого
Код:
tmp = (frag_num << 16) | (int) (log2(frag_size) + 0.5);
при таком раскладе, кстати, у меня даже на 2х фрагментах прекрасно пашет (тк размер фрагмента наконец-то больше размера звукового фрейма ). надо думать, из-за этого и была вся муть.
UPD. 0.5 -- тоже тупизм, ceil(log2(frag_size)) тогда уж
вообщем, если прилагаемый вавплей у тебя будет нормально работать, предлагаю размер фрагмента не совать в конфиг, а сделать во фрейм ((((unsigned long)71680/*frame*/*44100/*sound freq*/) / 3500000 /*Z80 clock*/) * 4), больше смысла не имеет. а frag_num в конфиг ИМХО стоит, тк при маленьком кол-ве фрагментов получается рилтайм, а при большом можно юзать эмуль как плеер, без опасения, что он захрюкает при большой загрузке проца.