arduino-audio-tools
AudioSourceIdxSDFAT.h
1 #pragma once
2 
3 #include <SPI.h>
4 #include <SdFat.h>
5 
6 #include "AudioConfig.h"
7 #include "AudioLogger.h"
8 #include "AudioTools/CoreAudio/AudioSource.h"
9 
10 #define USE_SDFAT
11 #include "AudioTools/AudioLibs/SDIndex.h"
12 
13 // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h,
14 // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT.
15 #ifndef SD_FAT_TYPE
16 #define SD_FAT_TYPE 1
17 #endif
18 // Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur. (40?)
19 #define SPI_CLOCK SD_SCK_MHZ(50)
20 #if SD_FAT_TYPE == 0
21 typedef SdFat AudioFs;
22 typedef File AudioFile;
23 #elif SD_FAT_TYPE == 1
24 typedef SdFat32 AudioFs;
25 typedef File32 AudioFile;
26 #elif SD_FAT_TYPE == 2
27 typedef SdExFat AudioFs;
28 typedef ExFile AudioFile;
29 #elif SD_FAT_TYPE == 3
30 typedef SdFs AudioFs;
31 typedef FsFile AudioFile;
32 #endif
33 
34 namespace audio_tools {
44  public:
46  AudioSourceIdxSDFAT(const char *startFilePath = "/", const char *ext = ".mp3",
47  int chipSelect = PIN_CS, int speedMHz = 10,
48  bool setupIndex = true) {
49  TRACED();
50  LOGI("SD chipSelect: %d", chipSelect);
51  LOGI("SD speedMHz: %d", speedMHz);
52  LOGI("ext: %s", ext);
53  p_cfg = new SdSpiConfig(chipSelect, DEDICATED_SPI, SD_SCK_MHZ(speedMHz));
54  owns_cfg = true;
55  start_path = startFilePath;
56  exension = ext;
57  setup_index = setupIndex;
58  }
59 
61  AudioSourceIdxSDFAT(const char *startFilePath, const char *ext,
62  SdSpiConfig &config, bool setupIndex = true) {
63  TRACED();
64  p_cfg = &config;
65  owns_cfg = false;
66  start_path = startFilePath;
67  exension = ext;
68  setup_index = setupIndex;
69  }
70 
71  virtual void begin() override {
72  TRACED();
73  if (!is_sd_setup) {
74  if (!sd.begin(*p_cfg)) {
75  LOGE("sd.begin failed");
76  return;
77  }
78  is_sd_setup = true;
79  }
80  idx.begin(start_path, exension, file_name_pattern, setup_index);
81  idx_pos = 0;
82  }
83 
84  void end() {
85 #ifdef ESP32
86  sd.end();
87 #endif
88  is_sd_setup = false;
89  }
90 
91  virtual Stream *nextStream(int offset = 1) override {
92  LOGI("nextStream: %d", offset);
93  return selectStream(idx_pos + offset);
94  }
95 
96  virtual Stream *selectStream(int index) override {
97  LOGI("selectStream: %d", index);
98  idx_pos = index;
99  return selectStream(idx[index]);
100  }
101 
102  virtual Stream *selectStream(const char *path) override {
103  file.close();
104  if (path == nullptr) {
105  LOGE("Filename is null")
106  return nullptr;
107  }
108 
109  // AudioFile new_file;
110  if (!file.open(path, O_RDONLY)) {
111  LOGE("Open error: '%s'", path);
112  }
113 
114  LOGI("-> selectStream: %s", path);
115  // file = new_file;
116  return &file;
117  }
118 
121  void setFileFilter(const char *filter) { file_name_pattern = filter; }
122 
124  int index() { return idx_pos; }
125 
127  const char *toStr() { return file_name; }
128 
129  // provides default setting go to the next
130  virtual bool isAutoNext() { return true; }
131 
133  virtual void setPath(const char *p) { start_path = p; }
134 
136  long size() { return idx.size(); }
137 
138  protected:
139  SdSpiConfig *p_cfg = nullptr;
140  AudioFs sd;
141  AudioFile file;
143  size_t idx_pos = 0;
144  char file_name[MAX_FILE_LEN];
145  const char *exension = nullptr;
146  const char *start_path = nullptr;
147  const char *file_name_pattern = "*";
148  bool setup_index = true;
149  bool is_sd_setup = false;
150  int cs;
151  bool owns_cfg = false;
152 
153  const char *getFileName(AudioFile &file) {
154  static char name[MAX_FILE_LEN];
155  file.getName(name, MAX_FILE_LEN);
156  return name;
157  }
158 };
159 
160 } // namespace audio_tools
Abstract Audio Data Source for the AudioPlayer which is used by the Audio Players.
Definition: AudioSource.h:13
ESP32 AudioSource for AudioPlayer using an SD card as data source. This class is based on the Arduino...
Definition: AudioSourceIdxSDFAT.h:43
int index()
Provides the current index position.
Definition: AudioSourceIdxSDFAT.h:124
long size()
Provides the number of files (The max index is size()-1)
Definition: AudioSourceIdxSDFAT.h:136
const char * toStr()
provides the actual file name
Definition: AudioSourceIdxSDFAT.h:127
virtual void begin() override
Reset actual stream and move to root.
Definition: AudioSourceIdxSDFAT.h:71
virtual void setPath(const char *p)
Allows to "correct" the start path if not defined in the constructor.
Definition: AudioSourceIdxSDFAT.h:133
virtual bool isAutoNext()
Returns default setting go to the next.
Definition: AudioSourceIdxSDFAT.h:130
AudioSourceIdxSDFAT(const char *startFilePath="/", const char *ext=".mp3", int chipSelect=PIN_CS, int speedMHz=10, bool setupIndex=true)
Default constructor.
Definition: AudioSourceIdxSDFAT.h:46
void setFileFilter(const char *filter)
Definition: AudioSourceIdxSDFAT.h:121
AudioSourceIdxSDFAT(const char *startFilePath, const char *ext, SdSpiConfig &config, bool setupIndex=true)
Costructor with SdSpiConfig.
Definition: AudioSourceIdxSDFAT.h:61
virtual Stream * nextStream(int offset=1) override
Returns next audio stream.
Definition: AudioSourceIdxSDFAT.h:91
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: AudioSourceIdxSDFAT.h:96
virtual Stream * selectStream(const char *path) override
Returns audio stream by path.
Definition: AudioSourceIdxSDFAT.h:102
Definition: NoArduino.h:125
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition: AudioConfig.h:823