Class: Miyako::Audio::SE

Inherits:
Object show all
Defined in:
lib/Miyako/API/audio.rb

Overview

効果音管理クラス

Constant Summary collapse

@@channels =
8
@@playings =
[]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(fname, vol = nil, priority = 0) ⇒ SE

インスタンスを生成する

fname

効果音ファイル名。wavファイルのみ対応

vol

音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。

vol

再生優先度(省略可能)。整数を設定する。省略したときは0を渡す。

返却値

生成したインスタンス



440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
# File 'lib/Miyako/API/audio.rb', line 440

def initialize(fname, vol = nil, priority = 0)
  return nil if $not_use_audio
  raise MiyakoIOError.no_file(fname) unless File.exist?(fname)
  @wave = SDL::Mixer::Wave.load(fname)
  if vol
    raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
    @wave.set_volume(vol)
  end
  @channel = -1
  @loops = -1
  @now_loops = @loops
  @loop_cnt = 1
  @cnt_up_flag = false
  @priority = priority
end

Instance Attribute Details

#priorityObject

Returns the value of attribute priority.



348
349
350
# File 'lib/Miyako/API/audio.rb', line 348

def priority
  @priority
end

Class Method Details

.channelsObject

同時発音数を取得する

返却値

同時再生数



373
374
375
# File 'lib/Miyako/API/audio.rb', line 373

def SE.channels
  @@channels
end

.channels=(channels) ⇒ Object

同時発音数を変更する

同時発音数に0以下を指定するとMiyakoValueErrorが発生する 現在同時に発音している音が新しいせっていによりあぶれる場合、あぶれた分を優先度の低い順に停止する 起動時の同時発音数は8

channels

変更する同時発音数

返却値

変更に成功したときはtrue、失敗したときはfalseを返す

Raises:



393
394
395
396
397
398
399
400
401
402
403
404
# File 'lib/Miyako/API/audio.rb', line 393

def SE.channels=(channels)
  return false if $not_use_audio
  raise MiyakoValueError, "Illegal Channels! : #{channels}" if channels <= 0
  if @@playings.length > channels
    num = @@channels - channels
    sorted = @@playings.sort{|a,b| a.priority <=> b.priority}
    num.times{|n| sorted[n].stop}
  end
  SDL::Mixer.allocate_channels(channels)
  @@channels = channels
  return true
end

.playing_any?Boolean

何かしらの効果音が再生中かどうかを確認する

返却値

何かしらの効果音が再生中ならtrue、それ以外はfalse

Returns:

  • (Boolean)


367
368
369
# File 'lib/Miyako/API/audio.rb', line 367

def SE.playing_any?
  !@@playings.empty?
end

.stop(msec = nil) ⇒ Object

現在再生している効果音をすべて停止する

msec

停止する時間をミリ秒で指定(msecミリ秒後に停止)。nilを渡すとすぐに停止する。省略時はnilを渡す。



379
380
381
382
383
384
385
# File 'lib/Miyako/API/audio.rb', line 379

def SE.stop(msec = nil)
  if msec
    raise MiyakoValueError.over_range(msec, 1, nil) unless msec > 0
  end
  msec ? SDL::Mixer.expire(-1, msec) : SDL::Mixer.halt(-1)
  @@playings.clear
end

.updateObject

効果音の再生情報を更新する



351
352
353
354
355
356
357
358
359
360
361
362
363
# File 'lib/Miyako/API/audio.rb', line 351

def SE.update
  return if $not_use_audio
  @@playings.each{|playing|
    if !playing.playing_without_loop? && playing.in_the_loop?
      playing.loop_count_up
      @@playings.delete(playing) if !playing.in_the_loop?
    elsif !playing.playing? && !playing.fade_out?
      @@playings.delete(playing)
    elsif !playing.allow_loop_count_up?
      playing.allow_loop_count_up
    end
  }
end

Instance Method Details

#allow_loop_count_upObject

:nodoc:



427
428
429
# File 'lib/Miyako/API/audio.rb', line 427

def allow_loop_count_up #:nodoc:
  @cnt_up_flag = true
end

#allow_loop_count_up?Boolean

:nodoc:

Returns:

  • (Boolean)


431
432
433
# File 'lib/Miyako/API/audio.rb', line 431

def allow_loop_count_up? #:nodoc:
  @cnt_up_flag
end

#disposeObject

演奏情報を解放する

レシーバをdup/deep_dupなどのメソッドで複製したことがある場合、 内部データを共有しているため、呼び出すときには注意すること



632
633
634
635
# File 'lib/Miyako/API/audio.rb', line 632

def dispose
  @wave.destroy
  @wave = nil
end

#fade_in(msec = 5000, loops = 1, vol = nil, time = nil) ⇒ Object

