davidhq
davidhq

Reputation: 4760

AxWindowsMediaPlayer Clip Will Sometimes Not Play

I have a simple one-threaded windows forms .NET 4.5 app where user listens to spoken words (wav files) and then selects the correct picture that represents the word.

The problem is that the clip will sometimes (very rarely - about 1% of the time and completelly at random) not play...

This is the method for playing clips:

    public static void PlayWordAudio(Word word, AxWMPLib.AxWindowsMediaPlayer player)
    {
        string tempFile = Path.GetTempFileName() + ".wav";

        MemoryStream stream = new MemoryStream(word.Audio);

        using (Stream fileStream = File.OpenWrite(tempFile))
        {
            stream.WriteTo(fileStream);
        }

        player.URL = tempFile;

        File.Delete(tempFile);
    }

Can someone please suggest a solution to this problem? Maybe I shouldn't delete the file at the end of the method? But then temp files would pile up...

I am on Windows 7...

Upvotes: 1

Views: 1167

Answers (2)

davidhq
davidhq

Reputation: 4760

It seems that I solved the problem... it was in fact the deletion of file that caused this...

solution:

public static void PlayWordAudio(Word word, AxWMPLib.AxWindowsMediaPlayer player)
    {
        string tempFile = Path.GetTempFileName() + ".wav";

        MemoryStream stream = new MemoryStream(word.Audio);

        using (Stream fileStream = File.OpenWrite(tempFile))
        {
            stream.WriteTo(fileStream);
        }

        player.URL = tempFile;

        RunDelayed(5000, File.Delete, tempFile); //if we delete file immediately then clip sometimes would not be played
    }        

    public delegate void DelayedFuncion(string param);

    public static void RunDelayed(int delay, DelayedFuncion function, string param = null)
    {
        System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();

        DelayedArgs args = new DelayedArgs() { delayedFunction = function, param = param };
        timer.Tag = args;
        timer.Tick += TimerElapsed;            
        timer.Interval = delay;

        timer.Start();
    }

    private static void TimerElapsed(object sender, EventArgs e)
    {
        System.Windows.Forms.Timer timer = sender as System.Windows.Forms.Timer;
        timer.Stop();
        DelayedArgs args = timer.Tag as DelayedArgs;
        args.delayedFunction(args.param);
    }


    class DelayedArgs
{
    public Util.DelayedFuncion delayedFunction;
    public string param;
}

Upvotes: 0

rene
rene

Reputation: 42444

I guess the file is being deleted quicker than it can get played.

Can you try this in stead of File.Delete(tempFile); utilizing the PlayStateChange event

player.PlayStateChange += (snd, psce) => {
     switch (psce.newState)
    {
        case 1:    // Stopped (maybe use 12 =>  Last )
            File.Delete(tempFile);
            break;
        default:
            Debug.WriteLine(psce.newState);
            break;
    }
};

You might have to unsubscribe the event if you keep the player object around a long time.

Upvotes: 1

Related Questions