Legacy Documentation: Version 2017.1 (Go to current version)
LanguageEnglish
  • C#
  • JS

Script language

Select your preferred scripting language. All code snippets will be displayed in this language.

AudioSettings.dspTime

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

Switch to Manual
public static var dspTime: double;
public static double dspTime;

Description

Returns the current time of the audio system.

This is a value specified in seconds and based on the actual number of samples the audio system processes and is therefore much more precise than the time obtained via the Time.time property.

// The code example shows how to implement a metronome that procedurally generates the click sounds via the OnAudioFilterRead callback.
// While the game is paused or the suspended, this time will not be updated and sounds playing will be paused. Therefore developers of music scheduling routines do not have to do any rescheduling after the app is unpaused

@script RequireComponent(AudioSource)

public var bpm : double = 140.0; public var gain : float = 0.5f; public var signatureHi : int = 4; public var signatureLo : int = 4;

private var nextTick : double = 0.0; private var amp : float = 0.0f; private var phase : float = 0.0f; private var sampleRate : double = 0.0; private var accent : int; private var running : boolean = false;

function Start () { accent = signatureHi; var startTick = AudioSettings.dspTime; sampleRate = AudioSettings.outputSampleRate; nextTick = startTick * sampleRate; running = true; }

function OnAudioFilterRead(data:float[], channels:int) { if(!running) return; var samplesPerTick = sampleRate * (60.0f / bpm) * (4.0 / signatureLo); var sample = AudioSettings.dspTime * sampleRate; var dataLen = data.length / channels; for(var n = 0; n < dataLen; n++) { var x : float = gain * amp * Mathf.Sin(phase); for(var i = 0; i < channels; i++) data[n * channels + i] += x; while (sample + n >= nextTick) { nextTick += samplesPerTick; amp = 1.0; if(++accent > signatureHi) { accent = 1; amp *= 2.0; } Debug.Log("Tick: " + accent + "/" + signatureHi); } phase += amp * 0.3; amp *= 0.993; } }
using UnityEngine;
using System.Collections;

// The code example shows how to implement a metronome that procedurally generates the click sounds via the OnAudioFilterRead callback. // While the game is paused or the suspended, this time will not be updated and sounds playing will be paused. Therefore developers of music scheduling routines do not have to do any rescheduling after the app is unpaused

[RequireComponent(typeof(AudioSource))] public class ExampleClass : MonoBehaviour { public double bpm = 140.0F; public float gain = 0.5F; public int signatureHi = 4; public int signatureLo = 4; private double nextTick = 0.0F; private float amp = 0.0F; private float phase = 0.0F; private double sampleRate = 0.0F; private int accent; private bool running = false; void Start() { accent = signatureHi; double startTick = AudioSettings.dspTime; sampleRate = AudioSettings.outputSampleRate; nextTick = startTick * sampleRate; running = true; }

void OnAudioFilterRead(float[] data, int channels) { if (!running) return;

double samplesPerTick = sampleRate * 60.0F / bpm * 4.0F / signatureLo; double sample = AudioSettings.dspTime * sampleRate; int dataLen = data.Length / channels; int n = 0; while (n < dataLen) { float x = gain * amp * Mathf.Sin(phase); int i = 0; while (i < channels) { data[n * channels + i] += x; i++; } while (sample + n >= nextTick) { nextTick += samplesPerTick; amp = 1.0F; if (++accent > signatureHi) { accent = 1; amp *= 2.0F; } Debug.Log("Tick: " + accent + "/" + signatureHi); } phase += amp * 0.3F; amp *= 0.993F; n++; } } }

Did you find this page useful? Please give it a rating: