News  [SoftwareSite

Latest News
Older News
RSS Feed
 
Complete Projects
Useful Classes
Top Downloads
Message Board
AllAPI.net
 
Send Comments
Software License
Mentalis.org Buttons
Donate
 
Forums -> Miscellaneous Forum
 
difficult bug in WaveFile Stop() method

Reply

by David S [dshiel at yahoo dot com]
posted on 2004/05/30

After a successful call to Play(), a subsequent call to Play() with the same file causes an exception (however, no call stack is available) at the following line:
waveOutReset(Output);

For me, this happens under WinXp but not Win2k.

I can eliminate the error by inserting the following line in the Stop method:
m_Status = MediaStatus.Stopped;

...just before the check of the m_Status member in:
if (m_Status == MediaStatus.Stopped)


However, I would like your help finding the real solution.

------------

Here is my output window text:
before SoundSuccess.Play(). 30may04 DS
after SoundSuccess.Play(). 30may04 DS
before SoundSuccess.Stop(). 30may04 DS
Stop entry. m_Disposed = False 30may04 DS
Stop entry. m_Status = Stopped 30may04 DS
Stop exit. 30may04 DS
after SoundSuccess.Stop(). 30may04 DS
Close entry. m_Disposed = False 30may04 DS
MediaStatus = Stopped 30may04 DS
In Close, before calling mmioClose. 30may04 DS
30may04 DS. calling FreeHGlobal(m_Buffer[0])
30may04 DS. calling FreeHGlobal(m_Buffer[1])
30may04 DS. calling FreeHGlobal(m_Buffer[2])
30may04 DS. calling FreeHGlobal(m_Buffer[3])
30may04 DS. calling FreeHGlobal(m_Buffer[4])
In Close, before calling GC.SuppressFinalize. 30may04 DS
Close exit. 30may04 DS
Close entry. m_Disposed = False 30may04 DS
MediaStatus = Stopped 30may04 DS
In Close, before calling mmioClose. 30may04 DS
30may04 DS. calling FreeHGlobal(m_Buffer[0])
30may04 DS. calling FreeHGlobal(m_Buffer[1])
30may04 DS. calling FreeHGlobal(m_Buffer[2])
30may04 DS. calling FreeHGlobal(m_Buffer[3])
30may04 DS. calling FreeHGlobal(m_Buffer[4])
In Close, before calling GC.SuppressFinalize. 30may04 DS
Close exit. 30may04 DS


before SoundSuccess.Play(). 30may04 DS
after SoundSuccess.Play(). 30may04 DS
before SoundSuccess.Stop(). 30may04 DS
Stop entry. m_Disposed = False 30may04 DS
Stop entry. m_Status = Stopped 30may04 DS
Stop exit. 30may04 DS
after SoundSuccess.Stop(). 30may04 DS
Close entry. m_Disposed = False 30may04 DS
MediaStatus = Stopped 30may04 DS
In Close, before calling mmioClose. 30may04 DS
30may04 DS. calling FreeHGlobal(m_Buffer[0])
30may04 DS. calling FreeHGlobal(m_Buffer[1])
30may04 DS. calling FreeHGlobal(m_Buffer[2])
30may04 DS. calling FreeHGlobal(m_Buffer[3])
30may04 DS. calling FreeHGlobal(m_Buffer[4])
In Close, before calling GC.SuppressFinalize. 30may04 DS
Close exit. 30may04 DS
Close entry. m_Disposed = False 30may04 DS
MediaStatus = Playing 30may04 DS
In Close, before calling Stop. 30may04 DS
Stop entry. m_Disposed = False 30may04 DS
Stop entry. m_Status = Playing 30may04 DS
before waveOutReset(m_Output=2259968) 30may04 DS
An unhandled exception of type 'System.NullReferenceException' occurred in Unknown Module.

Additional information: Object reference not set to an instance of an object.

-----------------------------

Below is my altered method with debug writeline statements inserted, for your reference.


public void Stop()
{
Debug.WriteLine("Stop entry. m_Disposed = " + m_Disposed.ToString() + " 30may04 DS");
if (m_Disposed)
{
Debug.WriteLine("before throw new ObjectDisposedException. 30may04 DS");
throw new ObjectDisposedException(this.GetType().FullName);
}
Debug.WriteLine("Stop entry. m_Status = " + m_Status.ToString() + " 30may04 DS");

//new 30may04 DS testing as part of debugging
m_Status = MediaStatus.Stopped;
//

if (m_Status == MediaStatus.Stopped)
{
Debug.WriteLine("Stop exit. 30may04 DS");
return;
}
m_Stopping = 1;
//
//
//The following line(s) are causing an exception 30may04 DS
//It happens upon any ref to m_Output or Output from this point -- even in the WriteLine statement!
//
Debug.WriteLine("before waveOutReset(m_Output=" + m_Output.ToString() + ") 30may04 DS");
//waveOutReset(Output);
waveOutReset(m_Output);//testing 30may04 DS
Debug.WriteLine("after waveOutReset. 30may04 DS");

for (int i = 0; i < m_Header.Length; i++)
{
Debug.WriteLine("30may04 DS. calling waveOutUnprepareHeader(... m_Header[" + i.ToString() + "])");
waveOutUnprepareHeader(Output, ref m_Header[i], Marshal.SizeOf(m_Header[i]));
}
Debug.WriteLine("before calling waveOutClose 30may04 DS.");
waveOutClose(Output);
Debug.WriteLine("after calling waveOutClose 30may04 DS.");
Position = 0;
m_Status = MediaStatus.Stopped;
Debug.WriteLine("Stop exit. 30may04 DS");
}

 

Copyright © 2002-2007, The Mentalis.org Team. All rights reserved.
This site is located at http://www.mentalis.org/
Send comments to the webmaster.