CRI ADX2(Unity)
中級編06 音声の再生時刻を取得する(音声同期タイマ編)

音声同期タイマを使用した再生時刻

まずはじめにこちらの図をご覧ください。

前回紹介した再生済みサンプル数 GetNumPlayedSamplesと、今回紹介する音声同期タイマベースでのGetTimeSyncedWithAudioを並べた図となります。
見ての通り、GetTimeSyncedWithAudioで取得した値はカウントアップの粒度が高く、再生中の音声にぴったりと同期した再生時刻が取得できます。

また、例えばスマートフォンでのイヤホン抜き差しなどで音の再生が途切れた場合、これらの再生時刻は更新を一時的に停止して、常に出力される音と同期した時刻を返します。

それでは音声同期タイマの再生時間取得方法について、2通り実装方法をご紹介します。

1. CriAtomExPlayerを利用する場合

CriAtomExPlayback.GetTimeSyncedWithAudio関数を使用するためには音声同期タイマーフラグを有効にした、専用のCriAtomExPlayerを作成する必要があります。
下記の要領でスクリプトからCriAtomExPlayerを作成し、キューの再生と音声に同期した再生時刻の取得を行うことが可能です。

/* 音声同期タイマーを有効にしたAtomExPlayerの生成 */
CriAtomExPlayer atomExPlayer = new CriAtomExPlayer(true);
atomExPlayer.SetCue("Cue1");
CriAtomExPlayback playback = atomExPlayer.Start();

private void Update(){
    /* 音声に同期した再生時刻を取得 */
    long playTime = playback.GetTimeSyncedWithAudio();
}

2. CriAtomSourceを利用する場合

CriAtomSourceのコンポーネントの機能を利用しつつ上記の音声同期タイマーを用いた再生時刻を使用したい場合は、CriAtomSourceを継承したアプリケーション独自のクラスを定義することで、音声に同期した再生時刻を取得することができます。
下記のように、初期化処理をオーバーライドして、専用のCriAtomExPlayerを作成してください。

using UnityEngine;
using System.Collections;
using CriWare;

public class MyAtomSource : CriAtomSource {
    protected override void InternalInitialize()
    {
        CriAtomPlugin.InitializeLibrary();
        /* enableAudioSyncedTimerフラグを有効にしてプレーヤを作成 */
        this.player = new CriAtomExPlayer(true);
        this.source = new CriAtomEx3dSource();
    }
}

注意

GetTimeSyncedWithAudioは呼び出しの度に時刻が更新されるので、1フレームに1回だけ取得しましょう。

author:我妻