QNA > C > Cosa Va In Un Lettore Audio?

Cosa va in un lettore audio?

Ho scoperto che questa settimana sto lavorando a un aggiornamento del mio lettore audio.

Uso un framework chiamato Harmony 3, per i microcontrollori MIPS (PIC32) e ARM (SAM) a 32 bit della Microchip. Nell'attuale versione del repo audio per Harmony 3 su GitHub, c'è un'applicazione chiamata decoder audio universale che legge i file MP3, WAV o ADPCM da un file system situato su una chiavetta USB o una scheda SD.

Sto facendo un aggiornamento di questa applicazione che includerà tre formati aggiuntivi.

Piuttosto che scrivere i miei decoder, che sarebbe un compito enorme, sto usando quelli open-source. Per esempio, per l'MP3 ne ho usato uno chiamato Helix che ho aggiunto ad Harmony 3 come libreria. Helix è usato nella linea di prodotti RealPlayer, ed è disponibile sotto diverse licenze open-source. Ho poi aggiunto del codice per visualizzare le informazioni nei tag ID3, come il titolo della canzone, l'artista, l'album alla libreria.

I componenti principali di un lettore multimediale sono:

  • B host library, per ospitare un dongle USB con un file system (o)
    SD media card library (per ospitare una scheda SD o micro-SD con un file system)
  • Audio decoder library (WAV, MP3 etc.)
  • Biblioteca audio (driver I2S, driver per periferiche I2S, e driver codec)
  • Biblioteca grafica (se fornisce una GUI)

Ecco uno schema a blocchi dell'applicazione che mostra questi componenti e le loro connessioni, dalla documentazione del mio programma:

main-qimg-eb4d1dc20d228c9eadde8297a029dde7

Questo è l'aspetto del programma nel grafico del progetto MPLAB X Harmony Configurator (MHC):

main-qimg-512c7e54586dc6bc718958a2b0943837

Il terzo superiore sono principalmente i componenti per la GUI. Sono tutti riuniti insieme selezionando un modello grafico per il display (TM4301B). In base al tipo di scheda di sviluppo (PIC32MZ EF Curiosity 2.0), le periferiche appropriate e le assegnazioni dei pin sono selezionate automaticamente.

Poi hai l'audio. Ancora una volta, questo viene portato selezionando un modello audio per il codec AK4954. Ancora una volta in base al tipo di scheda di sviluppo (PIC32MZ EF Curiosity 2.0), le periferiche appropriate (I2C1 e I2S2) sono selezionate automaticamente.

In fondo ci sono i componenti per l'interfaccia host USB per un thumb drive (MSD=mass storage device), insieme a un file system.

I blocchi STDIO e UART nell'angolo in basso a sinistra non sono in realtà parte dell'applicazione, ma piuttosto aggiunti per il debug - qualsiasi output tramite un'istruzione printf nel mio codice viene inviato tramite la porta di debug a una porta COM virtuale sul mio PC dove posso visualizzarlo con un programma terminale come RealTerm.

Molti dei componenti hanno opzioni di configurazione; io ho selezionato il codec AK4954 (contorno in verde nel grafico del progetto) e il suo menu di configurazione è mostrato sul lato destro.

Una volta che tutti i componenti sono stati selezionati, premendo un pulsante Code si genera tutto il codice per i componenti mostrati. Si deve poi solo scrivere l'applicazione che lega tutto insieme - rispondendo a eventi come l'inserimento della chiavetta USB (causando la lettura della directory), rispondendo ai pulsanti dell'utente nell'interfaccia grafica che vengono premuti (play/pausa, avanzamento veloce, volume, ecc.). Ancora una discreta quantità di lavoro.

L'applicazione deve anche aprire il file selezionato, passarlo al decodificatore appropriato (come l'MP3), e poi passare i campioni PCM decodificati al DMA che alimenterà il codec sul bus I2S.

Tutto il codice della versione attuale di questa applicazione è disponibile nel repo GitHub collegato in precedenza.

L'applicazione gira sia su un microcontrollore MIPS (PIC32MZ2048EFM144) che ARM (ATSAME70Q21B), con esattamente lo stesso codice applicativo - tutte le differenze nel codice sorgente sono nei driver e nelle librerie di periferiche il cui codice è generato automaticamente da Harmony dal grafico del progetto e dal menu di configurazione associato.

Qui c'è una foto che gira sulla scheda PIC32MZ EF Curiosity 2.0. Il codec AK4954 è sulla daughterboard in alto a destra dell'immagine.

main-qimg-a7900416925b461bc1bbcd0a20744bba-mzj

Di Scrope Buckhanan

Qual è la differenza tra un feeder e una linea di trasmissione? :: Qual è il massimo assorbimento di corrente delle periferiche consentito in Raspberry Pi 4?
Link utili