Я построил эмулированный аналоговый счетчик VU для приложения для записи и все правильно подключилось и работаю так, как я ожидаю, за исключением одного аспекта. Если вы нажмете watch this 13-second video измерителя VU, вы увидите, что игла отскакивает повсюду, и на самом деле это не так, как в реальном измерителе VU. Для примера того, что я ищу, попробуйте приложение Apple Voice Memos и посмотрите.Мог ли я умереть с помощью аналогового измерителя уровня звука для более реалистичного аналогового измерителя VU?
Моя логика до сих пор легко:
#define VU_METER_FREQUENCY 1.0/5.0
- (void)someMethod {
_updateTimer = [NSTimer
scheduledTimerWithTimeInterval:VU_METER_FREQUENCY
target:self
selector:@selector(_refresh)
userInfo:nil
repeats:YES];
}
- (void)_refresh {
// if we have no queue, but still have levels, gradually bring them down
if (_delegate == nil) {
CFAbsoluteTime thisFire = CFAbsoluteTimeGetCurrent();
// calculate how much time passed since the last draw
CFAbsoluteTime timePassed = thisFire - _peakFalloffLastFire;
needleValue = needleValue - timePassed * VU_METER_LEVEL_FALL_OFF_PER_SECOND;
if (needleValue < VU_METER_MIN_DB) {
needleValue = VU_METER_MIN_DB;
TT_INVALIDATE_TIMER(_updateTimer);
}
_peakFalloffLastFire = thisFire;
} else {
prevNeedleValue = needleValue;
needleValue = [_delegate currentDB];
}
[self updateNeedle];
}
- (void)updateNeedle {
[UIView beginAnimations:nil context:NULL]; // arguments are optional
[UIView setAnimationDuration:VU_METER_FREQUENCY];
[UIView setAnimationCurve:(needleValue > prevNeedleValue ? UIViewAnimationCurveEaseOut : UIViewAnimationCurveEaseIn)];
CGFloat radAngle = [self radianAngleForValue:needleValue];
self.needle.transform = CGAffineTransformMakeRotation(radAngle);
[UIView commitAnimations];
}
В принципе, я могу настроить таймер для запуска на VU_METER_FREQUENCY
и обновить вращение иглы с помощью UIView анимации с ослабления, что является предпочтительным, чтобы игла выше. Я ищу способ скорректировать это как-то, чтобы обеспечить более гладкую иглу, и мой бенчмарк был как можно ближе к аналоговому VU Meter от Apple. Чтобы получить needleValue
, я использую AudioQueue
's mAveragePower
и запрашивая его каждый раз, когда вызывается currentDB
. Как я могу сгладить это?
Надеюсь, вы не возражаете поделиться своим radianAngleForValue: needleValue: метод со мной. Я пытаюсь заставить мой счетчик VU работать, но он просто не сработает. Я тоже не буду возражать против вас;) – 2011-03-24 04:57:58
Угол очень специфичен для вашей собственной реализации. Это зависит от длины и масштаба иглы, которая определяется изображением, которое вы создаете для отображения значений. Мне потребовалось некоторое время, чтобы разобраться на бумаге, чтобы решить множество уравнений, необходимых и получить значения, необходимые для этой функции в моей настройке. Эта ссылка была ценна при определении того, как настроить ее для себя: http://neolit123.blogspot.com/2009/03/designing-analog-vu-meter-in-dsp.html#hcon – coneybeare 2011-03-24 19:33:43
Спасибо, что, вероятно, помогите мне понять это. Беспощадные выходные, здесь я прихожу! На данный момент у меня есть дерьмовая реализация измерителя VU с иглой, которая движется вбок, хотя мне это нравится, мне нужна реальная сделка с измерителем VU. – 2011-03-24 23:34:00