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