arduino-audio-tools
Loading...
Searching...
No Matches
AudioSourceVFS.h
Go to the documentation of this file.
1#pragma once
2
3#include <filesystem>
4
5#include "AudioLogger.h"
10
11namespace audio_tools {
12
13namespace fs = std::filesystem;
14
26 public:
28 AudioSourceVFS(VFS &vfs, const char *startFilePath = "/",
29 const char *ext = "") {
31 exension = ext;
32 setVFS(vfs);
33 }
34
36 AudioSourceVFS(const char *startFilePath = "/",
37 const char *ext = "") {
39 exension = ext;
40 }
41
42 virtual ~AudioSourceVFS() {
43 end();
44 }
45
46
47 virtual bool begin() override {
48 TRACED();
49 idx_pos = 0;
50 return (p_vfs) ? p_vfs->begin() : false;
51 }
52
53 virtual void end() {
54 file.close();
55 if (p_vfs) p_vfs->end();
56 }
57
58 virtual Stream *nextStream(int offset = 1) override {
59 LOGI("nextStream: %d", offset);
60 return selectStream(idx_pos + offset);
61 }
62
63 virtual Stream *selectStream(int index) override {
64 LOGI("selectStream: %d", index);
65 idx_pos = index;
67 if (file_name == nullptr) return nullptr;
68 LOGI("Using file %s", file_name);
69 assert(p_vfs != nullptr);
71 return file ? &file : nullptr;
72 }
73
74 virtual Stream *selectStream(const char *path) override {
75 file.close();
76 if (path == nullptr) {
77 LOGE("Filename is null")
78 return nullptr;
79 }
80 assert(p_vfs != nullptr);
81 file = p_vfs->open(path);
83 LOGI("-> selectStream: %s", path);
84 return file ? &file : nullptr;
85 }
86
89 void setFileFilter(const char *filter) { file_name_pattern = filter; }
90
92 int index() { return idx_pos; }
93
95 const char *toStr() { return file_name; }
96
97 // provides default setting go to the next
98 virtual bool isAutoNext() { return true; }
99
101 virtual void setPath(const char *p) { start_path = p; }
102
105 long size() {
106 long count = 0;
107 for (auto const &dir_entry : fs::recursive_directory_iterator(start_path)) {
108 if (isValidAudioFile(dir_entry)) count++;
109 }
110 return count;
111 }
112
114 void setVFS(VFS &vfs){
115 p_vfs = &vfs;
116 }
117
118 protected:
120 size_t idx_pos = 0;
121 const char *file_name;
122 const char *exension = "";
123 const char *start_path = "/";
124 const char *file_name_pattern = "*";
125 fs::directory_entry entry;
126 VFS *p_vfs = nullptr;
127
128 const char *get(int idx) {
129 int count = 0;
130 const char *result = nullptr;
131 for (auto const &dir_entry : fs::recursive_directory_iterator(start_path)) {
133 if (count++ == idx) {
135 result = entry.path().c_str();
136 break;
137 }
138 }
139 }
140 return result;
141 }
142
144 bool isValidAudioFile(fs::directory_entry file) {
145 const std::filesystem::path &path = file.path();
146
147 const char *file_name = path.filename().c_str();
148 if (file.is_directory()) {
149 LOGD("-> isValidAudioFile: '%s': %d", file_name, false);
150 return false;
151 }
153 bool result = strFileTName.endsWithIgnoreCase(exension) &&
155 LOGD("-> isValidAudioFile: '%s': %d", file_name, result);
156 return result;
157 }
158};
159
160} // namespace audio_tools
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define LOGE(...)
Definition AudioLoggerIDF.h:30
#define assert(T)
Definition avr.h:10
Definition Arduino.h:136
Abstract Audio Data Source for the AudioPlayer which is used by the Audio Players.
Definition AudioSource.h:17
AudioSource using the standard C++ api. In order to make this work you need to configure and provide ...
Definition AudioSourceVFS.h:25
int index()
Provides the current index position.
Definition AudioSourceVFS.h:92
const char * get(int idx)
Definition AudioSourceVFS.h:128
const char * exension
Definition AudioSourceVFS.h:122
long size()
Definition AudioSourceVFS.h:105
virtual Stream * selectStream(int index) override
Definition AudioSourceVFS.h:63
AudioSourceVFS(VFS &vfs, const char *startFilePath="/", const char *ext="")
Default constructor with VFS.
Definition AudioSourceVFS.h:28
virtual bool begin() override
Reset actual stream and move to root.
Definition AudioSourceVFS.h:47
fs::directory_entry entry
Definition AudioSourceVFS.h:125
size_t idx_pos
Definition AudioSourceVFS.h:120
VFS * p_vfs
Definition AudioSourceVFS.h:126
VFSFile file
Definition AudioSourceVFS.h:119
const char * start_path
Definition AudioSourceVFS.h:123
const char * toStr()
provides the actual file name
Definition AudioSourceVFS.h:95
const char * file_name
Definition AudioSourceVFS.h:121
virtual ~AudioSourceVFS()
Definition AudioSourceVFS.h:42
virtual void setPath(const char *p)
Allows to "correct" the start path if not defined in the constructor.
Definition AudioSourceVFS.h:101
AudioSourceVFS(const char *startFilePath="/", const char *ext="")
Default constructor w/o VFS.
Definition AudioSourceVFS.h:36
virtual bool isAutoNext()
Returns default setting go to the next.
Definition AudioSourceVFS.h:98
virtual Stream * nextStream(int offset=1) override
Returns next audio stream.
Definition AudioSourceVFS.h:58
void setFileFilter(const char *filter)
Definition AudioSourceVFS.h:89
virtual void end()
Definition AudioSourceVFS.h:53
const char * file_name_pattern
Definition AudioSourceVFS.h:124
bool isValidAudioFile(fs::directory_entry file)
checks if the file is a valid audio file
Definition AudioSourceVFS.h:144
virtual Stream * selectStream(const char *path) override
Returns audio stream by path: The index is not changed!
Definition AudioSourceVFS.h:74
void setVFS(VFS &vfs)
Assign the VFS: to be used before calling begin.
Definition AudioSourceVFS.h:114
A simple wrapper to provide string functions on existing allocated char*. If the underlying char* is ...
Definition StrView.h:28
Arduino File support using std::fstream.
Definition VFSFile.h:33
void close()
Definition VFSFile.h:180
const char * name() const
Definition VFSFile.h:182
Base class which uses c++ file functions. It is also used as base class for an ESP32 Virtual File Sys...
Definition VFS.h:18
virtual bool begin()
mount the file systems
Definition VFS.h:21
VFSFile open(const char *file, FileMode mode=VFS_FILE_READ)
Definition VFS.h:27
virtual void end()
unmount the file system
Definition VFS.h:23
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