arduino-audio-tools
Loading...
Searching...
No Matches
AudioSourceIdxSDFAT.h
1#pragma once
2
3#include <SPI.h>
4#include <SdFat.h>
5
6#include "AudioToolsConfig.h"
7#include "AudioLogger.h"
8#include "AudioTools/Disk/AudioSource.h"
9
10#define USE_SDFAT
11#include "AudioTools/Disk/SDIndex.h"
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 {
27template <typename AudioFs = SdFat32, typename AudioFile = File32>
29 public:
31 AudioSourceIdxSDFAT(const char *startFilePath = "/", const char *ext = ".mp3",
32 int chipSelect = PIN_CS, int speedMHz = 10,
33 bool setupIndex = true) {
34 TRACED();
35 LOGI("SD chipSelect: %d", chipSelect);
36 LOGI("SD speedMHz: %d", speedMHz);
37 LOGI("ext: %s", ext);
38 p_cfg = new SdSpiConfig(chipSelect, DEDICATED_SPI, SD_SCK_MHZ(speedMHz));
39 owns_cfg = true;
40 start_path = startFilePath;
41 exension = ext;
42 setup_index = setupIndex;
43 }
44
46 AudioSourceIdxSDFAT(const char *startFilePath, const char *ext,
47 SdSpiConfig &config, bool setupIndex = true) {
48 TRACED();
49 p_cfg = &config;
50 owns_cfg = false;
51 start_path = startFilePath;
52 exension = ext;
53 setup_index = setupIndex;
54 }
55
57 AudioSourceIdxSDFAT(AudioFs fs, const char *startFilePath="/", const char *ext="", bool setupIndex = true){
58 TRACED();
59 sd = fs;
60 p_cfg = nullptr;
61 owns_cfg = false;
62 start_path = startFilePath;
63 exension = ext;
64 setup_index = setupIndex;
65 is_sd_setup = true;
66 // since we expect an open fs we do not close it
67 is_close_sd = false;
68 }
69
70 virtual ~AudioSourceIdxSDFAT() { end(); }
71
72 virtual bool begin() override {
73 TRACED();
74 if (!is_sd_setup) {
75 if (!sd.begin(*p_cfg)) {
76 LOGE("sd.begin failed");
77 return false;
78 }
79 is_sd_setup = true;
80 }
81 idx.begin(start_path, exension, file_name_pattern, setup_index);
82 idx_pos = 0;
83 return is_sd_setup;
84 }
85
86 void end() {
87 if (is_sd_setup) {
88#ifdef ESP32
89 if (is_close_sd) sd.end();
90#endif
91 if (owns_cfg) delete (p_cfg);
92 is_sd_setup = false;
93 }
94 }
95
96 virtual Stream *nextStream(int offset = 1) override {
97 LOGI("nextStream: %d", offset);
98 return selectStream(idx_pos + offset);
99 }
100
101 virtual Stream *selectStream(int index) override {
102 LOGI("selectStream: %d", index);
103 idx_pos = index;
104 return selectStream(idx[index]);
105 }
106
107 virtual Stream *selectStream(const char *path) override {
108 file.close();
109 if (path == nullptr) {
110 LOGE("Filename is null")
111 return nullptr;
112 }
113
114 // AudioFile new_file;
115 if (!file.open(path, O_RDONLY)) {
116 LOGE("Open error: '%s'", path);
117 }
118
119 LOGI("-> selectStream: %s", path);
120 // file = new_file;
121 return &file;
122 }
123
126 void setFileFilter(const char *filter) { file_name_pattern = filter; }
127
129 int index() { return idx_pos; }
130
132 const char *toStr() { return file_name; }
133
134 // provides default setting go to the next
135 virtual bool isAutoNext() { return true; }
136
138 virtual void setPath(const char *p) { start_path = p; }
139
141 long size() { return idx.size(); }
142
144 int indexOf(const char* filename) {
145 return idx.indexOf(filename);
146 }
147
149 const char* name(int pos) {
150 return idx[pos];
151 }
152
153 protected:
154 SdSpiConfig *p_cfg = nullptr;
155 AudioFs sd;
156 AudioFile file;
158 size_t idx_pos = 0;
159 char file_name[MAX_FILE_LEN];
160 const char *exension = nullptr;
161 const char *start_path = nullptr;
162 const char *file_name_pattern = "*";
163 bool setup_index = true;
164 bool is_close_sd = true;
165 bool is_sd_setup = false;
166 int cs;
167 bool owns_cfg = false;
168
169 const char *getFileName(AudioFile &file) {
170 static char name[MAX_FILE_LEN];
171 file.getName(name, MAX_FILE_LEN);
172 return name;
173 }
174};
175
176} // namespace audio_tools
Abstract Audio Data Source for the AudioPlayer which is used by the Audio Players.
Definition AudioSource.h:16
ESP32 AudioSource for AudioPlayer using an SD card as data source. An index file is used to speed up ...
Definition AudioSourceIdxSDFAT.h:28
int index()
Provides the current index position.
Definition AudioSourceIdxSDFAT.h:129
AudioSourceIdxSDFAT(AudioFs fs, const char *startFilePath="/", const char *ext="", bool setupIndex=true)
Constructor for providing an open FS.
Definition AudioSourceIdxSDFAT.h:57
long size()
Provides the number of files (The max index is size()-1)
Definition AudioSourceIdxSDFAT.h:141
virtual Stream * selectStream(int index) override
Definition AudioSourceIdxSDFAT.h:101
virtual bool begin() override
Reset actual stream and move to root.
Definition AudioSourceIdxSDFAT.h:72
const char * toStr()
provides the actual file name
Definition AudioSourceIdxSDFAT.h:132
virtual void setPath(const char *p)
Allows to "correct" the start path if not defined in the constructor.
Definition AudioSourceIdxSDFAT.h:138
virtual bool isAutoNext()
Returns default setting go to the next.
Definition AudioSourceIdxSDFAT.h:135
int indexOf(const char *filename)
Provides the index of the file with the given name.
Definition AudioSourceIdxSDFAT.h:144
AudioSourceIdxSDFAT(const char *startFilePath="/", const char *ext=".mp3", int chipSelect=PIN_CS, int speedMHz=10, bool setupIndex=true)
Default constructor.
Definition AudioSourceIdxSDFAT.h:31
virtual Stream * nextStream(int offset=1) override
Returns next audio stream.
Definition AudioSourceIdxSDFAT.h:96
void setFileFilter(const char *filter)
Definition AudioSourceIdxSDFAT.h:126
const char * name(int pos)
Provides the file name for the indicated index.
Definition AudioSourceIdxSDFAT.h:149
AudioSourceIdxSDFAT(const char *startFilePath, const char *ext, SdSpiConfig &config, bool setupIndex=true)
Costructor with SdSpiConfig.
Definition AudioSourceIdxSDFAT.h:46
virtual Stream * selectStream(const char *path) override
Returns audio stream by path: The index is not changed!
Definition AudioSourceIdxSDFAT.h:107
We store all the relevant file names in an sequential index file. Form there we can access them via a...
Definition SDIndex.h:20
Definition NoArduino.h:142
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10