2014-02-05 5 views
0

Я записываю голос из приложения Windows на временных интервалах. Я сделал класс, чтобы начать и остановить запись голоса и вызвать его функцию в моей форме.Проблема с аудиозаписью с использованием события, прошедшего с помощью Windows Timer

Класс следующего

class VoiceRecording { 
    [DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
    private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback); 
    public VoiceRecording() { 

    } 

    public void StartRecording() { 
     mciSendString("open new Type waveaudio Alias recsound", "", 0, 0); 
     mciSendString("record recsound", "", 0, 0); 
    } 

    public void StopRecording(int FileNameCounter) { 
     mciSendString(String.Format("save recsound {0}", @"E:\WAVFiles\" + FileNameCounter + ".wav"), "", 0, 0); 
     mciSendString("close recsound ", "", 0, 0); 
     Computer c = new Computer(); 
     c.Audio.Stop(); 
    } 
} 

Теперь, когда я называю эти функции на событии нажатия кнопки, как

int FileNameCounter = 1; 
    private void btnStart_Click(object sender, EventArgs e) { 
     VR = new VoiceRecording(); 
     VR.StartRecording(); 
    } 

    private void btnStop_Click(object sender, EventArgs e) { 
     VR.StopRecording(FileNameCounter++); 
     VR = null; 
    } 

все идет хорошо, независимо от того, насколько медленно или быстро я нажимаю кнопки, то код всегда создает пронумерованные файлы.

Я поставил код в петлю, а как

for (int i = 0; i < 10; i++) { 
    VR = new VoiceRecording(); 
    VR.StartRecording(); 
    VR.StopRecording(FileNameCounter++); 
    VR = null; 
} 

он также хорошо работает и создает 10 пронумерованных файлов.

До сих пор все в порядке, а вот я представил Таймера как этот

System.Timers.Timer t = new System.Timers.Timer(); 
t.Elapsed += new ElapsedEventHandler(TimerEvent); 
t.Interval = 10000; 
t.Start(); 

private bool RecordingStarted = false; 
private void TimerEvent(object sender, ElapsedEventArgs e) { 
    if (RecordingStarted) { 
     VR.StopRecording(FileNameCounter++); 
     VR = null; 
     RecordingStarted = false; 
    } else { 
     VR = new VoiceRecording(); 
     VR.StartRecording(); 
     RecordingStarted = true; 
    } 
} 

Теперь проблема, когда код выполняется внутри TimerEvent, он создает файлы, но также отсутствуют некоторые файлы.

Для примера
цикл создает: 1.wav, 2.wav, 3.wav, 4.wav, 5.wav, 6.wav
Таймер Создает: 1.wav, 2.wav, 4.wav, 7.wav, 8.wav, 13.wav

У меня отладка кода, каждый оператор выполняется каждый раз, но иногда файл не создается.

Любая помощь будет высоко оценен :)

+0

Нет опыта в этом, но в своем классе VoiceRecording вы отправляете сообщения в какой-то базовый объект без проверки успеш- ищет пути получения статуса/извлечения ошибок, где я начинать. –

+1

System.Timers.Timer - сложный класс, создающий всевозможные возможности для неразрушающего отказа. Повторное вмешательство всегда сопряжено с риском, его привычка глотать все исключения особенно затруднительна. Просто не используйте его, вам это не нужно. Вместо этого используйте обычный таймер Winforms. –

ответ

1

По словам Ханса Passant

System.Timers.Timer сложный класс, создавая все виды возможностей для undiagnosable неудачи. Повторное вмешательство всегда сопряжено с риском, его привычка глотать все исключения особенно затруднительна. Просто не используйте его, вам это не нужно. Вместо этого используйте обычный таймер Winforms.

Использование таймера Winforms позволило решить проблему. Теперь пронумерованные файлы создаются так, как я хотел. :)

Спасибо Hans Passant не