2010-12-06 25 views
2

私は誰かがこれを手伝ってくれることを願っています。 SilverlightアプリケーションでXNAを使用してオーディオを録音する例が見つかりました。しかし、それは初めてです。私は、別々のWP7ページにすべてのレコーディング機能を持っており、それがうまく動作しないページを連続して訪問しています。私が知ることができる最高ののは、microphone.startが呼び出されていますが、micophone.statusは停止したままです。変わったのは、BufferReadyが呼び出され続けることです。その関数内のコードはすべて実行されていますが、実際に何も起きていないマイクは実際には起こりません。あなたは、アプリケーションを終了し、再び最初にページにアクセスし、すべてが正常に動作しますが、ページへの再訪問とそれは戻って来ません。Windows Phone 7オーディオ録音の問題

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

更新... 問題は見つかりましたが解決策は見つかりませんでした。私はタイマーのコードを介してmicrophone.stopを呼び出していたので(録音されたオーディオを5秒に制限することができた)手動停止ボタンがクリックされたときに実行するのとまったく同じコード。手動停止ボタンをクリックするとすべて正常に動作し、ページを再訪問しても問題ありません。タイマーのコードで停止が呼び出されたときには、次にページにアクセスしても機能しませんでした。だから私は手動停止ボタンだけで実装しましたが、本当にそれを自動的に(そして本当の問題が何であるかを知るために)うれしく思います。

+1

あなたのしていることを見ることができるようにコードを投稿してください。 –

答えて

0

あなたがページから離れて移動して手動で停止しないと、タイマー/マイクをどのように停止しているかわからない場合があります。

これはそうでない場合は、すべてのマイク操作が同じスレッドで実行されていることを確認していますか? (単なる考えです)

+0

私は、ページから離れて行く前に、マイクを止めてテストしていただけです(録音中に戻るボタンを押したときに忘れた場合)。私はすべてのmicorphone操作がthis.Dispatcher.BeginInvokeと同じスレッド上にあることを確認しようとしましたか、それをやるべきである別の方法がありますか?しかし、同じ問題を抱えて、ボタンをクリックしてコードを呼び出すだけで、コードを初めて呼び出すことができます。 – Jeremy

1

文字列名= System.Threading.Thread.CurrentThread.ManagedThreadId.ToString()を追加して、同じスレッド上にあったことを確認してください。

最後にこれを試してみましたが、問題は、microphone.stopがマイクが(私が予期していたように)バッファレディイベントを発生させ続けるのを止めないことです。ページがキャッシュされているように見えますが、このイベントではまだ奇妙な問題が発生します。だから私はコードを追加しました

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

私のコードを停止すると、すべて今すぐ動作します。

+0

私は同じ問題、録音とページの変更を追加します。そして今私がするとき - イベントで、それは働いている!ありがとう – NicoMinsk

2

あなたが離れページからナビゲートしているとき、実際にあなたが

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

    } 

を追加することができますし、ページに戻ってきている

this.MicroPhone.BufferReady += this.Microphone_BufferReady; 

を追加あなたは、どちらかのページロードイベントでこのステートメントを追加することができますかOnNavigatedToイベント

+0

これをお寄せいただきありがとうございます!私は同じ問題に走っていたが、私はそれを解決知っている:) – Icarus

関連する問題