Packages
vtc
0.17.2
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.9
0.16.8
0.16.7
0.16.6
0.16.5
0.16.4
0.16.2
0.16.1
0.16.0
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.15
0.13.14
0.13.13
0.13.12
0.13.11
0.13.10
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.10
0.10.9
0.10.8
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.2
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.3
0.5.2
0.5.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
A SMPTE timecode library for Elixir
Current section
Files
Jump to
Current section
Files
lib/utils/mixed_rate_ops.ex
defmodule Vtc.Utils.MixedRateOps do
@moduledoc false
alias Vtc.Framerate
alias Vtc.Framestamp
alias Vtc.Framestamp.MixedRateArithmeticError
alias Vtc.Source.Frames
# Gets a the correct rate for a mixed rate operation.
@doc false
@spec get_rate(
Framestamp.t() | Frames.t(),
Framestamp.t() | Frames.t(),
Framestamp.inherit_opt(),
func_name :: atom()
) :: {:ok, Framerate.t()} | {:error, MixedRateArithmeticError.t()}
def get_rate(a, b, opt, func_name) do
with :ok <- get_rate_validate(a, b, opt, func_name) do
case {a, b, opt} do
{%Framestamp{rate: rate}, _, :left} -> {:ok, rate}
{_, %Framestamp{rate: rate}, _} -> {:ok, rate}
{%Framestamp{rate: rate}, _, _} -> {:ok, rate}
end
end
end
@spec get_rate_validate(
Framestamp.t() | Frames.t(),
Framestamp.t() | Frames.t(),
Framestamp.inherit_opt(),
func_name :: atom()
) :: :ok | {:error, MixedRateArithmeticError.t()}
defp get_rate_validate(%Framestamp{rate: rate}, %Framestamp{rate: rate}, _, _), do: :ok
defp get_rate_validate(_, _, :left, _), do: :ok
defp get_rate_validate(_, _, :right, _), do: :ok
defp get_rate_validate(_, b, _, _) when not is_struct(b, Framestamp), do: :ok
defp get_rate_validate(a, _, _, _) when not is_struct(a, Framestamp), do: :ok
defp get_rate_validate(a, b, _, func_name),
do: {:error, %MixedRateArithmeticError{func_name: func_name, left_rate: a.rate, right_rate: b.rate}}
end