Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo fornece uma visão geral do Bluetooth LE Audio introduzido no Windows 11 versão 22H2 (KB5026446).
Introdução
O Bluetooth LE Audio permite transmitir áudio unicast ou de difusão para dispositivos Bluetooth LE por meio de um transporte isócrono. A partir da versão 5.3 da especificação principal do Bluetooth, não há uma HCI (interface do controlador de host) definida padrão para que as plataformas host enviem e recebam dados isocronos de e para o controlador Bluetooth. Este documento define o VSAP (caminho de áudio específico) do fornecedor bluetooth do Windows para permitir que as plataformas usem soluções específicas do fornecedor para habilitar o streaming de áudio Bluetooth LE. A interface de software VSAP usa as extensões de classe de áudio (ACX) do Windows e mais propriedades de interface definidas neste documento.
Terminologia e pré-requisitos
Além dos termos definidos nesta tabela, este documento também faz referência aos termos definidos pelas extensões de classe de áudio do Windows.
| Prazo | Definição |
|---|---|
| Áudio LE | Abreviação de Bluetooth LE Audio |
| Áudio clássico | Streaming de áudio Bluetooth que usa o HFP (perfil de mãos livres) e o perfil de distribuição de áudio avançado (A2DP) |
| Dispositivo de áudio | Um único dispositivo remoto Bluetooth LE Audio ou um conjunto de dispositivos Bluetooth LE Audio que, juntos, compõem um único ponto de extremidade de áudio na perspectiva do Windows. |
| BAP | O Perfil de Áudio Básico define como os dispositivos podem distribuir e consumir áudio usando comunicações de LE (Bluetooth Low Energy). |
| TMAP | O Perfil de Áudio de Mídia e Telefonia especifica configurações interoperáveis dos serviços e perfis de áudio de nível inferior. |
| ASCS | O Serviço de Controle de Fluxo de Áudio define uma maneira padrão para dispositivos Bluetooth LE Audio configurarem e estabelecerem fluxos de áudio unicast. |
| Sistema de Arquivamento e Comunicação de Imagens (PACS) | O Serviço de Recursos de Áudio Publicado define uma maneira padrão para dispositivos Bluetooth LE Audio relatarem seus recursos de codec de áudio com suporte. |
| CIS | O transporte de Fluxos Isocronos Conectados é usado para enviar e receber dados de áudio unicast entre dispositivos BLUETOOTH LE. |
| BIS | O transporte de fluxo isocrono de difusão é usado para transferências de dados de áudio sem conexão. |
| ACX | Abreviação de extensões de classe de áudio, que é o modelo de driver exigido por todos os drivers de áudio para dar suporte ao Bluetooth LE Audio no Windows. |
| Circuitos de streaming | Um ou mais objetos ACXCIRCUIT criados pela Pilha de Drivers de Áudio Específicos do Fornecedor para seu caminho de transmissão. |
| Circuito de perfil | Um objeto ACXCIRCUIT criado pela implementação do perfil de áudio BLUETOOTH LE no Windows. Este ACXCIRCUIT não é um circuito de streaming. |
Este artigo pressupõe familiaridade com os termos definidos anteriormente e os seguintes comandos HCI definidos na especificação do Bluetooth Core:
- Comandos do controlador local
- HCI_Read_Local_Supported_Codecs (v2)
- HCI_Read_Local_Supported_Codec_Capabilities
- HCI_LE_Setup_ISO_Data_Path
- HCI_LE_Remove_ISO_Data_Path
- Configurar_Caminho_de_Dados_HCI
- Comandos de streaming Unicast
- HCI_LE_Set_CIG_Parameters
- HCI_LE_Create_CIS
- HCI_LE_Remove_CIG
- Comandos de streaming de transmissão
- HCI_LE_Create_BIG
- HCI_LE_Terminate_BIG
- HCI_LE_BIG_Create_Sync
- HCI_LE_BIG_Terminate_Sync
- HCI_LE_Set_Periodic_Advertising_Parameters
- HCI_LE_Set_Periodic_Advertising_Data
- HCI_LE_Set_Periodic_Advertising_Enable
- HCI_LE_Periodic_Advertising_Create_Sync
- HCI_LE_Periodic_Advertising_Create_Sync_Cancel
- HCI_LE_Periodic_Advertising_Terminate_Sync
- HCI_LE_Set_Periodic_Advertising_Receive_Enable
- HCI_LE_Periodic_Advertising_Report
- HCI_LE_BIGInfo_Advertising_Report
- HCI_LE_Read_Periodic_Advertiser_List_Size
- HCI_LE_Add_Device_To_Periodic_Advertiser_List
- HCI_LE_Remove_Device_From_Periodic_Advertiser_List
- HCI_LE_Clear_Periodic_Advertiser_List
- HCI_LE_Periodic_Advertising_Set_Info_Transfer
- HCI_LE_Periodic_Advertising_Sync_Transfer
- HCI_LE_Set_Default_Periodic_Advertising_Sync_Transfer_Parameters
- HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters
O VSAP de áudio Bluetooth LE requer que os drivers de áudio usem o framework ACX. A adoção do ACX para Bluetooth LE Audio oferece várias vantagens, como:
- Dá suporte ao modelo de driver de áudio preferencial para Windows daqui para frente.
- Usa o suporte nativo do ACX para soluções de áudio de multicamadas sem exigir uma DDI dedicada entre controladores.
- Não requer drivers de áudio IHV para retransmitir solicitações do sistema de áudio para a pilha Bluetooth. Em vez disso, o ACX pode enviar solicitações diretamente para a pilha Bluetooth por meio do circuito de perfil.
Arquitetura
Definições
Os componentes a seguir estão envolvidos nas diferentes variantes de arquitetura do VSAP.
Estrutura ACX do Windows
Esse componente habilita o suporte para um ponto de extremidade de áudio multi-camadas. Para o Áudio LE Bluetooth, os componentes de software que compõem um ponto de extremidade de áudio são a pilha de driver de áudio específica do fornecedor e o perfil de Áudio LE Bluetooth do Windows.
Pilha de drivers de áudio específica para fornecedor
Esse componente específico do fornecedor é responsável por enviar e receber dados bluetooth LE Audio de e para um controlador Bluetooth por meio de uma interface de áudio definida pelo fornecedor. Ele deve consistir, no mínimo, em um driver de streaming ACX para gerenciar os dados de áudio de entrada e saída. Mais drivers ACX poderão ser incluídos se forem partes necessárias do ponto de extremidade de áudio ACX de vários circuitos. Esse componente também é conhecido como o driver de streaming do ACX IHV neste documento.
Perfil de Áudio Bluetooth LE do Windows
Esse componente contém a implementação do perfil de áudio básico (BAP), perfil de controle de volume e perfil de controle de microfone. Ele é responsável por criar o controle ACXCIRCUIT para cada dispositivo Bluetooth LE Audio ou conjunto de dispositivos emparelhados com o Windows. Ele também relata formatos de áudio do dispositivo remoto e do controlador Bluetooth e gerencia o estado de canais e grupos isocronos.
Pilha principal de Bluetooth do Windows
Esse componente fornece uma interface para permitir que o Perfil de Áudio LE bluetooth do Windows consulte os recursos de codec com suporte do controlador Bluetooth local e gerencie o estado de canais e grupos isocronos.
Codec LC3
Esse subcomponente se traduz entre áudio LC3 compactado e áudio PCM. Ele deve dar suporte a recursos de codificação e decodificação. O codec LC3 pode ser implementado no software como parte da pilha do VSAP (driver de áudio) específico do fornecedor. Como alternativa, ele pode ser implementado em hardware como parte do DSP de áudio ou controlador Bluetooth. O diagrama menciona LC3 pelo nome, pois é o codec padrão compatível com o SIG Bluetooth. Codecs futuros e codecs específicos do fornecedor compatíveis com o Windows também podem ser incorporados à arquitetura de maneira semelhante.
Variantes de arquitetura
A arquitetura VSAP de áudio Bluetooth LE dá suporte a diferentes variantes para streaming.
- Sideband Bluetooth LE Áudio streaming sem descarregamento de áudio
- Sideband Bluetooth LE Áudio streaming com descarregamento de áudio
- Streaming de áudio inband Bluetooth LE específico do fornecedor
Nos diagramas a seguir, os componentes sombreados são fornecidos pelo IHV e os componentes sem sombra são fornecidos pelo sistema operacional.
Arquitetura de áudio DE LE bluetooth de sideband sem descarregamento de áudio
Uma arquitetura de sideband usa uma interface de áudio específica do fabricante, permitindo que a pilha de drivers de áudio envie e receba dados de áudio para o controlador Bluetooth. Esse caminho de dados é separado do caminho de dados HCI usado para outros dados Bluetooth, como mensagens de sinalização entre o cliente unicast e o servidor unicast remoto. O diagrama a seguir modela uma arquitetura de sideband em que o codec LC3 está hospedado no controlador Bluetooth. Também é válido ter o codec LC3 hospedado como parte da Pilha de Drivers de Áudio Específica do Fornecedor para codificação e decodificação por software. Nesse caso, o áudio enviado para o controlador Bluetooth seria formatado como quadros de áudio LC3 em vez de áudio PCM.
O diagrama a seguir mostra uma arquitetura de áudio Bluetooth LE de banda lateral com um codec LC3 no controlador Bluetooth.
O diagrama a seguir mostra uma arquitetura de Bluetooth LE Audio de banda lateral, com um codec LC3 na pilha do driver de áudio.
Arquitetura de áudio Bluetooth LE de banda lateral com offload de áudio
Uma arquitetura de banda lateral com deslocamento de áudio inclui um componente de hardware DSP de áudio para fornecer uma solução Bluetooth LE para streaming de áudio com benefícios em termos de economia de energia. Os diagramas a seguir demonstram uma possível arquitetura com o codec LC3 no controlador Bluetooth e o codec no DSP de áudio.
O diagrama a seguir mostra um Bluetooth LE Audio sideband com arquitetura de descarregamento de áudio e um codec LC3 no controlador Bluetooth.
O diagrama a seguir mostra uma banda lateral Bluetooth LE Audio com arquitetura de offload de áudio, utilizando um codec LC3 no DSP de áudio.
Arquitetura de Áudio Bluetooth LE em Banda Específica do Fornecedor
A arquitetura inband do VSAP permite que um pipeline personalizado envie e receba dados de Bluetooth LE Audio da pilha de driver de áudio específica do fornecedor para o HCI do controlador Bluetooth. Essa arquitetura inclui um novo componente, o "Componente de mesclagem ISO do IHV". Esse componente é responsável por gerenciar o controle de fluxo para os dados ISO. Ele também compartilhará o controle de fluxo de comando HCI com o Windows Bluetooth Core Stack se precisar enviar comandos HCI.
O diagrama a seguir mostra uma arquitetura de áudio Bluetooth LE de banda de entrada específica do fornecedor.
Design detalhado
Requisitos de formato de áudio
KSAUDIO_PACKETSIZE_CONSTRAINTS2
Drivers de áudio ACX IHV são necessários para dar suporte à propriedade KSAUDIO_PACKETSIZE_CONSTRAINTS2. O suporte a essa propriedade reduz o tempo entre adicionar um dispositivo de áudio BLUETOOTH LE ao Windows e o dispositivo de áudio ficar disponível para aplicativos para streaming.
Durações do quadro de áudio
Perfis de áudio Bluetooth LE permitem que implementações ofereçam suporte ao streaming de áudio com durações de quadro de 7,5 milissegundos ou 10 milissegundos. O Windows requer codecs fornecidos por IHVs para dar suporte a ambas as durações de quadro. Esse requisito garante a interoperabilidade com dispositivos acessórios Bluetooth LE Audio e coexistência de qualidade com outros dispositivos Bluetooth LE conectados ao sistema.
Definições do modo de processamento de sinal
O Bluetooth LE Audio dá suporte a uma ampla gama de formatos de streaming para dar suporte a diferentes cenários de usuário. As especificações BAP e TMAP definem formatos com suporte obrigatório para certificação. O Windows aplica modos de processamento de sinal de áudio para correlacionar o formato a ser usado com o cenário que o sistema está executando. Os drivers de áudio que dão suporte ao Bluetooth LE Audio devem indicar suporte para os modos e formatos de processamento de sinal na tabela a seguir. Além disso, o Bluetooth LE Audio não dá suporte ao modo de processamento de sinal bruto, portanto, os drivers de áudio não devem anunciar nenhum formato com suporte para esse modo.
Formatos de áudio de fluxo de renderização unicast e modos de processamento de sinal
O Bluetooth LE Audio requer que os formatos de áudio de renderização unicast sejam declarados para os seguintes modos de processamento de sinal:
- Padrão (AUDIO_SIGNALPROCESSINGMODE_DEFAULT)
- Esse modo é usado para cenários de renderização unidirecional, como reprodução de música, notificações e áudio de videogame.
- Comunicações (AUDIO_SIGNALPROCESSINGMODE_COMMUNICATIONS)
- Esse modo é usado para cenários bidirecionais, como chamadas de voz.
As tabelas a seguir são listas de formatos simétricos para cada caso de uso e modo de processamento de sinal. O suporte ao formato assimétrico é definido no estéreo super wideband para cenários de voz.
Os formatos de áudio são ordenados dos mais preferenciais aos menos preferenciais.
Sons do sistema, reprodução de música e áudio de videogame quando conectado a um dispositivo estéreo ou conjunto coordenado de dispositivos
Modo de processamento de sinal: padrão
| Frequência de amostragem | Contagem de canais | Profundidade do bit | Duração do quadro | Taxa de Dados de Áudio | ID de Configuração de Codec BAP (Tabela 3.11 da Especificação BAP) |
|---|---|---|---|---|---|
| 48 kHz | 2 | 16 | 7,5 ms | 96 kbps | 48_3 |
| 48 kHz | 2 | 16 | 7,5 ms | 80 kbps | 48_1 |
| 48 kHz | 2 | 16 | 10 ms | 96 kbps | 48_4 |
| 48 kHz | 2 | 16 | 10 ms | 80 kbps | 48_2 |
| 32 kHz | 2 | 16 | 7,5 ms | 64 kbps | 32_1 |
| 32 kHz | 2 | 16 | 10 ms | 64 kbps | 32_2 |
| 24 kHz | 2 | 16 | 7,5 ms | 48 kbps | 24_1 |
| 24 kHz | 2 | 16 | 10 ms | 48 kbps | 24_2 |
Sons do sistema, reprodução de música e áudio de videogame quando conectado a um único membro de um conjunto coordenado (earbud único ou aparelho auditivo)
Modo de processamento de sinal: padrão
| Frequência de amostragem | Contagem de canais | Profundidade do bit | Duração do quadro | Taxa de Dados de Áudio | ID de Configuração de Codec BAP (Tabela 3.11 da Especificação BAP) |
|---|---|---|---|---|---|
| 48 kHz | 1 | 16 | 7,5 ms | 96 kbps | 48_3 |
| 48 kHz | 1 | 16 | 7,5 ms | 80 kbps | 48_1 |
| 48 kHz | 1 | 16 | 10 ms | 96 kbps | 48_4 |
| 48 kHz | 1 | 16 | 10 ms | 80 kbps | 48_2 |
| 32 kHz | 1 | 16 | 7,5 ms | 64 kbps | 32_1 |
| 32 kHz | 1 | 16 | 10ms | 64 kbps | 32_2 |
| 24 kHz | 1 | 16 | 7,5 ms | 48 kbps | 24_1 |
| 24 kHz | 1 | 16 | 10 ms | 48 kbps | 24_2 |
| 16 kHz | 1 | 16 | 7,5 ms | 32 kbps | 16_1 |
| 16 kHz | 1 | 16 | 10 ms | 32 kbps | 16_2 |
Renderizar gravador de voz, chamadas VoIP ou áudio de jogos eletrônicos com chat por voz
Modo de processamento de sinal: comunicações
| Frequência de amostragem | Contagem de canais | Profundidade do bit | Duração do quadro | Taxa de Dados de Áudio | ID de Configuração de Codec BAP (Tabela 3.11 da Especificação BAP) |
|---|---|---|---|---|---|
| 32 kHz | 1 | 16 | 7,5 ms | 64 kbps | 32_1 |
| 32 kHz | 1 | 16 | 10 ms | 64 kbps | 32_2 |
| 24 kHz | 1 | 16 | 7,5 ms | 48 kbps | 24_1 |
| 24 kHz | 1 | 16 | 10 ms | 48 kbps | 24_2 |
| 16 kHz | 1 | 16 | 7,5 ms | 32 kbps | 16_1 |
| 16 kHz | 1 | 16 | 10 ms | 32 kbps | 16_2 |
Formatos de áudio de fluxo de captura unicast e modos de processamento de sinal
O Bluetooth LE Audio requer que os formatos de áudio de captura unicast sejam declarados para o modo de processamento de sinal Padrão (AUDIO_SIGNALPROCESSINGMODE_DEFAULT). A lista de formatos de captura com suporte está na tabela a seguir.
Os formatos de áudio são ordenados dos mais preferenciais aos menos preferenciais.
Capturar gravador de voz, chamadas VOIP ou áudio de videogame com chat de voz
Modo de processamento de sinal: padrão
| Frequência de amostragem | Contagem de canais | Profundidade do bit | Duração do quadro | Taxa de Dados de Áudio | ID de Configuração de Codec BAP (Tabela 3.11 da Especificação BAP) |
|---|---|---|---|---|---|
| 32 kHz | 1 | 16 | 7,5 ms | 64 kbps | 32_1 |
| 32 kHz | 1 | 16 | 10 ms | 64 kbps | 32_2 |
| 24 kHz | 1 | 16 | 7,5 ms | 48 kbps | 24_1 |
| 24 kHz | 1 | 16 | 10 ms | 48 kbps | 24_2 |
| 16 kHz | 1 | 16 | 7,5 ms | 32 kbps | 16_1 |
| 16 kHz | 1 | 16 | 10 ms | 32 kbps | 16_2 |
Modos de processamento de sinal de áudio de transmissão
O áudio LE bluetooth do Windows requer que os formatos de áudio de origem de difusão (renderização) sejam declarados para o modo de processamento de sinal Padrão (AUDIO_SIGNALPROCESSINGMODE_DEFAULT).
O Áudio LE bluetooth do Windows requer que os formatos de áudio do coletor de difusão (captura) sejam declarados para o modo de processamento de sinal Padrão (AUDIO_SIGNALPROCESSINGMODE_DEFAULT).
A lista completa a seguir de formatos com suporte necessários é idêntica para ambas as funções.
Fluxo de transmissão estéreo para sons do sistema, reprodução de música e áudio de videogame
Modo de processamento de sinal: padrão
| Frequência de amostragem | Contagem de canais | Profundidade do bit | Duração do quadro | Taxa de Dados de Áudio | ID de Configuração de Codec BAP (Tabela 3.11 da Especificação BAP) |
|---|---|---|---|---|---|
| 48 kHz | 2 | 16 | 7,5 ms | 96 kbps | 48_3 |
| 48 kHz | 2 | 16 | 7,5 ms | 80 kbps | 48_1 |
| 48 kHz | 2 | 16 | 10 ms | 96 kbps | 48_4 |
| 48 kHz | 2 | 16 | 10ms | 80 kbps | 48_2 |
| 24 kHz | 2 | 16 | 7,5 ms | 48 kbps | 24_1 |
| 24 kHz | 2 | 16 | 10ms | 48 kbps | 24_2 |
Fluxo de transmissão mono para sons do sistema, reprodução de música e áudio de videogame
Modo de processamento de sinal: padrão
| Frequência de amostragem | Contagem de canais | Profundidade do bit | Duração do quadro | Taxa de Dados de Áudio | ID de Configuração de Codec BAP (Tabela 3.11 da Especificação BAP) |
|---|---|---|---|---|---|
| 48 kHz | 1 | 16 | 7,5 ms | 96 kbps | 48_3 |
| 48 kHz | 1 | 16 | 7,5 ms | 80 kbps | 48_1 |
| 48 kHz | 1 | 16 | 10ms | 96 kbps | 48_4 |
| 48 kHz | 1 | 16 | 10ms | 80 kbps | 48_2 |
| 24 kHz | 1 | 16 | 7,5 ms | 48 kbps | 24_1 |
| 24 kHz | 1 | 16 | 10ms | 48 kbps | 24_2 |
| 16 kHz | 1 | 16 | 7,5 ms | 32 kbps | 16_1 |
| 16 kHz | 1 | 16 | 10ms | 32 kbps | 16_2 |
Configurações e topologias de fluxo definidas
Configurações somente de renderização unicast
Configuração básica do perfil de áudio 1
A configuração de áudio a seguir é definida na tabela 4.1 da especificação do BAP Bluetooth
O computador está conectado a um único dispositivo de áudio que dá suporte a fluxos mono. O único dispositivo pode ser um dispositivo autônomo ou um único membro conectado de um conjunto coordenado.
| Exemplos de caso de uso | Configurações de áudio do Windows | Configurações do controlador Bluetooth |
|---|---|---|
| Reprodução de mídia |
Renderizar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 Captura: Nenhum |
Contagem de CIS: 1 Contagem de CIG: 1 Configurações de QoS do BAP: alta confiabilidade |
| Chamada de voz sem microfone no dispositivo de áudio |
Renderizar: Modo de Processamento de Sinal: Comunicações Contagem de Canais: 1 Captura: Nenhum |
Contagem de CIS: 1 Contagem de CIG: 1 Configurações de QoS bap: baixa latência |
| Reprodução de videogame |
Renderizar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 Captura: Nenhum |
Contagem de CIS: 1 Contagem de CIG: 1 Configurações de QoS bap: baixa latência |
Configuração básica do perfil de áudio 4
A configuração de áudio a seguir é definida na tabela 4.1 da especificação do BAP Bluetooth
O computador está conectado a um único dispositivo de áudio que dá suporte a fluxos estéreo. O dispositivo de áudio é capaz de processar dois canais de áudio em um único CIS.
| Exemplos de caso de uso | Configurações de áudio do Windows | Configurações do controlador Bluetooth |
|---|---|---|
| Reprodução de mídia |
Render: Modo de Processamento do Sinal: Padrão Contagem de Canais: 2 Captura: Nenhum |
Contagem de CIS: 1 Contagem de CIG: 1 Configurações de QoS BAP: Alocação de Canal de Áudio de Alta Confiabilidade: frontal esquerdo e frontal direito |
| Reprodução de videogame | Modo de Processamento de Sinal: Padrão Contagem de Canais: 2 Captura: Nenhum |
Contagem de CIS: 1 Contagem de CIG: 1 Configurações de QoS bap: baixa latência Alocação de canal de áudio: frontal esquerdo e frontal direito |
Configuração básica do perfil de áudio 6(i)
A configuração de áudio a seguir é definida na tabela 4.1 da especificação do BAP Bluetooth
O computador está conectado a um único dispositivo de áudio que dá suporte a fluxos estéreo. O dispositivo de áudio só é capaz de processar um canal de áudio em cada uma das duas CISs
| Exemplos de caso de uso | Configurações de áudio do Windows | Configurações do controlador Bluetooth |
|---|---|---|
| Reprodução de mídia | Modo de Processamento de Sinal: Padrão Contagem de Canais: 2 Captura: Nenhum |
Contagem de CIS: 2 Contagem de CIG: 1 Configurações de QoS do BAP: alta confiabilidade |
| Chamada de voz sem microfone no dispositivo de áudio | Modo de Processamento de Sinal: Comunicações Contagem de Canais: 1 Captura: Nenhum |
Contagem de CIS: 2 Contagem de CIG: 1 Configurações de QoS bap: baixa latência Alocação de Canal de Áudio: frontal esquerdo ou frontal direito |
| Reprodução de videogame | Modo de Processamento de Sinal: Padrão Contagem de Canais: 2 Captura: Nenhum |
Contagem de CIS: 2 Contagem de CIG: 1 Configurações de QoS bap: baixa latência Alocação de canal de áudio: frontal esquerdo e frontal direito |
Configuração básica do perfil de áudio 6(ii)
A configuração de áudio a seguir é definida na tabela 4.1 da especificação do BAP Bluetooth
O computador está conectado a um conjunto coordenado de dispositivos de áudio. O conjunto é capaz de processar dois canais de áudio com cada membro processando um único canal.
| Exemplos de caso de uso | Configurações de áudio do Windows | Configurações do controlador Bluetooth |
|---|---|---|
| Reprodução de mídia | Modo de Processamento de Sinal: Padrão Contagem de Canais: 2 Captura: Nenhum |
Contagem de CIS: 2 Contagem de CIG: 1 Configurações de QoS do BAP: alta confiabilidade |
| Chamada de voz sem microfone em nenhum dos dispositivos | Modo de Processamento de Sinal: Comunicações Contagem de Canais: 1 Captura: Nenhum |
Contagem de CIS: 2 Contagem de CIG: 1 Configurações de QoS bap: baixa latência |
| Reprodução de videogame | Modo de Processamento de Sinal: Padrão Contagem de Canais: 2 Captura: Nenhum |
Contagem de CIS: 2 Contagem de CIG: 1 Configurações de QoS bap: baixa latência |
Configurações bidirecionais unicast
As configurações bidirecionais são usadas quando o perfil bluetooth LE Audio detecta que um aplicativo pretende criar um fluxo de captura e renderização para um dispositivo remoto ou um conjunto de dispositivos. Os aplicativos controlam a captura e renderizam fluxos separadamente. Portanto, drivers de áudio IHV e controladores Bluetooth permitirão que o áudio flua em uma única direção de um CIS bidirecional após o provisionamento. Esse provisionamento usa os comandos HCI Configure Data Path e LE Setup ISO Data Path.
Configuração básica do perfil de áudio 3
A configuração de áudio a seguir é definida na tabela 4.1 da especificação do BAP Bluetooth
O computador está conectado a um único dispositivo de áudio com um fluxo mono bidirecional estabelecido em um único CIS.
| Caso de Uso | Configurações de áudio do Windows | Configurações do controlador Bluetooth |
|---|---|---|
| Chamada de voz |
Renderizar: Modo de Processamento de Sinal: Comunicações Contagem de Canais: 1 Capturar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 |
Contagem de CIS: 1 Contagem de CIG: 1 Configurações de QoS BAP: Baixa Latência |
| Reprodução de videogame com chat de voz |
Renderizar: Modo de Processamento de Sinal: Comunicações Contagem de Canais: 1 Capturar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 |
Contagem de CIS: 2 Contagem de CIG: 1 Configurações de QoS BAP: Baixa Latência |
Configuração básica do perfil de áudio 8(i)
A configuração de áudio a seguir é definida na tabela 4.1 da especificação do BAP Bluetooth
O computador está conectado a um único dispositivo de áudio que dá suporte a fluxos de renderização estéreo e fluxos de captura mono. O dispositivo é capaz de processar um canal de áudio em um único CIS para uma direção específica.
| Caso de Uso | Configurações de áudio do Windows | Configurações do controlador Bluetooth |
|---|---|---|
| Chamada de voz |
Renderizar: Modo de Processamento de Sinal: Comunicações Contagem de Canais: 1 ou 2 Capturar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 |
Contagem de CIS: 2 Contagem de CIG: 1 Configurações de QoS BAP: Baixa Latência |
| Reprodução de videogame com chat de voz |
Renderizar: Modo de Processamento de Sinal: Comunicações Contagem de Canais: 2 Capturar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 |
Contagem de CIS: 2 Contagem de CIG: 1 Configurações de QoS BAP: Baixa Latência |
Configuração básica do perfil de áudio 8(ii)
A configuração de áudio a seguir é definida na tabela 4.1 da especificação do BAP Bluetooth
O computador está conectado a um conjunto coordenado de dispositivos de áudio. Cada membro do conjunto está recebendo um canal de áudio de renderização. Um único membro de conjunto tem um fluxo de captura estabelecido. O membro definido com o fluxo de captura é o primeiro membro definido que se conecta ao computador que também dá suporte a fluxos de captura.
| Caso de Uso | Configurações de áudio do Windows | Configurações do controlador Bluetooth |
|---|---|---|
| Chamada de voz |
Renderizar: Modo de Processamento de Sinal: Comunicações Contagem de Canais: 1 ou 2 Capturar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 |
Contagem de CIS: 2 Contagem de CIG: 1 Configurações de QoS BAP: Baixa Latência |
| Reprodução de videogame com chat de voz |
Renderizar: Modo de Processamento de Sinal: Comunicações Contagem de Canais: 2 Capturar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 |
Contagem de CIS: 2 Contagem de CIG: 1 Configurações de QoS BAP: Baixa Latência |
Configurações somente de captura unicast
Configuração básica do perfil de áudio 2
A configuração de áudio a seguir é definida na tabela 4.1 da especificação do BAP Bluetooth
O computador está conectado a um único dispositivo de áudio que dá suporte a fluxos de captura mono.
| Caso de Uso | Configurações de áudio do Windows | Configurações do controlador Bluetooth |
|---|---|---|
| Chamada de voz sem alto-falante no dispositivo |
Prestar: Nenhum Capturar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 |
Contagem de CIS: 1 Contagem de CIG: 1 Configurações de QoS BAP: Baixa Latência |
Configuração básica do perfil de áudio 9(i)
A configuração de áudio a seguir é definida na tabela 4.1 da especificação do BAP Bluetooth
O computador está conectado a um único dispositivo de áudio que dá suporte ao envio de dados de áudio estéreo. O dispositivo é capaz de codificar um canal de áudio em um único CIS.
| Caso de Uso | Configurações de áudio do Windows | Configurações do controlador Bluetooth |
|---|---|---|
| Captura de microfone de vários canais |
Prestar: Nenhum Capturar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 |
Contagem de CIS: 2 Contagem de CIG: 1 Configurações de QoS BAP: Baixa Latência |
Configuração básica do perfil de áudio 9(ii)
O computador está conectado a um único dispositivo de áudio que dá suporte a fluxos de captura mono.
A configuração de áudio a seguir é definida na tabela 4.1 da especificação do BAP Bluetooth
O computador está conectado a um conjunto de dispositivos de áudio. Cada membro do conjunto envia um canal de áudio para o computador.
| Caso de Uso | Configurações de áudio do Windows | Configurações do controlador Bluetooth |
|---|---|---|
| Captura de microfone de vários canais |
Prestar: Nenhum Capturar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 |
Contagem de CIS: 2 Contagem de CIG: 1 Configurações de QoS BAP: Baixa Latência |
Se o dispositivo remoto ou o conjunto de dispositivos der suporte a áudio bidirecional, a configuração de um fluxo somente de captura será a mesma do que para o bidirecional. Essa configuração permite transições de cenários de captura somente para cenários bidirecionais sem a necessidade de recriar os fluxos.
Configurações de origem de difusão
Configuração básica do perfil de áudio 12
A configuração de áudio a seguir é definida na tabela 4.2 da especificação do BAP Bluetooth
O computador está transmitindo um canal de áudio mono.
| Caso de Uso | Configurações de áudio do Windows | Configurações do controlador Bluetooth |
|---|---|---|
| Sons do sistema, reprodução de música |
Renderizar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 |
Contagem de BIS: 1 CONTAGEM GRANDE: 1 Configurações de QoS bap: alta confiabilidade |
| Áudio do videogame |
Renderizar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 |
Contagem de BIS: 1 CONTAGEM GRANDE: 1 Configurações de QoS BAP: Baixa Latência |
Configuração básica do perfil de áudio 13
A configuração de áudio a seguir é definida na tabela 4.2 da especificação do BAP Bluetooth
O computador está transmitindo áudio estéreo com cada canal transmitindo em seu próprio BIS.
| Caso de Uso | Configurações de áudio do Windows | Configurações do controlador Bluetooth |
|---|---|---|
| Sons do sistema, reprodução de música |
Renderizar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 2 |
Contagem de BIS: 1 CONTAGEM GRANDE: 1 Configurações de QoS bap: alta confiabilidade |
| Áudio do videogame |
Renderizar: Modo de Processamento de Sinal: Padrão Contagem de Canais: 1 |
Contagem de BIS: 1 CONTAGEM GRANDE: 1 Configurações de QoS BAP: Baixa Latência |
Estruturas de dados
Propriedades da interface bluetooth LE Audio definidas pela Microsoft
Propriedades de criação de fluxo de dados
As propriedades a seguir são compartilhadas entre a pilha de driver de áudio específica do fornecedor e o Perfil de Áudio BLUETOOTH LE por meio dos DDIsACXOBJECTBAG. Essas propriedades informam as decisões sobre a criação e a configuração do ponto de extremidade de fluxo, conforme mostrado no cenário de Criação de Fluxo .
BluetoothLEAudio_CodecCapabilities
O driver de áudio define essa propriedade para indicar suporte para recursos de streaming de áudio com suporte no DSP de áudio ou driver de áudio. O valor da propriedade é definido usando o DDI AcxObjectBagAddBlob e o formato do valor é o mesmo que um registro PAC definido na especificação PACS.
O perfil de áudio Bluetooth LE do Windows lê a propriedade para determinar as possíveis configurações de codec e a composição do fluxo a ser usada.
| Campo | Octeto |
|---|---|
| Contagem de Capacidades | 0 |
| ID do Codec[i] | 1-6 |
| Comprimento das capacidades específicas do codec[i] | 7 |
| Recursos específicos do Codec | 8... n |
| Comprimento dos metadados (m) | n + 1 |
| Metadados | n+2... m |
Os valores de campo são definidos nas tabelas 3.2 e 3.4 da especificação PACS.
Bluetooth_DatapathID
O driver de áudio define essa propriedade para indicar a ID do caminho de dados usada como parâmetro para os comandos HCI_LE_Setup_ISO_Data_Path e HCI_Configure_Data_Path. O valor da propriedade é definido usando a DDI AcxObjectBagAddUI8 .
O perfil Bluetooth LE Audio lê e usa essa propriedade como parâmetro nos comandos HCI_Configure_Data_Path e HCI_LE_Setup_ISO_Data_Path. Este ID é aplicado a todos os fluxos isócronos criados para o ACXSTREAM associado ao conjunto de objetos. Para atribuir uma ID de caminho de dados diferente para cada conexão de fluxo, use KSPROPERTY_BtLeAudio_DATAPATH_ID em seus drivers de áudio.
| Campo | Octeto |
|---|---|
| ID do caminho de dados | 0 |
Se o driver de áudio não definir essa propriedade, o sistema operacional usará o valor 1 como o parâmetro para os comandos HCI.
Bluetooth_DatapathConfiguration
O driver de áudio define essa propriedade para fornecer configurações específicas do fornecedor para o controlador Bluetooth por meio do comando HCI_Configure_Data_Path. Ele não deve ser maior que 255 bytes, que é o maior conteúdo que um controlador Bluetooth aceita para um comando HCI. O valor da propriedade é definido usando a DDI AcxObjectBagAddBlob . Essa configuração se aplica a todas as IDs de caminho de dados definidas pelo driver de áudio. Para atribuir uma configuração de caminho de dados diferente para cada ID de datapath, use KSPROPERTY_BtLeAudio_DATAPATH_CONFIG em seus drivers de áudio.
Bluetooth_RequiresHciTransportInD0ForStreaming
O driver de áudio define essa propriedade para indicar que o controlador Bluetooth não deve fazer a transição para um estado de baixa potência enquanto um fluxo de áudio estiver ativo. O valor da propriedade é definido usando a DDI AcxObjectBagAddUI8 .
| Campo | Octeto |
|---|---|
| ActiveTransportRequired (deve ser definido como 1) | 0 |
BluetoothLEAudio_CodecConfiguration
Essa propriedade deve ser definida pelo perfil Bluetooth LE Audio usando o DDI AcxObjectBagAddBlob após a configuração do codec ser feita com um dispositivo de áudio. A estrutura do valor é:
| Campo | Octeto |
|---|---|
| Contagem de configurações | 0 |
| Identificador de conexão de fluxo[i] | 1-2 |
| Formato de codificação[i] | 3 |
| ID da empresa[i] | 4-5 |
| ID de Codec específica do fornecedor[i] | 6-7 |
| Comprimento de configuração específico do Codec[i] | 8 |
| Configuração específica do Codec[i] | 9... n |
Os valores de campo são derivados da tabela 4.3 da Especificação do Serviço de Controle de Fluxo de Áudio Bluetooth.
A pilha de drivers de áudio específica do fornecedor deve ler esta propriedade se o codec LC3 estiver no driver de streaming ACX ou no DSP de áudio.
BluetoothLEAudio_StreamConnectionHandles
Essa propriedade deve ser definida pelo perfil de áudio BLUETOOTH LE para informar o driver de áudio da lista de identificadores BIS ou CIS criados para um BIG ou CIG. A ordem dos identificadores corresponde à ordem retornada pelo controlador Bluetooth ao comando HCI LE_Set_CIG_Parameters ou ao evento HCI LE_Create_BIG_Complete. A estrutura do valor é:
| Campo | Tamanho | Octeto |
|---|---|---|
| Contagem do identificador de conexão | 1 | 0 |
| Identificador de conexão[i] | 2 | 1-n |
Propriedades de KS de áudio do Bluetooth LE
As propriedades KS permitem que o driver de áudio ACX IHV defina ou atualize as configurações de fluxo de áudio após a criação do fluxo. Esse cenário é útil para drivers de áudio definirem as configurações com base nas propriedades definidas pelo circuito de perfil Bluetooth no procedimento create stream.
Definições
#define STATIC_KSPROPSETID_BtLeAudio\
0x1159b79, 0xea6, 0x4923, 0x80, 0xf5, 0x32, 0x58, 0xd1, 0xfd, 0x91, 0x56
DEFINE_GUIDSTRUCT("01159B79-0EA6-4923-80F5-3258D1FD9156", KSPROPSETID_BtLeAudio);
#define KSPROPSETID_BtLeAudio DEFINE_GUIDNAMED(KSPROPSETID_BtLeAudio)
typedef enum {
KSPROPERTY_BtLeAudio_DATAPATH_ID,
KSPROPERTY_BtLeAudio_DATAPATH_CONFIG,
} ksproperty_btleaudio;
KSPROPERTY_BtLeAudio_DATAPATH_ID
Esse KSProperty permite que drivers de áudio ACX IHV definam ou atualizem o valor definido por Bluetooth_DatapathID após a invocação do retorno de chamada de fluxo de criação. Essa propriedade também permite que drivers de áudio IHV atribuam uma ID de caminho de dados diferente para cada entrada de configuração de codec em BluetoothLEAudio_CodecConfiguration. O valor dessa propriedade deve ser definido como um único valor de byte para representar a ID do caminho de dados usada para todas as configurações de codec ou n bytes em que n é igual ao valor de Contagem de Configuração definido na propriedade BluetoothLEAudio_CodecConfiguration. Se o valor contiver várias IDs de caminho de dados, a ordem das IDs será usada para a configuração do codec, conforme ordenado na propriedade BluetoothLEAudio_CodecConfiguration.
KSPROPERTY_BtLeAudio_DATAPATH_CONFIG
Esse KSProperty permite que os drivers de áudio ACX IHV definam ou atualizem a configuração do caminho de dados, conforme definido em Bluetooth_DatapathConfiguration. O KSProperty deve ser enviado pelo driver de áudio para o perfil Bluetooth antes que o retorno de chamada de fluxo de áudio inicial seja invocado. Essa propriedade pode ser usada para definir uma única configuração para todos os caminhos de dados em uma única direção ou para definir uma configuração de caminho de dados específica para cada entrada de configuração de codec definida em BluetoothLEAudio_CodecConfiguration. Se o valor contiver várias configurações de caminho de dados, a ordem das configurações será usada para a entrada de configuração de codec, conforme ordenado na propriedade BluetoothLEAudio_CodecConfiguration. O número de configurações de codec deve ser igual ao número de IDs de caminho de dados definidas por KSPROPERTY_BtLeAudio_DATAPATH_ID ou Bluetooth_DatapathID.
| Campo | Tamanho | Value |
|---|---|---|
| Contagem de configurações | 1 byte | 1 ou Contagem de Configurações de Codec definida em BluetoothLEAudio_CodecConfiguration |
| Tamanho da configuração[i] | 1 byte | Não deve exceder 255 |
| Configuração[i] | Tamanho da configuração[i] |
Interfaces
IDs de associação de modelo de ponto de extremidade de áudio
Usado pela fábrica de circuitos ACX no driver de áudio para identificar quando um circuito ACX para um dispositivo Bluetooth emparelhado é criado.
As seguintes IDs de componente são usadas para criar circuitos de áudio BLUETOOTH LE:
// {5C52FDB5-722A-4AB7-A342-70163B7E9B5C}
DEFINE_GUID(GUID_BLUETOOTH_LEAUDIO_RENDER_COMPONENT_ID,
0x5c52fdb5, 0x722a, 0x4ab7, 0xa3, 0x42, 0x70, 0x16, 0x3b, 0x7e, 0x9b, 0x5c);
// {1DFF2EE3-AE89-441C-BDE3-24F885C55DF8}
DEFINE_GUID(GUID_BLUETOOTH_LEAUDIO_CAPTURE_COMPONENT_ID,
0x1dff2ee3, 0xae89, 0x441c, 0xbd, 0xe3, 0x24, 0xf8, 0x85, 0xc5, 0x5d, 0xf8);
Interface de suporte do Bluetooth LE Audio
Usado pela pilha do driver de áudio para indicar que está disponível para streaming de Bluetooth LE Audio. Monitoramento no nível do serviço de Áudio Bluetooth do Windows para essa interface e aguarde até que seja publicada antes de habilitar o suporte a áudio LE.
As seguintes IDs de interface são usadas para publicar a interface de suporte do Bluetooth LE Audio:
// {BA02FA1B-0FD0-4A0F-A748-4FAE2E2D2F67}
DEFINE_GUID(GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE,
0xba02fa1b, 0x0fd0, 0x4a0f, 0xa7, 0x48, 0x4f, 0xae, 0x2e, 0x2d, 0x2f, 0x67);
Sequências comuns
As sequências a seguir são executadas para cenários de áudio LE unicast e de transmissão.
Inicialização do driver de áudio
Quando o driver de streaming do ACX IHV é carregado e determina que ele dá suporte ao streaming de áudio Bluetooth LE, ele deve mostrar suporte para a tecnologia criando um objeto ACXFACTORYCIRCUIT e registrando-se para associações de modelo Bluetooth com ACX usando as IDs definidas em IDs de associação de modelo de ponto de extremidade de áudio.
Sequências de áudio Unicast
Criação de ponto de extremidade
Quando um dispositivo le audio é emparelhado com o sistema, o Perfil de Áudio LE Bluetooth:
- Lê as capacidades de áudio publicadas do dispositivo remoto.
- Descobre as capacidades suportadas do controlador enviando os comandos HCI_Read_Local_Support_Codecs [v2] e HCI_Read_Local_Supported_Codec_Capabilities.
- Cria um ACXCIRCUIT com os formatos com suporte definidos com base nos recursos codec compatíveis com o controlador Bluetooth e o dispositivo de áudio remoto. Se o controlador não oferecer suporte a nenhum codec porque o suporte a codec está no DSP de áudio ou no driver de áudio, os formatos suportados são definidos pelos formatos suportados pelo dispositivo de áudio remoto.
Depois que o ACXCIRCUIT é criado, o ACX solicita à fábrica de circuitos do driver de streaming ACX IHV a criação de um ACXCIRCUIT para processamento de fluxo.
Quando uma solicitação para criar um circuito é recebida, o driver de streaming ACX IHV:
- Cria objetos ACXCIRCUIT, ACXPIN, ACXOBJECTBAG e ACXSTREAMBRIDGE .
- Se o codec LC3 ou o codec específico do fornecedor estiver hospedado no driver de áudio ou DSP, o driver de streaming ACX IHV definirá a propriedade BluetoothLEAudio_CodecCapabilities no ACXOBJECTBAG.
- O driver de streaming do ACX IHV pode definir Bluetooth_DatapathID ou Bluetooth_DatapathConfiguration no ACXOBJECTBAG se ele for conhecido no momento.
Depois que ambos os circuitos são criados, o ACX invoca o retorno de chamada EvtAcxPinConnected no pino de ponte do driver ACX IHV.
Quando o retorno de chamada EvtAcxPinConnected é invocado , o driver de streaming ACX IHV:
- Recupera o pino de interconexão do circuito de perfil usando as APIs AcxTarget... para obter os formatos suportados pelo circuito de perfil.
- Itera através da lista de ACXDATAFORMATs definidos pelo circuito de perfil. Se o codec de áudio Bluetooth estiver hospedado no DSP de áudio ou driver de áudio, o driver de áudio IHV atualizará seus ACXDATAFORMATcom os formatos compatíveis com o codec e o circuito de perfil. Caso contrário, todos os formatos serão copiados para o pin de host do driver de streaming DO ACX IHV.
- Define a lista de formatos atualizada no pino de ponte se um mecanismo de áudio for criado para streaming de descarregamento.
Depois que os formatos são atualizados, o ACX habilita as duas interfaces, criando um ponto de extremidade de áudio.
Criação de fluxo
Quando um aplicativo solicita a criação de um fluxo de áudio, o ACX invoca os retornos de chamada EvtCircuitCreateStream registrados para cada circuito, começando com o driver de streaming ACX IHV.
Quando o retorno de chamada EvtCircuitCreateStream é invocado, o driver de streaming do ACX IHV:
- Define ou atualiza as propriedades Bluetooth_DatapathId e Bluetooth_DataPathConfiguration no ACXOBJECTBAG anexado ao ACXSTREAMBRIDGE.
- Cria um ACXSTREAM com retornos de chamada definidos para transições de estado de fluxo e processamento de fluxo RT
- Criará um elemento de motor de áudio na transmissão se o pipeline de áudio der suporte à transmissão de alívio de carga.
- Adiciona o ACXSTREAM à sua ponte de streaming. Isso invoca o retorno de chamada EvtCircuitCreateStream do perfil Bluetooth LE Audio.
Quando o retorno de chamada EvtAcxCircuitCreateStream é invocado, o perfil de áudio BLUETOOTH LE:
- Salva localmente as propriedades do ACXOBJECTBAG configuradas pelo driver de streaming ACX da IHV para futuros retornos de chamada de transição de fluxo.
- Executa a operação Config Codec conforme definido na especificação BAP. Os parâmetros para a operação são derivados do ACXDATAFORMAT especificado no retorno de chamada EvtAcxCircuitCreateStream e dos outros parâmetros de fluxo no ACXOBJECTBAG ou dos recursos de codec oferecidos pelo Controlador Bluetooth.
- Aloca recursos de fluxo enviando o comando HCI LE Set CIG Parameters.
- Define a propriedade BluetoothLEAudio_StreamConnectionHandles com a lista de identificadores de conexão CIS retornados pelo controlador Bluetooth.
- Define a propriedade BluetoothLEAudio_CodecConfiguration no ACXOBJECTBAG com o valor usado para configurar os dispositivos de áudio remotos.
Se o driver de streaming DO ACX IHV precisar atualizar sua ID de caminho de dados ou a configuração do caminho de dados com base nos valores do recipiente de objetos definidos pelo perfil, ele poderá invocar as operações do conjunto KSPROPERTY para atualizar o valor armazenado pelo circuito de perfil.
- Cria um ACXSTREAM com funções de retorno definidas para transições de estado do fluxo.
Transições de estado de fluxo
O ACX decide a ordem do circuito das transições de estado de fluxo com base no fluxo de áudio e se o estado está fazendo a transição para um estado mais ativo ou menos ativo.
- Para fluxos de renderização que vão de um estado menos ativo para um estado mais ativo, o circuito de perfil recebe o evento primeiro, seguido pelo circuito de streaming.
- Para fluxos de renderização que vão de um estado mais ativo para um estado menos ativo, o circuito de streaming recebe o evento primeiro, seguido pelo circuito de perfil.
- Para fluxos de captura que vão de um estado menos ativo para um estado mais ativo, o circuito de streaming recebe o evento primeiro, seguido pelo circuito de perfil.
- Para fluxos capturados que vão de um estado mais ativo para um estado menos ativo, o circuito de perfil começa a receber o evento primeiro, seguido pelo circuito de transmissão.
Preparar transmissão
Quando seu retorno de chamada EvtAcxStreamPrepareHardware é invocado, o perfil de áudio BLUETOOTH LE envia a operação QoS de configuração do ASCS para sincronizar as configurações com o dispositivo remoto, se necessário. É possível que a operação de QoS de configuração do ASCS já tenha sido concluída quando o retorno de chamada foi invocado para a outra direção de um fluxo bidirecional.
Quando seu retorno de chamada EvtAcxStreamPrepareHardware é invocado, o driver de streaming IHV ACX aloca os recursos de streaming necessários e inicializa o pipeline de áudio para colocá-lo no estado adquirido.
Iniciar fluxo
Quando seu retorno de chamada EvtAcxStreamRun é invocado, o perfil de áudio BLUETOOTH LE:
- Aplica os argumentos de configuração do driver de streaming ACX, conforme descrito abaixo, usando o comando HCI_Configure_Data_Path se eles tiverem sido alterados. O Windows Bluetooth Core Stack armazena em cache o buffer de Vendor_Specific_Config para cada par Data_Path_Direction e Data_Path_ID. O comando HCI_Configure_Data_Path é enviado somente quando o Vendor_Specific_Config é alterado para um par de Data_Path_Direction e Data_Path_ID.
- Data_Path_Direction é o AudioDirection do circuito de streaming que emite o retorno de chamada EvtAcxStreamRun.
- O Data_Path_ID é preenchido com o valor atribuído mais recentemente de uma das seguintes fontes:
- Bluetooth_DatapathID no ACXOBJECTBAG anexado ao ACXSTREAMBRIDGE passado para o Perfil de Áudio LE bluetooth do Windows durante o retorno de chamada EvtCircuitCreateStream.
- Dados de KSPROPERTY_BtLeAudio_DATAPATH_ID.
- Os dados de Vendor_Specific_Config são preenchidos com o valor atribuído mais recentemente de uma das seguintes fontes:
- Bluetooth_DatapathConfiguration no ACXOBJECTBAG anexado ao ACXSTREAMBRIDGE passado para o circuito de Perfil de Áudio LE bluetooth do Windows durante o retorno de chamada EvtCircuitCreateStream.
- Dados de KSPROPERTY_BtLeAudio_DATAPATH_CONFIG.
- Envia a operação Habilitar ASCS para os dispositivos remotos.
- Cria CISes se elas ainda não foram criadas usando o comando HCI_LE_Create_CIS.
- Se o caminho de dados ainda não estiver configurado, o perfil de áudio BLUETOOTH LE:
- Estabelece os caminhos de dados ISO usando o comando HCI_LE_Setup_ISO_Data_Path
- Se o driver de streaming ACX IHV definir a propriedade BluetoothLEAudio_CodecCapabilities, o valor do campo Codec_ID em HCI_LE_Setup_ISO_Data_Path deverá ser definido como transparente (0x3) conforme definido nos Números Atribuídos por Bluetooth. Caso contrário, o valor será o mesmo que o ID do Codec usado na operação de configuração do codec na criação do stream.
- Estabelece os caminhos de dados ISO usando o comando HCI_LE_Setup_ISO_Data_Path
- Se o fluxo de áudio for um fluxo de captura, o perfil de áudio BLUETOOTH LE executará a operação pronta para iniciar o receptor BAP.
Quando o retorno de chamada EvtAcxStreamRun é invocado, o driver de streaming ACX do IHV começa a processar dados de áudio provenientes do sistema de áudio do Windows (renderização) ou capturados pelo controlador Bluetooth (captura).
Pausar fluxo
Quando a sua função de retorno de chamada EvtAcxStreamPause é invocada, o perfil de Áudio Bluetooth LE:
- Executa o procedimento de desabilitação do fluxo unicast do BAP.
- Remove o caminho de dados ISO usando o comando HCI_LE_Remove_ISO_Data_Path.
- Executa o procedimento de prontidão para parar o receptor ASCS se o fluxo de áudio for um fluxo unicast de captura.
- Desconecte CISes se não houver outros fluxos em uso para esse CIS.
Quando o retorno de chamada EvtAcxStreamPause é invocado, o driver de streaming ACX do IHV pausa seu pipeline de processamento de áudio.
Fluxo de lançamentos
Quando seu retorno de chamada EvtAcxStreamReleaseHardware é invocado, o Perfil de Áudio de LE Bluetooth:
- Envia a operação de versão do ASCS para o dispositivo remoto Bluetooth LE Audio
- Remove o CIG se todas as CISes estiverem desconectadas.
Quando seu retorno de chamada EvtAcxStreamReleaseHardware é invocado, o driver de streaming ACX do IHV libera seus recursos de pipeline de áudio.
Desconexão de endpoint
O perfil do Windows Bluetooth LE Audio atualiza o estado de conexão de um ponto de extremidade se o dispositivo unicast remoto não tiver uma conexão LE-ACL com o computador ou estiver relatando por meio de seus contextos de áudio disponíveis para PACS que ele não está disponível para streaming. Quando o ponto de extremidade é desconectado, o serviço de áudio do Windows anula qualquer fluxo de áudio ativo para o ponto de extremidade. Isso resulta na pausa do fluxo e nas sequências de liberação ocorrerem.
Controle de volume e função silenciosa
O circuito de streaming ACX do IHV deve incluir elementos de volume e mudo apenas se o driver de streaming exigir um motor de áudio. Ao usar um mecanismo de áudio, os sinalizadores de configuração devem ser definidos como tal:
ACX_AUDIOENGINE_CONFIG audioEngineCfg;
ACX_AUDIOENGINE_CONFIG_INIT(&audioEngineCfg);
…
audioEngineCfg.Flags |= AcxAudioEngineConfigVolumeSecondary; // Use this control only if endpoint doesn't have one.
audioEngineCfg.MuteElement = muteElement;
audioEngineCfg.Flags |= AcxAudioEngineConfigMuteSecondary; // Use this control only if endpoint doesn't have one.
audioEngineCfg.PeakMeterElement = peakmeterElement;
audioEngineCfg.Flags |= AcxAudioEngineConfigPeakMeterSecondary; // Use this control only if endpoint doesn't have one.
Isso é necessário para permitir que os pontos de extremidade Bluetooth LE Audio usem os perfis de controle de volume e microfone definidos pela Bluetooth SIG para alterações de volume e silencioso para pontos de extremidade de áudio unicast.
Se o dispositivo remoto Bluetooth LE Audio não oferecer suporte aos serviços de controle de volume ou microfone, ou se o ponto de extremidade for criado para áudio de transmissão, o volume e os elementos de silenciamento no mecanismo de áudio servirão como alternativa para lidar com as solicitações de alteração do sistema de áudio. O sistema de áudio do Windows lida com alterações em volume e mudo. Se não houver nenhum motor de áudio e qualquer dispositivo remoto não oferecer suporte ao volume ou aos serviços de microfone, ou o ponto de extremidade de áudio for para transmissão de áudio.
Remoção de ponto de extremidade
Um ponto de extremidade de áudio BLUETOOTH LE é removido do sistema quando o circuito de perfil ou o circuito de streaming é destruído. O circuito de perfil pode ser removido quando o emparelhamento do dispositivo unicast remoto é removido do Windows ou o rádio Bluetooth está desabilitado.
- Quando o perfil de áudio LE bluetooth do Windows remove seu circuito, o ACX desabilita suas interfaces de ponto de extremidade para sinalizar ao serviço de áudio do Windows que o ponto de extremidade deve ser removido.
- Quando as interfaces são desabilitadas, o serviço de áudio do Windows invalida todos os fluxos ativos para o ponto de extremidade de áudio BLUETOOTH LE, essa operação resulta na pausa de fluxo e liberação de retornos de chamada a serem invocados no circuito de streaming.
- Para concluir a remoção do ponto de extremidade, o ACX invalida o circuito do driver de streaming ACX do IHV, o que resulta na invocação pelo WDF do retorno de chamada de limpeza do circuito.
- Quando o callback de limpeza é chamado, o driver de streaming IHV ACX libera o seu circuito.
Bluetooth LE e coexistência de áudio clássico
O Windows deve garantir que apenas áudio clássico ou áudio LE esteja ativo para um dispositivo de áudio Bluetooth emparelhado que dê suporte a ambas as tecnologias. Se o áudio LE estiver ativo, os DDIs de sideband para A2DP e HFP para o dispositivo remoto serão desabilitados e o circuito de perfil será criado para o ponto de extremidade de áudio LE. Se o áudio clássico estiver ativo, os DDIs de sideband para A2DP e HFP para o dispositivo remoto serão habilitados e o circuito de perfil não será criado para o ponto de extremidade de áudio LE.
Gerenciamento de energia
O Bluetooth LE Audio não tem nenhum requisito de gerenciamento de energia ou fluxos fora do que já está definido pelo WDF.
Estéreo de super wideband para cenários de voz
A experiência de áudio Bluetooth de hoje é conveniente, mas tem limitações, especialmente quando comparadas com experiências de áudio com fio. Uma das principais limitações, com consequências voltadas para o usuário, é a queda para o áudio mono sempre que o microfone estiver ativo. Isso impede que experiências como áudio espacial no Teams e outros aplicativos VoIP funcionem e prejudica muito as experiências de jogos envolvendo chat de voz.
O Bluetooth LE Audio fecha a lacuna com fidelidade de áudio aprimorada e latência reduzida adicionando suporte para reprodução estéreo enquanto o microfone está em uso.
Pares de formato de renderização/captura
Uma solução IHV anuncia seu suporte para renderização estéreo com captura mono fornecendo uma lista de pares de formato de renderização/captura, cada um deles consiste em um formato de renderização estéreo e um formato de captura mono que pode ser usado simultaneamente para streaming bidirecional. Um formato de renderização estéreo (ou captura mono) é definido como um par de um Sampling_Frequency (por exemplo, 16/24/32/48 kHz) e um Audio_Channel_Count (por exemplo, 1/2 ch) associado a um codec de áudio específico, que não se limita ao LC3.
Por exemplo, suponha que uma solução IHV dê suporte à renderização estéreo de 16kHz com captura mono de 16kHz e renderização estéreo de 48kHz com captura mono de 24kHz ou 32kHz. Os pares de formato de renderização/captura correspondentes são semelhantes a este:
| Entry | Formato de renderização | Formato de captura |
|---|---|---|
| 1 | Renderização(16 kHz, 2 ch) | Capture(16 kHz, 1 ch) |
| 2 | Renderização(48 kHz, 2 ch) | Capture(24 kHz, 1 ch) |
| 3 | Renderização(48 kHz, 2 ch) | Capture(32 kHz, 1 ch) |
Tabela 3: Pares de formato de renderização/captura de exemplo
Como um membro de conjunto coordenado pode ingressar ou desativar a qualquer momento, uma solução IHV deve dar suporte à renderização mono com captura mono nas mesmas respectivas frequências de amostragem para cada entrada nos pares de formato. Isso significa que, dado o exemplo na Tabela 3, todos os pares de formato abaixo também devem ter suporte implícito, mesmo que não sejam declarados explicitamente:
| Entry | Formato de renderização | Formato de captura |
|---|---|---|
| 1 | Renderização(16 kHz, 1 ch) | Capture(16 kHz, 1 ch) |
| 2 | Renderização(48 kHz, 1 ch) | Capture(24 kHz, 1 ch) |
| 3 | Renderização(48 kHz, 1 ch) | Capture(32 kHz, 1 ch) |
Tabela 4: Pares de formato de renderização/captura implícitos para a Tabela 3
A principal diferença entre a Tabela 3 e a Tabela 4 é que o Audio_Channel_Count para cada formato de renderização no último é definido como um (para "renderização mono"); todo o resto permanece o mesmo.
Pares de formato de renderização/captura obrigatórios
A Tabela 5 define a lista de formatos de áudio que todas as soluções IHV darão suporte:
| Entry | (Render_format, Capture_format) |
|---|---|
| 1 | { Renderização(48 kHz, 2 ch), Capture(32 kHz,1 ch) } |
| 2 | { Renderização(32 kHz, 2 ch), Capture(32 kHz,1 ch) } |
| 3 | { Renderização(24 kHz, 2 ch), Capture(24 kHz,1 ch) } |
| 4 | { Renderização(16 kHz, 2 ch), Capture(16 kHz,1 ch) } |
Pares de formato de renderização/captura obrigatórios da Tabela 5
Anúncio de funcionalidades
Dependendo se o controlador Bluetooth dá suporte ao codec de áudio envolvido (padrão para LC3), uma solução IHV anuncia a lista de pares de formato de renderização/captura que ele dá suporte de diferentes maneiras. Especificamente:
Se o codec estiver no controlador Bluetooth, o controlador e o driver de streaming do ACX IHV anunciarão as listas de pares de formato de forma independente. Se as duas listas discordarem umas das outras, o Windows deverá se cruzar e manter as partes comuns.
Se o codec não estiver no controlador Bluetooth (por exemplo, ele está no DSP de áudio), somente o driver de streaming ACX IHV será necessário para anunciar a lista de pares de formato. Controlador Bluetooth
Como o Codec_Capability[i] na resposta de um HCI_Read_Local_Supported_Codec_Capabilities não dá suporte a metadados, o controlador Bluetooth é necessário para dar suporte a uma família de IDs de codec específicas da Microsoft (consulte a Tabela 7) de modo que o Windows possa consultar mais recursos codec, por exemplo, a lista de pares de formato de renderização/captura, que não podem ser facilmente transmitidos pela interface HCI existente.
| Parâmetro | Tamanho (octetos) | Description |
|---|---|---|
| Codec_ID | 5 |
Octet 0: 0xFF (específico do fornecedor) Octeto 1 a 2: 0x0006 (Microsoft) Octeto de 3 a 4: ID de codec definida pelo fornecedor Se o bit mais significativo do octeto 4 estiver definido como zero (0), o octeto 3 conterá um formato de codificação aprovado por SIG (variando de 0x00 a 0x07 a partir de 31 de maio de 2024), exceto por 0xFF. Se o bit mais significativo do octeto 4 for definido como um (1), o octeto 3 conterá um formato de codificação que ainda não foi definido e será reservado pelo Windows para uso futuro. |
ID de codec específica da Microsoft da Tabela 7
Os escopos dessas IDs de codec específicas da Microsoft são limitados a:
- HCI_Read_Local_Supported_Codecs [v2]
- HCI_Read_Local_Supported_Codec_Capabilities
Por contrato, o Windows não deve usar nenhuma dessas IDs de codec específicas da Microsoft para outros tipos de comandos HCI.
HCI_Read_Local_Supported_Codecs [v2]
O controlador deve anunciar seu suporte para a ID de codec específica da Microsoft por meio de Vendor_Specific_Codec_ID e Vendor_Specific_Codec_Transport:
| Campo | Description |
|---|---|
| Vendor_Specific_Codec_ID[k] |
Octetos de 0 a 1: ID da empresa (0x0006) Para obter mais informações, consulte Octet 1 a 2 na Tabela 7. Octetos de 2 a 3: ID de codec definida pelo fornecedor (por exemplo, 0x0006 para LC3) Para obter mais informações, consulte Octet 3 a 4 na Tabela 7. |
| Vendor_Specific_Codec_Transport[k] | LE_CIS (0x02) deve ter suporte. |
Tabela 8 HCI_Read_Local_Supported_Codec [v2] valor de resposta
HCI_Read_Local_Supported_Codec_Capabilities
Para consultar todos os recursos de codec específicos do Windows, incluindo a lista de pares de formato de renderização/captura, o Windows chama HCI_Read_Local_Supported_Codec_Capabilities com os seguintes argumentos:
| Parâmetro | Tamanho (octetos) | Description |
|---|---|---|
| Codec_ID (ID de codec específica da Microsoft) | 5 |
Octet 0: 0xFF (específico do fornecedor) Octeto de 1 a 2: ID da empresa (0x0006) Para obter mais informações, consulte Octet 1 a 2 na Tabela 8. Octeto de 3 a 4: ID de codec definida pelo fornecedor (por exemplo, 0x0006 para LC3) Para obter mais informações, consulte Octet 3 a 4 na Tabela 8. |
| Logical_Transport_Type | 1 | 0x2 (LE CIS) |
| Direção | 1 | 0x00 (Entrada, por exemplo, Host para Controlador) |
Argumentos de comando de HCI_Read_Local_Supported_Codec_Capabilities da Tabela 9
Ao receber esse comando, o controlador deverá retornar todos os recursos específicos do Windows para o codec especificado pela ID de codec definida pelo fornecedor. Por exemplo, se a ID de codec definida pelo fornecedor estiver definida como 0x0006, o controlador retornará todos os recursos relacionados ao LC3 exigidos pelo Windows.
A resposta para o comando mantém a mesma estrutura de nível superior que a definida pela Especificação do Bluetooth Core:
| Parâmetro | Tamanho (octetos) | Description |
|---|---|---|
| Situação | 1 | 0x00 (Êxito); 0x01 para 0xFF (código de erro) |
| Num_Codec_Capabilities | 1 | Número total de recursos retornados. |
| Codec_Capability_Length[i] | 1 | Comprimento do campo Codec_Capability[i]. |
| Codec_Capability [i] | Varia | Codec_Capability_Length[i] octetos de dados de funcionalidade específicos do codec. |
Estrutura de resposta de HCI_Read_Local_Supported_Codec_Capabilities da Tabela 10
No entanto, a carga de Codec_Capability[i] é diferente daquela definida pelo SIG e é adaptada para Windows.
Atualmente, o único recurso codec definido pelo Windows é Bidirectional_Multichannel_Streaming, que é descrito abaixo.
Bidirectional_Multichannel_Streaming
Ao anunciar Bidirectional_Multichannel_Streaming, o controlador afirma que dá suporte à renderização simultânea de m-channel com captura de n-canal em que m ≥ 1, n ≥ 1 e m + n> 2. (A renderização estéreo com captura mono é efetivamente uma Bidirectional_Multichannel_Streaming com m = 2 e n = 1.)
Esta tabela descreve o formato para Bidirectional_Multichannel_Streaming:
| Parâmetro | Tamanho (octetos) | Bits | Description |
|---|---|---|---|
| Tipo 1 | 0x00 | (Bidirectional_Multichannel_Streaming) | |
| Channel_Counts | 1 | Bit 0 a 4: (m – 1), onde m é o número de canais de renderização | (Para renderização estéreo com captura mono, isso deve ter o valor, 2 – 1 = 1.) |
| Channel_Counts | 1 | Bit 5 a 7: (n – 1), onde n é o número de canais de captura | (Para renderização estéreo com captura mono, isso deve ter o valor, 1 – 1 = 0.) |
| Render_Sampling_Frequencies | 1 |
Bit 0: 16 kHz Bit 1: 24 kHz Bit 2: 32 kHz Bit 3: 48 kHz Bit 4: RFU Bit 5: RFU Bit 6: RFU Bit 7: RFU |
Todas as frequências de amostragem nesta lista têm a mesma contagem de canais especificada pelo bit 0-4 de Channel_Count. Todos os bits rfu são reservados e devem ser definidos como zero. |
| Capture_Sampling_Frequencies_-List[i], onde 0 ≤ i ≤ 7 | i + 1 |
Bit 0: 16 kHz Bit 1: 24 kHz Bit 2: 32 kHz Bit 3: 48 kHz Bit 4: RFU Bit 5: RFU Bit 6: RFU Bit 7: RFU |
Todas as frequências de amostragem nesta lista têm a mesma contagem de canais especificada pelo bit 5-7 de Channel_Count. Cada instância Capture_Sampling_Frequencies_List tem um octeto de tamanho e pode haver até oito dessas instâncias (se todos os bits em Render_Sampling_Frequencies estiverem definidos como um). Todos os bits rfu são reservados e devem ser definidos como zero. |
Formato de Bidirectional_Multichannel_Streaming da Tabela 11 (comprimento máximo: 11 bytes)
Channel_Counts
A opção de contagens de bits para renderização/captura é arbitrária – cinco bits são alocados para renderização (para abranger todos os locais de áudio definidos por SIG) e três bits para captura (para minimizar o tamanho da carga HCI).
Por exemplo, o Channel_Counts da Tabela 3 é 0b00000'0001 porque o número de canais de renderização/captura, por exemplo, m e n, são 2 e 1, respectivamente:
| Captura | Render | |
|---|---|---|
| Bit | 7 6 5 | 4 3 2 1 0 |
| Valor | 0 0 0 | 0 0 0 0 1 |
Tabela 12 Channel_Counts para a Tabela 3
Por design, todos os recursos com o mesmo par de ID de codec específico da Microsoft e Channel_Counts devem ser agrupados e representados por um único registro Bidirectional_Multichannel_Streaming.
Render_Sampling_Frequencies
O campo Render_Sampling_Frequencies especifica todas as frequências de renderização que podem ser usadas no contexto da estrutura de Bidirectional_Multichannel_Streaming associada.
Por exemplo, o Render_Sampling_Frequencies da Tabela 3 é 0b0000'1001, o que significa que 16kHz e 48kHz podem ser usados como a frequência de amostragem para renderização de dois canais:
| Khz | RFU | RFU | RFU | RFU | 48 | 32 | 24 | 16 |
|---|---|---|---|---|---|---|---|---|
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Valor | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
Tabela 13 Render_Sampling_Frequencies para a Tabela 3
Capture_Sampling_Frequencies_List[i]
Para cada bit "um" em Render_Sampling_Frequencies, começando do menos significativo para o mais significativo, o controlador deve fornecer uma máscara de bits exclusiva (Capture_Sampling_Frequencies_List[i]) especificando todas as frequências de captura compatíveis com a frequência representada por esse bit de renderização. O controlador não deve fornecer uma máscara de bits Capture_Sampling_Frequencies para nenhum bit "zero" em Render_Sampling_Frequencies.
Por exemplo, as máscaras de bit de captura da Tabela 3 são semelhantes a esta:
// The order matters!
{
// Capture_Sampling_Frequencies_List[0] for 16kHz dual-channel rendering.
0b0000'0001, // 16 kHz single-channel capture
// Do not create a dummy Capture_Sampling_Frequencies_List entry, for example, 0b0000'0000,
// for 24kHz dual-channel rendering, which is not supported at all.
// Do not create a dummy Capture_Sampling_Frequencies_List entry, for example, 0b0000'0000,
// for 32kHz dual-channel rendering, which is not supported at all.
// Capture_Sampling_Frequencies_List[1] for 48kHz dual-channel rendering.
0b0000'0110 // Either 24 or 32 kHz single-channel capture
}
Especificamente:
| Render_-Sampling_-Frequencies | eu | Capture_-Sampling_-Frequencies[i] | Description |
|---|---|---|---|
| 0b0000'1001 ⇤ ordem ↤ |
0 | 0b0000'0001 | O primeiro bit "um" menos significativo (bit 0) em Render_Sampling_Frequencies corresponde a 16 kHz. Habilite o bit 0 de Capture_Sampling_Frequencies_List[0] para indicar que a captura de 16 kHz pode ser emparelhada com essa frequência de renderização. |
| 0b0000'1 001 ⇤ ordem ↤ |
1 | 0b0000'0110 | O segundo bit "um" menos significativo (bit 3) em Render_Sampling_Frequencies corresponde a 48 kHz. Habilite o bit 1 e 2 de Capture_Sampling_Frequencies_List[1] para indicar que a captura de 24 kHz e 32 kHz pode ser emparelhada com essa frequência de renderização. |
Exemplo da Tabela 14 para criar um Capture_Sampling_Frequencies_List[i] para um Render_Sampling_Frequencies
IHV ACX Streaming Driver
Para dar suporte à renderização estéreo com captura mono, um driver de streaming IHV ACX define a propriedade do dispositivo, BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities, que representa os pares de formato de renderização/captura descritos em 3.11.2, para uma instância da classe de interface do dispositivo, GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE.
A propriedade deve ser disponibilizada imediatamente após a criação da instância da classe de interface do dispositivo e o valor da propriedade permanece constante durante todo o tempo de vida da instância da classe de interface do dispositivo.
A chave de propriedade de BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities é definida como:
DEFINE_DEVPROPKEY(DEVPKEY_BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities,
0xd27ba3a4, 0x1bfe, 0x4374, 0x88, 0x7d, 0xe8, 0xb3, 0xa6, 0xac, 0xe, 0xe9, 2); // DEVPROP_TYPE_BINARY (BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY[])
O tipo de valor de propriedade associado à chave, DEVPKEY_BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities, é definido como:
typedef struct _BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY
{
BTH_LE_AUDIO_CODEC_ID CodecId;
BOOL IsCodecPresent;
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CHANNEL_COUNT RenderChannelCount;
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CHANNEL_COUNT CaptureChannelCount;
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY RenderSamplingFrequencies;
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY CaptureSamplingFrequenciesList[
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_BIT_LENGTH
];
} BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY;
Where:
typedef struct _BTH_LE_AUDIO_CODEC_ID
{
UINT8 CodingFormat;
UINT16 CompanyId;
UINT16 VendorCodecId;
} BTH_LE_AUDIO_CODEC_ID;
typedef UINT8 BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CHANNEL_COUNT;
typedef enum _BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY :
UINT8 // Bit flags
{
// 16 kHz
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_16000HZ = 0x1,
// 24 kHz
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_24000HZ = 0x2,
// 32 kHz
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_32000HZ = 0x4,
// 48 kHz
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_48000HZ = 0x8,
// A dummy value for indicating a sampling frequency is "not applicable" in the
// respective context.
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_NONE = 0,
// All valid sampling frequencies combined.
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_ALL =
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_16000HZ |
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_24000HZ |
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_32000HZ |
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_48000HZ,
} BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY;
DEFINE_ENUM_FLAG_OPERATORS(BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY);
#define BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_BIT_LENGTH \
(sizeof(BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY) * 8)
A estrutura BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY segue regras semelhantes, conforme descrito em Bidirectional_Multichannel_Streaming, exceto que:
O driver de streaming ACX é necessário para definir um sinalizador extra, IsCodecPresent, para indicar se o codec de interesse é conceitualmente parte do driver de streaming ACX. Por exemplo, se o codec estiver no DSP de áudio, IsCodecPresent deverá ser definido como TRUE. Se o codec estiver no controlador Bluetooth, o sinalizador deverá ser definido como FALSE.
Para renderização m-channel com captura de n-canal, os valores de RenderChannelCount e CaptureChannelCount são m e n, respectivamente. Em outras palavras, RenderChannelCount e CaptureChannelCount indicam o número real de canais de renderização e captura.
Dado um índice, i, há um mapeamento um-para-um entre o bit i-th menos significativo de RenderSamplingFrequencies e a entrada i-th de CaptureSamplingFrequenciesList. Se o bit i-th de RenderSamplingFrequencies for zero, defina CaptureSamplingFrequenciesList[i] como zero.
O código de exemplo a seguir mostra como criar a interface do dispositivo GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE e define a propriedade de interface do dispositivo BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities:
PAGED_CODE_SEG
NTSTATUS
AdvertiseBluetoothLEAudioSupport(
WDFDEVICE Device
)
{
// Create a device interface with the class,
// GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE, for the specified WDF device.
DECLARE_CONST_UNICODE_STRING(
bluetoothLEAudioSupportInterface, L"BluetoothLEAudioSupport");
RETURN_NTSTATUS_IF_FAILED(WdfDeviceCreateDeviceInterface(
Device,
&GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE,
(PUNICODE_STRING)&bluetoothLEAudioSupportInterface));
#pragma region associate BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities with GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE.
// Advertise bidirectional multichannel streaming support by setting the device
// interface property,
// BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities,
// to the newly created device interface.
// See Table 7 "Microsoft-specific codec ID" in Microsoft Bluetooth LE Audio
// IHV Specification for reference.
constexpr BTH_LE_AUDIO_CODEC_ID microsoftLC3CodecId
{
0xff, // Vendor-specific
0x6, // Microsoft
0x6, // LC3
};
constexpr BTH_LE_AUDIO_CODEC_ID microsoftCVSDCodecId
{
0xff, // Vendor-specific
0x6, // Microsoft
0x2, // CVSD
};
// For readability purpose only
constexpr auto SamplingFrequency_None = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_NONE;
constexpr auto SamplingFrequency_16000Hz = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_16000HZ;
constexpr auto SamplingFrequency_24000Hz = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_24000HZ;
constexpr auto SamplingFrequency_32000Hz = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_32000HZ;
constexpr auto SamplingFrequency_48000Hz = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_48000HZ;
constexpr auto SamplingFrequency_All = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_ALL;
// Bidirectional multichannel streaming capabilities
BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY capabilities[]
{
// List of formats supported for 2-channel render with 1-channel capture using
// the LC3 codec:
//
// Render Capture
// (Freq, #Chan) (Freq, #Chan)
// ============= =============
// (16kHz, 2) <---> (16kHz, 1)
// ---------- ----------
// (24kHz, 2) <---> (16kHz, 1)
// (24kHz, 2) <---> (24kHz, 1)
// ---------- ----------
// (32kHz, 2) <---> (16kHz, 1)
// (32kHz, 2) <---> (24kHz, 1)
// (32kHz, 2) <---> (32kHz, 1)
// ---------- ----------
// (48kHz, 2) <---> (16kHz, 1)
// (48kHz, 2) <---> (24kHz, 1)
// (48kHz, 2) <---> (32kHz, 1)
// (48kHz, 2) <---> (48kHz, 1)
//
{
// CodecId
microsoftLC3CodecId,
// IsCodecPresent,
FALSE, // The LC3 codec is in the Bluetooth Controller.
// RenderChannelCount
2,
// CaptureChannelCount
1,
// RenderSamplingFrequencies
SamplingFrequency_All,
// CaptureSamplingFrequencies: List of 1-channel capture sampling
// frequencies compatible with 16kHz, 2-channel render
SamplingFrequency_16000Hz,
// CaptureSamplingFrequencies: List of 1-channel capture sampling
// frequencies compatible with 24kHz, 2-channel render
SamplingFrequency_16000Hz | SamplingFrequency_24000Hz,
// CaptureSamplingFrequencies: List of 1-channel capture sampling
// frequencies compatible with 32kHz, 2-channel render
SamplingFrequency_16000Hz |
SamplingFrequency_24000Hz |
SamplingFrequency_32000Hz,
// CaptureSamplingFrequencies: List of 1-channel capture sampling
// frequencies compatible with 48kHz, 2-channel render
SamplingFrequency_All,
// CaptureSamplingFrequencies: RFU
SamplingFrequency_None,
// CaptureSamplingFrequencies: RFU
SamplingFrequency_None,
// CaptureSamplingFrequencies: RFU
SamplingFrequency_None,
// CaptureSamplingFrequencies: RFU
SamplingFrequency_None,
},
// List of formats supported for 4-channel render with 2-channel capture using
// the CVSD codec:
//
// Render Capture
// (Freq, #Chan) (Freq, #Chan)
// ============= =============
// (16kHz, 4) <---> (16kHz, 2)
// ---------- ----------
// (32kHz, 4) <---> (16kHz, 2)
// (32kHz, 4) <---> (32kHz, 2)
//
{
// CodecId
microsoftCVSDCodecId,
// IsCodecPresent,
TRUE, // The CVSD codec is in the audio DSP.
// RenderChannelCount
4,
// CaptureChannelCount
2,
// RenderSamplingFrequencies
SamplingFrequency_16000Hz | SamplingFrequency_32000Hz,
// CaptureSamplingFrequencies: List of 2-channel capture sampling
// frequencies compatible with 16kHz, 4-channel render
SamplingFrequency_16000Hz,
// CaptureSamplingFrequencies: List of 2-channel capture sampling
// frequencies compatible with 24kHz, 4-channel render
SamplingFrequency_None, // N/A
// CaptureSamplingFrequencies: List of 2-channel capture sampling
// frequencies compatible with 32kHz, 4-channel render
SamplingFrequency_16000Hz | SamplingFrequency_32000Hz,
// CaptureSamplingFrequencies: List of 2-channel capture sampling
// frequencies compatible with 48kHz, 4-channel render
SamplingFrequency_None, // N/A
// CaptureSamplingFrequencies: RFU
SamplingFrequency_None,
// CaptureSamplingFrequencies: RFU
SamplingFrequency_None,
// CaptureSamplingFrequencies: RFU
SamplingFrequency_None,
// CaptureSamplingFrequencies: RFU
SamplingFrequency_None,
}
};
// Call IoSetDeviceInterfacePropertyData to associate the capabilities associated
// with the DEVPKEY.
WDFSTRING wdfSymbolicLinkName;
RETURN_NTSTATUS_IF_FAILED(WdfStringCreate(
nullptr, WDF_NO_OBJECT_ATTRIBUTES, &wdfSymbolicLinkName));
auto deleteWdfStringOnExt = scope_exit([wdfSymbolicLinkName]() -> void
{
WdfObjectDelete(wdfSymbolicLinkName);
});
RETURN_NTSTATUS_IF_FAILED(WdfDeviceRetrieveDeviceInterfaceString(
Device,
&GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE,
&bluetoothLEAudioSupportInterface,
wdfSymbolicLinkName));
UNICODE_STRING symbolicLinkName;
WdfStringGetUnicodeString(wdfSymbolicLinkName, &symbolicLinkName);
RETURN_NTSTATUS_IF_FAILED(IoSetDeviceInterfacePropertyData(
&symbolicLinkName,
&DEVPKEY_BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities,
LOCALE_NEUTRAL,
PLUGPLAY_PROPERTY_PERSISTENT,
DEVPROP_TYPE_BINARY,
sizeof(capabilities), capabilities));
#pragma endregion
return STATUS_SUCCESS;
}
Artigos relacionados
- Extensões de classe de áudio ACX
- Especificação do Perfil de Áudio Básico do Bluetooth
- Especificação do Bluetooth Core 5.3
- Especificação do Serviço de Recursos de Áudio Publicados por Bluetooth
- Especificação do Serviço de Controle de Fluxo de Áudio Bluetooth
- Números Atribuídos por Bluetooth
- Diretrizes de desvio para Bluetooth HFP em drivers de áudio
- Transmissão de áudio com desvio HFP do Bluetooth