フェードインしながら演奏する

msec

フェードインの時間。ミリ秒単位。デフォルトは5000ミリ秒(5秒)

loops

演奏の繰り返し回数を指定する。-1のときは無限に繰り返す。省略時は1を渡す。

vol

音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。

time

演奏時間。ミリ秒を整数で指定する。省略時は最後まで演奏する。

返却値

演奏に成功したときはtrue、失敗した問いはfalseを返す



552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
# File 'lib/Miyako/API/audio.rb', line 552

def fade_in(msec=5000, loops = 1, vol = nil, time = nil)
  return false if $not_use_audio
  if (@@playings.length == @@channels && !@@playings.include?(self))
    sorted = @@playings.sort{|a,b| a.priority <=> b.priority}
    sorted[0].stop
  elsif @@playings.include?(self)
    self.stop
  end
  if vol
    raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
    set_volume(vol)
  end
  if time
    raise MiyakoValueError.over_range(time, 1, nil) unless time > 0
  end
  raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
  @now_loops = loops ? loops : @loops
  @loop_cnt = 1
  lp = @now_loops == -1 ? -1 : @now_loops - 1
  @channel = time ? SDL::Mixer.fade_in_channel_timed(-1, @wave, lp, msec, time) : SDL::Mixer.fade_in_channel(-1, @wave, lp, msec)
  @@playings << self
  @start_tick = SDL.get_ticks
  @pos_ticks = 0
  SE.update
  return true
end

#fade_in?Boolean

フェードイン中を示すフラグ

返却値

フェードイン中はtrue、そのほかの時はfalseを返す

Returns:

  • (Boolean)


598
599
600
601
602
603
604
605
# File 'lib/Miyako/API/audio.rb', line 598

def fade_in?
  return false if $not_use_audio
  return false if @channel == -1
  # なぜかSDL::Mixer::FADING_INが見つからないため、即値で
  # from SDL_Mixer.h
#        return SDL::Mixer.fading(@channel) == SDL::Mixer::FADING_IN
  return SDL::Mixer.fading(@channel) == 2
end

#fade_out(msec = 5000, wmode = false) ⇒ Object

演奏をフェードアウトする

msec

フェードアウトする時間。ミリ秒単位。デフォルトは5000ミリ秒

wmode

フェードアウトする間、処理を停止するかどうかを示すフラグ。デフォルトはfalse(すぐに次の処理を開始)

返却値

自分自身を返す



583
584
585
586
587
588
589
590
591
592
593
594
# File 'lib/Miyako/API/audio.rb', line 583

def fade_out(msec = 5000, wmode = false)
  return self if $not_use_audio
  return self if !@@playings.include?(self)
  if msec
    raise MiyakoValueError.over_range(msec, 1, nil) unless msec > 0
  end
  if self.playing?
    SDL::Mixer.fade_out(@channel, msec)
    SDL::delay(msec) if wmode
  end
  return self
end

#fade_out?Boolean

フェードアウト中を示すフラグ

返却値

フェードアウト中はtrue、そのほかの時はfalseを返す

Returns:

  • (Boolean)


609
610
611
612
613
614
615
616
# File 'lib/Miyako/API/audio.rb', line 609

def fade_out?
  return false if $not_use_audio
  return false if @channel == -1
  # なぜかSDL::Mixer::FADING_INが見つからないため、即値で
  # from SDL_Mixer.h
#        return SDL::Mixer.fading(@channel) == SDL::Mixer::FADING_OUT
  return SDL::Mixer.fading(@channel) == 1
end

#in_the_loop?Boolean

現在、繰り返し演奏中かどうかを問い合わせる

現在、繰り返し回数が指定の回数の範囲内かどうかをtrue・falseで返す。 無限に繰り返しているときは常にtrue

返却値

現在繰り返し演奏中のときはtrue

Returns:

  • (Boolean)


418
419
420
# File 'lib/Miyako/API/audio.rb', line 418

def in_the_loop?
  @now_loops == -1 ? true : @loop_cnt <= @now_loops
end

#initialize_copy(obj) ⇒ Object

インスタンスの複写

複写すると不都合が多いため、MiyakoCopyException例外が発生する



458
459
460
# File 'lib/Miyako/API/audio.rb', line 458

def initialize_copy(obj)
  raise MiyakoCopyError.not_copy("SE")
end

#loop_countObject

現在の繰り返し回数を取得する

繰り返し回数を限定して演奏しているとき、何回目の演奏家を示す。 無限に繰り返しているときは常に-1を返す

返却値

ループ回数



410
411
412
# File 'lib/Miyako/API/audio.rb', line 410

def loop_count
  @loop_cnt
end

#loop_count_upObject

:nodoc:



422
423
424
425
# File 'lib/Miyako/API/audio.rb', line 422

def loop_count_up #:nodoc:
  @loop_cnt = @loop_cnt + 1 if (@now_loops != -1 && @cnt_up_flag)
  @cnt_up_flag = false
end

#play(vol = nil, loops = 1, time = nil) ⇒ Object

効果音を鳴らす

音の大きさ・繰り返し回数・演奏時間を指定可能 鳴らすとき、同時再生数を超えるときは鳴らさずにfalseを返す ただし、自分自身が鳴っているときは、前に鳴っていた音を止めて再び鳴らす

vol

音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。

loops

演奏の繰り返し回数を指定する。-1のときは無限に繰り返す。省略時は1を渡す。

time

演奏時間。ミリ秒を整数で指定する。省略時は最後まで演奏する。

返却値

再生に成功したときはtrue、失敗したときはfalseを返す



487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
# File 'lib/Miyako/API/audio.rb', line 487

def play(vol = nil, loops = 1, time = nil)
  return false if $not_use_audio
  if (@@playings.length == @@channels && !@@playings.include?(self))
    sorted = @@playings.sort{|a,b| a.priority <=> b.priority}
    sorted[0].stop
  elsif @@playings.include?(self)
    self.stop
  end
  if vol
    raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
    set_volume(vol)
  end
  if time
    raise MiyakoValueError.over_range(time, 1, nil) unless time > 0
  end
  raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
  @now_loops = loops ? loops : @loops
  @loop_cnt = 1
  lp = @now_loops == -1 ? -1 : @now_loops - 1
  @channel = time ? SDL::Mixer.play_channel_timed(-1, @wave, lp, time) : SDL::Mixer.play_channel(-1, @wave, lp)
  @@playings << self
  if block_given?
    yield self
    SDL::Mixer.halt(@channel)
  end
  SE.update
  return true
end

#playing?Boolean

効果音が鳴っているかを示すフラグ

返却値

効果音が鳴っているときはtrue、鳴っていないときはfalseを返す

Returns:

  • (Boolean)


518
519
520
521
# File 'lib/Miyako/API/audio.rb', line 518

def playing?
  return false if $not_use_audio
  return @channel != -1 ? (SDL::Mixer.play?(@channel) && self.in_the_loop?) || self.fade_out? : false
end

#playing_without_loop?Boolean

:nodoc:

Returns:

  • (Boolean)


523
524
525
526
# File 'lib/Miyako/API/audio.rb', line 523

def playing_without_loop? #:nodoc:
  return false if $not_use_audio
  return @channel != -1 ? SDL::Mixer.play?(@channel) : false
end

#set_volume(v) ⇒ Object Also known as: setVolume

効果音の大きさを設定する

v

音の大きさ。0から255までの整数で示す。

返却値

自分自身を返す



622
623
624
625
626
627
# File 'lib/Miyako/API/audio.rb', line 622

def set_volume(v)
  return self if $not_use_audio
  raise MiyakoValueError.over_range(v, 0, 255) unless (0..255).cover?(v)
  @wave.set_volume(v)
  return self
end

#start(vol = nil, loops = 1, time = nil) ⇒ Object

効果音を鳴らす

音の大きさ・繰り返し回数・演奏時間を指定可能

vol

音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。

loops

演奏の繰り返し回数を指定する。-1のときは無限に繰り返す。省略時は1を渡す。

time

演奏時間。ミリ秒を整数で指定する。省略時は最後まで演奏する。

返却値

再生に成功したときはtrue、失敗したときはfalseを返す



468
469
470
471
472
473
474
475
476
477
# File 'lib/Miyako/API/audio.rb', line 468

def start(vol = nil, loops = 1, time = nil)
  if vol
    raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
  end
  if time
    raise MiyakoValueError.over_range(time, 1, nil) unless time > 0
  end
  raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
  return self.play(vol, loops, time)
end

#stop(msec = nil) ⇒ Object

効果音を停止する

msec

停止する時間をミリ秒で指定(msecミリ秒後に停止)。nilを渡すとすぐに停止する。省略時はnilを渡す。

返却値

自分自身を返す



531
532
533
534
535
536
537
538
539
540
541
542
543
544
# File 'lib/Miyako/API/audio.rb', line 531

def stop(msec = nil)
  return self if $not_use_audio
  return self if !@@playings.include?(self)
  if msec
    raise MiyakoValueError.over_range(msec, 1, nil) unless msec > 0
  end
  return self if @channel == -1
  return self unless SDL::Mixer.play?(@channel)
  msec ? SDL::Mixer.expire(@channel, msec) : SDL::Mixer.halt(@channel)
  @loop_cnt = @now_loops + 1
  @@playings.delete(self)
  @channe = -1
  return self
end