arduino-audio-tools
Loading...
Searching...
No Matches
VFSFile.h
Go to the documentation of this file.
1#pragma once
2#include <sys/stat.h>
3#include <unistd.h>
4
5#include <fstream>
6#include <iostream>
7
8#include "AudioToolsConfig.h"
9
10#ifdef IS_NOARDUINO
11#define NOARD_OVR override
12#else
13#define NOARD_OVR
14#endif
15
16#ifndef FILE_READ
17#define FILE_READ VFS_FILE_READ
18#define FILE_WRITE VFS_FILE_WRITE
19#define FILE_APPEND VFS_FILE_APPEND
20#endif
21
22namespace audio_tools {
23
25enum SeekMode { SeekSet = 0, SeekCur = 1, SeekEnd = 2 };
26
33class VFSFile : public Stream {
34 public:
35 VFSFile() = default;
36 VFSFile(const char* fn) { open(fn, VFS_FILE_READ); }
37 VFSFile(const VFSFile& file) { open(file.name(), VFS_FILE_READ); }
38 ~VFSFile() { end();}
39
41 open(file.name(), VFS_FILE_READ);
42 return *this;
43 }
44
45 void open(const char* name, FileMode mode = VFS_FILE_READ) {
47 switch (mode) {
48 case VFS_FILE_READ:
49 stream.open(name, stream.binary | stream.in);
50 is_read = true;
51 break;
52 case VFS_FILE_WRITE:
53 stream.open(name, stream.binary | stream.trunc | stream.out);
54 is_read = false;
55 break;
56 case VFS_FILE_APPEND:
57 stream.open(name, stream.binary | stream.out);
58 is_read = false;
59 break;
60 }
61 }
62
63 virtual bool begin() {
64 // move to beginning
65 return seek(0);
66 }
67
68 virtual void end() { stream.close(); }
69
70 virtual int print(const char* str) NOARD_OVR {
71 stream << str;
72 return strlen(str);
73 }
74
75 virtual int println(const char* str = "") NOARD_OVR {
76 stream << str << "\n";
77 return strlen(str) + 1;
78 }
79
80 virtual int print(int number) NOARD_OVR {
81 char buffer[80];
82 int len = snprintf(buffer, 80, "%d", number);
83 print(buffer);
84 return len;
85 }
86
87 virtual int println(int number) {
88 char buffer[80];
89 int len = snprintf(buffer, 80, "%d\n", number);
90 print(buffer);
91 return len;
92 }
93
94 virtual void flush() override { stream.flush(); }
95
96
97 virtual size_t write(uint8_t* str, size_t len) {
98 stream.write((const char*)str, len);
99 return len;
100 }
101
102 virtual size_t write(const uint8_t* str, size_t len) override {
103 stream.write((const char*)str, len);
104 return len;
105 }
106
107 virtual size_t write(int32_t value) {
108 stream.put(value);
109 return 1;
110 }
111
112 virtual size_t write(uint8_t value) override {
113 stream.put(value);
114 return 1;
115 }
116
117 virtual int available() override {
118 int result = size() - position();
119 return result;
120 };
121
122 virtual int read() override { return stream.get(); }
123
124 virtual size_t readBytes(char* data, size_t len) {
125 return readBytes((uint8_t*)data, len);
126 }
127
128 virtual size_t readBytes(uint8_t* data, size_t len) override {
129 stream.read((char*)data, len);
130 return stream ? len : stream.gcount();
131 }
132
133 virtual int peek() override { return stream.peek(); }
134
135 bool seek(uint32_t pos, SeekMode mode) {
136 if (is_read) {
137 switch (mode) {
138 case SeekSet:
139 stream.seekg(pos, std::ios_base::beg);
140 break;
141 case SeekCur:
142 stream.seekg(pos, std::ios_base::cur);
143 break;
144 case SeekEnd:
145 stream.seekg(pos, std::ios_base::end);
146 break;
147 }
148 } else {
149 switch (mode) {
150 case SeekSet:
151 stream.seekp(pos, std::ios_base::beg);
152 break;
153 case SeekCur:
154 stream.seekp(pos, std::ios_base::cur);
155 break;
156 case SeekEnd:
157 stream.seekp(pos, std::ios_base::end);
158 break;
159 }
160 }
161 return stream.fail() == false;
162 }
163
164 bool seek(uint32_t pos) { return seek(pos, SeekSet); }
165
166 size_t position() { return stream.tellp(); }
167
168 size_t size() const {
169 std::streampos fsize = 0;
170 std::ifstream file(file_path, std::ios::binary);
171
172 fsize = file.tellg();
173 file.seekg(0, std::ios::end);
174 fsize = file.tellg() - fsize;
175 file.close();
176
177 return fsize;
178 }
179
180 void close() { stream.close(); }
181
182 const char* name() const { return file_path; }
183
184 operator bool() { return stream.is_open(); }
185
186 protected:
187 std::fstream stream;
188 bool is_read = true;
189 const char* file_path = nullptr;
190};
191
192} // namespace audio_tools
#define NOARD_OVR
Definition VFSFile.h:13
Definition NoArduino.h:142
Arduino File support using std::fstream.
Definition VFSFile.h:33
virtual size_t write(const uint8_t *str, size_t len) override
Definition VFSFile.h:102
const char * file_path
Definition VFSFile.h:189
size_t size() const
Definition VFSFile.h:168
void open(const char *name, FileMode mode=VFS_FILE_READ)
Definition VFSFile.h:45
virtual int read() override
Definition VFSFile.h:122
size_t position()
Definition VFSFile.h:166
VFSFile(const VFSFile &file)
Definition VFSFile.h:37
virtual bool begin()
Definition VFSFile.h:63
void close()
Definition VFSFile.h:180
bool seek(uint32_t pos)
Definition VFSFile.h:164
virtual size_t readBytes(uint8_t *data, size_t len) override
Definition VFSFile.h:128
bool seek(uint32_t pos, SeekMode mode)
Definition VFSFile.h:135
VFSFile & operator=(VFSFile file)
Definition VFSFile.h:40
virtual size_t write(int32_t value)
Definition VFSFile.h:107
const char * name() const
Definition VFSFile.h:182
std::fstream stream
Definition VFSFile.h:187
bool is_read
Definition VFSFile.h:188
virtual int println(const char *str="")
Definition VFSFile.h:75
virtual int peek() override
Definition VFSFile.h:133
virtual size_t readBytes(char *data, size_t len)
Definition VFSFile.h:124
VFSFile(const char *fn)
Definition VFSFile.h:36
~VFSFile()
Definition VFSFile.h:38
virtual int println(int number)
Definition VFSFile.h:87
virtual int print(const char *str)
Definition VFSFile.h:70
virtual size_t write(uint8_t *str, size_t len)
Definition VFSFile.h:97
virtual size_t write(uint8_t value) override
Definition VFSFile.h:112
virtual void end()
Definition VFSFile.h:68
virtual int print(int number)
Definition VFSFile.h:80
virtual void flush() override
Definition VFSFile.h:94
virtual int available() override
Definition VFSFile.h:117
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
FileMode
Definition VFSFile.h:24
@ VFS_FILE_READ
Definition VFSFile.h:24
@ VFS_FILE_WRITE
Definition VFSFile.h:24
@ VFS_FILE_APPEND
Definition VFSFile.h:24
SeekMode
Definition VFSFile.h:25
@ SeekSet
Definition VFSFile.h:25
@ SeekCur
Definition VFSFile.h:25
@ SeekEnd
Definition VFSFile.h:25
size_t writeData(Print *p_out, T *data, int samples, int maxSamples=512)
Definition AudioTypes.h:512