class WaveFile::Duration

Calculates playback time given the number of sample frames and the sample rate. For example, you can use this to calculate how long a given Wave file is.

The hours, minutes, seconds, and milliseconds fields return values like you would see on a stopwatch, and not the total amount of time in that unit. For example, a stopwatch running for exactly 2 hours would show something like “2:00:00.000”. Accordingly, if the given sample frame count and sample rate add up to exactly 2 hours, then hours will be 2, and minutes, seconds, and milliseconds will all be 0.

Attributes

hours[R]

Public

milliseconds[R]

Public

minutes[R]

Public

sample_frame_count[R]

Public

sample_rate[R]

Public

seconds[R]

Public

Public

↑ top

Public Class Methods

new(sample_frame_count, sample_rate) click to toggle source

Constructs a new immutable Duration.

sample_frame_count

The number of sample frames, i.e. the number samples in each channel.

sample_rate

The number of samples per second, such as 44100

Examples:

duration = Duration.new(400_000_000, 44100)
duration.hours         # => 2
duration.minutes       # => 31
duration.seconds       # => 10
duration.milliseconds  # => 294

The hours, minutes, seconds, and milliseconds fields return values like you would see on a stopwatch, and not the total amount of time in that unit. For example, a stopwatch running for exactly 2 hours would show something like “2:00:00.000”. Accordingly, if the given sample frame count and sample rate add up to exactly 2 hours, then hours will be 2, and minutes, seconds, and milliseconds will all be 0.

# File lib/wavefile/duration.rb, line 30
def initialize(sample_frame_count, sample_rate)
  @sample_frame_count = sample_frame_count
  @sample_rate = sample_rate

  sample_frames_per_millisecond = sample_rate / 1000.0
  sample_frames_per_second = sample_rate
  sample_frames_per_minute = sample_frames_per_second * 60
  sample_frames_per_hour = sample_frames_per_minute * 60
  @hours, @minutes, @seconds, @milliseconds = 0, 0, 0, 0

  if sample_frame_count >= sample_frames_per_hour
    @hours = sample_frame_count / sample_frames_per_hour
    sample_frame_count -= sample_frames_per_hour * @hours
  end

  if sample_frame_count >= sample_frames_per_minute
    @minutes = sample_frame_count / sample_frames_per_minute
    sample_frame_count -= sample_frames_per_minute * @minutes
  end

  if sample_frame_count >= sample_frames_per_second
    @seconds = sample_frame_count / sample_frames_per_second
    sample_frame_count -= sample_frames_per_second * @seconds
  end

  @milliseconds = (sample_frame_count / sample_frames_per_millisecond).floor
end

Public Instance Methods

==(other_duration) click to toggle source

Returns

Returns true if this Duration represents that same amount of time as other_duration.

Two Duration instances will evaluate as == if they correspond to the same “stopwatch time”. This means that two Durations constructed from a different number of sample frames or different sample rates can be considered equal if they correspond to the same amount of time. For example, a Duration from 44,100 sample frames at 44,100 samples/sec will be considered equal to a Duration from 22,050 sample frames at 22,050 samples/sec, because both correspond to 1 second of audio.

Since the finest resolution of a duration is 1 millisecond, two Durations that represent different amounts of time but differ by less than 1 millisecond will be considered equal.

# File lib/wavefile/duration.rb, line 73
def ==(other_duration)
  @hours == other_duration.hours &&
  @minutes == other_duration.minutes &&
  @seconds == other_duration.seconds &&
  @milliseconds == other_duration.milliseconds
end