Casa > U > Um Dispositivo Leitor De Mp3 Tem Um Driver De Áudio?

Um dispositivo leitor de MP3 tem um driver de áudio?

Apenas há alguns meses atrás, escrevi o código de um leitor de MP3 para o framework Harmony 3 do Microchip, que suporta os seus microcontroladores MIPS (PIC32) de 32 bits e ARM (SAM).

Aqui está o diagrama de blocos do leitor:

main-qimg-cadb4abe76d9f118444d2a9a50001cba

Os principais componentes de um media player são:

  • >li>USB host library, para hospedar um dongle USB com um sistema de arquivos (ou)
    SD media card library (para hospedar um cartão SD ou micro-SD com um sistema de arquivos)li>li>Audio decoder library (WAV, MP3 etc.)
  • Biblioteca de áudio (driver I2S, driver periférico I2S, e driver de codec)>li>li>Biblioteca de gráficos (se fornecer uma GUI)
p> Este leitor lê arquivos de um dongle USB, mostrado na parte inferior esquerda do diagrama, mas eu também tenho uma versão que lê arquivos de um cartão SD.

Os arquivos MP3 são lidos e decodificados usando a biblioteca de decodificadores de áudio MP3 (em verde), em um fluxo PCM. Isto é então alimentado para o Codec Driver AK4954 (em azul) que envia o áudio digital usando um protocolo I2S através de um driver I2S (azul) e periférico (preto) para o Codec AK4954 externo, que converte o fluxo I2S em saída analógica para um par de auscultadores.

Rather do que escrever o meu próprio descodificador MP3, o que seria uma tarefa enorme, usei um de código aberto chamado Helix que adicionei ao Harmony 3 como biblioteca. O Helix é usado na linha de produtos RealPlayer, e está disponível sob várias licenças open-source. Eu então adicionei código para mostrar as informações nas tags ID3, como o título da música, artista, álbum à biblioteca.

Esta é a aparência do programa no gráfico do projeto MPLAB X Harmony Configurator (MHC) do Harmony:

main-qimg-512c7e54586dc6bc718958a2b0943837

O terço superior são principalmente os componentes para a GUI. Todos eles são reunidos selecionando um modelo gráfico para o display (TM4301B). Baseado no tipo de placa de desenvolvimento (PIC32MZ EF Curiosity 2.0), os periféricos apropriados e as atribuições de pinos) são selecionados automaticamente.

P>Próximo você tem o áudio. Novamente, isto é trazido pela seleção de um modelo de áudio para o codec AK4954. Novamente baseado no tipo de placa de desenvolvimento (PIC32MZ EF Curiosity 2.0), os periféricos apropriados (I2C1 e I2S2) são selecionados automaticamente.

Na parte inferior estão os componentes para a interface do host USB para um drive de polegar (MSD=mass storage device), juntamente com um sistema de arquivos.

Os blocos STDIO e UART no canto inferior esquerdo não fazem realmente parte da aplicação, mas são adicionados para depuração - qualquer saída através de uma declaração printf no meu código é enviada através da porta de depuração para uma porta COM virtual no meu PC, onde posso vê-la com um programa terminal como o RealTerm.

Muitos dos componentes têm opções de configuração; eu selecionei o codec AK4954 (esquema em verde no gráfico do projeto) e seu menu de configuração é mostrado no lado direito.

Após todos os componentes terem sido selecionados, pressionando um botão Code gera todo o código para os componentes mostrados. Em seguida, é preciso escrever a aplicação ligando tudo isso - respondendo a eventos como a unidade USB sendo inserida (fazendo com que o diretório seja lido), respondendo aos botões do usuário na GUI sendo pressionada (play/pause, fast forward, volume, etc.).

A aplicação também tem que abrir o arquivo selecionado, passá-lo para o decodificador apropriado (como MP3), e então passar as amostras decodificadas do PCM para o DMA que alimentará o codec através do barramento I2S.

Todo o código para a aplicação está disponível num repo.

Eu tenho esta aplicação a correr num microcontrolador MIPS (PIC32MZ2048EFM144) e ARM (ATSAME70Q21B), com exactamente o mesmo código da aplicação - todas as diferenças no código fonte estão nos drivers e bibliotecas periféricas cujo código é gerado automaticamente pelo Harmony a partir do gráfico do projecto e do menu de configuração associado.

Aqui está uma imagem dele a correr na placa PIC32MZ EF Curiosity 2.0. O codec AK4954 está na placa filha no canto superior direito da imagem.

main-qimg-a7900416925b461bc1bbcd0a20744bba-mzj

De Thorn

Quais são os 10 melhores diálogos de filmes em inglês? :: Qual é a linha mais complexa do código C que você criou ou encontrou?