🌊

Audiomasterロードマップ ~再生編~

2022/03/27に公開

この記事は?

AudioMasterロードマップの再生編です。
AudioMasterというライブラリを作成するまでにやることをまとめているものです。

https://zenn.dev/entaku/articles/725253883f1699

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.

参考:
https://developer.apple.com/av-foundation/

AVFAudio

AVFAudioはAVFoundationからAudio機能を切り出したものです。

ちなみに利用する場合はAVFoundationかAVFAudioを意識する必要はなく、AVFoundationのimportでAVFAudioを利用できるようです。(2022/03/24現在)

Play, record, and process audio; configure your app’s system audio behavior.

参考:
https://developer.apple.com/documentation/avfaudio

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

https://developer.apple.com/documentation/avfaudio/avaudioplayer

Packageの作成

このAVAudioPlayerを利用し簡単なパッケージを作成してみます。
パッケージの作成方法は uhooiさんがQiitaに書かれている内容が参考になると思います。

と言うわけで爆誕です
https://qiita.com/uhooi/items/2f36b85f5f41cbd35189

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