Мое приложение записывает аудио образцы с микрофона, подключенного к моему ПК. Поэтому я выбрал Windows WaveInXXX
API, чтобы сделать работу.
После прочтения документации я решил не использовать механизм обратного вызова с WaveInProc
чтобы избавить меня от хлопот, синхронизирующих потоки. В целом приложение довольно большое, и я подумал, что это упростит отладку. Когда приложение запрашивает блок сэмплов, я просто перебираю свою очередь в буфере, вынимаю одну, копирую данные, готовлю их, подготавливаю и добавляю обратно в очередь буфера. Базовая структура программы выглядит следующим образом, я надеюсь, что она прояснит основной поток программы:
WaveInOpen()
WaveInStart()
FunctionAddingPreparedBuffersToTheQueue()
while(someConditionThatEventuallyBecomesFalse)
if(NextBufferInQueueIsMarkedDone)
GetDataFromBuffer()
UnpreparePrepareHeaderAndAddBuffer()
else
WaitForAShortTime()
WaveInStop()
WaveInClose()
Теперь возникает проблема: через некоторое время (и я не могу воспроизвести точное условие), WaveInAddBuffer()
вызывает тупик, хотя он находится в той же теме, что и все остальные. Подготовлен заголовок для буфера, который должен быть добавлен при возникновении взаимоблокировки. dwFlags == WHDR_PREPARED == 2
,
Есть идеи, что может вызвать этот тупик?
Я не видел такой проблемы, но предположение могло бы быть чем-то вроде фрагментации, связанной со всеми циклами подготовки / подготовки. Они не нужны. Вы можете выполнить подготовку по одному разу для каждого буфера, а затем не подготовить, когда закончите запись. (Подготовка блокирует буфер в физической памяти.)
Других решений пока нет …