Проблема записи звука в Windows Phone 7 - PullRequest
2 голосов
/ 07 декабря 2010

Я надеюсь, что кто-то может помочь мне с этим. Я нашел примеры для записи звука с использованием XNA в приложении Silverlight. И это работает, однако, только в первый раз. У меня есть все функции записи на отдельной странице WP7 и при последовательных посещениях страницы это не работает. Лучшее, что я могу сказать, - звонит микрофон. Старт, но микрофон. Статус остается остановленным. Что странно, так это то, что BufferReady продолжает вызываться, и код внутри этой функции все работает, но без запуска микрофона ничего не происходит. Когда вы выходите из приложения и возвращаетесь снова при первом посещении страницы, все работает нормально, но при повторном посещении страницы это не так.

    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 секунд). Точно такой же код для выполнения при нажатии кнопки ручной остановки. При нажатии кнопки ручной остановки все работало нормально, мог повторно посетить страницу и все было бы хорошо. Когда остановка была вызвана в коде из таймера, следующее посещение страницы не будет работать. Так что я реализовал это только с помощью кнопки ручного останова, но было бы неплохо сделать это автоматически (и узнать, в чем реальная проблема).

Ответы [ 3 ]

2 голосов
/ 27 января 2012

на самом деле, когда вы уходите со страницы, вы можете добавить

 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

1 голос
/ 07 декабря 2010

Добавлено имя строки = System.Threading.Thread.CurrentThread.ManagedThreadId.ToString (), чтобы убедиться, что он был в том же потоке (и был).

Но, наконец, это решено, проблема в микрофон. Стоп не мешает микрофону продолжать запускать событие готовности буфера (как я и ожидал). И может показаться, что кэширование страницы вызывает странные проблемы с этим событием, которое все еще срабатывает. Поэтому я добавил код

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

к моему коду для остановки, и теперь все работает.

0 голосов
/ 07 декабря 2010

Я не вижу из вашего кода, как вы останавливаете таймер / микрофон, если вы уходите со страницы и не останавливаете ее вручную.

Если это не так, гарантируете ли вы, что все ваши действия с микрофоном выполняются в одном потоке? (Просто мысль.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...