Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Извлекает указатель на следующее доступное пространство в буфере конечной точки отрисовки, в который вызывающий объект может записать пакет данных.
Синтаксис
HRESULT GetBuffer(
[in] UINT32 NumFramesRequested,
[out] BYTE **ppData
);
Параметры
[in] NumFramesRequested
Количество звуковых кадров в пакете данных, которое вызывающий планирует записать в запрошенное пространство в буфере. Если вызов выполнен успешно, размер буферной области, на которую указывает *ppData , соответствует размеру, указанному в NumFramesRequested.
[out] ppData
Указатель на переменную указателя, в которую метод записывает начальный адрес буферной области, в которую вызывающий объект записывает пакет данных.
Возвращаемое значение
Если метод выполнен успешно, он возвращает S_OK. В случае сбоя возможные коды возврата включаются, но не ограничиваются значениями, приведенными в следующей таблице.
| Код возврата | Description |
|---|---|
|
GetBuffer не удалось получить буфер данных и *ppData указывает на NULL. Дополнительные сведения см. в разделе "Примечания". |
|
Значение NumFramesRequested превышает доступное буферное пространство (размер буфера минус размер заполнения). |
|
Поток является монопольным режимом и использует буфер на основе событий, но клиент попытался получить пакет, который не был размером буфера. |
|
Предыдущий вызов IAudioRenderClient::GetBuffer по-прежнему действует. |
|
Устройство конечной точки звука было отключено, или звуковое оборудование или связанные аппаратные ресурсы были перенастроены, отключены, удалены или недоступны для использования. |
|
Ресурсы потока были недействительны. Эта ошибка может возникать по следующим причинам: — поток приостановлен. — Поток эксклюзивной или разгрузки отключен. — Упаковаемое приложение с монопольным режимом или потоком разгрузки. — Поток "защищенных выходных данных" закрыт. |
|
Доступ к буферу невозможен, так как выполняется сброс потока. |
|
Звуковая служба Windows не запущена. |
|
Параметр ppData имеет значение NULL. |
Замечания
Вызывающий объект может запрашивать размер пакета, который меньше или равен объему доступного пространства в буфере (за исключением случаев потока монопольного режима, использующего буферизацию на основе событий; дополнительные сведения см. в разделе IAudioClient::Initialize). Доступное пространство — это просто размер буфера минус объем данных в буфере, который уже помещается в очередь для воспроизведения. Если вызывающий объект задает значение NumFramesRequested , превышающее доступное пространство в буфере, вызов завершается ошибкой и возвращает код ошибки AUDCLNT_E_BUFFER_TOO_LARGE.
Клиент отвечает за запись достаточного объема данных в буфер, чтобы предотвратить сбои в звуковом потоке. Дополнительные сведения о требованиях к буферизации см. в разделе IAudioClient::Initialize.
После получения пакета данных путем вызова GetBuffer клиент заполняет пакет данными отрисовки и выдает пакет звуковому обработчику путем вызова метода IAudioRenderClient::ReleaseBuffer .
Клиент должен вызвать ReleaseBuffer после вызова GetBuffer, который успешно получает пакет любого размера, отличного от 0. Клиент может вызывать или не вызывать ReleaseBuffer для выпуска пакета размером 0.
Для размеров пакетов, отличных от нуля, клиент должен использовать альтернативные вызовы GetBuffer и ReleaseBuffer. За каждым вызовом GetBuffer должно следовать соответствующий вызов ReleaseBuffer . После вызова GetBuffer для получения пакета данных клиент не может получить следующий пакет данных, пока он не вызовет ReleaseBuffer , чтобы освободить предыдущий пакет. Два или более последовательных вызовов GetBuffer или ReleaseBuffer не разрешены и завершаются ошибкой с кодом ошибки AUDCLNT_E_OUT_OF_ORDER.
Чтобы обеспечить правильное упорядочение вызовов, вызов GetBuffer и соответствующий вызов ReleaseBuffer должны выполняться в одном потоке.
Размер звукового кадра определяется элементом nBlockAlign структуры WAVEFORMATEX , которую клиент получает путем вызова метода IAudioClient::GetMixFormat .
Если вызывающий объект задает NumFramesRequested = 0, метод возвращает код состояния S_OK, но не записывает в переменную, на которую указывает параметр ppData .
Клиенты должны избегать чрезмерных задержек между вызовом GetBuffer , который получает буфер и вызов ReleaseBuffer , который освобождает буфер. Реализация звукового модуля предполагает, что вызов GetBuffer и соответствующий вызов ReleaseBuffer происходят в течение одного периода обработки буфера. Клиенты, которые задерживают освобождение буфера в течение нескольких периодов, рискуют потерять образец данных.
В Windows 7 GetBuffer может вернуть код ошибки AUDCLNT_E_BUFFER_ERROR для звукового клиента, использующего буфер конечной точки в монопольном режиме. Эта ошибка указывает, что буфер данных не был получен, так как пакет данных недоступен (*ppData получил ЗНАЧЕНИЕ NULL).
Если GetBuffer возвращает AUDCLNT_E_BUFFER_ERROR, поток, используюющий звуковые образцы, должен ожидать следующего прохождения обработки. Клиент может воспользоваться сохранением количества неудачных вызовов GetBuffer . Если GetBuffer повторно возвращает эту ошибку, клиент может запустить новый цикл обработки после завершения работы текущего клиента, вызвав IAudioClient::Stop, IAudioClient::Reset и выпуская звуковой клиент.
Примеры
Примеры кода, вызывающие метод GetBuffer , см. в следующих разделах:
Требования
| Требование | Ценность |
|---|---|
| Минимальный поддерживаемый клиент | Windows Vista [классические приложения | Приложения UWP] |
| минимальный поддерживаемый сервер | Windows Server 2008 [классические приложения | Приложения UWP] |
| целевая платформа | Windows |
| Header | audioclient.h |