Я готов. У меня есть программный микшер для 16 буферов (без разницы статических или динамических)
число буферов можно легко нарастить
Как подфункции сделаны ММХ микшеры на 2, 3, 4 потока в 1. ММХ конвертеры моно 44.1 в стерео 44.1, стерео 22.05 в стерео 44.1, моно 22.05 в стерео 44.1 и примитивный ресемплер 44.1 в 48.0
Сейчас отлаживаю код под ДОС.
Hater
Quote:
Берётся ближайший конец загруженного блока и до него воспроизводится, а по окончании воспроизведения если не был дозагружен новый блок, можно организовать что-то вроде виртуального прерывания для обращения к заранее подготовленной программе в процессе, или просто информация об этом виртуальном канале удаляется из таблицы.
Я использую похожую схему. Только у меня первичный буфер состоит из 4 сегментов по 16 кб.
Потоковые (динамические) буферы должны иметь фиксированный размер, кратный размеру сегмента например 64 или 128 кБ.
При достижении середины и конца потокового буфера драйвер посылает программе, создавшей буфер
уведомление.
Статические буферы могут быть любого размера, драйвер будет округлять его до N * 512 байт, а неиспользуемый хвост дотирать нулями.
Когда заканчивается проигрывание очередного 16 кб сегмента АС97 генерирует прерывание
и драйвер микширует в первичный буфер очередные 16 кб из звуковых буферов. Само микширование
происходит блоками по 512 байт - так меньше забивается кеш 1 уровня. Я проверял блоки по 256 и 512 байт в VTUNE на моем P4 2.6c блоки по 512 байт оказались быстрее, но можно для разных процессоров сделать разные схемы.
Для экономии памяти звук в буферах хранится в исходном формате и приводится к основному
(стерео 44100 или 48000) перед микшированием также блоками по 256 или 512 байт.
Для кратных частот 11025 -> 22050 -> 44100 это очень просто. Для преобразования дробных частот
44100 -> 48000 лучше конвертировать сразу весь буфер, моно в моно, стерео в стерео.
При такой схеме нам не нужно манипулировать с BDL и постоянно менять длину воспроизводимого
блока. Недостаток - задержка с началом воспроизведения статического буфера.
При 16 кб сегменте и частоте 44100 масимальная задержка будет приблизительно 0.185 с.
если уменьшить размер сегмента до 8 или 4 кб задержка уменьшится до 0.092 и 0.046 с, что должно
быть приемлемым.
Если есть желание пиши на infinity_sound<собака>mail.ru