Я сейчас работаю над очень базовым c волновым синтезатором. Я буду стараться изо всех сил, чтобы дать понятный обзор.
У меня есть одиночная форма сигнала поиска с 4096 точками, которая дискретизируется аудиопотоком. В общем, однако, один генератор имеет несколько форм волны, которые могут быть изменены с помощью параметра position
. Например, давайте возьмем две синусоидальные волны, где вторая имеет половину периода первой. Когда мы воспроизводим их на frequency = 440Hz
и position = 0.5
, мы слышим два одинаково громких тона на 440 Гц и 880 Гц. Вот ссылка на аудио (см. Sidenote 2).
По соображениям производительности я создаю таблицу поиска на другом нить всякий раз, когда изменяется параметр позиции. И в этом заключается моя проблема. Даже когда я не меняю положение таблицы и просто периодически генерирую свою таблицу поиска, у меня появляются странные, непредсказуемые сбои. Поскольку в этом случае аудиоданные в таблице не меняются, я могу объяснить это только разорванными чтениями. Это верно? И если так, как я могу обойти это? Должен ли я использовать двойной буфер с заменой указателя атома c после того, как я закончу генерацию данных sh?
Опять же, вот аудио для этой записи (см. Sidenote 2). Кроме того, некоторые данные осциллографа:
Sidenote 1 : заполнение моей справочной таблицы занимает ~50,000ns
без оптимизации и ~10,000ns
с оптимизацией. Но, похоже, глюки случаются с той же вероятностью.
Sidenote 2 : Сайт, на который я загрузил аудио, похоже, содержит некоторые странные гармоники, которые не слышны в моем видео. Просто чтобы ты знал.