Eksperymentuję właśnie z biblioteką z programowym dekodowaniem MP3 za pomocą biblioteki popularnej libmad. W tej chwili testy wykonuję na Raspberry Pi Pico, ale docelowo będę ją także próbował odpalić na STM32.
Z pozoru korzystanie z biblioteki nie jest skomplikowane. Wystarczy wywołać funkcję mad_decoder_init() z kilkoma parametrami - m.in. adresem struktury przechowującej stan dekodera oraz wskaźnikami do funkcji, które będą wywoływane w określonych sytuacjach (pobieranie danych, obsługa błędu, zapis zdekodowanych danych audio PCM itp.). Następnie należy wywołać funkcję mad_decoder_run(), która będzie w odpowiednich chwilach wywoływała podane funkcje.
Każda z funkcji zwraca enuma określającego co dekoder ma robić dalej: kontynuować pracę (MAD_FLOW_CONTINUE), zignorować ramkę (MAD_FLOW_IGNORE), przerwać dekodowanie i zwrócić błąd (MAD_FLOW_BREAK) lub zakończyć pracę (MAD_FLOW_STOP).
Przykład wykorzystania biblioteki można zobaczyć tutaj:
Funkcje pobierające wyglądają u mnie następująco:
Wyszedłem z założeni, że jeśli funkcję mad_output_callback() zakończę zwracając MAD_FLOW_STOP, to przy kolejnym wywołaniu mad_decoder_run() biblioteka wznowi pracę tam gdzie skończyła i kolejne wywołanie mad_input_callback() otrzyma wskaźnik do kolejnej ranki.
Niestety, ten prosty plan rozbił się o fakt, że te dane są tracone.
Ktoś z was orientuje się może jak wstrzymać dekodowanie do momentu kiedy kolejna porcja danych PCM będzie potrzebna?