Страница 1 из 88

ESP32-Radiola/Радиола-2 - Музыкальный центр на ESP32 своими руками

Добавлено: 19 окт 2019, 07:10
SinglWolf
ESP32-Radiola - Проект создания многофункционального музыкального центра под управлением ESP32 своими руками.

Чтобы видеть ссылки в теме - надо зарегистрироваться и иметь 1 пост на форуме. Для этого есть КУРИЛКА и там тема Здрасти.

Радиола-2 версия 3.0
Пока для ESP32-S3 16M flash 8M PSRAM
и PCM5102A
► Показать



Адреса загрузки файлов для 16 mB флешки!
  • bootloader.bin 0x000000
  • partitions.bin 0x008000
  • factory.bin 0x030000
  • fatfs.bin 0x831000
factory.bin - файл прошивки!


Beta 16.1.8
Beta 16.4.0
Beta 17.0.0
Beta 18.0.5
Схема и распиновка
Подключение SD-карты к ESP32-S3
Команда в консоли для первого подключения к WI-FI:

Код: Выделить всё

wifi.con("ssid","password")
sys.boot
ДЕМО ВЕБ-ИНТЕРФЕЙСА РАДИОЛЫ
Radiola-2 - Часто задаваемые Вопросы (ЧАВО)
Файл с логом присылайте сюда. Удачи! :-)

-->ОБЪЯВЛЕНИЕ<--


Радиола-1
Для просмотра ссылок Вы должны быть авторизованы на форуме.

Текущая версия: 2.2 Rev: 5.
  • binaries.zip
    релизная и отладочная версии
    (1.38 МБ) 798 скачиваний
    Адреса загрузки:
    • bootloader.bin - 0x1000
    • partitions.bin - 0x8000
    • ESP32Radiola(-release или -debug).bin - 0x10000
    • ESP32Radiola(-release или -debug).bin - 0x200000
ПРОШИВАТЬ НА ЧИСТУЮ FLASH!
Команда в консоли для первого подключения к WI-FI:
► Показать
Радиола-2 с новой графикой и поддержкой HTTPS
Схемы Радиолы-2.1
НОВЫЕ ВЕРСИИ (NEW VERSIONS):
  • Implemented multilingual support. By default, the Russian language.
  • Added English. Language selection in the web interface of the OPTIONS tab.
Проект Радиола-S2 на ESP32-S2-WROVER

Веб-интерфейс в браузере Опера, IE, Edge - НЕ РАБОТАЕТ.
Веб-интерфейс ТОЧНО РАБОТАЕТ в Яндекс-браузере, Гугл-хром.
Радиола-2 на ESP32-WROOM НЕ РАБОТАЕТ!

Принципиальные схемы Радиола-2
Старые прошивки Радиолы-2 и Радиолы-S2

Плейлист для примера (с 1 станцией по протоколу https для проверки):
образец.m3u
(387 байт) 191 скачивание
подробности под спойлером
► Показать
Используемое железо (HARDWARE)
► Показать
Фото и видео под спойлером.
► Показать
Пишите, спрашивайте, не стесняйтесь..

Re: Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 21 окт 2019, 08:16
kulia
Круто! Где купить/цена проекта в студию! 👍

Re: Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 21 окт 2019, 09:01
SinglWolf
kulia писал(а):
21 окт 2019, 08:16
Круто! Где купить/цена проекта в студию! 👍
Алиэкспресс, Ebay - самые дешёвые варианты. Только надо внимательно покупать. :-) Ну, а цена вопроса... Блин. Я все компоненты приобретал постепенно.
300р. - ESP32 (с внешней доп. ОЗУ)
400р. - VS1053B MP3 модуль для интернет-радио и проигрывания файлов с sd-карты. (музыка, будильник, говорящие часы)
700. - дисплей (самый дорогой компонент)
400р. - 2 платы усилителя мощности.
100р. - аудиопроцессор (я выдрал со старой автомагнитолы)
60р. - ИК-пульт с ик-приёмником в комплекте. (У меня пульт и приёмник от старого телевизора Goldstar)
Основную печатную плату заказал на PCBWay. Первый заказ на 5$ бесплатно, оплата только за доставку.

