2010-12-06 5 views
2

J'espère que quelqu'un pourra m'aider avec ça. J'ai trouvé les exemples d'enregistrement audio en utilisant XNA dans une application Silverlight. Et cela fonctionne, cependant, seulement la première fois. J'ai toutes les fonctionnalités d'enregistrement sur une page WP7 séparée et avec des visites successives à la page cela ne fonctionne pas. Le mieux que je puisse dire, c'est que le micro.start est appelé mais le micophone.status reste arrêté. Ce qui est bizarre, c'est que le BufferReady continue d'être appelé et que le code de cette fonction est en cours d'exécution mais sans le micro, rien ne se passe réellement. Lorsque vous quittez l'application et revenez à nouveau la première fois à la page et tout fonctionne bien, mais une nouvelle visite à la page et il ne fonctionne pas.Windows Phone 7 Enregistrement audio Problème

void microphone_BufferReady(object sender, EventArgs e) 
      { 
       this.Dispatcher.BeginInvoke(() => 
       { 
        microphone.GetData(buffer); 

        stream.Write(buffer, 0, buffer.Length); 

        TimeSpan tsTemp = timer.Elapsed; 
        TextBlockSeconds.Text = tsTemp.Hours.ToString().PadLeft(2, '0') + ":" + tsTemp.Minutes.ToString().PadLeft(2, '0') + ":" + tsTemp.Seconds.ToString().PadLeft(2, '0'); 

    if(timer.Elapsed.Seconds >5) 
    DoStop(); 

       }); 
      } 

      private void ButtonRecord_Click(object sender, RoutedEventArgs e) 
      { 
       DisableRecordButton(); 

       timer = new Stopwatch(); 
       timer.Start(); 

       stream = new MemoryStream(); 

       TextBlockSeconds.Text = "00:00:00"; 
       TextBlockStatus.Text = "Recording: "; 

       microphone.BufferDuration = TimeSpan.FromMilliseconds(500); 
       buffer = new byte[microphone.GetSampleSizeInBytes(microphone.BufferDuration)]; 

       microphone.BufferReady += new EventHandler<EventArgs>(microphone_BufferReady); 

       microphone.Start(); 
      } 

    private void DoStop() 
      { 

if (timer.IsRunning) 
       timer.Stop(); 

      if (microphone.State == MicrophoneState.Started) 
      { 
       microphone.Stop(); 
       TextBlockStatus.Text = "Stopped: Ready to save"; 
      } 
      else 
      { 
       TextBlockStatus.Text = "Ready: "; 
      } 

      TextBlockSeconds.Text = string.Empty; 

      EnableRecordButton(); 
      } 

Mise à jour ... j'ai trouvé le problème, mais pas de solution. J'appelais le microphone.stop via le code sur une minuterie (donc je pourrais limiter l'audio enregistré à 5 secondes). Exactement le même code à exécuter quand un bouton d'arrêt manuel serait cliqué. En cliquant sur le bouton d'arrêt manuel, tout a bien fonctionné, peut-être re-visiter la page et tout irait bien. Lorsque l'arrêt a été appelé dans le code de la minuterie, la prochaine visite de la page ne fonctionnerait pas. Donc je l'ai implémenté avec seulement un bouton d'arrêt manuel mais j'aurais vraiment aimé le faire automatiquement (et savoir quel était le vrai problème).

+1

veuillez poster votre code afin que nous puissions voir ce que vous faites. –

Répondre

0

Je ne vois pas d'après votre code comment vous arrêtez le minuteur/microphone si vous vous éloignez de la page et ne l'arrêtez pas manuellement.

Si ce n'est pas le cas, assurez-vous que toutes vos opérations de microphone sont exécutées sur le même thread? (Juste une pensée.)

+0

J'avais seulement testé avec le microphone étant arrêté avant de naviguer loin de la page (j'ai oublié d'inclure quand quelqu'un pourrait appuyer sur le bouton arrière pendant l'enregistrement). J'ai essayé de m'assurer que toutes les opérations de micorphone sont sur le même fil avec this.Dispatcher.BeginInvoke ou est-ce qu'il y a une autre manière que je devrais faire cela? Mais entamé avec le même problème, cliquez sur le bouton fonctionne bien, appeler le code fonctionne la première fois seulement. – Jeremy

1

Chaîne ajoutée name = System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() pour s'assurer qu'il était sur le même thread (et il l'était).

Mais finalement travaillé, le problème est le microphone.stop n'arrête pas le microphone de continuer à déclencher l'événement prêt à l'emploi (comme je m'y attendais). Et il semblerait que la façon dont la page est mise en cache provoque des problèmes étranges avec cet événement qui continue de se déclencher. J'ai donc ajouté le code

microphone.BufferReady -= new EventHandler<EventArgs>(microphone_BufferReady); 

à mon code pour l'arrêt, et tout fonctionne maintenant.

+0

J'ajoute le même problème, en enregistrant et en changeant de page. et maintenant quand je fais - = sur l'événement, ça marche! merci – NicoMinsk

2

fait lorsque vous naviguez loin de la page que vous pouvez ajouter

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) 
    { 
     base.OnNavigatedFrom(e); 
     this.MicroPhone.BufferReady -= this.Microphone_BufferReady; 

    } 

et quand vous retournez à la page ajouter

this.MicroPhone.BufferReady += this.Microphone_BufferReady; 

Vous pouvez ajouter cette déclaration soit dans un événement chargé de page ou un événement OnNavigatedTo

+0

Merci pour le partage! Je courais sur le même problème, mais sachez que je l'ai résolu :) – Icarus