Introduction
Please note - this tip is merely an update to the code published in the article C# MP3 Compressor. I did not write any of this original code, but I've found it very useful so I created this tip to fix a couple of bugs and provide a little more background on the RIFF format.
The original project is a very useful example of MP3 compression and WAV to MP3 conversion, but I was experiencing problems with WAV files that contain additional chunks (e.g., BWAV format, stuff from ProTools, etc.). The WaveStream
class made some unsafe assumptions about the structure of the RIFF data, so here is my fix for the problems I encountered.
As with the original, there is code from the article: A low level audio player in C# by Ianier Munoz. In fact, this is the only code I've changed.
The project has also been upgraded to VS2010.
Background
Here are a couple of useful articles about the RIFF file format:
Using the Code
The only changes are in the WaveStream.cs file, in the yeti.mmedia
project.
There are two main bug fixes:
- It is no longer assumed that the "fmt" chunk will be the first data chunk after the RIFF header. It might well not be.
- The old code assumed that all the chunk headers would be
DWORD
(4 byte) aligned. This is not at all guaranteed, the RIFF format only mandates word (2 byte) alignment. In some cases, this would cause the chunks to be missed, and the file would fail to read.
The code now also accounts for cases where a chunk's data is an odd number of bytes long, in which case there should be a padding byte which is not counted in the chunk length field. Apparently. I've never seen this in a real life file, but if it occurs the code should handle it.
Additional Resources