Sha256: 59105db691950b22d18c9b091cb4f42ed0e6b78baa6480d95e01e65424a8ac2d

Contents?: true

Size: 1.69 KB

Versions: 1

Compression:

Stored size: 1.69 KB

Contents

require 'dxopal/remote_resource'

module DXOpal
  class Sound < RemoteResource
    RemoteResource.add_class(Sound)

    # Return AudioContext
    def self.audio_context
      @@audio_context ||= %x{
        new (window.AudioContext||window.webkitAudioContext)
      }
    end

    # Load remote sound (called via Window.load_resources)
    def self._load(path_or_url)
      snd = new(path_or_url)
      snd_promise = %x{
        new Promise(function(resolve, reject) {
          var request = new XMLHttpRequest();
          request.open('GET', #{path_or_url}, true);
          request.responseType = 'arraybuffer';
          request.onload = function() {
            var audioData = request.response;
            var context = #{Sound.audio_context};
            context.decodeAudioData(audioData, function(decoded) {
              snd['$decoded='](decoded);
              resolve();
            });
          };
          request.send();
        });
      }
      return snd, snd_promise
    end

    def initialize(path_or_url)
      @path_or_url = path_or_url  # Used in error message
    end
    attr_accessor :decoded

    # Play this sound
    def play(loop_ = false)
      raise "Sound #{path_or_url} is not loaded yet" unless @decoded
      source = nil
      %x{
        var context = #{Sound.audio_context};
        source = context.createBufferSource();
        source.buffer = #{@decoded};
        if (#{loop_}) {
          source.loop = true;
        }
        source.connect(context.destination);
        source.start(0); 
      }
      @source = source
    end

    # Stop playing this sound (if playing)
    def stop
      return unless @decoded 
      return unless @source
      @source.JS.stop()
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dxopal-1.6.0 lib/dxopal/sound.rb