Git Product home page Git Product logo

Comments (8)

beyondvoid avatar beyondvoid commented on August 11, 2024

By the way: reading out the field subchunk2size by using

header = read("test.wav", 46)
sum(header[41:44] .* (256.^(0:3)))

yields 32000, which is wrong, since it should be 64000. (Note: subchunk2size equals number_samples * number_channels * bits_per_sample / 8).

from wav.jl.

beyondvoid avatar beyondvoid commented on August 11, 2024

I just figured out that the value corresponding to the field chunksize is correct; however, the value corresponding to subchunk2size is wrong. My current workaround is as follows:

# Note: `number_samples` and `path_file` is given. 

# Read header. 
file_stream = open(path_file, "r+")
header = read(file_stream, 46)

# Find characters `data` to determine length (44-bytes or 46-bytes) of header. 
# Hex-string below corresponds to the characters `data`.            
range_matched_sequence = search(header, [0x64, 0x61, 0x74, 0x61])
if !isempty(range_matched_sequence)
    indices_data_size = range_matched_sequence + 4;
    if ==(maximum(indices_data_size), 46)
        warn("File features 46-byte header.")
    end
else
    error("Invalid file header.")
end

# Get value that corresponds to field `blockalign`. 
block_align = sum(header[33:34] .* (256.^(0:1)))
if ~isinteger(block_align)
    error("Corrupted file: non-integer block align.")
end

# Update header. 
header[indices_data_size] = reverse(hex2bytes(hex(number_samples*block_align, 8)))

# Overwrite file's header by updated header. 
seekstart(file_stream)
write(file_stream, header)
close(file_stream)

This way I avoid reading and writing the whole file.

from wav.jl.

beyondvoid avatar beyondvoid commented on August 11, 2024

And by the way: Do you assume 44-byte and/or 46-byte header files?

from wav.jl.

beyondvoid avatar beyondvoid commented on August 11, 2024

I skimmed through the code and realized that wavappend (or even the whole WAV-package) only supports 44-byte headers. (Please correct me if I'm wrong.) If this is the case, I would suggest that the package should either

  1. throw an error if it appends to a wave file that features a 46-byte header or
  2. converts the 46-byte header into a 44-byte header as follows:
# `header` is an array containing the first 46 bytes of the wave file
if ==(header[17], 0x12)
    warning("Converting 46-byte header into 44-byte header.")
    header[17] = 0x10
    deleteat!(header, [37,38])
end

from wav.jl.

beyondvoid avatar beyondvoid commented on August 11, 2024

Hi, everyone. I've found and fixed the bug related to the aforementioned problem. Please go through my pull-request in order to figure out what I've changed.

from wav.jl.

dancasimiro avatar dancasimiro commented on August 11, 2024

Thanks @beyondvoid

It’s been a while since I wrote the header code. I’ll take a look and get back to you.

from wav.jl.

beyondvoid avatar beyondvoid commented on August 11, 2024

Hi, @dancasimiro. Thanks for taking a look. If you are interested you can find detailed information on the header at http://soundfile.sapp.org/doc/WaveFormat/.

from wav.jl.

dancasimiro avatar dancasimiro commented on August 11, 2024

Fixed by pull request #61.

from wav.jl.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.