| 
 
| 赞 | 0 |  
| VIP | 0 |  
| 好人卡 | 0 |  
| 积分 | 1 |  
| 经验 | 2664 |  
| 最后登录 | 2014-9-27 |  
| 在线时间 | 62 小时 |  
 Lv1.梦旅人 
	梦石0 星屑50 在线时间62 小时注册时间2011-1-28帖子35 | 
| 可以直接用 API 的多媒體接口 載入 播放 什麼的都沒問題
 只是 SEEK(就是設定由那裡開始播放/重播也需要用到) 的時候倒是會卡一下
 
 #==============================================================================# ■ CacheAudio#------------------------------------------------------------------------------#   本模組載入音效,建立並保存音頻物件。為使播放暢順並節省内存,本模組可把指定#   音效預先讀入,使得程序在需求已存在的音效時能快速讀取。#============================================================================== $mciSendStringW = Win32API.new("winmm","mciSendStringW",['P','P','I','L'],'L')$mciGetErrorStringW = Win32API.new("winmm","mciGetErrorStringW",['L','P','I'],'L')$: << Dir.getwdmodule CacheAudio  #--------------------------------------------------------------------------  # ● 載入音檔。  #    filename : Str.文件名  #    *device  : Str.標識  #--------------------------------------------------------------------------  def self.open(filename,device=filename)    return $mciSendStringW.call("open #{filename} alias #{device}".to_unc,0,0,0)  end  #--------------------------------------------------------------------------  # ● 結束音檔。  #    device : Str.標識  #--------------------------------------------------------------------------  def self.close(device)    error = $mciSendStringW.call("close #{device}".to_unc,0,0,0)    raise CacheAudioException.new(error) if error != 0  end  #--------------------------------------------------------------------------  # ● 播放音檔。  #    device : Str.標識  #--------------------------------------------------------------------------  def self.play(device)    error = $mciSendStringW.call("play #{device}".to_unc,0,0,0)    raise CacheAudioException.new(error) if error != 0  end  #--------------------------------------------------------------------------  # ● 播放音檔。  #    device : Str.標識  #    *from  : Int.位置  #--------------------------------------------------------------------------  def self.playfrom(device,from=0)    error = $mciSendStringW.call("play #{device} from #{from}".to_unc,0,0,0)    raise CacheAudioException.new(error) if error != 0  end  #--------------------------------------------------------------------------  # ● 停止播放。  #    device : Str.標識  #--------------------------------------------------------------------------  def self.stop(device)    error = $mciSendStringW.call("stop #{device}".to_unc,0,0,0)    raise CacheAudioException.new(error) if error != 0  end  #--------------------------------------------------------------------------  # ● 暫停播放。  #    device : Str.標識  #--------------------------------------------------------------------------  def self.pause(device)    error = $mciSendStringW.call("pause #{device}".to_unc,0,0,0)    raise CacheAudioException.new(error) if error != 0  end  #--------------------------------------------------------------------------  # ● 恢復播放。  #    device : Str.標識  #--------------------------------------------------------------------------  def self.resume(device)    error = $mciSendStringW.call("resume #{device}".to_unc,0,0,0)    raise CacheAudioException.new(error) if error != 0  end  #--------------------------------------------------------------------------  # ● 移動游標。  #    device    : Str.標識  #    *position : Int.位置  #--------------------------------------------------------------------------  def self.seek(device,position=0)    position = "start" if position == 0    position = "end" if position == 0 - 1    error = $mciSendStringW.call("seek #{device} to #{position}".to_unc,0,0,0)    raise CacheAudioException.new(error) if error != 0  end  #--------------------------------------------------------------------------  # ● 設置音量。  #    device : Str.標識  #    volune : Int.音量  #--------------------------------------------------------------------------  def self.setvolume(device,volume)    volume = [[volume,0].max,1000].min    error = $mciSendStringW.call("setaudio #{device} volume to #{volume}".to_unc,0,0,0)    raise CacheAudioException.new(error) if error != 0  end  #--------------------------------------------------------------------------  # ● 獲取音量。  #    device : Str.標識  #--------------------------------------------------------------------------  def self.getvolume(device)    buf = " " * 256    error = $mciSendStringW.call("status #{device} volume".to_unc,0,0,0)    raise CacheAudioException.new(error) if error != 0    return buf.strip.to_utf  end  #--------------------------------------------------------------------------  # ● 漸變音量  #    device : Str.標識  #    time   : Int.漸變時間  #    to     : Int.最後音量  #--------------------------------------------------------------------------  def self.gradual(device,time,to)    Thread.new {      begin        unless time <= 0          volume = getvolume(device).to_f          change = (to - getvolume(device)).to_f / time / 10          for t in 0...time * 10            setvolume(device,volume.to_i)            volume += change            sleep 0.08          end        end        setvolume(device,to)      rescue Exception => ex        p "淡入或淡出時發生了異常:",ex      end    }  end  #--------------------------------------------------------------------------  # ● 設置播放速度。  #    device : Str.標識  #    speed  : Int.播放速度  #--------------------------------------------------------------------------  def self.setspeed(device,speed)    speed = [[speed,500].max,1500].min    error = $mciSendStringW.call("set #{device} speed #{speed}".to_unc,0,0,0)    raise CacheAudioException.new(error) if error != 0  end  #--------------------------------------------------------------------------  # ● 獲取播放速度。  #    device : Str.標識  #--------------------------------------------------------------------------  def self.getspeed(device)    buf = " " * 256    error = $mciSendStringW.call("status #{device} speed".to_unc,0,0,0)    raise CacheAudioException.new(error) if error != 0    return buf.strip.to_utf  endend #==============================================================================# ■ CacheAudioException#------------------------------------------------------------------------------#  音頻貯藏所模塊異常類。#============================================================================== class CacheAudioException < Exception  #--------------------------------------------------------------------------  # ● 初始化异常类对象  #    code : 错误代码  #--------------------------------------------------------------------------  def initialize(code)    return super if code.class == String    @msg = " " * 512    $mciGetErrorStringW.call(code,@msg,256)    @msg = "錯誤代碼︰#{code}  #{@msg.to_utf}"  end  #--------------------------------------------------------------------------  # ● 返回异常对象的字符串描述  #--------------------------------------------------------------------------  def to_s    return @msg if @msg    return super  endend
