Sha256: d5f10d4f68bc18c48e530474cd0b29a29dfb03e46ed3b0913d5da99b0e526036

Contents?: true

Size: 1.15 KB

Versions: 3

Compression:

Stored size: 1.15 KB

Contents

# -*- coding: utf-8 -*-

module DXRubySDL
  class Sound
    @sdl_mixer_openend = false

    def initialize(filename)
      if !self.class.instance_variable_get('@sdl_mixer_openend')
        SDL::Mixer.open
        SDL::Mixer.allocate_channels(2)
        self.class.instance_variable_set('@sdl_mixer_openend', true)
      end
      if /\.mid$/ =~ filename
        @sound = Music.new(filename)
      else
        @sound = Wave.new(filename)
      end
    end

    def play
      @sound.play
    end

    private

    class Music
      def initialize(filename)
        @music = SDL::Mixer::Music.load(filename)
      end

      def play
        SDL::Mixer.play_music(@music, -1)
      end
    end
    private_constant :Music

    class Wave
      def initialize(filename)
        @wave = SDL::Mixer::Wave.load(filename)
        @last_played_channel = nil
      end

      def play
        @last_played_channel = SDL::Mixer.play_channel(-1, @wave, 0)
      rescue SDL::Error => e
        if /No free channels available/ =~ e.message
          SDL::Mixer.halt(@last_played_channel == 0 ? 1 : 0)
          retry
        end
      end
    end
    private_constant :Wave
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dxruby_sdl-0.0.4 lib/dxruby_sdl/sound.rb
dxruby_sdl-0.0.3 lib/dxruby_sdl/sound.rb
dxruby_sdl-0.0.2 lib/dxruby_sdl/sound.rb