arduino-audio-tools
All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Modules Pages
VFSFile.h
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
24enum FileMode { VFS_FILE_READ = 'r', VFS_FILE_WRITE = 'w', VFS_FILE_APPEND = 'a' };
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
40 VFSFile& operator=(VFSFile file) {
41 open(file.name(), VFS_FILE_READ);
42 return *this;
43 }
44
45 void open(const char* name, FileMode mode = VFS_FILE_READ) {
46 file_path = name;
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
Definition NoArduino.h:142
Arduino File support using std::fstream.
Definition VFSFile.h:33
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10