Brian Willoughby wrote:> I do not see the need to jump to 64-bit merely to get beyond the 2 GB > limit. There are modern API that handle 32-bit unsigned file lengths > - i.e., up to 4 GB - without going to 64-bit.When we are talking about offset_t we are talking about the flac C and C++ API. Currently if we have a flac file with more than 2Gig samples it is not possible to seek past the 2 Gig sample point on platforms where offset_t is 32 bit. To fix this we need to guarantee that the offset parameter is 64 bits on all platforms. Correctly converting WAV files larger than 2 (or 4) Gig is a separate issue.> Besides, RF64 is the proper format for files that exceed 4 GB, while > standard RIFF/WAVE should allow reading of files up to 4 GB.When talking about the WAV 2/4 Gig problem we are talking about mal-formed WAV files that are greater than 4 Gig in size. There is a flac command line option (--ignore-chunk-sizes) that treats everything after the start of the audio data as audio data even if the file is over 4Gig in size.> For maximum compatibility, writing WAV files over 2 GB should be > avoided whenever possible, since so many tools used signed 32-bit > file sizes.I agree completely. Unfortunately there is a lot of broken software out there. Erik -- ---------------------------------------------------------------------- Erik de Castro Lopo http://www.mega-nerd.com/
On Mar 6, 2013, at 00:55, Erik de Castro Lopo wrote:> Brian Willoughby wrote: > >> I do not see the need to jump to 64-bit merely to get beyond the 2 GB >> limit. There are modern API that handle 32-bit unsigned file lengths >> - i.e., up to 4 GB - without going to 64-bit. > > When we are talking about offset_t we are talking about the flac C and > C++ API. Currently if we have a flac file with more than 2Gig samples > it is not possible to seek past the 2 Gig sample point on platforms > where offset_t is 32 bit. To fix this we need to guarantee that the > offset parameter is 64 bits on all platforms.What about fseeko()? I use that in my ObjC library for converting between AIFF, FLAC, and WAVE. It takes an unsigned 32-bit offset, as contrasted with fseek() classic. Unless you need negative offsets, that seems like a simple change. FLAC__stream_decoder_seek_absolute() already takes a FLAC__uint64 offset. I just cast my 32-bit unsigned long and use that in the existing FLAC API. Brian Willoughby Sound Consulting
Brian Willoughby wrote:> What about fseeko()? I use that in my ObjC library for converting > between AIFF, FLAC, and WAVE. It takes an unsigned 32-bit offset, as > contrasted with fseek() classic. Unless you need negative offsets, > that seems like a simple change. > > FLAC__stream_decoder_seek_absolute() already takes a FLAC__uint64 > offset. I just cast my 32-bit unsigned long and use that in the > existing FLAC API.I said offset_t, but I meant off_t. The public header file FLAC/metadata.h returns off_t from funtcion: FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator); That needs to be fixed. Erik -- ---------------------------------------------------------------------- Erik de Castro Lopo http://www.mega-nerd.com/