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:
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)
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:
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.
Artigos semelhantes
- Um rádio de presunto pode enviar áudio para um leitor de mp3 ou qualquer outro dispositivo que reproduza áudio ou que tenha um altifalante?
- Como corrigir um problema de áudio no Ubuntu 18 no qual todo o áudio, exceto aqueles conectados à tomada de áudio, funciona
- Qual é a melhor qualidade de música, MP3 convertido no YouTube ou MP3 baixado pago?
- Como corrigir o formato do meu MP3 player não suportado, mesmo que eu use MP3 como extensão da minha música