2010-12-06 4 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(); 
      } 

업데이트 ... 문제점을 발견했지만 해결책이 없습니다. 마이크에 전화를 걸었습니다. 타이머에서 코드를 통해 정지합니다 (녹음 된 오디오를 5 초로 제한 할 수 있음). 수동 중지 버튼을 클릭했을 때 실행되는 똑같은 코드입니다. 수동 중지 버튼을 클릭하면 모든 것이 정상적으로 작동하고 페이지를 다시 방문하면 모든 것이 정상적으로 진행될 수 있습니다. 타이머에서 코드에서 정지가 호출되면 다음에 페이지를 방문하면 작동하지 않습니다. 그래서 수동 중지 버튼만으로 구현했지만 실제로 자동으로 (그리고 실제 문제가 무엇인지 알기 위해) 좋았을 것입니다.

+1

우리가하는 일을 볼 수 있도록 코드를 게시하십시오. –

답변

0

페이지에서 벗어나 수동으로 멈추지 않으면 타이머/마이크를 멈추는 방법을 코드에서 볼 수 없습니다.

그렇지 않은 경우 모든 마이크 작업이 동일한 스레드에서 실행되고 있는지 확인 하시겠습니까? (방금 생각했습니다.)

+0

나는 페이지에서 벗어나기 전에 멈추는 마이크 만 테스트했다. (누군가 녹음 중에 뒤로 버튼을 치는 것을 잊었을 때). 나는 모든 micorphone 작업이 this.Dispatcher.BeginInvoke와 같은 스레드에 있는지 확인하려고 했는가, 아니면 내가해야 할 다른 방법이 있는가? 하지만 같은 문제로 eneded, 버튼을 잘 작동 코드를 호출 처음으로 작동합니다. – 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