65 lines
1.6 KiB
Julia
65 lines
1.6 KiB
Julia
using PortAudio
|
|
using DSP
|
|
|
|
function create_measure_signal()
|
|
signal = zeros(Float32, 20000)
|
|
for i in 1:3
|
|
signal = vcat(signal, rand(Float32, 100), zeros(Float32, i * 10000))
|
|
end
|
|
return signal
|
|
end
|
|
|
|
function measure_latency(in_latency = 0.1, out_latency = 0.1; is_warmup = false)
|
|
in_stream = PortAudioStream(1, 0; latency = in_latency)
|
|
out_stream = PortAudioStream(0, 1; latency = out_latency)
|
|
|
|
cond = Base.Event()
|
|
|
|
writer_start_time = Int64(0)
|
|
reader_start_time = Int64(0)
|
|
|
|
reader = Threads.@spawn begin
|
|
wait(cond)
|
|
writer_start_time = time_ns() |> Int64
|
|
return read(in_stream, 100000)
|
|
end
|
|
|
|
signal = create_measure_signal()
|
|
writer = Threads.@spawn begin
|
|
wait(cond)
|
|
reader_start_time = time_ns() |> Int64
|
|
write(out_stream, signal)
|
|
end
|
|
|
|
notify(cond)
|
|
|
|
wait(reader)
|
|
wait(writer)
|
|
|
|
recorded = collect(reader.result)[:, 1]
|
|
|
|
close(in_stream)
|
|
close(out_stream)
|
|
|
|
diff = reader_start_time - writer_start_time |> abs
|
|
|
|
diff_in_ms = diff / 10^6 # 1 ms = 10^6 ns
|
|
|
|
if !is_warmup && diff_in_ms > 1
|
|
@warn "Threads start time difference $diff_in_ms ms is bigger than 1 ms"
|
|
end
|
|
|
|
delay = finddelay(recorded, signal) / 48000
|
|
|
|
return trunc(Int, delay * 1000)# result in ms
|
|
end
|
|
|
|
measure_latency(0.1, 0.1; is_warmup = true) # warmup
|
|
|
|
latencies = [0.1, 0.01, 0.005]
|
|
for in_latency in latencies
|
|
for out_latency in latencies
|
|
measure = measure_latency(in_latency, out_latency)
|
|
println("$measure ms latency for in_latency=$in_latency, out_latency=$out_latency")
|
|
end
|
|
end
|