А если есть старая автомагнитола, муз. центр, телевизор, то много чего можно использовать в проекте.
Пишите название модели аппарата, подскажу что можно раскурочить. :-D

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 25 янв 2020, 01:22
Nadim
Немного перевел с китайского (гуглом) описание модуля BT201
Для просмотра ссылок Вы должны быть авторизованы на форуме.

На ESP32 есть проекты с MP3 аудио плеером - может можно перенести MP3 плеер в этот проект:

ogo-shell - это файловый браузер, аудио плеер и программа просмотра изображений для ODROID-GO ESP32
Для просмотра ссылок Вы должны быть авторизованы на форуме.

Еще один проект на ESP32 где используется только аудио плеер от проекта ogo-shell
Для просмотра ссылок Вы должны быть авторизованы на форуме.
Для просмотра ссылок Вы должны быть авторизованы на форуме.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 14 дек 2020, 12:57
folks
Я так понял , что поддержки PCM 5102 в этом проекте нет ?

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 14 дек 2020, 13:51
Dust112
Немного по железу. Расширить количество пинов для увеличения функционала можно за счет MCP23017 - до 16 или PCF8574 - до 8, обе i2c.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 14 дек 2020, 15:58
SinglWolf
folks писал(а):
14 дек 2020, 12:57
Я так понял , что поддержки PCM 5102 в этом проекте нет ?
Поддержки PCM 5102 в этом проекте нет. И в ближайшей перспективе не планируется.
Dust112 писал(а):
14 дек 2020, 13:51
Расширить количество пинов для увеличения функционала можно
Спасибо, я в курсе :-) . Но в планах расширения функционала нет. Ибо даже под текущее железо пока ещё не весь софт написан :-[ .

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 15 дек 2020, 19:12
S1m80L
Спасибо.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 15 дек 2020, 22:04
Dust112
Залил отладочную. В консоли настроил wi-fi соединение. Вход в вебморду оперой, в настройках не выбираются пункты (настройка пины, пульт и т.д.).
В IE ообще ничего не выбирается. Перешивал на чистую раза четыре. Железо: врум с доп памятью, переферия не подключена. В консоли webserver: WebServer Socket fails try again errno: 11
При воспроизведении станции в консоли адрес имеет вид ##CLI.ICY3#: http:\/\/95.213.143.165:8010\/radiosept320.mp3

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 16 дек 2020, 00:38
Nadim
Прошивку удалось запустить - я с проводами напутал. Есть баг, нет возможности поменять GPIO. новые gpio не сохраняются в NVS.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 16 дек 2020, 03:07
SinglWolf
Dust112 писал(а):
15 дек 2020, 22:04
В IE ообще ничего не выбирается.
Дык и КаРадио в нём не работает :-) У IE нет поддержки локального хранилища. Говорю сразу - не просите. Коду добавлять немеряно.
Dust112 писал(а):
15 дек 2020, 22:04
Вход в вебморду оперой, в настройках не выбираются пункты (настройка пины, пульт и т.д.).
Nadim писал(а):
16 дек 2020, 00:38
Есть баг, нет возможности поменять GPIO. новые gpio не сохраняются в NVS.
Спасибо, буду исправлять. Я это не проверял. :-[

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 16 дек 2020, 16:07
pilnikov
В webclient.c строчка 1217
vTaskDelay(300);
Зачем столько?

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 16 дек 2020, 16:57
SinglWolf
pilnikov писал(а):
16 дек 2020, 16:07
vTaskDelay(300);
Бесполезная, на мой взгляд, задержка.
И такого кода в КаРадио немеряно. Туча лишних циклов. Нелепые проверки. Логгирование каждого пука. Есть участки кода просто в фигурных скобках. Особо "вставляет" код проверки считывания данных из FLASH, если битые... обрезаем, обнуляем, но продолжаем работать :-D . НАХРЕНА, спрашивается? =-O Флеш умерла. *SCRATCH* *DONT_KNOW*

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 16 дек 2020, 18:11
Dust112
По прошивке, переназначил пины для vs, на все остальные - 255. Модуль в ступоре E (2637) gpio: GPIO_PIN mask error ESP_ERROR_CHECK failed: esp_err_t 0x102 (ESP_ERR_INVALID_ARG) at 0x4008e770
file: "components/ucglib/src/ucg_esp32_hal.c" line 118
func: ucg_com_hal
expression: gpio_config(&gpioConfig)

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 16 дек 2020, 18:30
Dust112
Сейчас прогнал по пинам. Значение в SPI не переписывал. Зависон при записи 255 (не используется) в пины управления дисплеем. Достаточно записать в один из пинов управления дисплеем 255. Как понимаю в коде нет проверки на вариант не использования дисплея.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 16 дек 2020, 18:34
SinglWolf
Dust112 писал(а):
16 дек 2020, 18:30
Как понимаю в коде нет проверки на вариант не использования дисплея.
Проверки на отсутствие дисплея нет, ибо он прописан в минимальной конфигурации :-D
А пока просто не пишите 255 пинам, управляющим дисплеем. Просто проследите, чтобы не было дублей с другими пинами.
Исправлю в ближайшее время.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 16 дек 2020, 19:04
Dust112
Без вмешательства в пины все заиграло. Легкие подергивания звука при выводе в консоль размер свободного буфера. Отключил вывод в консоль, все равно легкое подергивания.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 16 дек 2020, 19:07
SinglWolf
Вырезал переназначение типа шины SPI через веб-интерфейс. Только сбивает столку, а практического смысла нет.
Переназначить можно только через menuconfig перед компиляцией прошивки.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 16 дек 2020, 19:08
SinglWolf
Dust112 писал(а):
16 дек 2020, 19:04
Без вмешательства в пины все заиграло. Легкие подергивания звука при выводе в консоль размер свободного буфера. Отключил вывод в консоль, все равно легкое подергивания.
Ссылку на поток, проверю. У меня все станции без затыков играют.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 16 дек 2020, 19:32
Dust112
Еще погоняю, может это просто стечение обстоятельств. По типу шины согласен, не нужно знать основной массе пользователей. К слову в win10 связка VSC и PlatformIO исходники собирает нормально. Сейчас играет вроде нормально.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 16 дек 2020, 19:35
alexsumi
Хорошее начало. этот проект надо развивать.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 16 дек 2020, 22:34
pilnikov
SinglWolf писал(а):
16 дек 2020, 16:57
pilnikov писал(а):
16 дек 2020, 16:07
vTaskDelay(300);
Бесполезная, на мой взгляд, задержка.
И такого кода в КаРадио немеряно. Туча лишних циклов. Нелепые проверки. Логгирование каждого пука. Есть участки кода просто в фигурных скобках. Особо "вставляет" код проверки считывания данных из FLASH, если битые... обрезаем, обнуляем, но продолжаем работать :-D . НАХРЕНА, спрашивается? =-O Флеш умерла. *SCRATCH* *DONT_KNOW*
я это к чему все -
убавил до 30 (можно еще меньше наверняка). сделал вебклиенту самый высокий приоритет - шевелится стало побыстрее (в вебморде) но не суть - самое главное стало меньше затыков при хреновом канале (только не при обрывах) за счет более быстрого наполнения буфера к.м.к.
еще послушал enjoyengeener'a сделал громкость в ffff для устранения щелчков сразу после резета чипа.
убрал второй резет сразу за первым.
сделал инфо о потоке (тока формат (мп3, аас...) не хочет пока показывать)
Для просмотра ссылок Вы должны быть авторизованы на форуме.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 17 дек 2020, 09:26
SinglWolf
pilnikov писал(а):
16 дек 2020, 22:34
убавил до 30 (можно еще меньше наверняка).
Вы меня не слушаете совсем, или как?
Я же сказал - это бесполезная задержка. Даже больше скажу - вредная, ибо задерживается запуск всего девайса на 0,3 сек. (Казалось бы не критично, но у задержек есть свойство суммироваться.)
Объясняю на пальцах (на куске кода функции):
  1. //Фрагмент из main_app
  2. // запуск задач
  3. // задачи запускаются только ОДИН раз...
  4. // у каждой задачи есть бесконечный цикл, в котором обрабатываются те или иные события...
  5. xTaskCreatePinnedToCore(uartInterfaceTask, "uartInterfaceTask", 2400, NULL, PRIO_UART, &pxCreatedTask, CPU_UART);
  6. ESP_LOGI(TAG, "%s task: %x", "uartInterfaceTask", (unsigned int)pxCreatedTask);
  7. vTaskDelay(1);  // Пауза между запусками задач
  8. // Запуск нашей задачи, где есть затычка-тормоз
  9. xTaskCreatePinnedToCore(clientTask, "clientTask", 3000, NULL, PRIO_CLIENT, &pxCreatedTask, CPU_CLIENT);
  10. ESP_LOGI(TAG, "%s task: %x", "clientTask", (unsigned int)pxCreatedTask);
  11. vTaskDelay(1)
  12.  
  13. // Фрагмент кода задачи
  14. void clientTask(void *pvParams)
  15. {
  16.     portBASE_TYPE uxHighWaterMark;
  17.     struct timeval timeout;
  18.     timeout.tv_usec = 0;
  19.     timeout.tv_sec = 3;
  20.     int sockfd;
  21.     int bytes_read;
  22.     uint8_t cnterror;
  23.  
  24.     struct sockaddr_in dest;
  25.  
  26.     vTaskDelay(300); /// ТОРМОЗИМ АЖ 0,3 секунды... НАФИГА????
  27.  
  28.     strcpy(useragent, MainConfig->ua);
  29.     if (strlen(useragent) == 0)
  30.     {
  31.         strcpy(useragent, "ESP32Radiola/1.5");
  32.         strcpy(MainConfig->ua, useragent);
  33.     }
  34.  
  35.     while (1)
  36.     {
  37. // ТУТ запускается бесконечный цикл задачи КЛИЕНТА
  38. // Он будет крутиться до выключения питания
Надеюсь, что внятно объяснил...
pilnikov писал(а):
16 дек 2020, 22:34
сделал вебклиенту самый высокий приоритет - шевелится стало побыстрее (в вебморде) но не суть - самое главное стало меньше затыков при хреновом канале (только не при обрывах) за счет более быстрого наполнения буфера к.м.к.
Это хорошо, но, на мой взгляд, основные тормоза дают: первое - логгирование почти каждого пука + то, что идёт в выхлоп консоли\телнета и второе - трансляция сообщений идёт не только на дисплей, дубли идут в вебморду, консоль, телнет.
Короче говоря, я удивляюсь как esp32 всё это вытягивает %)
pilnikov писал(а):
16 дек 2020, 22:34
еще послушал enjoyengeener'a сделал громкость в ffff для устранения щелчков сразу после резета чипа.
убрал второй резет сразу за первым.
У меня давным давно только один софтовый сброс VS-ки. В штатном режиме никаких щелчков нет.
pilnikov писал(а):
16 дек 2020, 22:34
сделал инфо о потоке (тока формат (мп3, аас...) не хочет пока показывать)
Не нашёл :-[

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 17 дек 2020, 14:17
pilnikov
Строка 360 в vs1053.c

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 17 дек 2020, 14:22
pilnikov
300 это задержка задачи клиента - она крутится на постоянке - и задержка на каждый цикл.
Тут где-то почитал, что задачи установки соединения (handshake) и обмена данными в открытом сокете надо тоже разводить

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 17 дек 2020, 16:44
SinglWolf
pilnikov писал(а):
17 дек 2020, 14:22
300 это задержка задачи клиента - она крутится на постоянке - и задержка на каждый цикл.
Это последняя попытка растолковать очевидную вещь...
► Показать
  1. void clientTask(void *pvParams)
  2. {
  3.     portBASE_TYPE uxHighWaterMark;
  4.     struct timeval timeout;
  5.     timeout.tv_usec = 0;
  6.     timeout.tv_sec = 3;
  7.     int sockfd;
  8.     int bytes_read;
  9.     uint8_t cnterror;
  10.  
  11.     struct sockaddr_in dest;
  12.  
  13.     vTaskDelay(300);
  14.  
  15.     strcpy(useragent, g_device->ua);
  16.     if (strlen(useragent) == 0)
  17.     {
  18.         strcpy(useragent, "ESP32Radiola/1.5");
  19.         strcpy(g_device->ua, useragent);
  20.     }
  21.  
  22.     //  portBASE_TYPE uxHighWaterMark;
  23.     //  uxHighWaterMark = uxTaskGetStackHighWaterMark( NULL );
  24.     //  printf("watermark webclient:%d  heap:%d\n",uxHighWaterMark,xPortGetFreeHeapSize( ));
  25.  
  26.     while (1)  // ЭТО ОБЪЯВЛЕНИЕ БЕСКОНЕЧНОГО ЦИКЛА!!!!!!!!!!!!!!
  27.     { // Начало тела цикла
  28.         xSemaphoreGive(sConnected);
  29.         if (xSemaphoreTake(sConnect, portMAX_DELAY))
  30.         {
  31.  
  32.             xSemaphoreTake(sDisconnect, 0);
  33.             sockfd = socket(AF_INET, SOCK_STREAM, 0);
  34.             ESP_LOGI(TAG, "Webclient socket: %d, errno: %d", sockfd, errno);
  35.             if (sockfd < 0)
  36.             {
  37.                 ESP_LOGE(TAG, "Webclient socket create, errno: %d", errno);
  38.                 xSemaphoreGive(sDisconnect);
  39.                 continue;
  40.             }
  41.             bzero(&dest, sizeof(dest));
  42.             dest.sin_family = AF_INET;
  43.             dest.sin_port = htons(clientPort);
  44.             dest.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr *)(server->h_addr_list[0])));
  45.             bytes_read = 0;
  46.             /*---Connect to server---*/
  47.             if (connect(sockfd, (struct sockaddr *)&dest, sizeof(dest)) >= 0)
  48.             {
  49.                 //              printf("WebClient Socket connected\n");
  50.                 memset(bufrec, 0, RECEIVE + 20);
  51.  
  52.                 char *t0 = strstr(clientPath, ".m3u");
  53.                 if (t0 == NULL)
  54.                     t0 = strstr(clientPath, ".pls");
  55.                 if (t0 == NULL)
  56.                     t0 = strstr(clientPath, ".xspf");
  57.                 if (t0 == NULL)
  58.                     t0 = strstr(clientPath, ".m3u8");
  59.                 if (t0 == NULL)
  60.                     t0 = strstr(clientPath, ".asx");
  61.                 if (t0 != NULL) // a playlist asked
  62.                 {
  63.                     cstatus = C_PLAYLIST;
  64.                     //printf("sprint%d\n",6);
  65.                     sprintf((char *)bufrec, "GET %s HTTP/1.1\r\nHOST: %s\r\nUser-Agent: %s\r\n\r\n", clientPath, clientURL, useragent); //ask for the playlist
  66.                 }
  67.                 else
  68.                 {
  69.                     if (strcmp(clientURL, "stream.pcradio.biz") == 0)
  70.                         strcpy(useragent, "pcradio");
  71.                     //printf("sprint%d\n",7);
  72.                     sprintf((char *)bufrec, "GET %s HTTP/1.1\r\nHost: %s\r\nicy-metadata: 1\r\nUser-Agent: %s\r\n\r\n", clientPath, clientURL, useragent);
  73.                 }
  74.                 //printf("st:%d, Client Sent:\n%s\n",cstatus,bufrec);
  75.                 xSemaphoreTake(sConnected, 0);
  76.                 send(sockfd, (char *)bufrec, strlen((char *)bufrec), 0);
  77.  
  78.                 if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0)
  79.                     ESP_LOGE(TAG, "Client socket: %d  setsockopt: %d  errno:%d ", sockfd, bytes_read, errno);
  80.                 //////
  81.                 cnterror = 0;
  82.                 do
  83.                 {
  84.                     bytes_read = recvfrom(sockfd, bufrec, RECEIVE, 0, NULL, NULL);
  85.                     if (bytes_read < 0)
  86.                     {
  87.                         ESP_LOGE(TAG, "Client socket: %d  read: %d  errno:%d ", sockfd, bytes_read, errno);
  88.                         if (errno == 11)
  89.                             bytes_read = 0;
  90.                     }
  91.                     //if (bytes_read < 1000 )
  92.                     //  printf("Rec:%d\n%s\n",bytes_read,bufrec);
  93.                     //  printf(" %d ",bytes_read);  fflush(stdout);
  94.                     if (bytes_read > 0)
  95.                     {
  96.                         cnterror = 0;
  97.                         clientReceiveCallback(sockfd, (char *)bufrec, bytes_read);
  98.                     }
  99.                     else
  100.                     {
  101.                         ESP_LOGW(TAG, "No data in recv. Errno = %d", errno);
  102.                         cnterror++;
  103.                         if (errno != 11)
  104.                             vTaskDelay(20); //timeout
  105.                         else
  106.                             vTaskDelay(2);
  107.                         if ((errno == 128) || (cnterror > 9))
  108.                             break;
  109.                     }
  110.                     vTaskDelay(2);
  111.                     // if a stop is asked
  112.                     if (xSemaphoreTake(sDisconnect, 0))
  113.                     {
  114.                         clearHeaders();
  115.                         break;
  116.                     }
  117.                 } while ((bytes_read > 0) || (playing && (bytes_read == 0)));
  118.             }
  119.             else
  120.             {
  121.                 ESP_LOGE(TAG, "Client socket: %d  connect: %d  errno:%d ", sockfd, bytes_read, errno);
  122.                 clientSaveOneHeader("Invalid address", 15, METANAME);
  123.                 wsHeaders();
  124.                 vTaskDelay(1);
  125.                 clientDisconnect("Invalid");
  126.                 close(sockfd);
  127.                 continue;
  128.             }
  129.             /*---Clean up---*/
  130.             if (bytes_read <= 0) //nothing received or error or disconnected
  131.             {
  132.                 if ((playing) && (once == 0)) // try restart
  133.                 {
  134.                     clientDisconnect("try restart");
  135.                     clientConnect();
  136.                     playing = 1; // force
  137.                 }
  138.                 else if ((!playing) && (once == 1))
  139.                 { // nothing played. Force the read of the buffer
  140.                     // some data not played
  141.                     if ((!playing) && (spiRamFifoFill()))
  142.                     {
  143.                         playing = 1;
  144.                         vTaskDelay(1);
  145.                         setVolumei(getVolume());
  146.                         kprintf(CLIPLAY, 0x0d, 0x0a);
  147.                         while (spiRamFifoFill())
  148.                             vTaskDelay(100);
  149.                         vTaskDelay(150);
  150.                         playing = 0;
  151.                         clientDisconnect("data not played");
  152.                     }
  153.                 }
  154.                 //
  155.                 else if ((!playing) && (once == 0))
  156.                 { // nothing received
  157.                     clientDisconnect(nodata);
  158.                     clientSaveOneHeader(nodata, 7, METANAME);
  159.                     wsHeaders();
  160.                     vTaskDelay(1);
  161.                 }
  162.                 else
  163.                 { //playing & once=1 and no more received stream
  164.                     while (spiRamFifoFill())
  165.                         vTaskDelay(100);
  166.                     vTaskDelay(200);
  167.                     clientDisconnect("once");
  168.                 }
  169.             } //jpc
  170.  
  171.             if (playing) // stop clean
  172.             {
  173.                 setVolumei(0);
  174.                 audio_player_stop();
  175.                 player_config->media_stream->eof = true;
  176.                 //
  177.                 VS1053_flush_cancel(2);
  178.                 playing = 0;
  179.                 vTaskDelay(40); // stop without click
  180.                 setVolumei(getVolume());
  181.             }
  182.  
  183.             //
  184.             shutdown(sockfd, SHUT_RDWR); // stop the socket
  185.             vTaskDelay(1);
  186.             close(sockfd);
  187.             //printf("WebClient Socket closed\n");
  188.             if (cstatus == C_PLAYLIST)
  189.             {
  190.                 clientConnect();
  191.             }
  192.             uxHighWaterMark = uxTaskGetStackHighWaterMark(NULL);
  193.             ESP_LOGI(TAG, "watermark : %x  %d", uxHighWaterMark, uxHighWaterMark);
  194.         }
  195.     }
  196. }
