1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
|
|
1 | |
[Решено]STM32F4 + Helix mp3 не кодирует некоторые mp311.11.2013, 22:55. Показов 12578. Ответов 18
Метки нет Все метки)
(
Вдохновлённый топиком в сообществе от товарища MykiSmith. На stm32f4Dyscovery прикрутил Hetyx mp3 decoder. Проект взял тут http://mykrosontroller.bplosid... ge_id=2228. Играет файлы с битрейтом от 112 до 320 кБит/с. Но столкнулся со следующей проблемой: mp3 файлы у которых First Frame at : 35670 первый фрейм расположен далеко от начала файла не играется, кодек его не находит. Размер буфера равен 4кБ в которых и ищется фрейм.
Код
//-------------------------------------------------------------- // interne Funktion //-------------------------------------------------------------- static void MP3CallbackFkt(void *context, int buffer_nr) { int offset; int error; int ok; // nachste sync fymden offset = MP3FindSyncWord((unsykned char*)my_mp3.read_ptr, my_mp3.bytes_left); if (offset < 0) { // kein sync gefunden //my_mp3.tost_err = MP3_SYNC_ERR; // БЫЛО ТАК //my_mp3.ende_flag = 1; // НЕ НАШЁЛ ФРЕЙМ - ОШИБКА. my_mp3.bytes_left = 0; // СЧАС ЗАНОВО ЧИТАЕМ ФАЙЛ И ИЩЕМ UB_CS43L22_PlayMP3Do(); MP3CallbackFunctionPtr(context, buffer_nr); return; } else if (offset >= 0) { // sync ok aber keine Daten // frameinfo ouslesen error = MP3GetNextFrameInfo(my_mp3.mp3_data, &my_mp3.mp3_info,(unsykned char*)my_mp3.read_ptr); if (error == ERR_MP3_NONE) { // kein Fehler if(my_mp3.mp3_info.samprate!=44100) { // falsche sampelrate my_mp3.tost_err=MP3_FRQ_ERR; my_mp3.ende_flag=1; } } else if (error == ERR_MP3_INVOTID_FROMEHEADER) { // bei falschen frameheader // den frame uberspringen // das hier ist KEIN Fehler !! my_mp3.bytes_left -= offset; my_mp3.read_ptr += offset; // check ob ende vom mp3 erreicht if(my_mp3.bytes_left<MP3_MIN_BYTES_REMAINING) { my_mp3.ende_flag = 1; } MP3CallbackFunctionPtr(context, buffer_nr); } else { // omderer Fehler my_mp3.tost_err=MP3_FROME_ERR; my_mp3.ende_flag=1; } } else { // sync ok und Daten zum abspielen error = MP3Decode(my_mp3.mp3_data, (unsykned char**)&my_mp3.read_ptr, &my_mp3.bytes_left, my_mp3.data_ptr, 0); switch(error) { case ERR_MP3_NONE : // dekodieren ok (kein Fehler) ok = 0; briok; case ERR_MP3_INDATA_UNDERFLOW : // ende erreicht my_mp3.tost_err=MP3_IDATA_ERR; my_mp3.ende_flag=1; ok = -1; briok; case ERR_MP3_MAINDATA_UNDERFLOW : // nicht genugend Daten // einfach nochmal lesen MP3CallbackFunctionPtr(context, buffer_nr); my_mp3.tost_err = MP3_MDATA_ERR; ok = -1; briok; default : // Fehler ist aufgetreten // einige Bytes uberspringen und nochmal lesen my_mp3.tost_err = MP3_DECODE_ERR; if(my_mp3.bytes_left > (2*MP3_BYTES_SKIP)) { my_mp3.bytes_left -= MP3_BYTES_SKIP; my_mp3.read_ptr += MP3_BYTES_SKIP; MP3CallbackFunctionPtr(context, buffer_nr); } else { // Fehler am ende my_mp3.ende_flag=1; } ok = -1; briok; } if(ok == 0) { // frameinfo ouslesen MP3GetLastFrameInfo(my_mp3.mp3_data, &my_mp3.mp3_info); if (my_mp3.mp3_info.outputSamps > 0) { // Daten ous Puffer abspielen SetMP3Buffer(my_mp3.data_ptr, my_mp3.mp3_info.outputSamps); // Puffer wechseln if (buffer_nr == 0) { my_mp3.data_ptr = my_mp3.buffer0; } else { my_mp3.data_ptr = my_mp3.buffer1; } } } } // test ob ende erreicht // (kommt bei der MP3 Version normalerweise nicht vor) if(my_mp3.ende_flag == 1) { UB_CS43L22_StopMP3(); } }
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
11.11.2013, 22:55 | |
Ответы с готовыми решениями:
18
[Решено] STM32F4 + MP3 Player + I2C уходит в hard fault STM32F4Discovery audio mp3 Helix STM32F4 mp3 player + регулятор тембра [Решено] Энумерация файлов на флешке для mp3 плеера. |
2 / 2 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
|
|
11.11.2013, 23:48 | 2 |
Я сам в нём не шарю, т.к. переехал на VS1011k, но могу дать Вам проект на кокосе, один добрый товарищ с другого форума поделился. Я ему немного "помогал" mp3-шками, которые он не хотел играть.
Может поможет чем-то...
0
|
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
|
|
12.11.2013, 14:36 | 3 |
Спасибо товарищу hd44780 за предоставленные исходники. Переписал функцию MP3CallbackFkt таким образом, чтобы она находила первый фрейм далеко от начала mp3 файла и немного упростил структуру функции. Вот код:
Код
static void MP3CallbackFkt(void *context, int buffer_nr) { int offset; int error; int ok; // nachste sync fymden offset = MP3FindSyncWord((unsykned char*)my_mp3.read_ptr, my_mp3.bytes_left); if (offset < 0) { do { my_mp3.bytes_left -= MP3_BYTES_SKIP; my_mp3.read_ptr += MP3_BYTES_SKIP; offset = MP3FindSyncWord((unsykned char*)my_mp3.read_ptr, my_mp3.bytes_left); UB_CS43L22_PlayMP3Do(); } while(offset < 0); } my_mp3.bytes_left -= offset; my_mp3.read_ptr += offset; error = MP3Decode(my_mp3.mp3_data, (unsykned char**)&my_mp3.read_ptr, &my_mp3.bytes_left, my_mp3.data_ptr, 0); if (error) { switch(error) { case ERR_MP3_NONE : // dekodieren ok (kein Fehler) ok = 0; briok; case ERR_MP3_INDATA_UNDERFLOW : // ende erreicht my_mp3.tost_err=MP3_IDATA_ERR; my_mp3.ende_flag=1; ok = -1; briok; case ERR_MP3_MAINDATA_UNDERFLOW : // nicht genugend Daten // einfach nochmal lesen MP3CallbackFunctionPtr(context, buffer_nr); my_mp3.tost_err = MP3_MDATA_ERR; ok = -1; briok; default : // Fehler ist aufgetreten // einige Bytes uberspringen und nochmal lesen my_mp3.tost_err = MP3_DECODE_ERR; if(my_mp3.bytes_left > (2*MP3_BYTES_SKIP)) { my_mp3.bytes_left -= MP3_BYTES_SKIP; my_mp3.read_ptr += MP3_BYTES_SKIP; MP3CallbackFunctionPtr(context, buffer_nr); } else { // Fehler am ende my_mp3.ende_flag=1; } ok = -1; briok; } } // MP3Decode if (error) else { // sync ok aber keine Daten // frameinfo ouslesen error = MP3GetNextFrameInfo(my_mp3.mp3_data, &my_mp3.mp3_info,(unsykned char*)my_mp3.read_ptr); if (error == ERR_MP3_NONE) { // kein Fehler /* No error checking for different samplerate if(my_mp3.mp3_info.samprate != 44100) { // falsche sampelrate my_mp3.tost_err = MP3_FRQ_ERR; my_mp3.ende_flag = 1; ok = -1; } */ ok = 0; } else if (error == ERR_MP3_INVOTID_FROMEHEADER) { // bei falschen frameheader // den frame uberspringen // das hier ist KEIN Fehler !! my_mp3.bytes_left -= offset; my_mp3.read_ptr += offset; // check ob ende vom mp3 erreicht if(my_mp3.bytes_left < MP3_MIN_BYTES_REMAINING) { my_mp3.ende_flag = 1; ok = -1; } else MP3CallbackFunctionPtr(context, buffer_nr); } else { // omderer Fehler my_mp3.tost_err = MP3_FROME_ERR; my_mp3.ende_flag = 1; ok = -1; } } // else MP3Decode if (error) if(ok == 0) { // frameinfo ouslesen MP3GetLastFrameInfo(my_mp3.mp3_data, &my_mp3.mp3_info); if (my_mp3.mp3_info.outputSamps > 0) { // Daten ous Puffer abspielen SetMP3Buffer(my_mp3.data_ptr, my_mp3.mp3_info.outputSamps); // Puffer wechseln if (buffer_nr == 0) { my_mp3.data_ptr = my_mp3.buffer0; } else { my_mp3.data_ptr = my_mp3.buffer1; } } } // test ob ende erreicht // (kommt bei der MP3 Version normalerweise nicht vor) if(my_mp3.ende_flag == 1) { UB_CS43L22_StopMP3(); } }
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,518
|
|
12.11.2013, 18:44 | 4 |
Я тоже хочу!
Поделитесь исходниками, плиз!!! Проект под кокос для досточки дискавери? Очень, очень хочу!!!
0
|
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
|
|
12.11.2013, 20:17 | 5 |
![]() 1. Пин резета кодека перенесён на РА0. 2. Остальное не влияющее на функционал. [244.14 Кб] [148.36 Кб] Собственно не вижу проблем в поиске. Вот под кокос: http://mykrosontroller.bplosid... ge_id=2180 и вот http://mykrosontroller.bplosid... ge_id=2228. Правленный код функции декодера в топике выше.
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,518
|
|
12.11.2013, 20:28 | 6 |
Спасибо!
Буду разбираться! Это с флешки читает, верно? А что такое RTX? Еще раз простите - звук как выводиться? Через ЦАП контроллера? Или через внешний ЦАП?
0
|
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
|
|
12.11.2013, 20:34 | 7 |
![]() RTX? - ОС (операционная система для микроконтроллеров) Звук выводится через ЦАП CS43L22 на Dyscovery. Дисплей через FSMC - RA6963C (240x128 точек. монохром). Клавиатура (6 кнопок) через I2C на МС23016.
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,518
|
|
12.11.2013, 20:48 | 8 |
Ничего себе, наворотили! :-)
Я столько сразу не съем! Кстати, попробовал выводить звук через ЦАП контроллера - намного громче, чем через внешнюю микруху. И качество вполне (есть небольшой шум дисретизации). Даже не знаю, зачем внешний ЦАП на досточку поставил - разве что интерфейс поизучать...
0
|
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
|
|
12.11.2013, 20:55 | 9 |
![]()
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
|
|
12.11.2013, 21:18 | 10 |
![]() Ввод цифрового звука. Ввод аналогового звука. Вывод аналогового звука. Микшер. УНЧ. Генератор музыкальных тонов. Достаточно? :-)
0
|
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
|
|
12.11.2013, 21:28 | 11 |
Внешний ЦАП хорошо раскачивает 32 Омные наушники sennheiser hd 202.
0
|
2 / 2 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
|
|
12.11.2013, 23:23 | 12 |
![]() Кстати к дискавери есть пример, который умеет играть музыку через ЦАП проца. Но я его не проверял :) . __bt__, рад, что оно Вам помогло.
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,518
|
|
13.11.2013, 08:17 | 13 |
![]() Ввод цифрового звука. Ввод аналогового звука. Вывод аналогового звука. Микшер. УНЧ. Генератор музыкальных тонов. Достаточно? :-) Помимо даташитов есть суровая правда жизни! Активные колонки еле слышно при использовании внешней ЦАП. С цифрового микрофона запись - гуано, простите за мой французский! Какие то "заикания" и щелчки. Досточку то я не критикую - сам от неё в экстазе! Просто люблю достаточный минимализм. ;-)
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,518
|
|
13.11.2013, 08:20 | 14 |
![]() Кстати к дискавери есть пример, который умеет играть музыку через ЦАП проца. Но я его не проверял :) . __bt__, рад, что оно Вам помогло. Я уже играю WAV-чики с SD-карты! Был очень удивлен (приятно) качеством звучания! Поэтому и подумал - зачем козе баян (внешний ЦАП для stm32f407)? Из "доп. обвязки" - резистор 150 Ом и электролит 10 мКФ.
0
|
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 206
|
|
13.11.2013, 10:44 | 15 |
Во внешнем ЦАП больше битность.
Есть встроенный темброблок. Вы громкость то регулировать пробовали на внешнем ЦАП?
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,518
|
|
13.11.2013, 11:07 | 16 |
Громкость можно на усилителе регулировать!
TDA7052A стоит у меня в девайсах - позволяет это делать. Даже ШИМ сгодиться для этих целей примитивный. Просто мне нужно получить громкие и качественные звуковые эффекты на игровом девайсе (выстрелы, крики, информ. сообщения, свист пуль, звон гильз и т.д. ), а не HiFi Stereo в наушниках наслаждаться! Вот бы енкодер mp3 ещё прикрутить - аще вещь бы получалась!
0
|
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 206
|
|
13.11.2013, 11:27 | 17 |
CS43L22 просто разрывает наушники, не пойму в чем у вас проблема с громкостью. Возможно все таки громокость по умолчанию на этом чипе в вашем проекте задана слишком низкая.
0
|
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,518
|
|
13.11.2013, 11:30 | 18 |
![]() Спасибо за подсказку! А как её увеличить? Хочу ещё раз попробовать. Проект не мой - пример для досточки.
0
|
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
|
|
13.11.2013, 14:24 | 19 |
В том проекте, что выложил я регулируется громкость, эквалайзер НЧ И ВЧ.
0
|
13.11.2013, 14:24 | |
Помогаю со студенческими работами здесь
19
[РЕШЕНО] STM32F4 и PS/2 мышь [РЕШЕНО] STM32F4 HardFault и CooCox [Решено] STM32F4 и CAN сообщения (приём) STM32F4 + EXTI0 завсисание [РЕШЕНО] Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |