Использование нейросетей для анализа звуковой информации


Работа со звуком на платформе Windows - часть 2


При открытии устройства и начале записи создается непрерывный процесс, который записывает вводимые звуковые данные в находящиеся в очереди записи блоки памяти. При записи очередного блока он удаляется из очереди и приложение информируется об окончании записи блока. Можно задать несколько способов:  посредством сообщений некоторому окну или процессу, функцией обратного вызова (callback), через объект-событие. Приложение обрабатывает записанный блок и добавляет в очередь новый. При отсутствии блоков в очереди ошибки не выдается, просто теряются поступающие данные, поэтому всегда надо следить, чтобы в очереди был пустой блок. Наиболее простая схема записи без потери данных – запись с двумя блоками.

Проблема синхронизации процессов записи, обработки и визуализации.

В разрабатываемой мной системе осуществляется как обработка и визуализация звука в реальном времени, так и сохранение записываемых данных в файл. В первом случае важна синхронизация процесса обработки сообщений главным окном приложения и процесса записи. Если процесс записи непрерывный, то процесс главного окна помимо сообщений от звукозаписи обрабатывает ещё множество сообщений графического интерфейса Windows (например, перемещение курсора или нажатие кнопок). Во втором случае наоборот важна независимость процесса записи от процесса главного окна, чтобы исключить потерю данных. Очевидно, что использование механизма обработки сообщений о записи блоков главным окном невозможно как в первом, так и во втором случае (что и показал опыт разработки первой версии программы).  В первом случае если время обработки блока аудиоданных будет меньше времени его записи (что вполне возможно в связи со сложностью вычислений и визуализации), то очередь сообщений главного окна очень быстро переполнится и приложение “зависнет”, т.е. перестанет реагировать на действия пользователя. Во втором случае будет происходить потеря данных, т.к. приложение помимо сообщений звукозаписи будет обрабатывать сообщения Windows (например, при перемещении окна обработка очереди сообщений прекращается).

Проблема решается созданием ещё одного процесса, независимого от процесса главного окна. Он обрабатывает сообщения от звукозаписи и может при помощи  механизма синхронизации передавать блоки на для обработки окну приложения.

Применительно к конкретной среде C++ Builder мной создан класс TWaveRecorder, унаследованный от класса TThread, в котором полностью реализуется описанный выше механизм. Схема процессов и взаимодействия между ними изображена на рис. 1

 

Взаимодействие процессов при вводе звука

Рис. 1

Запись начинается сразу после создания экземпляра класса TWaveRecorder. Конструктору передается формат аудиоданных, размер блоков, адрес функции-обработчика записанных блоков и необходимость синхронизации с окном приложения. Завершается запись функцией TWaveRecorder::Stop() или удалением объекта.




- Начало -  - Назад -  - Вперед -