Hallo zusammen,
ich nutze eine STM32F4Discovery als Audioplayer und den Code von
Benjamins Robotics
(http://vedder.se/2012/12/stm32f4-discovery-usb-host-and-mp3-player/)
als Basis. Anschluss erfolgt über den Headphone-Ausgang an einen
externen Verstärker.
Der Code spielt mp3 per DMA vom USB-Stick aus. Das erfolgt mit 2
Audio-Puffern entsprechend einer Application Note von ST. Das Abspielen
eines mp3 kann per Taster unterbrochen werden (Sprung zum nächsten mp3).
Je MP3 wird der Audio-Codec vom aktuellen Code:
- Initialisiert (Code geändert, damit mit Lautstärke 0x00 initialisiert
wird)
- DMA eingeschaltet (spielt die Audiodaten ab)
- Interrupt eingeschaltet (schaltet die Puffer um)
- Lautstärke (0x90)
- MP3 wird decoded und gespielt
- Lautstärke (0) (per fade-out)
- Interrupt ausgeschaltet
- DMA ausgeschaltet
Main.c versorgt die Puffer mit Audiodaten. Das alles klappt sehr gut und
mit guter Audio-Qualität. Nun zum Problem:
Bei jedem Wechsel eines mp3 erzeugt der Audio Codec am Kopfhörerausgang
Ein-Ausschalt-Störungen. Ein doch sehr lautes "Knacken" ist zu hören.
Hat hierfür jemand eine Lösung?
Meine erste Idee ist, den Code so umzuschreiben, dass DMA und Interrupt
weiterlaufen (Pointer auf Audio-Daten werden entsprechend auf "0"-Werte
umgelegt). Zudem müsste der Code noch die "verbleibenden" Daten im
Puffer mit 0-Werten füllen, um tatsächlich auch ein "Ende" zu hören,
wenn das Abspielen eines mp3 unterbrochen wird. Wenn ich übrigens nur
die Codec-Initialisierung "InitializeAudio(Audio44100HzSettings)" zu
Beginn in main.c ausführe und aus play_mp3 lösche, ist kein Audio-Output
zu hören. Den Grund hierfür hab per Debugger noch nicht auffinden
können.
Ausschnitt main.c hier; Initialisierungsfunktionen, DMA, etc. in audio.c
anbei.
static FRESULT play_mp3(char* filename) {
...
...
...
// Play mp3
hMP3Decoder = MP3InitDecoder();
InitializeAudio(Audio44100HzSettings);
PlayAudioWithCallback(AudioCallback, 0);
SetAudioVolume(volume);
for(;;) {
Feedmp3Data();
// Out of data or error or user button... Stop playback!
if (br < btr || res != FR_OK) {
// Re-initialize and set volume to avoid noise
SetAudioVolume(0);
StopAudio();
InitializeAudio(Audio44100HzSettings);
// Close currently open file
f_close(&file);
// Return to previous function
break;
}
}
// Stop Playing if Button is pressed!
if (!startfadeout) {
if ((newposition = ReadPosition())) { // Get Keypress
// Start Fadeout
fadevolume = volume;
startfadeout = 1;
}
} else {
if (fadevolume > (MIN_VOLUME - 0x20)) {
fadevolume -= 1;
SetAudioVolume(fadevolume);
Delay(3);
} else {
SetAudioVolume(0);
StopAudio();
InitializeAudio(Audio44100HzSettings);
// Return to previous function
break;
}
}
}
// Free Memory
MP3FreeDecoder(hMP3Decoder);
}
return res;
}
Gruß
Mario