#============================================================================== 
# ■ CacheAudio 
#------------------------------------------------------------------------------ 
#   本模組載入音效,建立並保存音頻物件。為使播放暢順並節省内存,本模組可把指定 
#   音效預先讀入,使得程序在需求已存在的音效時能快速讀取。 
#============================================================================== 
  
$mciSendStringW = Win32API.new("winmm","mciSendStringW",['P','P','I','L'],'L') 
$mciGetErrorStringW = Win32API.new("winmm","mciGetErrorStringW",['L','P','I'],'L') 
$: << Dir.getwd 
module CacheAudio 
  #-------------------------------------------------------------------------- 
  # ● 載入音檔。 
  #    filename : Str.文件名 
  #    *device  : Str.標識 
  #-------------------------------------------------------------------------- 
  def self.open(filename,device=filename) 
    return $mciSendStringW.call("open #{filename} alias #{device}".to_unc,0,0,0) 
  end 
  #-------------------------------------------------------------------------- 
  # ● 結束音檔。 
  #    device : Str.標識 
  #-------------------------------------------------------------------------- 
  def self.close(device) 
    error = $mciSendStringW.call("close #{device}".to_unc,0,0,0) 
    raise CacheAudioException.new(error) if error != 0 
  end 
  #-------------------------------------------------------------------------- 
  # ● 播放音檔。 
  #    device : Str.標識 
  #-------------------------------------------------------------------------- 
  def self.play(device) 
    error = $mciSendStringW.call("play #{device}".to_unc,0,0,0) 
    raise CacheAudioException.new(error) if error != 0 
  end 
  #-------------------------------------------------------------------------- 
  # ● 播放音檔。 
  #    device : Str.標識 
  #    *from  : Int.位置 
  #-------------------------------------------------------------------------- 
  def self.playfrom(device,from=0) 
    error = $mciSendStringW.call("play #{device} from #{from}".to_unc,0,0,0) 
    raise CacheAudioException.new(error) if error != 0 
  end 
  #-------------------------------------------------------------------------- 
  # ● 停止播放。 
  #    device : Str.標識 
  #-------------------------------------------------------------------------- 
  def self.stop(device) 
    error = $mciSendStringW.call("stop #{device}".to_unc,0,0,0) 
    raise CacheAudioException.new(error) if error != 0 
  end 
  #-------------------------------------------------------------------------- 
  # ● 暫停播放。 
  #    device : Str.標識 
  #-------------------------------------------------------------------------- 
  def self.pause(device) 
    error = $mciSendStringW.call("pause #{device}".to_unc,0,0,0) 
    raise CacheAudioException.new(error) if error != 0 
  end 
  #-------------------------------------------------------------------------- 
  # ● 恢復播放。 
  #    device : Str.標識 
  #-------------------------------------------------------------------------- 
  def self.resume(device) 
    error = $mciSendStringW.call("resume #{device}".to_unc,0,0,0) 
    raise CacheAudioException.new(error) if error != 0 
  end 
  #-------------------------------------------------------------------------- 
  # ● 移動游標。 
  #    device    : Str.標識 
  #    *position : Int.位置 
  #-------------------------------------------------------------------------- 
  def self.seek(device,position=0) 
    position = "start" if position == 0 
    position = "end" if position == 0 - 1 
    error = $mciSendStringW.call("seek #{device} to #{position}".to_unc,0,0,0) 
    raise CacheAudioException.new(error) if error != 0 
  end 
  #-------------------------------------------------------------------------- 
  # ● 設置音量。 
  #    device : Str.標識 
  #    volune : Int.音量 
  #-------------------------------------------------------------------------- 
  def self.setvolume(device,volume) 
    volume = [[volume,0].max,1000].min 
    error = $mciSendStringW.call("setaudio #{device} volume to #{volume}".to_unc,0,0,0) 
    raise CacheAudioException.new(error) if error != 0 
  end 
  #-------------------------------------------------------------------------- 
  # ● 獲取音量。 
  #    device : Str.標識 
  #-------------------------------------------------------------------------- 
  def self.getvolume(device) 
    buf = " " * 256 
    error = $mciSendStringW.call("status #{device} volume".to_unc,0,0,0) 
    raise CacheAudioException.new(error) if error != 0 
    return buf.strip.to_utf 
  end 
  #-------------------------------------------------------------------------- 
  # ● 漸變音量 
  #    device : Str.標識 
  #    time   : Int.漸變時間 
  #    to     : Int.最後音量 
  #-------------------------------------------------------------------------- 
  def self.gradual(device,time,to) 
    Thread.new { 
      begin 
        unless time <= 0 
          volume = getvolume(device).to_f 
          change = (to - getvolume(device)).to_f / time / 10 
          for t in 0...time * 10 
            setvolume(device,volume.to_i) 
            volume += change 
            sleep 0.08 
          end 
        end 
        setvolume(device,to) 
      rescue Exception => ex 
        p "淡入或淡出時發生了異常:",ex 
      end 
    } 
  end 
  #-------------------------------------------------------------------------- 
  # ● 設置播放速度。 
  #    device : Str.標識 
  #    speed  : Int.播放速度 
  #-------------------------------------------------------------------------- 
  def self.setspeed(device,speed) 
    speed = [[speed,500].max,1500].min 
    error = $mciSendStringW.call("set #{device} speed #{speed}".to_unc,0,0,0) 
    raise CacheAudioException.new(error) if error != 0 
  end 
  #-------------------------------------------------------------------------- 
  # ● 獲取播放速度。 
  #    device : Str.標識 
  #-------------------------------------------------------------------------- 
  def self.getspeed(device) 
    buf = " " * 256 
    error = $mciSendStringW.call("status #{device} speed".to_unc,0,0,0) 
    raise CacheAudioException.new(error) if error != 0 
    return buf.strip.to_utf 
  end 
