Pergunta

Eu estou trabalhando em um aplicativo de áudio, escrito em C. Eu necessidade de oferecer uma reprodução de áudio ao vivo no Windows. Eu preciso decidir qual API de áudio para usar. Estou planejando usar a API básica waveOut , mas eu queria verificar para ver o que a comunidade aqui recomenda.

Eu quero código que vai funcionar em qualquer versão recente do Windows, sem a necessidade de instalar bibliotecas; e eu quero latência mínima.

Eu não precisa ou quer qualquer "efeitos", eu só preciso fielmente jogar o que onda amostras a aplicação gera.

O meu entendimento é que a maioria das aplicações profissionais de áudio no Windows uso ASIO, que dá excelente baixa latência, mas eu não quero ASIO porque eu quero meu código para apenas trabalhar ea maioria das pessoas não têm ASIO pré-instalado em seus computadores. (Numa data posterior eu possa voltar e também adicionar ASIO como uma opção, mas eu estou indo para a solução mais geral pela primeira vez.)

Existe alguma coisa lá fora, que seria melhor do que waveOut para os meus propósitos, ou isso é a melhor escolha?

Foi útil?

Solução

Depende do que você está tentando fazer. A API de áudio básica waveOut é melhor para streaming de áudio. Ele permite que você fila vários buffers e tê-los automaticamente jogado em sucessão. Mas se o áudio está tocando e você quer mudá-lo, ou adicionar algo a ele, que é relativamente difícil.

DirectX áudio é melhor para áudio baseado em eventos. Você pode ter várias coisas tocando ao mesmo tempo sem ter que fazer a mistura-se. Você pode adicionar ou remover pequenos pedaços de áudio facilmente - como tocar um som quando o usuário puxa o gatilho de sua arma. Mas de streaming (ou seja, jogando um tampão após a outra) é mais difícil.

waveOut é projetado para facilitar a reprodução de áudio que é constante, como um arquivo .mp3. DirectX é projetado para áudio que é intermitente, como o feedback em um jogo.

ASIO é como o pior dos waveOut e DirectX em termos de dificuldade de programação. E não é que estável. Aplicações normalmente não podem compartilhar o dispositivo de áudio. Mas dá-lhe o menor acesso latência para que o hardware de áudio.

ASIO também lhe dá uma maneira de reprodução sincronizar em vários dispositivos.

Se você não precisa de ser capaz de mudança o que vai ser jogado para a direita antes de ser jogado, e você não precisa sincronizar vários dispositivos, em seguida, você não precisa ASIO .

Outras dicas

No momento eu fiz esta pergunta, eu escrevi código de streaming usando o waveOut e APIs WaveIn. Desde então, eu descobri uma biblioteca útil:

PortAudio http://www.portaudio.com/

PortAudio é um software livre com uma licença comercial-friendly. Se você escrever seu código para chamar PortAudio ele deve ser capaz de trabalhar com dispositivos WaveOut mas também com dispositivos ASIO no Windows; ele pode ser, em seguida, novamente compilado para Linux e deve funcionar com dispositivos ALSA; e pode então ser recompilados para o Mac e deve funcionar com dispositivos CoreAudio. Eu não testei a parte Mac, mas o meu projeto está trabalhando muito com o Windows e Linux.

Além das opções mencionadas por João Knoeller, há WASAPI que permite latências mais baixas do que WaveOut, mas infelizmente só está disponível a partir do Windows Vista em diante.

Depois de ter escrito uma aplicação de streaming de DirectSound mim, eu certamente recomendo para baixa latência e facilidade de uso. Além disso, ele permite que você definir um formato de maior qualidade para reprodução em edições legadas do Windows.

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