2013-03-18 1 views
1

J'ai une simple application Windows Forms à un seul thread .NET 4.5 où l'utilisateur écoute les mots parlés (fichiers wav), puis sélectionne l'image correcte qui représente le mot.Le clip AxWindowsMediaPlayer ne joue parfois pas

Le problème est que le clip sera parfois (très rarement - environ 1% du temps et completelly au hasard) ne joue pas ...

C'est la méthode des clips jouant:

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); 
    } 

Quelqu'un peut-il s'il vous plaît suggérer une solution à ce problème? Peut-être que je ne devrais pas supprimer le fichier à la fin de la méthode? Mais les fichiers temporaires s'entasser ...

Je suis sous Windows 7 ...

+0

Vous devrez poster une partie du code vous utilisez afin que nous puissions vous aider. – fmendez

Répondre

0

Il semble que je résolu le problème ... il était en fait la suppression du fichier qui a provoqué cette ...

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; 
} 
1

Je suppose que le fichier est en cours de suppression plus rapide que cela peut se jouer.

Pouvez-vous essayer au lieu de File.Delete(tempFile); utilisant l'événement PlayStateChange

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

Vous pourriez avoir à vous désabonner de l'événement si vous gardez l'objet joueur autour depuis longtemps.

+0

J'ai essayé votre solution mais j'ai obtenu ceci: L'accès au chemin 'C: \\ Utilisateurs \\ David \\ AppData \\ Local \\ Temp \\ tmp5F17.tmp.wav' est refusé. sur la ligne File.Delete ... pas sûr pourquoi .. peut-être le fichier est toujours joué et donc pas libéré. Si j'utilise 12 au lieu de 1 les fichiers ne sont pas supprimés ... ma solution ci-dessous fonctionne donc je vais juste l'utiliser. Merci quand même - je ne pensais pas à cette possibilité - il serait peut-être possible de le faire fonctionner .. – davidhq