SID Player
All Classes Functions Pages
SIDAudioSource.h
1 #pragma once
2 #ifdef ARDUINO
3 #include "SD.h"
4 #endif
5 #include <stddef.h>
6 #include <stdint.h>
7 
8 #include "audio/comic.h"
9 #include "audio/commando.h" // Good!
10 #include "audio/ik.h" // Good!
11 #include "audio/mikie.h" // Good!
12 #include "audio/ocean.h" // Good!
13 #include "audio/yie.h" // Good!
14 
15 namespace audio_tools {
16 
22 struct SidTitle {
23  uint8_t *data;
24  size_t size;
25  int no;
26 };
27 
28 const SidTitle DemoSongs[] = {
29  {(uint8_t *)music_Commando_sid, music_Commando_sid_len, 0},
30  {(uint8_t *)Yie_Ar_Kung_Fu_sid, Yie_Ar_Kung_Fu_sid_len, 18},
31  {(uint8_t *)Mikie_sid, Mikie_sid_len, 0},
32  {(uint8_t *)Ocean_Loader_2_sid, Ocean_Loader_2_sid_len, 0},
33  {(uint8_t *)International_Karate_sid, International_Karate_sid_len, 0},
34  {(uint8_t *)Comic_Bakery_sid, Comic_Bakery_sid_len, 0}
35 };
36 const int DemoSongsCount = 6;
37 
43 class SIDAudioSource : public AudioSource {
44 public:
45  SIDAudioSource() = default;
46  SIDAudioSource(const SidTitle *songs, int count) {
47  for (int j = 0; j < count; j++) {
48  addSong(songs[j]);
49  }
50  }
51 
52  void addSong(SidTitle song) { songs.push_back(song); }
53 
55  virtual void begin() {
56  index = 0;
57  stream.begin();
58  }
59 
61  virtual Stream *nextStream(int offset) {
62  index += offset;
63  if (index >= songs.size()) {
64  index = 0;
65  }
66  if (index < 0) {
67  index = songs.size() - 1;
68  }
69  return selectStream(index);
70  }
71 
74  virtual Stream *selectStream(int index) {
75  LOGI("selectStream: %d", index);
76  SidTitle& title = songs[index];
77  stream.setValue(title.data, title.size, FLASH_RAM);
78  title_size = title.size;
79  LOGI("actualFileSize: %d", (int)title_size);
80  return &stream;
81  }
82 
83  size_t actualFileSize() { return title_size; }
84 
86  int size() { return songs.size(); }
87 
89  void clear() { songs.clear(); }
90 
92  virtual Stream *selectStream(const char *path) { return nullptr; }
93 
94 protected:
95  int index = 0;
96  Vector<SidTitle> songs{0};
97  MemoryStream stream{nullptr,0,true, FLASH_RAM};
98  size_t title_size = 0;
99 };
100 
106 class SizeSource {
107 public:
108  virtual size_t size() = 0;
109 };
110 
111 #ifdef ARDUINO
112 
118 class SizeSourceFile : public SizeSource {
119 public:
120  SizeSourceFile(AudioSource &source) { p_source = &source; }
121  size_t size() override {
122  // get the current stream (which is actually a file)
123  File *p_file = (File *)p_source->nextStream(0);
124  return p_file->size();
125  };
126 
127 protected:
128  AudioSource *p_source;
129 };
130 
131 #endif
132 
138 class SIDSizeSource : public SizeSource {
139 public:
140  SIDSizeSource(SIDAudioSource &source) { p_source = &source; }
141  size_t size() { return p_source->actualFileSize(); }
142 
143 protected:
144  SIDAudioSource *p_source;
145 };
146 
147 
148 } // namespace audiotools
AudioSource with SID files which are stored in PROGMEM.
Definition: SIDAudioSource.h:43
virtual Stream * selectStream(int index)
Definition: SIDAudioSource.h:74
virtual Stream * nextStream(int offset)
Returns next audio stream.
Definition: SIDAudioSource.h:61
void clear()
Clears all songs.
Definition: SIDAudioSource.h:89
virtual Stream * selectStream(const char *path)
Returns audio stream by path.
Definition: SIDAudioSource.h:92
virtual void begin()
Reset actual stream and move to root.
Definition: SIDAudioSource.h:55
int size()
File size of actual file.
Definition: SIDAudioSource.h:86
Provides the size of the current file for a SIDAudioSource.
Definition: SIDAudioSource.h:138
Logic to determine the Size of the Stream: File ?
Definition: SIDAudioSource.h:106
Information about an individual SID song title.
Definition: SIDAudioSource.h:22