module Sonos::Features::Voiceover

Public Instance Methods

voiceover!(uri, vol = nil) click to toggle source

Interrupts the speaker and plays the provided URI. When finished, returns the play head and state to their original position. Useful for doorbell sounds, announcements, etc.

# File lib/sonos/features/voiceover.rb, line 5
def voiceover!(uri, vol = nil)
  start_time = Time.now

  result = group_master.with_isolated_state do
    self.volume = vol if vol
    group_master.play_blocking(uri)
  end

  result.merge({duration: (Time.now - start_time )})
end

Protected Instance Methods

play_blocking(uri) click to toggle source
# File lib/sonos/features/voiceover.rb, line 45
def play_blocking(uri)
  # queue up the track
  play uri

  # play it
  play

  # pause the thread until the track is done
  sleep(0.1) while is_playing?
end
with_isolated_state() { || ... } click to toggle source
# File lib/sonos/features/voiceover.rb, line 18
def with_isolated_state
  pause if was_playing = is_playing?
  unmute if was_muted = muted?
  previous_volume = volume
  previous = now_playing

  yield

  # the sonos app does this. I think it tells the player to think of the master queue as active again
  play uid.gsub('uuid', 'x-rincon-queue') + '#0'

  if previous
    select_track previous[:queue_position]
    seek Time.parse("1/1/1970 #{previous[:current_position]} -0000" ).to_i

    self.volume = previous_volume
    mute if was_muted
  end

  play if was_playing

  {
    original_volume: previous_volume,
    original_state: (was_playing ? 'playing' : 'paused')
  }
end