Search code examples
c#objectdisposedexception

c# objected disposed exception -how can I correct them?


I am beginner c#. I would like to make program converting from .wav file to .raw file. I found some source and I would like to use it. but something happened in the code. the error is related to ObjectDisposedException.

could you give me a some code or idea for me? the whole code is under

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;

    namespace WaveTestRead
    {
       class WaveReader
       { 
    FileInfo m_fInfo;
    FileStream m_fStream;
    BinaryReader m_binReader;

    // RIFF chunk
    byte[] chunkID;
    UInt32 chunkSize;
    byte[] format;

    // fmt subchunk
    byte[] fmtChunkID;
    UInt32 fmtChunkSize;
    UInt16 audioFormat;
    UInt16 numChannels;
    UInt32 sampleRate;
    UInt32 byteRate;
    UInt16 blockAssign;
    UInt16 BitsPerSample;

    // data subchunk
    byte[] dataChunkID;
    UInt32 dataChunkSize;
    byte[] data8L;              // 8-bit left channel
    byte[] data8R;              // 8-bit right channel
    Int16[] data16L;           // 16-bit left channel
    Int16[] data16R;           // 16-bit right channel
    int numSamples;

    public WaveReader()
    {

    }

    public bool Open(String filename)
    {
        string str;
        m_fInfo = new FileInfo(filename);
        m_fStream = m_fInfo.OpenRead();
        m_binReader = new BinaryReader(m_fStream);

        chunkID = new byte[4];
        format = new byte[4];

        chunkID = m_binReader.ReadBytes(4);
        chunkSize = m_binReader.ReadUInt32();
        format = m_binReader.ReadBytes(4);

        str = System.Text.ASCIIEncoding.ASCII.GetString(chunkID, 0, 4);
        if (str != "RIFF")
            return false;

        str = System.Text.ASCIIEncoding.ASCII.GetString(format, 0, 4);
        if (str != "WAVE")
            return false;

        if (ReadFmt() == false)
            return false;
        if (ReadData() == false)
            return false;

        m_fStream.Close();

        return true;
    }

    private bool ReadFmt()
    {
        fmtChunkID = new byte[4];
        fmtChunkID = m_binReader.ReadBytes(4);

        string str = System.Text.ASCIIEncoding.ASCII.GetString(fmtChunkID, 0, 4);
        if (str != "fmt ")
            return false;

        fmtChunkSize = m_binReader.ReadUInt32();
        audioFormat = m_binReader.ReadUInt16();
        numChannels = m_binReader.ReadUInt16();
        sampleRate = m_binReader.ReadUInt32();
        byteRate = m_binReader.ReadUInt32();
        blockAssign = m_binReader.ReadUInt16();
        BitsPerSample = m_binReader.ReadUInt16();

        return true;
    }
   static void Main(string[] args)
    {
        p.Open("wavetest.wav");
        bool a = p.ReadFmt();
        p.ReadData();
    }
 }
 }

Solution

  • The problem likely exists in Main. The Open method closes the file at the end, and the ReadFmt call in Main reads from m_binReader. Either don't call ReadFmt from your main method after the Open call, or change Open to not close the file when it's done (and make the close explicit).

    It looks like Open is doing all the work for you anyway (by calling ReadFmt and ReadData). You don't need to do it again in Main; just access the data from p.