arduino-audio-tools
AudioSourceSDMMC.h
1 #pragma once
2 
3 #include "AudioBasic/StrExt.h"
4 #include "AudioLogger.h"
5 #include "AudioTools/AudioSource.h"
6 #include "FS.h"
7 #include "SD_MMC.h"
8 #include "AudioLibs/SDDirect.h"
9 
10 namespace audio_tools {
11 
33 class AudioSourceSDMMC : public AudioSource {
34 public:
36  AudioSourceSDMMC(const char *startFilePath = "/", const char *ext = ".mp3", bool setupIndex=true) {
37  start_path = startFilePath;
38  exension = ext;
39  setup_index = setupIndex;
40  }
41 
42  virtual void begin() override {
43  TRACED();
44  if (!is_sd_setup) {
45  if (!SD_MMC.begin("/sdcard", true)) {
46  LOGE("SD_MMC.begin failed");
47  return;
48  }
49  is_sd_setup = true;
50  }
51  idx.begin(start_path, exension, file_name_pattern);
52  idx_pos = 0;
53  }
54 
55  void end() {
56  SD_MMC.end();
57  is_sd_setup = false;
58  }
59 
60 
61  virtual Stream *nextStream(int offset = 1) override {
62  LOGI("nextStream: %d", offset);
63  return selectStream(idx_pos + offset);
64  }
65 
66  virtual Stream *selectStream(int index) override {
67  LOGI("selectStream: %d", index);
68  idx_pos = index;
69  file_name = idx[index];
70  if (file_name==nullptr) return nullptr;
71  LOGI("Using file %s", file_name);
72  file = SD_MMC.open(file_name);
73  return file ? &file : nullptr;
74  }
75 
76  virtual Stream *selectStream(const char *path) override {
77  file.close();
78  file = SD_MMC.open(path);
79  file_name = file.name();
80  LOGI("-> selectStream: %s", path);
81  return file ? &file : nullptr;
82  }
83 
86  void setFileFilter(const char *filter) { file_name_pattern = filter; }
87 
89  int index() { return idx_pos; }
90 
92  const char *toStr() { return file_name; }
93 
94  // provides default setting go to the next
95  virtual bool isAutoNext() { return true; }
96 
98  virtual void setPath(const char *p) { start_path = p; }
99 
101  long size() { return idx.size();}
102 
103 protected:
104  SDDirect<fs::SDMMCFS,fs::File> idx{SD_MMC};
105  File file;
106  size_t idx_pos = 0;
107  const char *file_name;
108  const char *exension = nullptr;
109  const char *start_path = nullptr;
110  const char *file_name_pattern = "*";
111  bool setup_index = true;
112  bool is_sd_setup = false;
113 };
114 
115 } // namespace audio_tools
Abstract Audio Data Source for the AudioPlayer which is used by the Audio Players.
Definition: AudioSource.h:12
ESP32 AudioSource for AudioPlayer using an SD card as data source. This class is based on the Arduino...
Definition: AudioSourceSDMMC.h:33
int index()
Provides the current index position.
Definition: AudioSourceSDMMC.h:89
long size()
Provides the number of files (The max index is size()-1): WARNING this is very slow if you have a lot...
Definition: AudioSourceSDMMC.h:101
const char * toStr()
provides the actual file name
Definition: AudioSourceSDMMC.h:92
virtual void begin() override
Reset actual stream and move to root.
Definition: AudioSourceSDMMC.h:42
virtual void setPath(const char *p)
Allows to "correct" the start path if not defined in the constructor.
Definition: AudioSourceSDMMC.h:98
AudioSourceSDMMC(const char *startFilePath="/", const char *ext=".mp3", bool setupIndex=true)
Default constructor.
Definition: AudioSourceSDMMC.h:36
virtual bool isAutoNext()
Returns default setting go to the next.
Definition: AudioSourceSDMMC.h:95
void setFileFilter(const char *filter)
Definition: AudioSourceSDMMC.h:86
virtual Stream * nextStream(int offset=1) override
Returns next audio stream.
Definition: AudioSourceSDMMC.h:61
virtual Stream * selectStream(int index) override
Returns audio stream at the indicated index (the index is zero based, so the first value is 0!...
Definition: AudioSourceSDMMC.h:66
virtual Stream * selectStream(const char *path) override
Returns audio stream by path.
Definition: AudioSourceSDMMC.h:76
long size()
Provides the number of files.
Definition: SDDirect.h:49
Definition: NoArduino.h:125
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition: AnalogAudio.h:10