Delphi: ошибка acmstreamconvert

Я использую acmStreamConvert для преобразования голосового буфера, отправленного через Интернет, и воспроизведения его. Все работало нормально, но есть пользователи, которым стало больно *, голосовой буфер, отправленный через Интернет, конвертируется таким образом.

Procedure WriteBuffer(Buffer: Pointer; SrcBufferUsed: Cardinal; var DestBuffer: Pointer; var DestBufferUsed: Cardinal);
Var rDestBuffer: Cardinal;
Begin
  Move(Buffer^, FACMConverter.InBuffer^, SrcBufferUsed);
  rDestBuffer:= FACMConverter.Convert(SrcBufferUsed);
  DestBuffer := FACMConverter.OutBuffer;
  DestBufferUsed := rDestBuffer;
End;

Function FACMConverter.Convert(SrcBufferUsed: Cardinal): Cardinal;
Begin
  FillChar(FOutBuffer^, OutputBufferSize, 0);
  FStreamHeader.cbSrcLength := SrcBufferUsed;
  acmStreamConvert(FStreamHandle,FStreamHeader, ACM_STREAMCONVERTF_BLOCKALIGN);
  acmStreamReset(FStreamHandle, 0);
  Result := FStreamHeader.cbDstLengthUsed;
End;

В обычном сценарии это работает нормально, но некоторые пользователи редактируют пакеты, используя анализатор пакетов и связываясь с голосовым буфером, когда этот пакет пересылается другим пользователям, приложение начинает генерировать ошибки нарушения доступа и вылетает. Есть ли способ проверить голосовой буфер перед передачей его acmStreamConvert?

PS: когда передается обычный буфер, обычный размер вывода в FStreamHeader.cbDstLengthUsed находится где-то между 7680 и 8340, но когда передается поврежденный буфер, возвращаемое значение является значением максимальной памяти, которую преобразователь может использовать для потока, значения известны после вызова acmStreamConvert, когда уже слишком поздно что-либо делать.

С уважением

1 ответ

Код, который вызывает acmStreamConvert, не может проверить возвращаемое значение. Возвращаемое значение acmStreamConvert указывает, был ли вызов успешным, и если произошел сбой, почему.

Поэтому я подозреваю, что вам нужно изменить код, чтобы проверить возвращаемое значение acmStreamConvert. Если это возвращаемое значение ненулевое, не продолжайте.

Фактически, вы делаете еще один вызов библиотеки ACM в коде вопроса и не проверяете возвращаемое значение. Я предлагаю вам полностью проверить код на предмет отсутствия ошибок. Обратитесь к документации по каждой вызываемой API-функции, чтобы узнать, как обрабатывать ошибки.

Другие вопросы по тегам