-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathARAudioRecognizer.m
100 lines (76 loc) · 3.23 KB
/
ARAudioRecognizer.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//
// ARAudioRecognizer.m
// Audio Recognizer
//
// Created by Anthony Picciano on 6/6/13.
// Copyright (c) 2013 Anthony Picciano. All rights reserved.
//
#import "ARAudioRecognizer.h"
#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>
@interface ARAudioRecognizer ()
@property (nonatomic, strong) AVAudioRecorder *recorder;
@property (nonatomic, strong) NSTimer *levelTimer;
- (void)initializeRecorder;
- (void)initializeLevelTimer;
@end
@implementation ARAudioRecognizer
@synthesize delegate = _delegate;
@synthesize sensitivity = _sensitivity, frequency = _frequency, lowPassResults = _lowPassResults;
- (id)init
{
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
return [self initWithSensitivity:AR_AUDIO_RECOGNIZER_SENSITIVITY_DEFAULT
frequency:AR_AUDIO_RECOGNIZER_FREQUENCY_DEFAULT];
}
- (id)initWithSensitivity:(float)sensitivity frequency:(float)frequency
{
if (self = [super init]) {
_sensitivity = sensitivity;
_frequency = frequency;
_lowPassResults = 0.0f;
}
[self initializeRecorder];
[self initializeLevelTimer];
return self;
}
- (void)initializeRecorder
{
NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
nil];
NSError *error;
self.recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
if (self.recorder) {
[self.recorder prepareToRecord];
[self.recorder setMeteringEnabled:YES];
[self.recorder record];
} else
NSLog(@"Error in initializeRecorder: %@", [error description]);
}
- (void)initializeLevelTimer
{
self.levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
}
- (void)levelTimerCallback:(NSTimer *)timer
{
[self.recorder updateMeters];
const double ALPHA = 0.1;
double peakPowerForChannel = pow(10, (0.05 * [self.recorder peakPowerForChannel:0]));
_lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * self.lowPassResults;
if (self.delegate && [self.delegate respondsToSelector:@selector(audioLevelUpdated:level:)]) {
[self.delegate audioLevelUpdated:self level:self.lowPassResults];
}
if (self.delegate && [self.delegate respondsToSelector:@selector(audioLevelUpdated:averagePower:peakPower:)]) {
[self.delegate audioLevelUpdated:self averagePower:[self.recorder averagePowerForChannel:0] peakPower:[self.recorder peakPowerForChannel:0]];
}
if (self.lowPassResults > 0.95 && self.delegate && [self.delegate respondsToSelector:@selector(audioRecognized:)]) {
[self.delegate audioRecognized:self];
_lowPassResults = 0.0f;
}
}
@end