moononournation / LVGL_Music_Player

41 stars 11 forks source link

请教问题,移植I2S_FFT_Level_Meter项目,audio_process_i2s没有被调用。 #1

Closed dingxiao88 closed 1 year ago

dingxiao88 commented 1 year ago

moononournation你好,感谢你提供的LVGL_Music_Player项目源码,我在尝试其中的I2S_FFT_Level_Meter项目时遇到了一些问题,想请教下你。 问题: 在移植I2S_FFT_Level_Meter后,程序能够成功编译并运行,可以播放音乐。 但是,发现audio_process_i2s函数不会被调用,不知道问题发生在哪里,希望能指教,谢谢。


代码:测试核心代码为:

// I2S
#define I2S_DOUT 25
#define I2S_BCLK 26
#define I2S_LRCK 12    

...

init_peak_array();

audio.setPinout(I2S_BCLK, I2S_LRCK, I2S_DOUT);
audio.setVolume(16); // 0...21
audio.connecttoFS(LITTLEFS, "/music/music_test.mp3"); 

xTaskCreatePinnedToCore(Task_Audio, "Task_Audio", 10240, NULL, 3, NULL, 0);  //run core0 ok

并在audio_process_i2s中增加了调用打印:

void audio_process_i2s(uint32_t* sample, bool *continueI2S)
{
  Serial.println("audio_process_i2s");
  raw_data[raw_data_idx++] = *sample;
  if (raw_data_idx >= WAVE_SIZE)
  {
    fft.exec((int16_t *)raw_data);
    // draw_fft_level_meter(gfx);
    draw_fft_level_meter(tft);
    raw_data_idx = 0;
  }
  *continueI2S = true;
}
moononournation commented 1 year ago

未移植前運作正常嗎?

dingxiao88 commented 1 year ago

未移植前工作正常能播放歌曲,移植后也能播放歌曲。 问题是移植后audio_process_i2s并未被调用执行,没有显示歌曲律动图。 不知audio_process_i2s函数是否是I2S后台自动调用的,还是需要再loop函数中显式调用的? 请指教,再次感谢。

moononournation commented 1 year ago

即是移植中出錯?

dingxiao88 commented 1 year ago

不应该定义为是移植出错,移植完成后,能正常播放音乐,但是我还想在TFT显示屏中看到歌曲律动条状图(FFT_Level_Meter)。 而歌曲律动条状图(FFT_Level_Meter)是在audio_process_i2s函数中绘制的,目前发现I2S后台没有自动调用该函数(audio_process_i2s)。

void audio_id3data(const char *info)
{ // id3 metadata
  Serial.print("id3data     ");
  Serial.println(info);
}
void audio_eof_mp3(const char *info)
{ // end of file
  Serial.print("eof_mp3     ");
  Serial.println(info);
}
void audio_process_i2s(uint32_t* sample, bool *continueI2S)
{

  Serial.println("audio_process_i2s");       //@-简单查看函数是否被调用

  raw_data[raw_data_idx++] = *sample;
  if (raw_data_idx >= WAVE_SIZE)
  {
    fft.exec((int16_t *)raw_data);
    // draw_fft_level_meter(gfx);
    draw_fft_level_meter(tft);
    raw_data_idx = 0;
  }
  *continueI2S = true;
}

上述3个函数中的audio_id3data的数据可以在后台串口正常输出内容。

我自认为audio_process_i2s函数也是I2S自动调用的,但是事实上并未被自动调用执行。

所以想请教你audio_process_i2s是否需要在程序的其他地方显式调用该函数。

moononournation commented 1 year ago

but the original example can call audio_process_i2s()?

dingxiao88 commented 1 year ago

我从来没有尝试过使用audio_process_i2s函数。这是我第一次尝试这么做。

moononournation commented 1 year ago

Can you run I2S_FFT_Level_Meter.ino success?

dingxiao88 commented 1 year ago

感谢您的耐心回复,我已找到问题的所在,关键点是在Audio库的版本。 1.我目前正常使用的是Audio的2.0.3版,该版本中并未定义audio_process_i2s接口。 2.Audio版本升级至最新的3.0.0版,发现存在audio_process_i2s接口。 但是我尝试将Audio升级至最新的3.0.0版,发现已不能正常播放音乐,在3.0.0版本下我还需要再重新测试。 再次感谢你的耐心回复,谢谢。

dingxiao88 commented 1 year ago

更换至3.0.0后,经测试一切正常,感谢你提供的优秀源码。