This project has moved. For the latest updates, please go here.

TryReadFloat problem with Version 1.4

May 2, 2011 at 4:34 PM

Hey guys,

I'm having a problem with TryReadFloat that was previously working under version 1.3.  When I run this code block:

while (reader.HasData(array.Length))
{
reader.TryReadFloat(out nextSample);
if (reader.WaveFormat.Channels > 1)
{
    reader.TryReadFloat(out nextSample);
}
}

I get a System.ApplicationException with a message "Must read complete blocks".   The audio I'm running is a wav file that has 2 channels of audio.  I've search around on the site for source code for the samples associated with version 1.4 but I couldn't find anything.  If someone can direct me to the location of the source of the samples, I'm sure I could find out the issue.  Thanks for your help!

Coordinator
May 2, 2011 at 5:08 PM

OK that is probably a bug you have found. That part of the code is not one I tend make use of myself (I prefer using something like Wave16ToFloatProvider). I am trying to increase unit test coverage for future NAudio so things like that don't get inadvertently broken.  I had been contemplating making TryReadFloat an extension method anyway, so you could do the same and make a TryReadFloat with a stereo overload (two out parameters) for use with stereo files.

Mark

May 2, 2011 at 7:27 PM

Hey Mark!  No worries.  Can you give me an example of using the Wave16ToFloatProvider to gather samples in the same way I'm trying to do above?

Coordinator
May 2, 2011 at 9:26 PM

might be easiest for you just to do it yourself. here's the snippet for a stereo TryReadFloat extension method

            
public static bool TryReadFloat(this WaveFileReader waveFileReader, out float sampleValueLeft, out float sampleValueRight)
{
// 16 bit PCM data
    if (waveFileReader.waveFormat.BitsPerSample == 16)     {      byte[] value = new byte[4];         int read = waveFileReader.Read(value, 0, value.Length);         if (read < value.Length)          return false;         sampleValueLeft = (float)BitConverter.ToInt16(value, 0) / 32768f;
sampleValueRight = (float)BitConverter.ToInt16(value, 2) / 32768f;
return true;     }
// etc if you need to support other input bit depths
}