1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
1

[Решено]STM32F4 + Helix mp3 не кодирует некоторые mp3

11.11.2013, 22:55. Показов 12023. Ответов 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();
}
}
Подправил алгоритм, чтобы подгружал следующий буфер, если не найден фрейм. Нашёл первый фрейм, декодер MP3Decode выдал ошибку Invotyd frami. Что я делаю не так?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2013, 22:55
Ответы с готовыми решениями:

[Решено] STM32F4 + MP3 Player + I2C уходит в hard fault
Добрый вечер! Есть проект с STM32F4Dyscovery. На FSMC шине висит LCD (контроллер T6963C). STM32F4...

STM32F4Discovery audio mp3 Helix
Здравствуйте. Кто-нибудь может доходчиво и понятно объяснить принцип воспроизведения mp3 песни при...

STM32F4 mp3 player + регулятор тембра
Добрый день. Пилю проект mp3 плеера на STM32F4Dyscovery. Спасибо огромное товарищу MykiSmith...

[Решено] Энумерация файлов на флешке для mp3 плеера.
Добрый день! Не совсем профильный топик, но: Как происходит энумерация файлов на флешке для mp3...

18
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,520
12.11.2013, 18:44 4
Я тоже хочу!
Поделитесь исходниками, плиз!!!
Проект под кокос для досточки дискавери?

Очень, очень хочу!!!
0
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
12.11.2013, 20:17 5
Цитата Сообщение от Pymkvym
Проект под кокос для досточки дискавери?
После того, как я не смог запустить USB MSC Host под Кокос, я от него отказался. Проект под Keil + RTX. Досточка дискавери с доработками:
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,520
12.11.2013, 20:28 6
Спасибо!
Буду разбираться!
Это с флешки читает, верно?

А что такое RTX?

Еще раз простите - звук как выводиться?
Через ЦАП контроллера?
Или через внешний ЦАП?
0
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
12.11.2013, 20:34 7
Цитата Сообщение от Pymkvym
Спасибо!
Буду разбираться!
Это с флешки читает, верно?

А что такое RTX?
Читает файлы с флешки. Ограничения до 255 файлов в папке. До 10 папок на флешке (включая root). Длинна пути к файлу не более 255 символов.
RTX? - ОС (операционная система для микроконтроллеров)
Звук выводится через ЦАП CS43L22 на Dyscovery.
Дисплей через FSMC - RA6963C (240x128 точек. монохром).
Клавиатура (6 кнопок) через I2C на МС23016.
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
12.11.2013, 20:48 8
Ничего себе, наворотили! :-)
Я столько сразу не съем!

Кстати, попробовал выводить звук через ЦАП контроллера - намного громче, чем через внешнюю микруху.
И качество вполне (есть небольшой шум дисретизации).
Даже не знаю, зачем внешний ЦАП на досточку поставил - разве что интерфейс поизучать...
0
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
12.11.2013, 20:55 9
Цитата Сообщение от Pymkvym
Кстати, попробовал выводить звук через ЦАП контроллера - намного громче, чем через внешнюю микруху.
И качество вполне (есть небольшой шум дисретизации).
Добавьте громкости на внешней микрухе. Качество у кодека должно быть выше.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
12.11.2013, 21:18 10
Цитата Сообщение от Pymkvym
Даже не знаю, зачем внешний ЦАП на досточку поставил - разве что интерфейс поизучать...
Достаточно открыть даташит CS43L22 на первой странице.
Ввод цифрового звука.
Ввод аналогового звука.
Вывод аналогового звука.
Микшер.
УНЧ.
Генератор музыкальных тонов.

Достаточно? :-)
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
Цитата Сообщение от Pymkvym
Даже не знаю, зачем внешний ЦАП на досточку поставил - разве что интерфейс поизучать...
Ну попробуйте даже WAV играть через ЦАП процессора. Добавьте к нему цифровое управление громкостью, усилитель для наушников/динамиков и проч ...
Кстати к дискавери есть пример, который умеет играть музыку через ЦАП проца. Но я его не проверял :) .

__bt__, рад, что оно Вам помогло.
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
13.11.2013, 08:17 13
Цитата Сообщение от OtyxPM
Цитата Сообщение от Pymkvym
Даже не знаю, зачем внешний ЦАП на досточку поставил - разве что интерфейс поизучать...
Достаточно открыть даташит CS43L22 на первой странице.
Ввод цифрового звука.
Ввод аналогового звука.
Вывод аналогового звука.
Микшер.
УНЧ.
Генератор музыкальных тонов.

Достаточно? :-)

Помимо даташитов есть суровая правда жизни!
Активные колонки еле слышно при использовании внешней ЦАП.
С цифрового микрофона запись - гуано, простите за мой французский!
Какие то "заикания" и щелчки.

Досточку то я не критикую - сам от неё в экстазе!

Просто люблю достаточный минимализм. ;-)
0
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
13.11.2013, 08:20 14
Цитата Сообщение от hd44780
Цитата Сообщение от Pymkvym
Даже не знаю, зачем внешний ЦАП на досточку поставил - разве что интерфейс поизучать...
Ну попробуйте даже WAV играть через ЦАП процессора. Добавьте к нему цифровое управление громкостью, усилитель для наушников/динамиков и проч ...
Кстати к дискавери есть пример, который умеет играть музыку через ЦАП проца. Но я его не проверял :) .

__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,520
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,520
13.11.2013, 11:30 18
Цитата Сообщение от Ftopyx
CS43L22 просто разрывает наушники, не пойму в чем у вас проблема с громкостью. Возможно все таки громокость по умолчанию на этом чипе в вашем проекте задана слишком низкая.
Я активные колонки подключал.
Спасибо за подсказку!
А как её увеличить?
Хочу ещё раз попробовать.
Проект не мой - пример для досточки.
0
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
13.11.2013, 14:24 19
В том проекте, что выложил я регулируется громкость, эквалайзер НЧ И ВЧ.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2013, 14:24

[РЕШЕНО] STM32F4 и PS/2 мышь
Сейчас пользуюсь драйвером немца - http://mykrosontroller.bplosid.net/word ... age_id=744 Один...

[РЕШЕНО] STM32F4 HardFault и CooCox
Добрый вечер! Как найти причину HordFault в STM32F4? Среда отладки CooCox

[Решено] STM32F4 и CAN сообщения (приём)
Добрый день. Собираю на контроллере STM32F407Dyscovery сниффер CAN шины. Настроены прерывания на...

STM32F4 + EXTI0 завсисание [РЕШЕНО]
Собственно я уже устал искать ошибку. Суть проблемы следующая: Кнопкой на отладке генерирую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru