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を渡す。

返却値

生成したインスタンス



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

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.



299
300
301
# File 'lib/Miyako/API/audio.rb', line 299

def priority
  @priority
end

Class Method Details

.channelsObject

同時発音数を取得する

返却値

同時再生数



324
325
326
# File 'lib/Miyako/API/audio.rb', line 324

def SE.channels
  @@channels
end

.channels=(channels) ⇒ Object

同時発音数を変更する

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

channels

変更する同時発音数

返却値

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

Raises:



344
345
346
347
348
349
350
351
352
353
354
355
# File 'lib/Miyako/API/audio.rb', line 344

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)


318
319
320
# File 'lib/Miyako/API/audio.rb', line 318

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

.stop(msec = nil) ⇒ Object

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

msec

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



330
331
332
333
334
335
336
# File 'lib/Miyako/API/audio.rb', line 330

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

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



302
303
304
305
306
307
308
309
310
311
312
313
314
# File 'lib/Miyako/API/audio.rb', line 302

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:



378
379
380
# File 'lib/Miyako/API/audio.rb', line 378

def allow_loop_count_up #:nodoc:
  @cnt_up_flag = true
end

#allow_loop_count_up?Boolean

:nodoc:

Returns:

  • (Boolean)


382
383
384
# File 'lib/Miyako/API/audio.rb', line 382

def allow_loop_count_up? #:nodoc:
  @cnt_up_flag
end

#disposeObject

演奏情報を解放する

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



581
582
583
584
# File 'lib/Miyako/API/audio.rb', line 581

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を返す



503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
# File 'lib/Miyako/API/audio.rb', line 503

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
  SE.update
  return true
end

#fade_in?Boolean

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

返却値

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

Returns:

  • (Boolean)


547
548
549
550
551
552
553
554
# File 'lib/Miyako/API/audio.rb', line 547

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(すぐに次の処理を開始)

返却値

自分自身を返す



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

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)


558
559
560
561
562
563
564
565
# File 'lib/Miyako/API/audio.rb', line 558

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)


369
370
371
# File 'lib/Miyako/API/audio.rb', line 369

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

#initialize_copy(obj) ⇒ Object

インスタンスの複写

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



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

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

#loop_countObject

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

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

返却値

ループ回数



361
362
363
# File 'lib/Miyako/API/audio.rb', line 361

def loop_count
  @loop_cnt
end

#loop_count_upObject

:nodoc:



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

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を返す



438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
# File 'lib/Miyako/API/audio.rb', line 438

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)


469
470
471
472
# File 'lib/Miyako/API/audio.rb', line 469

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)


474
475
476
477
# File 'lib/Miyako/API/audio.rb', line 474

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までの整数で示す。

返却値

自分自身を返す



571
572
573
574
575
576
# File 'lib/Miyako/API/audio.rb', line 571

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を返す



419
420
421
422
423
424
425
426
427
428
# File 'lib/Miyako/API/audio.rb', line 419

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 > 1
  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を渡す。

返却値

自分自身を返す



482
483
484
485
486
487
488
489
490
491
492
493
494
495
# File 'lib/Miyako/API/audio.rb', line 482

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