iOSアプリケーションからオーディオを再生するためのクラス

こんにちは、Habrasociety!



iOSアプリケーションからオーディオを再生する問題の解決策を共有したいと思います。 次のアプリケーションの開発プロセスでこれに遭遇しました。アプリケーションのさまざまなクラスにあることが多いさまざまな場所で、音楽や効果音の再生を開始および停止したかったのです。







通常、これに必要な機能の「空白」がコピーされ、特定のユースケースに適合します。 私たちはこれを複数回行い、よりエレガントなソリューションが必要だと判断しました。 このソリューションは「シングルトン」であることが判明しました。これは、アプリケーション内のさまざまな場所から利用できるだけでなく、同じオーディオが複数回使用された場合にシステムリソースを節約します。





実装



iOSでは、 いくつかの方法でサウンドを再生できます 。 システムは、サウンドを「システム」サウンドに分割します。これは、ユーザーに何らかのアクションを知らせるために再生される短いサウンドです。 たとえば、ボタンに「声を出す」、またはメールの送信を確認します。 もう1つのカテゴリは「音楽」です。歌、メロディーなどの連続したオーディオです。 私たちの場合、それは素晴らしい作曲家バフティヤール・アマンツホルによってアプリケーションのために書かれたメロディーでした。



System Sound Services 」を使用して短い音を再生できます。 さまざまな抽象化レベルで動作する一連のツールによって、より長いオーディオの再生が提供されます。 AVAudioPlayerを使用することにしました



使いやすくするために、「オブジェクトメソッド」ではなく「クラスメソッド」を通じて機能へのアクセスを許可することにしました。 その結果、次のコードを使用してサウンドを再生できます。



[MCSoundBoard playSoundForKey:@"ding"];
      
      







この種の呼び出しを実現すると同時に、オーディオフラグメントをキャッシュするために、「シングルトン」テンプレートを使用しました。 Objective-Cのシングルトーンは、さまざまな方法で実装できます。 この問題を調査すると、 ここで説明した非常にきちんとした方法に出会いました。 必要なコードは次のとおりです。



 + (MCSoundBoard *)sharedInstance { __strong static id _sharedObject = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedObject = [[self alloc] init]; }); return _sharedObject; }
      
      







次に、「public」メソッドを定義しました(これらはクラスメソッドであることに注意してください)。



 + (void)addSoundAtPath:(NSString *)filePath forKey:(id)key; + (void)playSoundForKey:(id)key; + (void)addAudioAtPath:(NSString *)filePath forKey:(id)key; + (void)playAudioForKey:(id)key; + (void)stopAudioForKey:(id)key; + (void)pauseAudioForKey:(id)key;
      
      







これらのパブリック静的メソッドは、シングルトンオブジェクトメソッドを呼び出します。



 - (void)addSoundAtPath:(NSString *)filePath forKey:(id)key { NSURL* fileURL = [NSURL fileURLWithPath:filePath]; SystemSoundID soundId; AudioServicesCreateSystemSoundID((__bridge CFURLRef)fileURL, &soundId); [_sounds setObject:[NSNumber numberWithInt:soundId] forKey:key]; } + (void)addSoundAtPath:(NSString *)filePath forKey:(id)key { [[self sharedInstance] addSoundAtPath:filePath forKey:key]; }
      
      







フェード-アウト



これで、アプリケーションの「音楽」機能の準備が整いました。 あまりにも「シャープ」なオン/オフの音楽を取り除くことは残っています。 解決策は、サウンドレベルを徐々に追加または削減することでした。 AVFoundationはそのような機会を与えませんでした。 幸いなことに、メインライブラリを使用してこれを実装することはそれほど難しくありません。



 - (void)fadeOutAndStop:(NSTimer *)timer { AVAudioPlayer *player = timer.userInfo; float volume = player.volume; volume = volume - 1.0 / MCSOUNDBOARD_AUDIO_FADE_STEPS; volume = volume < 0.0 ? 0.0 : volume; player.volume = volume; if (volume == 0.0) { [timer invalidate]; [player pause]; } } - (void)stopAudioForKey:(id)key fadeOutInterval:(NSTimeInterval)fadeOutInterval { AVAudioPlayer *player = [_audio objectForKey:key]; // If fade in inteval interval is not 0, schedule fade in if (fadeOutInterval > 0) { NSTimeInterval interval = fadeOutInterval / MCSOUNDBOARD_AUDIO_FADE_STEPS; [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(fadeOutAndStop:) userInfo:player repeats:YES]; } else { [player stop]; } }
      
      







以上です。 この資料が、同様の課題に直面した人々の助けになることを願っています。



オプション: GitHubのMCSoundBoard



All Articles