Pergunta

Estou desenvolvendo um aplicativo que entre outras coisas, enumera todos os dispositivos de áudio de entrada (usando SetupAPI) e, em seguida, para cada dispositivo de áudio, ele lista todas as linhas de áudio de entrada (usando winmm.dll).

Basicamente, a maneira que eu estou relacionando os dois está recebendo o caminho do dispositivo a partir do dispositivo de áudio e, em seguida, usando waveInMessage para comparar caminho do dispositivo da linha de áudio.

Agora, eu quero ser capaz de fazer o mesmo com a janelas padrão [entrada] linha de áudio (WAVE_MAPPER).

O problema é que o uso de waveInGetDevCaps para WAVE_MAPPER retorna "Microsoft mapeador de som", e usando waveInMessage com DRV_QUERYDEVICEINTERFACE retorna uma string vazia.

Todas as sugestões sobre como descobrir qual dispositivo da Microsoft Mapper é mapeamento para?

Foi útil?

Solução 3

Por favor me corrija se eu estiver errado, mas eu tenho assistido alguns vídeos de conferências da Microsoft anteriores sobre o desenvolvimento de som. Na mais recente de Larry Osterman, ele menciona novo som apresenta em [acredito] Windows 7 que a sua equipa trabalhou.

Uma das características era [o nome é a minha interpretação] "dispositivo de troca a quente". Digamos que a sua aplicação é reproduzir usando o endpoint "reprodução de som padrão do Windows", e que, neste momento, é um conjunto de fones de ouvido USB. De repente você se desconectar os fones de ouvido. Até o Windows 7, o seu pedido deixaria de funcionar [se você não previu que o cenário de teste]. No Windows 7 [e aqui está o gancho para o assunto original], se você estiver usando o dispositivo de reprodução padrão do Windows, o Windows normalmente e automaticamente irá trocar o fluxo de saída para o novo padrão, que poderiam ser os alto-falantes.

O que eu estou tentando chegar, é que eu estou tentando encaixar o dispositivo WAVE_MAPPER em uma classe onde não é suposto ser. Talvez, conceitualmente falando, o WAVE_MAPPER apesar de ter a mesma capacidade de entrada de fluxo e saída de áudio, deve ser tratado como uma exceção.

Eu vou tentar ser mais concreto. Na minha aplicação, eu tenho uma lista de dispositivos de áudio, e cada dispositivo de áudio tem uma lista de linhas de áudio. dispositivos de áudio tem propriedades como VID e PID que são facilmente detectável através da SetupAPI e podem estar relacionados com linhas de áudio via waveInMessage de Winmm. não WAVE_MAPPER não seguem essa lógica e eu estava tentando fazê-lo fazer.

Então, ao invés de tentar relacionar o WAVE_MAPPER com o seu dispositivo de áudio subjacente, eu só irá tratá-lo como o que é:. O dispositivo de áudio padrão

Outras dicas

O dispositivo que WAVE_MAPPER é mapeado para depende dos parâmetros passados ??para waveInOpen. A partir da documentação:

WAVE_MAPPER -. Os Seleciona a função de um dispositivo de entrada de forma de onda de áudio capaz de gravar no formato especificado

Isto significa que você não pode verificar as propriedades do dispositivo sem realmente abrir. Uma vez que você abri-lo, você deve ser capaz de obter o ID do dispositivo real com waveInGetID.

Bem, para que eu encontrei DirectSound para ser muito mais fácil e com muito menos XP para o Vista em situação irregular esquisitices (e curiosidades muito menos sem documentos em geral).

Mas, provavelmente, a única maneira de você resolver isso é para enumerar todos os outros dispositivos e veja qual combina a um WAVE_MAPPER.

Honestamente ... uso DirectSound ou, se você é capaz de fazer o Vista e Windows 7, apenas, use a API Core Audio. Winmm é uma API antiga e estava muito quebrado quando foi introduzido pela primeira vez ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top