arduino-audio-tools
Loading...
Searching...
No Matches
AudioSourceSDFAT.h
Go to the documentation of this file.
1#pragma once
2
3#include <SPI.h>
4#include <SdFat.h> // https://github.com/greiman/sdfat
5
6#include "AudioLogger.h"
8#include "AudioToolsConfig.h"
9
10#define USE_SDFAT
12
13// Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur. (40?)
14#define SPI_CLOCK SD_SCK_MHZ(50)
15
16namespace audio_tools {
31template <typename AudioFs = SdFat32, typename AudioFile = File32>
33 public:
35 AudioSourceSDFAT(const char *startFilePath = "/", const char *ext = ".mp3",
36 int chipSelect = PIN_CS, int speedMHz = 10,
37 int spi_mode = DEDICATED_SPI, bool setupIndex = true) {
38 TRACED();
39 LOGI("SD chipSelect: %d", chipSelect);
40 LOGI("SD speedMHz: %d", speedMHz);
41 LOGI("ext: %s", ext);
43 owns_cfg = true;
45 exension = ext;
47 }
48
50 AudioSourceSDFAT(const char *startFilePath, const char *ext,
51 SdSpiConfig &config, bool setupIndex = true) {
52 TRACED();
53 p_cfg = &config;
54 owns_cfg = false;
56 exension = ext;
58 }
59
61 AudioSourceSDFAT(AudioFs fs, const char *startFilePath="/", const char *ext="", bool setupIndex = true){
62 TRACED();
63 sd = fs;
64 p_cfg = nullptr;
65 owns_cfg = false;
67 exension = ext;
69 is_sd_setup = true;
70 // since we expect an open fs we do not close it
71 is_close_sd = false;
72 }
73
75 end();
76 if (owns_cfg) delete (p_cfg);
77 }
78
79 virtual bool begin() override {
80 TRACED();
81 if (!is_sd_setup) {
82 if (!sd.begin(*p_cfg)) {
83 LOGE("sd.begin failed");
84 return false;
85 }
86 is_sd_setup = true;
87 }
89 idx_pos = 0;
90 return is_sd_setup;
91 }
92
93 void end() {
94 file.close();
95
96 if (is_sd_setup) {
97 TRACEI();
98#ifdef ESP32
99 if (is_close_sd) sd.end();
100#endif
101 is_sd_setup = false;
102 }
103 }
104
105 virtual Stream *nextStream(int offset = 1) override {
106 LOGI("nextStream: %d", offset);
107 return selectStream(idx_pos + offset);
108 }
109
110 virtual Stream *selectStream(int index) override {
111 LOGI("selectStream SDFAT: %d", index);
112 if (index > -1) { // avoid invalid position
113 idx_pos = index;
114 }
115 return selectStream(idx[idx_pos]);
116 }
117
118 virtual Stream *selectStream(const char *path) override {
119 file.close();
120 if (path == nullptr) {
121 LOGE("Filename is null")
122 return nullptr;
123 }
124
125 // AudioFile new_file;
126 if (!file.open(path, O_RDONLY)) {
127 LOGE("Open error: '%s'", path);
128 }
129
130 LOGI("-> selectStream: %s", path);
132 // file = new_file;
133 return &file;
134 }
135
138 void setFileFilter(const char *filter) { file_name_pattern = filter; }
139
141 int index() { return idx_pos; }
142
144 const char *toStr() { return file_name; }
145
146 // provides default setting go to the next
147 virtual bool isAutoNext() { return true; }
148
150 virtual void setPath(const char *p) { start_path = p; }
151
154 long size() { return idx.size(); }
155
157 AudioFs &getAudioFs() { return sd; }
158
159 protected:
160 SdSpiConfig *p_cfg = nullptr;
164 size_t idx_pos = 0;
166 const char *exension = nullptr;
167 const char *start_path = nullptr;
168 const char *file_name_pattern = "*";
169 int cs;
170 bool setup_index = true;
171 bool owns_cfg = false;
172 bool is_sd_setup = false;
173 bool is_close_sd = true;
174
175 const char *getFileName(AudioFile &file) {
176 static char name[MAX_FILE_LEN];
177 file.getName(name, MAX_FILE_LEN);
178 return name;
179 }
180};
181
182} // namespace audio_tools
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define MAX_FILE_LEN
Definition SDDirect.h:6
#define PIN_CS
Definition avr.h:14
Definition Arduino.h:136
Abstract Audio Data Source for the AudioPlayer which is used by the Audio Players.
Definition AudioSource.h:17
AudioSource for AudioPlayer using an SD card as data source. This class is based on the Arduino SD im...
Definition AudioSourceSDFAT.h:32
int index()
Provides the current index position.
Definition AudioSourceSDFAT.h:141
AudioSourceSDFAT(const char *startFilePath, const char *ext, SdSpiConfig &config, bool setupIndex=true)
Costructor with SdSpiConfig.
Definition AudioSourceSDFAT.h:50
const char * exension
Definition AudioSourceSDFAT.h:166
long size()
Definition AudioSourceSDFAT.h:154
bool owns_cfg
Definition AudioSourceSDFAT.h:171
bool is_sd_setup
Definition AudioSourceSDFAT.h:172
virtual Stream * selectStream(int index) override
Definition AudioSourceSDFAT.h:110
virtual bool begin() override
Reset actual stream and move to root.
Definition AudioSourceSDFAT.h:79
SdSpiConfig * p_cfg
Definition AudioSourceSDFAT.h:160
bool is_close_sd
Definition AudioSourceSDFAT.h:173
AudioSourceSDFAT(AudioFs fs, const char *startFilePath="/", const char *ext="", bool setupIndex=true)
Constructor for providing an open FS.
Definition AudioSourceSDFAT.h:61
size_t idx_pos
Definition AudioSourceSDFAT.h:164
AudioSourceSDFAT(const char *startFilePath="/", const char *ext=".mp3", int chipSelect=PIN_CS, int speedMHz=10, int spi_mode=DEDICATED_SPI, bool setupIndex=true)
Default constructor.
Definition AudioSourceSDFAT.h:35
AudioFs & getAudioFs()
provides access to the AudioFs object
Definition AudioSourceSDFAT.h:157
const char * getFileName(AudioFile &file)
Definition AudioSourceSDFAT.h:175
AudioFs sd
Definition AudioSourceSDFAT.h:161
const char * start_path
Definition AudioSourceSDFAT.h:167
const char * toStr()
provides the actual file name
Definition AudioSourceSDFAT.h:144
AudioFile file
Definition AudioSourceSDFAT.h:162
virtual void setPath(const char *p)
Allows to "correct" the start path if not defined in the constructor.
Definition AudioSourceSDFAT.h:150
virtual ~AudioSourceSDFAT()
Definition AudioSourceSDFAT.h:74
char file_name[MAX_FILE_LEN]
Definition AudioSourceSDFAT.h:165
virtual bool isAutoNext()
Returns default setting go to the next.
Definition AudioSourceSDFAT.h:147
virtual Stream * nextStream(int offset=1) override
Returns next audio stream.
Definition AudioSourceSDFAT.h:105
void end()
Definition AudioSourceSDFAT.h:93
bool setup_index
Definition AudioSourceSDFAT.h:170
SDDirect< AudioFs, AudioFile > idx
Definition AudioSourceSDFAT.h:163
void setFileFilter(const char *filter)
Definition AudioSourceSDFAT.h:138
int cs
Definition AudioSourceSDFAT.h:169
const char * file_name_pattern
Definition AudioSourceSDFAT.h:168
virtual Stream * selectStream(const char *path) override
Returns audio stream by path: The index is not changed!
Definition AudioSourceSDFAT.h:118
We access the files directy with an index. The index is determined by a recurseve tree walk thru the ...
Definition SDDirect.h:22
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:508