Как задержка

Код: Выделить всё

vTaskDelay(300);
в начале функции и ДО тела цикла может влиять на каждый цикл задачи клиента??? НИКАК!!!
ДОШЛО :-) ? Иначе в Си я вам не помощник :-|
pilnikov писал(а):
17 дек 2020, 14:22
Тут где-то почитал, что задачи установки соединения (handshake) и обмена данными в открытом сокете надо тоже разводить
*DONT_KNOW* Если задержка до тела цикла влияет на каждый цикл, то надо...
Только я не понимаю как можно с самого начала запихать в одну задачу установку соединения и обмен данными в открытом сокете *SCRATCH* :-| *PARDON*
Надо послушать enjoyneering'a по этому поводу.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 17 дек 2020, 20:46
pilnikov
Ок, признаю свою тупость про цикличную задержку. Сказался стереотип построения таски - когда вайл в самом начале. Каюсь - затупил слегка старый пень.
Но два резета в оригинале(у JP) были. У меня щелкало 2 раза. Я даже AVDD снимал на старте чтобы их убрать - помогает.

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 17 дек 2020, 21:08
pilnikov
а по поводу вебсокетов - lwip_connect выполняется в клиент-таске внутри вайла каждый раз
  1. while (1)
  2.     {
  3.         xSemaphoreGive(sConnected);
  4.         if (xSemaphoreTake(sConnect, portMAX_DELAY))
  5.         {
  6.             xSemaphoreTake(sDisconnect, 0);
  7.             sockfd = socket(AF_INET, SOCK_STREAM, 0);
  8.             sterr = lwip_strerr(errno);
  9.             ESP_LOGI(TAG, "Webclient socket: %d, err: %s", sockfd, sterr);
  10.             if (sockfd < 0)
  11.             {
  12.                 sterr = lwip_strerr(errno);
  13.                 ESP_LOGE(TAG, "Webclient socket create, err: %s", sterr);
  14.                 xSemaphoreGive(sDisconnect);
  15.                 continue;
  16.             }
  17.             bzero(&dest, sizeof(dest));
  18.             dest.sin_family = AF_INET;
  19.             dest.sin_port = htons(clientPort);
  20.             dest.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr*)(server->h_addr_list[0])));
  21.             bytes_read = 0;
  22.  
  23.             /*---Connect to server---*/
  24.             if (connect(sockfd, (struct sockaddr*) & dest, sizeof(dest)) >= 0)
  25.             {
  26.                 //              printf("WebClient Socket connected\n");
и только при поступлении данных в буфер
  1.                     if (bytes_read > 0)
  2.                     {
  3.                         cnterror = 0;
  4.                         clientReceiveCallback(sockfd, (char*)bufrec, bytes_read);
  5.                     }
запускается некое подобие обработчика в виде clientReceiveCallback()

хотя например здесь
  1.    esp_websocket_client_handle_t client = esp_websocket_client_init(&websocket_cfg);
  2.     esp_websocket_register_events(client, WEBSOCKET_EVENT_ANY, websocket_event_handler, (void *)client); // ТУТА
  3.  
  4.     esp_websocket_client_start(client);
  5.     xTimerStart(shutdown_signal_timer, portMAX_DELAY);
  6.     char data[32];
  7.     int i = 0;
  8.     while (i < 10) {
  9.         if (esp_websocket_client_is_connected(client)) {
  10.             int len = sprintf(data, "hello %04d", i++);
  11.             ESP_LOGI(TAG, "Sending %s", data);
  12.             esp_websocket_client_send_text(client, data, len, portMAX_DELAY);
  13.         }
обработчик создается на стадии соединения и основная часть задачи оперирует уже только результатом его работы -esp_websocket_client_is_connected(client)

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 17 дек 2020, 21:12
SinglWolf
pilnikov писал(а):
17 дек 2020, 20:46
Ок, признаю свою тупость про цикличную задержку. Сказался стереотип построения таски - когда вайл в самом начале. Каюсь - затупил слегка старый пень.
Ок. Значит не всё так безнадёжно :-D
pilnikov писал(а):
17 дек 2020, 20:46
Но два резета в оригинале(у JP) были. У меня щелкало 2 раза. Я даже AVDD снимал на старте чтобы их убрать - помогает.
У меня VS не щёлкает. Остался 1 Софт ресет. Пин хард ресета VS соединён с пином сброса ESP-32. Щёлкать начинает, если при проигрывании музыки нажать кнопку сброса, а это не штатный режим. Так что я уже забыл эту проблему. Хотя чуть было не бросил проект из-за молчания VS при первом включении, петь начинала только при программном сбросе ESP-32. Намаялся я с VS-кой тогда сильно.
pilnikov писал(а):
17 дек 2020, 21:08
а по поводу вебсокетов - lwip_connect выполняется в клиент-таске внутри вайла каждый раз
Оформляйте код нормально, пожалуйста.
Websockets буду пилить, но позднее...

Re: ESP32-Radiola - Музыкальный центр с управлением на ESP32 своими руками

Добавлено: 17 дек 2020, 23:30
pilnikov
  1. ##CLI.META#: ФАКТОР 2 - Красавица
  2. I (478544) audio_player: Buffer fill 0%, 2037 // 1048576 bytes
  3. 250s 1983.9 kb/s 44100Hz stereo MP3 h = 0xFFFB
  4. E (482184) VS10xx: Music buffer is emty - Nothing playing :(
  5. E (482734) VS10xx: Music buffer is emty - Nothing playing :(
  6. E (484794) VS10xx: Music buffer is emty - Nothing playing :(
  7. I (494224) audio_player: Buffer fill 0%, 6203 // 1048576 bytes
  8. 266s 1960.8 kb/s 44100Hz stereo MP3 h = 0xFFFB
  9. I (510184) audio_player: Buffer fill 0%, 6515 // 1048576 bytes
  10. 282s 1940.4 kb/s 44100Hz stereo MP3 h = 0xFFFB
  11. E (512514) VS10xx: Music buffer is emty - Nothing playing :(
  12. E (517754) VS10xx: Music buffer is emty - Nothing playing :(
  13. E (518544) VS10xx: Music buffer is emty - Nothing playing :(
  14. E (519804) VS10xx: Music buffer is emty - Nothing playing :(
  15. E (522984) VS10xx: Music buffer is emty - Nothing playing :(
  16. I (526284) audio_player: Buffer fill 0%, 4469 // 1048576 bytes
  17. 298s 1922.0 kb/s 44100Hz stereo MP3 h = 0xFFFB
  18. E (534744) VS10xx: Music buffer is emty - Nothing playing :(
  19. E (536024) VS10xx: Music buffer is emty - Nothing playing :(
  20. E (541504) VS10xx: Music buffer is emty - Nothing playing :(
  21. E (542314) VS10xx: Music buffer is emty - Nothing playing :(
  22. I (542384) audio_player: Buffer fill 0%, 3821 // 1048576 bytes
  23. 314s 1905.7 kb/s 44100Hz stereo MP3 h = 0xFFFB
  24. E (548064) VS10xx: Music buffer is emty - Nothing playing :(
  25. E (553834) VS10xx: Music buffer is emty - Nothing playing :(
  26. I (558414) audio_player: Buffer fill 0%, 1785 // 1048576 bytes
  27. 330s 1890.8 kb/s 44100Hz stereo MP3 h = 0xFFFB
  28. I (574184) audio_player: Buffer fill 0%, 6862 // 1048576 bytes
  29. 346s 1877.4 kb/s 44100Hz stereo MP3 h = 0xFFFB
  30. E (576514) VS10xx: Music buffer is emty - Nothing playing :(
вот такой у меня лог обычно. при этом поет не заикаясь