Secondary Audio Mute 調査で盛大に爆死した

# 要約
[これ](https://developer.apple.com/library/ios/qa/qa1882/_index.html#//apple_ref/doc/uid/DTS40015063)を検証しようとしましたが、進捗ダメでした(’ω’乂)

# Secondary Audio について
![what_is_secondary_audio.png](https://qiita-image-store.s3.amazonaws.com/0/7950/afc04c7c-870d-0f97-c105-3d349e157cea.png)
WWDC2014 で紹介された [What's New in Core Audio](https://developer.apple.com/videos/wwdc/2014/#501) にアプリの状態とオーディオセッションの状態との両方を加味した管理に関するお話がありました。
その中で出てくるキーワードが Secondary Audio 。
[Technical Q&A](https://developer.apple.com/library/ios/qa/qa1882/_index.html#//apple_ref/doc/uid/DTS40015063) では以下のように説明されています。

> **Primary audio** - Audio that is absolutely required by an application. This audio should always play regardless of what other audio is already being played by other applications on the system.
>
> **Secondary audio** - Audio that can enhance an application but is not absolutely required. This audio may be turned off when other application audio is already playing.
> 
> For example, a game may classify its primary audio as sound effects; explosions, bleeps & bloops, short bits of dialog and so on. This is the audio that really enhances gameplay and should always play even if music is being played elsewhere on the system by some other application. The user would expect this primary audio to mix in with the other system audio that is already playing.
> 
> This same game would classify secondary audio as its music soundtrack. While the music soundtrack would also enhance gameplay, it's not considered mandatory. If the user was previously listening to their own music or podcast the game could choose to mute its own music soundtrack.
>
> By using the ``secondaryAudioShouldBeSilencedHint`` property and the ``AVAudioSessionSilenceSecondaryAudioHintNotification`` notification, the game can decide when to mute or un-mute its secondary audio soundtrack.

ゲームアプリに置き換えると

- Primary
    - SE
    - ゲームプレイの補助となる。他の音はアプリ外から提供されていもよいが、こいつだけはダメ。
- Secondary
    - BGM
    - もちろんゲームプレイを補助するものではあるが、この音を流すことはユーザへの強制としなくてもよい。 

ということになります。
「ゲーム中に iTunes から手持ちの音楽を流しながらプレイしたいから BGM だけはミュートしたいな」というユーザ要求に応えられそうです。

# Secondary Audio Notification
先ほどの引用にあるように、Secondary Audio は通知を利用して制御します。
> By using the ``secondaryAudioShouldBeSilencedHint`` property and the ``AVAudioSessionSilenceSecondaryAudioHintNotification`` notification, the game can decide when to mute or un-mute its secondary audio soundtrack.

![scene_play_itunes.png](https://qiita-image-store.s3.amazonaws.com/0/7950/ea1e804d-2df4-3a14-5bbd-f8985a84d27f.png)  
  
  
ゲームアプリを起動した状態でバックグラウンドから別の音楽アプリを再生することを想定してみましょう。
(i.e. Control Center から iTunes を再生する (で良いのかな) )
このとき、ゲームアプリは ``AVAudioSessionSilenceSecondaryAudioHintNotification`` を受け取り、 Secondary である BGM をミュートにするのが望ましいです。 
![scene_mute_secondary.png](https://qiita-image-store.s3.amazonaws.com/0/7950/6560b092-fca9-4019-bd42-3b60c99c2e9d.png)


加えて、バックグラウンドのアプリの音楽を停止したとき、同様の通知を受け取って BGM を再開するように組み立てます。
![scene_resume_secondary.png](https://qiita-image-store.s3.amazonaws.com/0/7950/a1190380-3746-1fcb-f4b6-43fff9de7dc7.png)

# 何で爆死したの
その通知である ``AVAudioSessionSilenceSecondaryAudioHintNotification`` が受け取れず検証できませんでした(’ω’乂)
StackOverflow に当たるも[まさかの1件で回答なし](http://stackoverflow.com/search?q=AVAudioSessionSilenceSecondaryAudioHintNotification)。
[同様のこと](https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch14p643ducking/ch27p912ducking/AppDelegate.swift)を試してみたものの得られる結果はなく…
「Control Center から起動することがバックグラウンド起動」という前提の正誤を疑うようになりタイムアップ。

あまり有意義な報告になりませんでしたが、同様の悩みで多大な時間を使っている方への情報共有となればと思います。
既に解決されている方がいらっしゃいましたらコメントにそっと書いていただけると幸いです∩(･ω･)∩