diff --git a/src/sndfile.jl b/src/sndfile.jl index a2952eb..4f73116 100644 --- a/src/sndfile.jl +++ b/src/sndfile.jl @@ -97,7 +97,8 @@ end # through an arbitrary render chain and returns the result as a vector function Base.read(file::AudioFile, nframes::Integer, dtype::Type) @assert file.sfinfo.channels <= 2 - arr = zeros(dtype, nframes, file.sfinfo.channels) + # the data comes in interleaved + arr = zeros(dtype, file.sfinfo.channels, nframes) if dtype == Int16 nread = ccall((:sf_readf_short, libsndfile), Int64, @@ -117,7 +118,7 @@ function Base.read(file::AudioFile, nframes::Integer, dtype::Type) file.filePtr, arr, nframes) end - return arr[1:nread, :] + return arr[:, 1:nread]' end Base.read(file::AudioFile, dtype::Type) = Base.read(file, file.sfinfo.frames, dtype) diff --git a/test/test_sndfile.jl b/test/test_sndfile.jl index 4dfe0b9..1ad5e87 100644 --- a/test/test_sndfile.jl +++ b/test/test_sndfile.jl @@ -28,6 +28,8 @@ facts("WAV file write/read") do @fact reference => actual[:, 1] end + # test seeking + # test rendering as an AudioNode AudioIO.open(fname) do f # pretend we have a stream at the same rate as the file @@ -42,7 +44,39 @@ facts("WAV file write/read") do buf = render(node, input, test_info) @fact expected[bufsize+1:2*bufsize] => buf[1:bufsize] end - end +facts("Stereo file reading") do + fname = Pkg.dir("AudioIO", "test", "440left_880right.wav") + samplerate = 44100 + t = [0 : 2 * samplerate - 1] / samplerate + expected = int16((2^15-1) * hcat(sin(2pi*t*440), sin(2pi*t*880))) + + AudioIO.open(fname) do f + buf = read(f) + @fact buf => mse(expected, 5) + end +end + +# note - currently AudioIO just mixes down to Mono. soon we'll support this +# new-fangled stereo sound stuff +#facts("Stereo file rendering") do +# fname = Pkg.dir("AudioIO", "test", "440left_880right.wav") +# samplerate = 44100 +# bufsize = 1024 +# input = zeros(AudioSample, bufsize) +# test_info = DeviceInfo(samplerate, bufsize) +# t = [0 : 2 * samplerate - 1] / samplerate +# expected = convert(AudioBuf, 0.5 * (sin(2pi*t*440) + sin(2pi*t*880))) +# +# AudioIO.open(fname) do f +# node = FilePlayer(f) +# buf = render(node, input, test_info) +# print(size(buf)) +# @fact expected[1:bufsize] => buf[1:bufsize] +# buf = render(node, input, test_info) +# @fact expected[bufsize+1:2*bufsize] => buf[1:bufsize] +# end +#end + end # module TestSndfile