Skip to content

Instantly share code, notes, and snippets.

@conradev
Created June 15, 2013 21:54
Show Gist options
  • Save conradev/5789715 to your computer and use it in GitHub Desktop.
Save conradev/5789715 to your computer and use it in GitHub Desktop.
@import UIKit;
@import AVFoundation;
@class _UISiriWaveyView;
@protocol _UISiriWaveyViewDelegate <NSObject>
- (CGFloat)audioLevelForWaveyView:(_UISiriWaveyView *)waveyView;
@end
typedef NS_ENUM(NSInteger, _UISiriWaveyViewMode) {
_UISiriWaveyViewModeSiri,
_UISiriWaveyViewModeDictation
};
@interface _UISiriWaveyView : UIView
@property(nonatomic) _UISiriWaveyViewMode mode;
@property(weak, nonatomic) id<_UISiriWaveyViewDelegate> delegate;
- (BOOL)inDictationMode;
- (BOOL)inSiriMode;
- (void)start;
@end
@interface WaveViewController : UIViewController <_UISiriWaveyViewDelegate>
@property (weak, nonatomic) _UISiriWaveyView *waveyView;
@property (strong, nonatomic) AVAudioRecorder *recorder;
@end
@implementation WaveViewController
- (void)loadView {
[super loadView];
_UISiriWaveyView *waveyView = [[_UISiriWaveyView alloc] init];
waveyView.delegate = self;
waveyView.translatesAutoresizingMaskIntoConstraints = NO;
self.waveyView = waveyView;
[self.view addSubview:waveyView];
NSDictionary *views = @{ @"wave" : waveyView };
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[wave]|" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[wave]|" options:0 metrics:nil views:views]];
}
- (void)viewDidLoad {
[super viewDidLoad];
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryRecord error:nil];
[session setActive:YES error:nil];
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"recording.caf"];
NSURL *url = [NSURL fileURLWithPath:path];
NSDictionary *settings = @{ AVEncoderAudioQualityKey: @(AVAudioQualityMin), AVEncoderBitRateKey: @8, AVNumberOfChannelsKey: @2, AVSampleRateKey: @22000 };
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:nil];
recorder.meteringEnabled = YES;
self.recorder = recorder;
[self.recorder prepareToRecord];
self.view.backgroundColor = [UIColor blackColor];
UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(waveyViewTapped:)];
[_waveyView addGestureRecognizer:gestureRecognizer];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[_waveyView start];
[_recorder record];
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[_recorder stop];
[_recorder deleteRecording];
}
- (void)waveyViewTapped:(UITapGestureRecognizer *)gestureRecognizer {
_waveyView.mode = _waveyView.mode == _UISiriWaveyViewModeSiri ? _UISiriWaveyViewModeDictation : _UISiriWaveyViewModeSiri;
}
- (CGFloat)audioLevelForWaveyView:(_UISiriWaveyView *)waveyView {
[_recorder updateMeters];
return [_recorder averagePowerForChannel:0];
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment