lib/nu_wav.rb in nu_wav-0.3.3 vs lib/nu_wav.rb in nu_wav-0.3.4

- old
+ new

@@ -6,10 +6,11 @@ require 'rubygems' require 'mp3info' require 'date' require 'tempfile' +require 'fileutils' module NuWav DEBUG = false @@ -41,33 +42,35 @@ class WaveFile attr_accessor :header, :chunks def self.parse(wave_file) - wf = NuWav::WaveFile.new - wf.parse(wave_file) - wf + NuWav::WaveFile.new.parse(wave_file) end def initialize self.chunks = {} end def parse(wave_file) NuWav::WaveFile.log "Processing wave file #{wave_file.inspect}...." + wave_file_size = File.size(wave_file) + File.open(wave_file, File::RDWR) do |f| #only for windows, make sure we are operating in binary mode f.binmode #start at the very beginning, a very good place to start f.seek(0) riff, riff_length = read_chunk_header(f) NuWav::WaveFile.log "riff: #{riff}" NuWav::WaveFile.log "riff_length: #{riff_length}" + NuWav::WaveFile.log "wave_file_size: #{wave_file_size}" + raise NotRIFFFormat unless riff == 'RIFF' - riff_end = f.tell + riff_length + riff_end = [f.tell + riff_length, wave_file_size].min riff_type = f.read(4) raise NotWAVEFormat unless riff_type == 'WAVE' @header = RiffChunk.new(riff, riff_length, riff_type) @@ -93,10 +96,11 @@ end end end @chunks.each{|k,v| NuWav::WaveFile.log "#{k}: #{v}\n\n" unless k.to_s == 'data'} NuWav::WaveFile.log "parse done" + self end def duration fmt = @chunks[:fmt] @@ -270,11 +274,14 @@ protected def read_chunk_header(file) hdr = file.read(8) - chunkName, chunkLen = hdr.unpack("A4V") + # puts "hdr: #{hdr}" + chunkName, chunkLen = hdr.unpack("A4V") rescue [nil, nil] + # puts "chunkName: '#{chunkName}', chunkLen: '#{chunkLen}'" + [chunkName, chunkLen] end def chunk_class(name) begin constantize("NuWav::#{camelize("#{name}_chunk")}") @@ -333,11 +340,11 @@ def read_word(start) @raw[start..(start+1)].unpack('v').first end def read_char(start, length=(@raw.length-start)) - @raw[start..(start+length-1)] + (@raw[start..(start+length-1)] || '').strip end def write_dword(val) val ||= 0 [val].pack('V') @@ -348,10 +355,11 @@ [val].pack('v') end def write_char(val, length=nil) val ||= '' + val = val.to_s length ||= val.length # NuWav::WaveFile.log "length:#{length} val.length:#{val.length} val:#{val}" padding = "\0" * [(length - val.length), 0].max out = val[0,length] + padding # NuWav::WaveFile.log out @@ -600,12 +608,12 @@ end def self.new_from_file(file) tmp_data = Tempfile.open('data_chunk') tmp_data.binmode - File.copy(file.path, tmp_data.path) + FileUtils.cp(file.path, tmp_data.path) tmp_data.rewind - self.new('data', File.size(file.path), tmp_data) + self.new('data', File.size(tmp_data.path).to_s, tmp_data) end def initialize(id=nil, size=nil, tmp_data_file=nil) @id, @size, @tmp_data_file = id, size, tmp_data_file end \ No newline at end of file