Descarregamento A2DP de banda lateral de áudio
Este tópico descreve o descarregamento A2DP de banda lateral de áudio disponível a partir do Windows 11, build 10.0.22000 para Bluetooth.
O principal objetivo do descarregamento A2DP de banda lateral de áudio é reduzir o consumo de energia durante a reprodução de música, por exemplo.
Este documento pressupõe alguma familiaridade com a solução atual de banda lateral HF. Consulte Diretrizes de bypass de Bluetooth para drivers de áudio e as especificações de Bluetooth A2DP mencionadas na seção consulte também deste tópico.
Design de arquitetura de banda lateral
O descarregamento A2DP de banda lateral de áudio baseia-se em designs comprovados para reduzir o consumo de energia durante a reprodução de conteúdo de áudio linear por meio de alto-falantes integrados (internos) ou fones de ouvido analógicos conectados. Em resumo, esses designs disparam grandes quantidades de dados de áudio (na ordem de um segundo) em um DSP de áudio por meio de um driver de áudio específico do fornecedor. Os processadores principais e a maioria dos outros circuitos entram em um estado de baixo consumo de energia enquanto o DSP de áudio transmite os dados de áudio disparados pelos alto-falantes internos. Quando os dados de áudio estão quase esgotados, o DSP gera uma interrupção no driver de áudio que sinaliza ao sistema operacional para disparar mais dados de áudio pelo driver de áudio para o DSP.
Os componentes cinza claro mostrados no diagrama a seguir são fornecidos pelo IHV.
O descarregamento A2DP de banda lateral de áudio também se baseia em um design comum para o caminho de áudio Bluetooth SCO, em que o mesmo DSP de áudio é conectado diretamente ao controlador Bluetooth.
Geralmente, essa conexão é uma interface I2S ou PCM, mas também pode ser um barramento mais rico e complexo, como o SLIMbus. A Microsoft se refere a essa arquitetura como áudio de banda lateral, refletindo o fato de que o áudio é transferido para o controlador Bluetooth (ou outro) por meio de um caminho alternativo em vez da interface de controlador (a "HCI") comum. Nesse caso, o driver de áudio transfere dados de áudio do sistema operacional para o DSP de áudio, que transfere dados pela conexão de banda lateral para o controlador de barramento de hardware, que por sua vez transmite dados de áudio para o dispositivo conectado. (Para áudio bidirecional, também ocorre a direção inversa). Embora haja mais componentes envolvidos, isso pode ter vantagens em relação à interface de controlador comum. Em alguns casos de uso (principalmente chamadas por celular), todo o caminho do sinal de áudio de ponta a ponta fica aos cuidados do firmware, descarregado dos processadores principais. Ele também pode fornecer uma interface melhor para a transferência de dados de áudio em tempo real/isócrona de/para o software host. Para essa conexão de banda lateral, a Microsoft define uma DDI de banda lateral usada pelo driver de áudio para dar suporte a pontos de extremidade de áudio com esse design físico.
Componentes
Driver de áudio IHV (driver DSP de áudio)
Esse driver controla pontos de extremidade de áudio integrados, áudio de celular e banda lateral/descarregamento HFP/SCO. Esse recurso requer que o driver também dê suporte ao descarregamento A2DP. As responsabilidades do driver são iguais às de HFP/SCO.
Controlador e driver de transporte Bluetooth IHV
O descarregamento A2DP não é definido em nenhum padrão Bluetooth SIG. Esse recurso aprimora e adiciona comandos de HCI Bluetooth definidos pela Microsoft. Para dar suporte a esse recurso, o controlador Bluetooth do IHV ou um driver IHV deve dar suporte a esses comandos.
Driver de perfil A2DP
Esse driver é fornecido pelo Windows. Suas funções incluem as seguintes:
- Implementa as especificações A2DP e AVDTP
- Expõe instâncias de interface de dispositivo PnP (a interface de banda lateral A2DP) para o driver de áudio IHV descobrir, abrir e enviar solicitações
- Dá suporte às solicitações IOCTL de banda lateral definidas neste documento
- Envia comandos de HCI Bluetooth definidos pela Microsoft para descarregamento A2DP
Requisito do driver de áudio IHV (driver DSP de áudio)
Se um driver de áudio de um sistema estiver configurado para streaming de banda lateral A2DP, ele deverá publicar uma interface de dispositivo com o GUID de classe definido como GUID_SIDEBANDAUDIO_A2DP_SUPPORT_INTERFACE
{2BC51EE4-07AF-49CF-B04B-FB3F1C26AADC}. Essa interface de dispositivo deve estar presente até a inicialização PnP do driver de áudio.
Estruturas de dados de banda lateral
Algumas constantes e estruturas de dados usadas pelo driver de áudio são definidas no cabeçalho sidebandaudio.h.
As estruturas de dados a seguir são usadas para descarregamento A2DP de banda lateral de áudio.
Descritor do dispositivo — SIDEBANDAUDIO_DEVICE_DESCRIPTOR
Element | Descrição |
---|---|
NumberOfEndpoints | Indica o número de pontos de extremidade em um dispositivo conectado |
O dispositivo conectado pode ser um dispositivo composto que contém vários pontos de extremidade de áudio (alto-falante, microfone etc.). O driver de áudio pode iterar para cada ponto de extremidade e obter mais detalhes para criar filtros KS para cada ponto de extremidade.
Descritor do ponto de extremidade — SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR
O SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR é definido como a seguir.
Element | Descrição |
---|---|
CbSize | Tamanho total do Descritor de ponto de extremidade. Inclui o buffer para armazenamento de cadeias de caracteres. |
ContainerId | GUID para pontos de extremidade. Um GUID comum para vários pontos de extremidade indica que eles estão contidos no mesmo contêiner físico. O sistema operacional pode associar esses pontos de extremidade para diversos cenários facilmente. |
Categoria | KSPIN_DESCRIPTOR. Categoria para indicar o fator forma de cada ponto de extremidade. |
Direção | Indica a direção do fluxo de dados Captura ou Renderização. |
Funcionalidades | (Consulte a tabela abaixo) |
FriendlyName | Nome amigável do ponto de extremidade a ser aplicado a DEVPKEY_DeviceInterface_FriendlyName na interface de filtro KS do ponto de extremidade. |
VolumePropertyValuesSize | Tamanho da estrutura KSPROPERTY_DESCRIPTION que descreve o escalonamento de volume e o intervalo de cada canal. |
SidetoneVolumePropertyValueSize | Tamanho da estrutura KSPROPERTY_DESCRIPTION que descreve o escalonamento de volume e o intervalo de cada canal para Sidetone. |
Descritor do ponto de extremidade — SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR — Recursos
Os recursos são definidos como segue.
Element | Descrição |
---|---|
Volume | O ponto de extremidade dá suporte ao controle Volume |
Mute | O ponto de extremidade dá suporte ao controle Mudo |
Sidetone | O ponto de extremidade dá suporte ao controle Sidetone |
Comentários | O ponto de extremidade tem um canal de feedback associado |
SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR2
A banda lateral A2DP usa uma versão atualizada da estrutura SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR existente para fornecer mais informações de que o sistema de áudio do Windows precisa para a identificação de pontos de extremidade — SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR2.
// Number of device properties that shall be added to the audio filter factory interface.
ULONG FilterInterfacePropertyCount;
DEVPROPERTY* FilterInterfaceProperties;
O driver de áudio obtém essa estrutura de dados usando a nova solicitação IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2. Após a conclusão da solicitação, o driver de áudio adiciona essas propriedades de dispositivo à interface de filtro de áudio Topologia.
Parâmetros da interface de áudio
A escolha e o design do transporte de áudio entre o dispositivo de áudio e o controlador Bluetooth são específicos do fornecedor. Esse transporte de áudio geralmente é uma interface I2S ou PCM, mas também pode ser um barramento mais rico e complexo, como o SLIMbus ou possivelmente SoundWire. Esse design de recurso não impõe requisitos específicos quanto ao transporte de áudio. No entanto, se o codec Bluetooth for implementado no DSP de áudio, o controlador Bluetooth deverá ser capaz de extrair os quadros codificados dos dados transmitidos pelo transporte de áudio para colocar esses quadros em pacotes de mídia AVDTP para transmissão.
A instalação e a configuração (se for o caso) do transporte de áudio são consideradas uma tarefa específica do fornecedor. Isso é facilitado por parâmetros de interface de áudio específicos do fornecedor que são passados entre os componentes nesse recurso. Os parâmetros específicos do fornecedor normalmente são definidos pelo fornecedor do driver de áudio e pelo fornecedor do controlador Bluetooth e/ou do driver de transporte. Os parâmetros são usados pelo dispositivo de áudio e pelo controlador Bluetooth para configurar o transporte de áudio entre o DSP de áudio e o controlador Bluetooth.
Por exemplo, esses dados podem incluir uma ID de transporte se houver várias conexões físicas ou lógicas, configurando o uso de sinais de uma interface PCM, ou o formato dos dados de áudio no transporte.
O driver de áudio define e obtém parâmetros da interface de áudio específicos do fornecedor usando SIOPs, que identificam os dados usando um GUID e um inteiro. Todavia, para manter um conjunto mais natural de comandos de HCI Bluetooth, os comandos de HCI definidos pela Microsoft passam parâmetros da interface de áudio específicos do fornecedor usando a estrutura a seguir.
Parâmetro da interface de áudio
Campo | Octeto |
---|---|
ID do Fornecedor | 0..3 |
ID de parâmetro específico do fornecedor | 4..5 |
Comprimento do valor específico do fornecedor = (n-9) | 6 |
Valor específico do fornecedor | 7.. n |
A definição de um ID de fornecedor pode ser encontrada em Bluetooth Assigned Numbers: https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers.
O driver A2DP executa uma conversão direta entre SIOPs do fornecedor, que são uma estrutura de dados mais natural para o driver de áudio, e um parâmetro da interface de áudio que é mais natural para a HCI Bluetooth. O GUID SIOP do fornecedor é construído a partir de um GUID de base mais o ID de fornecedor Bluetooth de 4 caracteres. Somente o ID do fornecedor (e não todo o GUID) passa pela HCI Bluetooth.
A GUID de base é SIDEBANDAUDIO_PARAMS_SET_A2DP
.
SIOPs A2DP definidos pela Microsoft
A Microsoft define dois SIOPs para A2DP que fornecem informações de codec. Os fornecedores podem definir SIOPs adicionais para dar suporte à sua implementação.
Codecs (codecs-SIOP)
O driver de áudio expressa sua lista de codecs A2DP com suporte (se houver) usando esse SIOP. Os campos SIDEBANDAUDIO_IO_PARAM_HEADER desse SIOP são definidos como segue.
Campo | Valor |
---|---|
ParamsSet | SIDEBANDAUDIO_PARAMS_SET_A2DP ({8FE0297F-3AE6-4384-ACE3-87589E571B9C}) |
TypeId | SIDEBANDAUDIO_PARAM_A2DP_CODECS (1) |
Tamanho | Tamanho total da lista de recursos de codec após esse cabeçalho |
Os dados após esse cabeçalho são uma sequência de estruturas de recursos de codec (de tamanho variável), conforme descrito nas informações de recursos de codec acima.
No restante deste tópico, esse parâmetro é mencionado como codecs-SIOP.
Codec configurado (configured-codec-SIOP)
O driver de áudio pode recuperar o codec A2DP configurado no momento usando esse SIOP. Os campos SIDEBANDAUDIO_IO_PARAM_HEADER desse SIOP são definidos como segue.
Campo | Valor |
---|---|
ParamsSet | SIDEBANDAUDIO_PARAMS_SET_A2DP ({8FE0297F-3AE6-4384-ACE3-87589E571B9C}) |
TypeId | SIDEANDAUDIO_PARAM_A2DP_CONFIGURED_CODEC (2) |
Tamanho | Tamanho total do recurso de codec após esse cabeçalho |
Os dados após esse cabeçalho são uma única estrutura de recursos de codec (de tamanho variável), conforme descrito nas informações de recursos de codec acima.
Esse SIOP é atualizável, o que significa que o driver de áudio deve usar a solicitação IOCTL_SBAUD_GET_SIOP_UPDATE para se manter informado sobre as alterações no codec configurado.
No restante deste tópico, esse parâmetro é mencionado como configured-codec-SIOP.
Modo de latência ativo do codec (codec-latency-mode-SIOP)
O driver de áudio pode recuperar o modo de latência ativo do codec A2DP que está configurado no momento usando esse SIOP. Os campos SIDEBANDAUDIO_IO_PARAM_HEADER desse SIOP são definidos como segue.
Campo | Valor |
---|---|
ParamsSet | SIDEBANDAUDIO_PARAMS_SET_A2DP |
TypeId | SIDEBANDAUDIO_PARAM_A2DP_CODEC_LATENCY_MODE |
Tamanho | 1 byte |
Os dados após esse cabeçalho são um único byte que é interpretado como inteiro de 8 bits sem sinal. O valor SIDEBANDAUDIO_CODEC_MODE_HIGH_QUALITY
indica que o codec configurado no momento está operando no modo de alta qualidade, enquanto o valor SIDEBANDAUDIO_CODEC_MODE_LOW_LATENCY
indica que o codec está operando no modo de baixa latência.
Esse SIOP é atualizável, o que significa que o driver de áudio deve usar a solicitação IOCTL_SBAUD_GET_SIOP_UPDATE para se manter informado sobre as alterações no modo de latência.
No momento, esse SIOP é usado apenas quando o codec aptX Adaptive está ativo. Para obter mais informações sobre o aptX, consulte Qualcomm aptX Adaptive Audio.
No restante deste tópico, esse parâmetro é mencionado como codec-latency-mode-SIOP.
Tamanho de MTU L2CAP do codec (mtu-size-SIOP)
O driver de áudio pode recuperar o tamanho de MTU L2CAP atual (em bytes) usando esse SIOP. Os campos SIDEBANDAUDIO_IO_PARAM_HEADER desse SIOP são definidos como segue.
Campo | Valor |
---|---|
ParamsSet | SIDEBANDAUDIO_PARAMS_SET_A2DP |
TypeId | SIDEBANDAUDIO_PARAM_A2DP_CODEC_MTU_SIZE |
Tamanho | 2 bytes |
Os dados após esse cabeçalho são 2 bytes que são interpretados como inteiro de 16 bits sem sinal. Esse SIOP é atualizável, o que significa que o driver de áudio deve usar a solicitação IOCTL_SBAUD_GET_SIOP_UPDATE para se manter informado sobre as alterações no tamanho de MTU.
No momento, esse SIOP é usado apenas quando o codec aptX Adaptive está ativo. Para obter mais informações sobre o aptX, consulte Qualcomm aptX Adaptive Audio.
No restante deste tópico, esse parâmetro é mencionado como mtu-size-SIOP.
Uso de SIOPs definidos pelo fornecedor
O driver de áudio pode estabelecer SIOPs definidos pelo fornecedor.
SIOPs do fornecedor definidos após a abertura da interface de banda lateral e antes de IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR
O driver A2DP salva os valores de SIOP em uma coleção de SIOPs do fornecedor de configuração do sistema. O driver A2DP envia essa coleção ao controlador Bluetooth (usando HCI_VS_MSFT_Avdtp_Capabilities_Configuration) enquanto processa IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2. Todos os parâmetros da interface de áudio retornados pelo controlador Bluetooth também são armazenados na coleção de SIOPs do fornecedor de configuração do sistema. O driver de áudio pode obter esses valores a qualquer momento após a conclusão de IOCTL.
SIOPs do fornecedor definidos após IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2
O driver A2DP falha em todos os SIOPs enviados pelo driver de áudio após IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2.
SIOPs do fornecedor definidos após IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR e antes de IOCTL_SBAUD_STREAM_OPEN
O driver A2DP salva os valores de SIOP em uma coleção de SIOPs do fornecedor de configuração de fluxo. O driver A2DP envia essa coleção para o controlador Bluetooth (usando HCI_VS_MSFT_Avdtp_Open) enquanto processa IOCTL_SBAUD_STREAM_OPEN. Todos os parâmetros da interface de áudio retornados pelo controlador Bluetooth também são armazenados na coleção de SIOPs do fornecedor de configuração de fluxo. O driver de áudio pode obter esses valores a qualquer momento após a conclusão de IOCTL.
O driver A2DP limpa a coleção de SIOPs do fornecedor de configuração de fluxo ao processar IOCTL_SBAUD_STREAM_CLOSE. (Ele não limpa a coleção de SIOPs do fornecedor de configuração do sistema.)
Interface de banda lateral A2DP
A banda lateral A2DP usa as solicitações IOCTL_SBAUD_* genéricas. Consulte o cabeçalho sidebandaudio.h para obter uma lista completa dos IOCTLs. Esta seção fornece informações específicas do A2DP.
Classe de interface PnP
A classe de interface é GUID_DEVINTERFACE_A2DP_SIDEBAND_AUDIO
para áudio Bluetooth de banda lateral A2DP.
IOCTLs usados para transições de estado de marcador KS
O driver de áudio envia essas solicitações em determinadas transições de estado de marcador KS.
- Na primeira transição acima de KSSTATE_STOP (normalmente para KSSTATE_ACQUIRE), envie IOCTL_SBAUD_STREAM_OPEN.
- Na transição até KSSTATE_RUN, envie IOCTL_SBAUD_STREAM_START.
- Na transição abaixo de KSSTATE_RUN, envie IOCTL_SBAUD_STREAM_SUSPEND.
- No fechamento do marcador KS, envie IOCTL_SBAUD_STREAM_CLOSE.
Extensões de HCI Bluetooth definidas pela Microsoft para descarregamento A2DP
Consulte Extensões de HCI Bluetooth definidas pela Microsoft para obter as extensões que estão definidas no momento.
HCI_VS_MSFT_Read_Supported_Features
O descarregamento A2DP de banda lateral de áudio aprimora o comando HCI_VS_MSFT_Read_Supported_Features definindo outro bit no parâmetro de retorno Supported_features para indicar suporte para comandos de descarregamento AVDTP. Quando esse bit é retornado definido, os comandos restantes nesta seção devem ser suportados.
Para obter uma descrição do comando e dos parâmetros de retorno, consulte HCI_VS_MSFT_Read_Supported_Features.
Para os valores de Supported_features (8 octetos), consulte também HCI_VS_MSFT_Read_Supported_Features. Um valor adicional é usado para indicar que o Controlador dá suporte ao descarregamento AVDTP e aos comandos HCI_VS_MSFT_Avdtp_* descritos em Eventos AVDTP de HCI Bluetooth definidos pela Microsoft.
Extensões de HCI Bluetooth definidas pela Microsoft relacionadas a áudio
A interface de controlador host (HCI) Bluetooth especifica todas as interações entre um host e um controlador de rádio Bluetooth. As especificações de Bluetooth permitem que comandos e eventos de HCI definidos pelo fornecedor habilitem a interação não padronizada entre hosts e controladores. A Microsoft define comandos e eventos de HCI específicos do fornecedor que são consumidos pelo Windows. Os comandos de HCI definidos pela Microsoft listados a seguir são usados para descarregamento de banda lateral de áudio.
Os comandos de HCI AVDTP listados a seguir estão descritos no tópico sobre Bluetooth — Eventos AVDTP de HCI Bluetooth definidos pela Microsoft.
HCI_VS_MSFT_Avdtp_Capabilities_Configuration
Valor do opcode de subcomando: 7
Configura a interface de transporte de áudio e retorna recursos de codec do controlador Bluetooth, que é uma lista de blocos de informações de codec. Cada bloco de informações do codec descreve um codec com suporte. Para obter mais informações, consulte HCI_VS_MSFT_Avdtp_Capabilities_Configuration.
HCI_VS_MSFT_Avdtp_Open
Valor do opcode de subcomando: 8
Aloca e configura recursos de descarregamento AVDTP no controlador. Para obter mais informações, consulte HCI_VS_MSFT_Avdtp__Open.
HCI_VS_MSFT_Avdtp_Start
Valor do opcode de subcomando: 9
Esse comando inicia o streaming de áudio do transporte de áudio para os pacotes de mídia AVDTP transmitidos. Para obter mais informações, consulte HCI_VS_MSFT_Avdtp_Start.
HCI_VS_MSFT_Avdtp_Suspend
Valor do opcode de subcomando: 0xA
Interrompe a atividade de streaming iniciada por HCI_VS_MSFT_Avdtp_Start. Para obter mais informações, consulte HCI_VS_MSFT_Avdtp_Suspend.
HCI_VS_MSFT_Avdtp_Close
Valor do opcode de subcomando: 0xB
Libera os recursos de descarregamento AVDTP alocados por HCI_VS_MSFT_Avdtp_Open. Para obter mais informações, consulte HCI_VS_MSFT_Avdtp_Close.
Codecs Bluetooth no DSP de áudio ou no controlador Bluetooth
A implementação acomoda codecs Bluetooth hospedados no DSP de áudio e/ou no controlador Bluetooth. O codecs-SIOP fornece um mecanismo para o driver de áudio indicar uma lista de codecs com suporte. Da mesma forma, o comando HCI_VS_MS_Avdtp_Capabilities_Configuration permite que o controlador Bluetooth retorne uma lista de codecs suportados. Pelo menos um dos drivers A2DP e o controlador Bluetooth devem retornar uma lista de codecs com suporte.
O driver A2DP não pode cruzar ou mesclar de maneira confiável listas de codecs A2DP suportados pelo driver de áudio e pelo controlador Bluetooth. Se ambos retornarem codecs com suporte para A2DP, Windows usará apenas a lista retornada pelo driver de transporte Bluetooth.
Se a solução IHV exigir interseção ou mesclagem de recursos relacionados ao codec dos recursos do DSP de áudio e do controlador Bluetooth, o driver de áudio poderá indicar seus recursos por meio do codecs-SIOP (se a representação padrão for suficiente) ou de um SIOP de fornecedor. O driver A2DP passa SIOPs para o controlador Bluetooth, que pode cruzar os recursos e retornar o conjunto resultante de codecs com suporte de HCI_VS_MSFT_Avdtp_Capabilities_Configuration.
Confira também
Extensões de HCI Bluetooth definidas pela Microsoft
Diretrizes de bypass Bluetooth para drivers de áudio
Diretrizes de processamento de driver de barramento de transporte para controle de energia Bluetooth