arduino-audio-tools
Loading...
Searching...
No Matches
AudioSourceSD.h
Go to the documentation of this file.
1#pragma once
2#include "SD.h"
3#include "SPI.h"
4#include "AudioLogger.h"
6#include "SDDirect.h"
7
8namespace audio_tools {
9
10
35class AudioSourceSD : public AudioSource {
36public:
38 AudioSourceSD(const char *startFilePath = "/", const char *ext = ".mp3", int chipSelect = PIN_CS, bool setupIndex=true) {
40 extension = ext;
42 p_spi = &SPI;
43 cs = chipSelect;
44 }
45
46#ifdef USE_SD_SUPPORTS_SPI
47
48 // Pass your own spi instance, in case you need a dedicated one
49 AudioSourceSD(const char *startFilePath, const char *ext, int chipSelect, SPIClass &spiInstance, bool setupIndex=true) {
51 extension = ext;
54 cs = chipSelect;
55 }
56
57#endif
58
59 virtual bool begin() override {
60 TRACED();
61 if (!is_sd_setup) {
62 int retry = 10;
63 while (!start_sd()) {
64 LOGE("SD.begin cs=%d failed", cs);
65 delay(500);
66 if (--retry <= 0) {
67 return false;
68 }
69 }
70 is_sd_setup = true;
71 }
73 idx_pos = 0;
74 return is_sd_setup;
75 }
76
77 void end() {
78 file.close();
79 SD.end();
80 is_sd_setup = false;
81 }
82
83 virtual Stream *nextStream(int offset = 1) override {
84 LOGI("nextStream: %d", offset);
85 return selectStream(idx_pos + offset);
86 }
87
88 virtual Stream *selectStream(int index) override {
89 LOGI("selectStream SD: %d", index);
90 if (index > -1) { // avoid invalid position
91 idx_pos = index;
92 }
93 return selectStream(idx[idx_pos]);
94 }
95
96 virtual Stream *selectStream(const char *path) override {
97 file.close();
98 if (path == nullptr) {
99 LOGE("Filename is null")
100 return nullptr;
101 }
102 file = SD.open(path);
103 file_name = file.name();
104 LOGI("-> selectStream: %s", path);
105 return file ? &file : nullptr;
106 }
107
110 void setFileFilter(const char *filter) { file_name_pattern = filter; }
111
113 int index() { return idx_pos; }
114
116 const char *toStr() { return file_name; }
117
118 // provides default setting go to the next
119 virtual bool isAutoNext() { return true; }
120
122 virtual void setPath(const char *p) { start_path = p; }
123
125 long size() { return idx.size();}
126
127protected:
128#if defined(USE_SD_NO_NS)
130#else
132#endif
134 size_t idx_pos = 0;
135 const char *file_name;
136 const char *extension = nullptr;
137 const char *start_path = nullptr;
138 const char *file_name_pattern = "*";
139 bool setup_index = true;
140 bool is_sd_setup = false;
141 int cs;
142 SPIClass *p_spi = nullptr;
143
144 bool start_sd(){
145#ifdef USE_SD_SUPPORTS_SPI
146 return SD.begin(cs, *p_spi);
147#else
148 return SD.begin(cs);
149#endif
150 }
151
152};
153
154} // namespace audio_tools
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#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
ESP32 AudioSource for AudioPlayer using an SD card as data source. This class is based on the Arduino...
Definition AudioSourceSD.h:35
int index()
Provides the current index position.
Definition AudioSourceSD.h:113
bool start_sd()
Definition AudioSourceSD.h:144
long size()
Provides the number of files (The max index is size()-1): WARNING this is very slow if you have a lot...
Definition AudioSourceSD.h:125
bool is_sd_setup
Definition AudioSourceSD.h:140
const char * extension
Definition AudioSourceSD.h:136
virtual Stream * selectStream(int index) override
Definition AudioSourceSD.h:88
virtual bool begin() override
Reset actual stream and move to root.
Definition AudioSourceSD.h:59
File file
Definition AudioSourceSD.h:133
size_t idx_pos
Definition AudioSourceSD.h:134
SPIClass * p_spi
Definition AudioSourceSD.h:142
const char * start_path
Definition AudioSourceSD.h:137
const char * toStr()
provides the actual file name
Definition AudioSourceSD.h:116
const char * file_name
Definition AudioSourceSD.h:135
virtual void setPath(const char *p)
Allows to "correct" the start path if not defined in the constructor.
Definition AudioSourceSD.h:122
virtual bool isAutoNext()
Returns default setting go to the next.
Definition AudioSourceSD.h:119
AudioSourceSD(const char *startFilePath="/", const char *ext=".mp3", int chipSelect=PIN_CS, bool setupIndex=true)
Default constructor.
Definition AudioSourceSD.h:38
virtual Stream * nextStream(int offset=1) override
Returns next audio stream.
Definition AudioSourceSD.h:83
void end()
Definition AudioSourceSD.h:77
bool setup_index
Definition AudioSourceSD.h:139
void setFileFilter(const char *filter)
Definition AudioSourceSD.h:110
int cs
Definition AudioSourceSD.h:141
const char * file_name_pattern
Definition AudioSourceSD.h:138
virtual Stream * selectStream(const char *path) override
Returns audio stream by path: The index is not changed!
Definition AudioSourceSD.h:96
SDDirect< fs::SDFS, fs::File > idx
Definition AudioSourceSD.h:131
We access the files directy with an index. The index is determined by a recurseve tree walk thru the ...
Definition SDDirect.h:22
long size()
Provides the number of files.
Definition SDDirect.h:50
void begin(const char *startDir, const char *extension, const char *file_name_pattern)
Definition SDDirect.h:26
Arduino File API for Zephyr.
Definition ZephyrFile.h:23
void close()
Definition ZephyrFile.h:67
const char * name() const
Definition ZephyrFile.h:200
ZephyrFile open(const char *path, const char *mode="r", bool create=false)
Definition ZephyrSD.h:51
void end()
Definition ZephyrSD.h:43
bool begin(const char *diskName="SD", const char *mountPoint="/SD")
Definition ZephyrSD.h:32
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
void delay(uint32_t ms)
Definition Arduino.h:255
static ZephyrSDClass SD
Access to SD object.
Definition ZephyrSD.h:215
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:508