Одна вещь, которую я бы предложил, это изменить.
#define VU_METER_FREQUENCY 1.0/5.0
Это говорит, что обновление 5x в секунду, проблема в том, что я думаю, что яблоко будет держать 0,2 сэмплов, так что вы действительно получаете среднее значение звуков, следовательно, измеритель на самом деле не следует за максимумами и минимумами звуков, больше более низкого среднего.
Я думаю, этот параметр может доходить до 1,0 / 60 (60 Гц).
Что касается плавности метра, то это немного сложнее.
Вы могли бы сделать что-то вроде этого.
- Создать массив, содержащий 7-8 значений.
- каждый раз, когда вы получаете чтение, добавляйте его в массив и извлекайте 7-е значение (например, сохраняйте только последние семь значений.
- Найти среднее значение массива (сумма массива / деление на количество элементов в массиве.
- Показать это среднее.
Так что это немного похоже на заполнение трубки, и как только вы прекратите заполнять ее, потребуется некоторое время, чтобы она опустела, и игла медленно упадет.
ИЛИ вы можете позволить игле только так сильно падать каждый цикл.
Допустим, колебания иглы составляют 0 (самое низкое значение) и 1 (самое высокое значение в правой части).
Допустим также, что вы производите выборку с частотой 20 Гц (20 раз в секунду).
Каждый раз, когда вы обновляете положение, игле разрешается только подняться, скажем, на 0,1 от максимального значения и упасть только на 0,05.
вы могли бы сделать что-то подобное и поиграть со значениями, чтобы получить его красиво и плавно.
if newValue>currentMeterValue
currentMeterValue = Min(currentMeterValue + 0.1, newValue);
else
currentMeterValue = Max(currentMeterValue - 0.05, newValue);
OR
Вы просто перемещаете измеритель со скоростью, пропорциональной расстоянию между каждым значением (это должно хорошо сгладить его), и фактически вы приближаетесь к реальному измерителю с пружиной, нажимающей на иглу, которая приводится в действие электромагнитом.
currentMeterValue += (newValue - currentMeterValue)/4.0;