2010-12-06 123 views
2

我希望有人能帮助我解决这个问题。我已经找到了在Silverlight应用程序中使用XNA录制音频的例子。然而,它只能在第一次使用。我将所有录制功能放在单独的WP7页面上,并且连续访问该页面不起作用。我能告诉的最好的是麦克风。开始播放,但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

请发布您的代码,以便我们可以看到您在做什么。 – 2010-12-06 22:54:29

回答

0

我无法从您的代码中看到,如果您离开页面并且不要手动停止它,您将如何停止计时器/麦克风。

如果不是这样,你是否确保所有的麦克风操作都在同一个线程上执行? (只是一个想法。)

+0

我只是在导航离开页面之前一直进行麦克风停止测试(当有人在录制过程中可能会碰到后退按钮时,忘记加入)。我试图确保所有的micorphone操作都与这个.Dispatcher.BeginInvoke在同一个线程上,或者有另一种方式我应该这样做?但同样的问题,单击按钮正常工作,调用代码只能在第一次工作。 – Jeremy 2010-12-07 16:58:40

1

添加字符串名称= System.Threading.Thread.CurrentThread.ManagedThreadId.ToString(),以确保它在同一个线程(和它是)。

但终于解决了这个问题,问题是麦克风。停止不停止麦克风继续触发缓冲区就绪事件(就像我期待的那样)。看起来页面被缓存的方式会导致一些奇怪的问题发生。所以我添加了代码

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

我的代码停止,现在所有的工作。

+0

我添加相同的问题,记录和更改页面。现在当我做 - =事件时,它正在工作!谢谢 – NicoMinsk 2012-04-10 15:13:28

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 2012-12-31 00:05:38