end 
  
#============================================================================== 
# ■ CacheAudioException 
#------------------------------------------------------------------------------ 
#  音頻貯藏所模塊異常類。 
#============================================================================== 
  
class CacheAudioException < Exception 
  #-------------------------------------------------------------------------- 
  # ● 初始化异常类对象 
  #    code : 错误代码 
  #-------------------------------------------------------------------------- 
  def initialize(code) 
    return super if code.class == String 
    @msg = " " * 512 
    $mciGetErrorStringW.call(code,@msg,256) 
    @msg = "錯誤代碼︰#{code}  #{@msg.to_utf}" 
  end 
  #-------------------------------------------------------------------------- 
  # ● 返回异常对象的字符串描述 
  #-------------------------------------------------------------------------- 
  def to_s 
    return @msg if @msg 
    return super 
  end 
end 
 #==============================================================================# ■ String#------------------------------------------------------------------------------#   字串類。#============================================================================== class String  #--------------------------------------------------------------------------  # ● 返回自身是否全部為美國資訊交換標準代碼的字符。  # ‧ Bol  #--------------------------------------------------------------------------  def ascii?    self.each_byte{|x| return false if x >= 128}     return true  end  #--------------------------------------------------------------------------  # ● 返回自身刪除位元組順序記號後的字串。  # ‧ Str  #--------------------------------------------------------------------------  def delete_bom    return self[3..0 - 1] if self[0,3] == "#{(239).chr}#{(187).chr}#{(191).chr}"    return self  end  @@MultiByteToWideChar = Win32API.new("kernel32", "MultiByteToWideChar", ['I', 'L', 'P', 'I', 'P', 'I'], 'I')  @@WideCharToMultiByte = Win32API.new("kernel32", "WideCharToMultiByte", ['I', 'L', 'P', 'I', 'P', 'I', 'P', 'P'], 'I')  #--------------------------------------------------------------------------  # ● 返回自身轉碼為"unicode"後的字串。如自身編碼非"UTF-8",經運算後,字串  #    可能出現亂碼。  # ‧ Str  #--------------------------------------------------------------------------  def to_unc #unc=>unicode    len = @@MultiByteToWideChar.call(65001,0,self,0 - 1,0,0) << 1    buf = " " * len    @@MultiByteToWideChar.call(65001,0,self,0 - 1,buf,len)    return buf  end  #--------------------------------------------------------------------------  # ● 返回自身轉碼為"UTF-8"後的字串。如自身編碼非"unicode",經運算後,字串  #    可能出現亂碼。  # ‧ Str  #--------------------------------------------------------------------------  def to_utf #utf=>UTF-8    len = @@WideCharToMultiByte.call(65001,0,self,0 - 1,0,0,0,0)    buf = " " * len    @@WideCharToMultiByte.call(65001,0,self,0 - 1,buf,len,0,0)    buf.slice!(0 - 1,1)    return buf  endend
