Sha256: 96c119f5b859a6d7cededa3a1529ab59184b6c6472adc4c79a8d02135e081df8

Contents?: true

Size: 1.38 KB

Versions: 3

Compression:

Stored size: 1.38 KB

Contents

module Mumble
  class AudioStream
    attr_reader :volume

    def initialize(type, target, encoder, file, connection)
      @type = type
      @target = target
      @encoder = encoder
      @file = File.open(file, 'rb')
      @conn = connection
      @seq = 0
      @compressed_size = 960
      @pds = PacketDataStream.new
      @volume = 1.0

      @queue = Queue.new
      @producer = spawn_thread :produce
      @consumer = spawn_thread :consume
    end

    def volume=(volume)
      @volume = volume / 100.0
    end

    def stop
      @producer.kill
      @consumer.kill
      @file.close
    end

    private
    def change_volume(pcm_data)
      pcm_data.unpack('s*').map { |s| s * @volume }.pack('s*')
    end

    def packet_header
      ((@type << 5) | @target).chr
    end

    def produce
      pcm_data = change_volume @file.read(@encoder.frame_size * 2)
      @queue << @encoder.encode(pcm_data, @compressed_size)
    end

    def consume
      @seq %= 1000000 # Keep sequence number reasonable for long runs

      @pds.rewind
      @seq += 1
      @pds.put_int @seq

      frame = @queue.pop
      len = frame.size
      @pds.put_int len
      @pds.append_block frame

      size = @pds.size
      @pds.rewind
      data = [packet_header, @pds.get_block(size)].flatten.join
      @conn.send_udp_packet data
    end

    def spawn_thread(sym)
      Thread.new { loop { send sym } }
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
mumble-ruby-1.0.2 lib/mumble-ruby/audio_stream.rb
mumble-ruby-1.0.1 lib/mumble-ruby/audio_stream.rb
mumble-ruby-1.0.0 lib/mumble-ruby/audio_stream.rb