Unity & C#

[Unity] AudioSettings.dspTime 이란?

왼손잡이개발자 2023. 3. 24. 12:29

 

유니티로 음악이 관련된 콘텐츠를 만드는 것을 좋아하다보니, AudioSettings.dspTime이란 것을 자주 만나 볼 수 있었다. 그냥 구글링하면 사운드 관련된 정확도를 위해 사용하는 값이라고 대충만 알고 있다가, 정확히 무엇인지 알아봐야겠다는 생각이 들어서 찾아보게 되었다.

 

DSP 란 Digital Signaling Processing 의 약자인데, 그렇다면 DSP Time 이란 디지털 신호 관련된 처리 시간이라고 유추해볼 수 있었다. 유니티에서 사용되는 dspTime은 오디오 시스템에서 처리된 실제 오디오 샘플 수에 기반하여 반환되는 double 값의 시간이라고 한다. 오디오 관련된 로직을 처리할 땐, 흔히 쓰는 Time.time의 float 값보다 더 정확하다. 그리고 dspTime은 Frame Rate의 영향을 받지 않는다.  

 

AudioSource의 Method 중 PlayScheduled(...) 라고 하는 것이 있는데, 여기에 들어가는 parameter 가 바로 dspTime이 들어가야한다. 만약 5초 뒤에 audioSource를 플레이 하고 싶다고 하면 아래와 같이 작성하면 된다.

private AudioSource audioSource;

    void Start()
    {
        audioSource = GetComponent<AudioSource>();

        double curDspTime = AudioSettings.dspTime;
        
        audioSource.PlayScheduled(curDspTime + 5f);
    }

그러면 FrameRate의 영향을 받지않고, 오디오 시스템에 기반하여 5초뒤에 음악을 재생할 수 있다. 

 

만약 한 오디오 소스의 오디오 클립이 끝나는 정확한 시간에 다른 오디오소스를 플레이 하고 싶다면 다음과 같이 코드를 작성하면 된다.

 [SerializeField] private AudioSource audioSource1;
 [SerializeField] private AudioSource audioSource2;

    void Start()
    {
        double curDspTime = AudioSettings.dspTime;
        double audioSource1Duration = (double)audioSource1.clip.samples / audioSource1.clip.frequency;
        Debug.Log("audiosource 1 duration is : " + audioSource1Duration);

        audioSource1.PlayScheduled(curDspTime);
        audioSource2.PlayScheduled(curDspTime + audioSource1Duration);
    }