#============================================================================== 
# ■ String 
#------------------------------------------------------------------------------ 
#   字串類。 
#============================================================================== 
  
class String 
  #-------------------------------------------------------------------------- 
  # ● 返回自身是否全部為美國資訊交換標準代碼的字符。 
  # ‧ Bol 
  #-------------------------------------------------------------------------- 
  def ascii? 
    self.each_byte{|x| return false if x >= 128}  
    return true 
  end 
  #-------------------------------------------------------------------------- 
  # ● 返回自身刪除位元組順序記號後的字串。 
  # ‧ Str 
  #-------------------------------------------------------------------------- 
  def delete_bom 
    return self[3..0 - 1] if self[0,3] == "#{(239).chr}#{(187).chr}#{(191).chr}" 
    return self 
  end 
  @@MultiByteToWideChar = Win32API.new("kernel32", "MultiByteToWideChar", ['I', 'L', 'P', 'I', 'P', 'I'], 'I') 
  @@WideCharToMultiByte = Win32API.new("kernel32", "WideCharToMultiByte", ['I', 'L', 'P', 'I', 'P', 'I', 'P', 'P'], 'I') 
  #-------------------------------------------------------------------------- 
  # ● 返回自身轉碼為"unicode"後的字串。如自身編碼非"UTF-8",經運算後,字串 
  #    可能出現亂碼。 
  # ‧ Str 
  #-------------------------------------------------------------------------- 
  def to_unc #unc=>unicode 
    len = @@MultiByteToWideChar.call(65001,0,self,0 - 1,0,0) << 1 
    buf = " " * len 
    @@MultiByteToWideChar.call(65001,0,self,0 - 1,buf,len) 
    return buf 
  end 
  #-------------------------------------------------------------------------- 
  # ● 返回自身轉碼為"UTF-8"後的字串。如自身編碼非"unicode",經運算後,字串 
  #    可能出現亂碼。 
  # ‧ Str 
  #-------------------------------------------------------------------------- 
  def to_utf #utf=>UTF-8 
    len = @@WideCharToMultiByte.call(65001,0,self,0 - 1,0,0,0,0) 
    buf = " " * len 
    @@WideCharToMultiByte.call(65001,0,self,0 - 1,buf,len,0,0) 
    buf.slice!(0 - 1,1) 
    return buf 
  end 
end 
 | 
 |