iPhoneの近接センサーを使って耳元で声優さんの声を聴こう！

この記事はiPhoneの上部スピーカーと近接センサーの機能を組み合わせてみようというお話です．

知り合いから「iPhoneの上部スピーカーを使ってアプリを作っている」という話を聞きました．
それを聞いたとき，普段から拝聴している[声優さんのラジオ番組](http://seaside-c.jp/program/adlib/)にて，たまたま[声優さん](http://ohashiayaka.com/)が素敵なくしゃみをしていたことを思い出しました．
そこでﾃｨﾝと閃いた僕は「iPhoneを耳に近づけたらこの素敵なくしゃみ音声を聴けるアプリを作れないかなぁ」と思いました．

アプリのUIとかは別として簡単に`Objective-C`で機能の実装をしてみました．
再生したい音声ファイル(声優さんの◯◯な音声等)は自分の好きなものを各自調達してきたという前提で話を進めます．


##近接センサー
iPhoneには近接センサーというものがあります．端末画面に顔が近付くことで反応するセンサーで，通話中などタッチを無効にすることで誤操作をなくすなどの用途があります．

###実装方法
まずは`viewDidLoad`で近接センサーをオンにします。

```objc
[UIDevice currentDevice].proximityMonitoringEnabled = YES;
```

次に、近接センサーを監視します。

近接センサーが反応すると、`UIDeviceProximityStateDidChangeNotification` が飛んでくるので、それを監視します。

```objc
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(proximitySensorStateDidChange:)
                                             name:UIDeviceProximityStateDidChangeNotification
                                           object:nil];
```

通知が飛んで来た時に呼ばれるメソッドを定義し，今回はその中にやりたい処理(くしゃみ音声再生)を書きます．

```objc
- (void)proximitySensorStateDidChange:(NSNotification *)notification {
    if ([UIDevice currentDevice].proximityState == 1) {
           //近接センサーがOnになった時にやりたい処理
    }
}
```

##iPhoneの上部スピーカー
iPhoneの上部(図参照)にあるスピーカーからくしゃみ音声を流します．

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/81914/b6b04292-cdc4-4596-d2a0-991481244242.png)

こちらのサイトを参考に上部スピーカーから音声を出力するコードを書きます．
参考サイト:http://www.eln.ne.jp/iphone/iphone-app/use-audiotoolbox.html

###実装方法
まず，既存のフレームワークから`AudioToolbox`と`AVFoundation`をプロジェクトに追加、importします．
次に，`ViewController.h`を以下のように記述します．

```objc

#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>

@interface ViewController : UIViewController<AVAudioPlayerDelegate>{

    AVAudioPlayer *Do;
}

@end
```

そして，`viewDidLoad`で音声データを読み込む処理を書き加えます．

```objc
- (void)viewDidLoad {
    [super viewDidLoad];
    
    [UIDevice currentDevice].proximityMonitoringEnabled = YES;
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(proximitySensorStateDidChange:)
                                                 name:UIDeviceProximityStateDidChangeNotification
                                               object:nil];

    //ここから先を書き加える

    NSString *path= [[NSBundle mainBundle] pathForResource:@"音声ファイル名" ofType:@"mp3"];
    Do = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path ] error:nil];
    
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
}
```

あとは先程，近接センサーが反応したときに呼ばれるメソッドの中に音声再生のコードを書いてあげればおしまいです．

```objc
- (void)proximitySensorStateDidChange:(NSNotification *)notification {
    if ([UIDevice currentDevice].proximityState == 1) {
        //近接センサーがOnになった時にやりたい処理
        [Do play];
    }
}
```

ちなみに参考にしたサイトではたしかiOS7あたりでサポート外になった書き方になっていたのでiOS7以降の書き方に直しました．

##まとめ
iPhoneを耳元に近付けると音声が出力されるアプリができました．
iPhoneには近接センサーの他にも面白いセンサーがあったりするのでまたアイディアを閃いたら色々とアプリを作ってみたいと思います．
今回は完全に趣味で作ったのでアレですが，音声ファイル(声優さんの声)の扱いは気をつけましょう．


##P.S.
声優さんのくしゃみ音声について語っていたときの僕は大分気持ち悪かったらしいですが，それはまた別のお話．