т.е. можно написать прямой драйвер усб карты, имея таблицу команд чипа (си-медия)?
Теоретически можно.
Но я не совсем понимаю цели.
... и добавил: В приведённой программе используется DirectX 8 for Visual Basic без регистрации. Формируется буфер и прокручивается бесконечно.
VB 6.0 не может работать с DirectX 9 и выше.
Начиная с DirectX 9 используется управляемый код. Я не знаю что это. Но современные ЯП должны же их как-то использовать.
С портами хорошо работается на С#. Должно легко и просто работать на VB.Net.
Кстати, попробовал изменить алгоритм. Беру сейчас для первой итерации начальное число периодов буфера равное округленному значению частоты сигнала поделенной на 10. То есть продолжительность буфера у нас не менее 100 мс. Естественно речь идет о полосе 20-20000Гц.
Потом алгоритм считает продолжительность буфера. По продолжительности буфера считается округленное количество тактов дискретизации в буфере. Далее по количеству тактов определяется фактическая продолжительность буфера, по которой вычисляется скорректированная частота сигнала. Далее считаем ошибку частоты и, если ошибка не укладывается в заданное значение увеличиваем количество периодов на 1 и повторяем цикл. И так, пока фактическая частота сигнала в буфере не будет отличаться от заданной на заданное значение погрешности.
Далее зациклил проигрывание буфера. И выпадения сигналов на слух прекратились.
Получается при малой продолжительности буфера во времени аудиопоток воспроизводится быстрее, чем выполняется команда зацикливания буфера.
То есть в принципе при использовании продолжительности буфера от 100мс питон успевает за время проигрывания предыдущего буфера передать в аудиопоток следующий.
ЗЫ. Директ икс для звука? В наше время?
Тот же PyAudio для питона спокойно тащит MME, WDM, ASIO, WASAPI, DIRECTSOUND, CoreAudio, ALSA. И в этом списке стопроцентно указано не все.
Ему вообще наплевать на host API. Просто работает по системному индексу звукового устройства. То есть работает с драйверами.
При этом имеет механизм очень подробного получения инфы о характеристиках звуковых девайсов.
Есть, правда, проблема. Не умеет из коробки разделять каналы при записи воспроизведении. По крайней мере из документации такой возможности в явном виде не наблюдается.
То есть если система видит, что устройство поддерживает 2 входных канала, то выбрать произвольно любой канал для записи не выйдет.
Как и не выйдет прямо из монофонического трека вывести данные в стереопоток. Только разве что сам драйвер аудиоустройства раскидает моно по стереоканалам, если умеет.
О том, чтобы взять на запись левый канал и записать в правый вообще речи не идет.
В первом случае придется распарсивать данные из потока и разбирать поканально сторонним алгоритмом.
Во втором удваивать размер буфера данных и дублировать данные.
В третьем последовательно менять данные местами.