title: How to detect a blow in the microphone with Unity and IOS
body: <p>I'm aware that there are several threads with the same problem, but i haven't been able to make their solution work. I ended up creating this class:</p>
  
  <p>MicroController.h</p>
  
  <pre><code>#import Foundation/Foundation.h&gt;
  
  #import &lt;AVFoundation/AVFoundation.h&gt;
  #import &lt;CoreAudio/CoreAudioTypes.h&gt;
  
  #import &lt;UIKit/UIKit.h&gt;
  
  @interface MicroController : UIView &lt; UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, AVAudioSessionDelegate &gt; {
      AVAudioRecorder *recorder;
      NSTimer *levelTimer;
      double lowPassResults;
  }
  
  - (void)levelTimerCallback:(NSTimer *)timer;
  @end
  </code></pre>
  
  <p>MicroController.mm</p>
  
  <pre><code>#import "MicroController.h"
  
  
  @implementation MicroController
  
  - (id)init
  {
      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;
  
      recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&amp;error];
  
      if (recorder) {
  
          [recorder prepareToRecord];
          recorder.meteringEnabled = YES;
  
          if ([recorder prepareToRecord] == YES){
              [recorder record];
          }else {
              int errorCode = CFSwapInt32HostToBig ([error code]); 
              NSLog(@"Error: %@ [%4.4s])" , [error localizedDescription], (char*)&amp;errorCode); 
  
          }
  
          levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
      } else
          NSLog([error description]); 
  
      // input 'level' is in meter.mAveragePower
  
      return self;
  }
  
  - (void)levelTimerCallback:(NSTimer *)timer {
      [recorder updateMeters];
  
      const double ALPHA = 1.0; // 0.05f
      double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0]));
      lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;  
  
      if (lowPassResults &gt; 0.55)
          NSLog(@"Mic blow detected");
  
  
      [recorder updateMeters];
      NSLog(@"Average input: %f Peak input: %f", [recorder averagePowerForChannel:0], [recorder peakPowerForChannel:0]);
  
  }
      - (void)viewDidLoad {
          [super viewDidLoad];
  
          NSLog(@"initiated");
  
          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;
  
          recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&amp;error];
  
          if (recorder) {
              [recorder prepareToRecord];
              recorder.meteringEnabled = YES;
              [recorder record];
              levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
          } else
              NSLog([error description]);
  
      }
  
  
      - (void)dealloc {
          [levelTimer release];
          [recorder release];
          [super dealloc];
      }
      @end
  </code></pre>
  
  <p>But I can't get to make the microphone work. I'm getting only this output, and the microphone never responds:</p>
  
  <p>Average input: -120.000000 Peak input: -120.000000</p>
  
  <p>Any idea about what can be wrong ?</p>
  
  <p>Thanks for your help !</p>