Audiomasterロードマップ ~再生編~
この記事は?
AudioMasterロードマップの再生編です。
AudioMasterというライブラリを作成するまでにやることをまとめているものです。
AVFoundation
AVFoundationとはAppleが提供しているtime-based audiovisual mediaです。
QuickTimeムービーとMPEG-4ファイルを簡単に再生、作成、編集したり、HLSストリームを再生したりなど、強力なメディア機能を組み込むことができます。
AVFoundation is the full featured framework for working with time-based audiovisual media on iOS, macOS, watchOS and tvOS. Using AVFoundation, you can easily play, create, and edit QuickTime movies and MPEG-4 files, play HLS streams, and build powerful media functionality into your apps.
参考:
AVFAudio
AVFAudioはAVFoundationからAudio機能を切り出したものです。
ちなみに利用する場合はAVFoundationかAVFAudioを意識する必要はなく、AVFoundationのimportでAVFAudioを利用できるようです。(2022/03/24現在)
Play, record, and process audio; configure your app’s system audio behavior.
参考:
AVAudioPlayer
AVAudioPlayerは文字通り音声を再生するためのクラスです
大きく下記の4つができます。簡単に言うと再生、レートやループ設定の変更、計測データへのアクセス、同時再生などの基本的な作業ができると言う感じですね
- ファイルまたはバッファから任意の長さのオーディオを再生する
- 再生されたオーディオの音量、パン、レート、およびループ動作を制御します
- 再生レベルの計測データにアクセスする
- 複数のプレーヤーの再生を同期して、複数のサウンドを同時に再生します
Play audio of any duration from a file or buffer
Control the volume, panning, rate, and looping behavior of the played audio
Access playback-level metering data
Play multiple sounds simultaneously by synchronizing the playback of multiple players
Packageの作成
このAVAudioPlayerを利用し簡単なパッケージを作成してみます。
パッケージの作成方法は uhooiさんがQiitaに書かれている内容が参考になると思います。
と言うわけで爆誕です
AudioMasterへ再生と停止の機能をつける
それでは早速ライブラリを作成していきます
AVAudioPlayerのインターフェースは単純で
- 音源ファイルを渡す
- 音声の開始
- 音声の停止
を作成します。
ここではライブラリなので、全てpublicで定義する必要があります。
内容自体は単純ですね。
public struct AudioMaster {
public private(set) var audioPlayer = AVAudioPlayer()
public init(url:URL) {
do {
audioPlayer = try AVAudioPlayer(contentsOf: url)
} catch {
print("error")
}
}
public func play() {
audioPlayer.play()
}
public func stop() {
audioPlayer.stop()
}
public func isPlayng() -> Bool {
return audioPlayer.isPlaying
}
public func setVolume(volume:Float){
audioPlayer.volume = volume
}
public func volume() -> Float {
return audioPlayer.volume
}
}
AudioMasterへ再生と停止のテストを追加する
続いてこちらのライブラリにテストを追加します。
先ほど作成していた下記の内容のテストを書きます
- 音源ファイルを渡す
- 音声の開始
- 音声の停止
final class AudioMasterTests: XCTestCase {
var audioMaster:AudioMaster!
override func setUp() {
super.setUp()
guard let url = Bundle.module.url(forResource: "test", withExtension: "m4a") else {
print("音源ファイルが見つかりません")
return
}
audioMaster = AudioMaster(url: url)
}
func testStart() throws {
audioMaster.play()
XCTAssertTrue(audioMaster.isPlayng())
}
func testSetVolume() throws {
let volume: Float = 2.5
audioMaster.setVolume(volume: volume)
XCTAssertTrue(audioMaster.volume() == volume)
}
func testStop() throws {
audioMaster.stop()
XCTAssertTrue(!audioMaster.isPlayng())
}
}
ちなみにここでは「test.m4a」を参照していますが、ファイルを置いた後にPackage.swiftで下記のように指定しないとビルド用フォルダにコピーされずにビルドエラーになるため注意してください。
.testTarget(
name: "AudioMasterTests",
dependencies: ["AudioMaster"],
resources: [
.copy("test.m4a")
]),
ということでテストができました!
テストが通るのは気持ちいいですね
Discussion