pianod2
multisource multiuser scriptable networked music player
tonegen.h
Go to the documentation of this file.
1 
11 #pragma once
12 
13 #include <config.h>
14 
15 #include <cstdio>
16 #include <ctime>
17 
18 #include <map>
19 #include <memory>
20 
21 #include "mediaunit.h"
22 #include "mediaplayer.h"
23 #include "audio/audiooutput.h"
24 #include "fundamentals.h"
25 #include "musiclibrary.h"
26 #include "musiclibraryparameters.h"
27 
28 namespace Media {
29  class Output;
30 }
31 
32 
37 namespace ToneGenerator {
38  typedef struct tone_sequence_t {
39  float duration;
40  float firstFreq;
41  float secondFreq;
44  typedef struct tone_albumt_t {
45  const char *artist;
46  const char *album;
47  const char *playlist;
48  const char *coverart;
50  typedef struct tone_song_t {
51  const char *id;
52  const char *title;
53  const TONE_ALBUM *album;
57 
58  enum class Channel {
59  LEFT,
60  CENTER,
61  RIGHT
62  };
63 
64  class Source;
65  class Player;
66  class Library;
67  class Song : public MusicLibrary::Song {
68  friend Source;
69  friend Player;
70  friend Library;
71  private:
72  const TEST_SONG *media() const;
74  public:
76  };
77 
78  class Player : public Media::ThreadedPlayer {
79  using channel_sample = int16_t;
80  typedef struct audio_sample {
83  } AUDIO_SAMPLE;
84  private:
85  Audio::Output *output = nullptr;
86  public:
88  const Song *song;
89  const TEST_SONG *media;
90  volatile int repetitions = 0;
91  volatile int current_rep = 0;
93  std::unique_ptr<AUDIO_SAMPLE> tone;
94  float duration = 0;
95  long samples = 0;
96 
97  public:
98  Player (const AudioSettings &audio, const PianodSong *song);
99  void createTone (int volume);
100 
101  // Regulate playback
102  virtual void setVolume (float volume) override;
103 
104  // Data retrieval functions
105  State currentState (void) const override;
106  virtual float trackDuration (void) const override;
107  virtual float playPoint (void) const override;
108  virtual RESPONSE_CODE playerThread (void) override;
109  };
110 
111  struct SplitToneId {
112  std::string media_id;
114  SplitToneId (const std::string &id);
115  };
116 
118  friend Source;
119  private:
120 
121  public:
122  Library (Media::Source * const owner, const bool persistence);
123  void loadToneLibrary (bool restored);
124  Song *add (const TEST_SONG *item);
125  Song *duplicate (const Song *song, const Channel channel);
126  };
127 
130  bool discrete_channels = false;
132  };
133 
134 
135  class Source : public Media::Source {
136  friend class Playlist;
137  friend class Library;
138  private:
142  public:
143  Source (const Parameters &params);
144  ~Source (void);
145 
146  // Identity
147  virtual const char *kind (void) const override;
148 
149  // Capability check methods
150  virtual bool canExpandToAllSongs (void) const override;
151 
152  // General source stuff
153  virtual bool flush (void) override;
154  virtual float periodic (void) override;
155 
156  // Playlist methods
157  virtual PlaylistList getPlaylists (const Filter &filter) override;
158  virtual MusicThingie *getAnythingById (const Media::SplitId &id) override;
159  virtual PianodPlaylist *getMixPlaylist (void) override;
160  virtual PianodPlaylist *getEverythingPlaylist (void) override;
161 
162  // Creating playlists
163  virtual PianodPlaylist *createPlaylist (const char *name,
164  MusicThingie::Type type,
165  MusicThingie *from) override;
166  virtual PianodPlaylist *createPlaylist (const char *name, const Filter &filter) override;
167  virtual PianodPlaylist *getTransientPlaylist (const Filter &criteria) override;
168 
169  // Miscellaneous
170  virtual Media::Player *getPlayer (const AudioSettings &audio, PianodSong *song) override;
172  const UserList &users,
173  Media::SelectionMethod) override;
174  virtual ThingieList getSuggestions (const Filter &filter, SearchRange where) override;
175 
176  // Typecasts
178  MusicThingie::Type type,
179  SearchRange where) override;
180  };
181 }
182 
Class to abstract away details of audio output system is in use.
Base audio output class (abstract).
Definition: audiooutput.h:65
Track data filter.
Definition: filter.h:38
Base class for playing audio from some source.
Definition: mediaplayer.h:46
State
Definition: mediaplayer.h:48
Base class that wraps any audio source, such as Pandora, Spotify, or local music.
Definition: mediaunit.h:68
const std::string & name(void) const
Get the name of this source.
Definition: mediasource.cpp:38
Source(SourceParameters *params)
Initialize the source.
Definition: mediasource.cpp:24
Mechanism to split MusicThingie IDs into source identifier, type and inner ID.
Definition: mediaunit.h:195
Base class for audio players that are spawned to a new thread.
Definition: mediaplayer.h:90
Definition: musiclibrary.h:339
Definition: musiclibraryparameters.h:30
LibraryParameters(Ownership::Type perm, User *user)
Definition: musiclibraryparameters.cpp:48
A PianodSong made of inbred data structures.
Definition: musiclibrary.h:217
Song(Album *const parent, const std::string &id, const std::string &name)
Add a song, and register itself with its parent album.
Definition: musiclibrarytypes.cpp:482
Base class for songs, albums, artists, playlists, genres, etc.
Definition: musictypes.h:77
Type
Definition: musictypes.h:86
Base class for playlists, but still a MusicThingie.
Definition: musictypes.h:416
Base class for songs, these are also MusicThingies, artists and albums.
Definition: musictypes.h:339
A container for lists of playlists.
Definition: retainedlist.h:324
A container for holding songs.
Definition: retainedlist.h:328
Base class for storing lists of thingies, which need to be reference counted accurately.
Definition: retainedlist.h:20
Definition: tonegen.h:117
void loadToneLibrary(bool restored)
Definition: tonegen.cpp:391
friend Source
Definition: tonegen.h:118
Song * duplicate(const Song *song, const Channel channel)
Definition: tonegen.cpp:373
Song * add(const TEST_SONG *item)
Definition: tonegen.cpp:384
Library(Media::Source *const owner, const bool persistence)
Definition: tonegen.cpp:355
const AudioSettings audio
Definition: tonegen.h:87
std::unique_ptr< AUDIO_SAMPLE > tone
Definition: tonegen.h:93
volatile int repetitions
Definition: tonegen.h:90
int16_t channel_sample
Definition: tonegen.h:79
virtual float playPoint(void) const override
Seconds from start, or a negative value if unknown.
const TEST_SONG * media
Definition: tonegen.h:89
State currentState(void) const override
float duration
Definition: tonegen.h:94
virtual float trackDuration(void) const override
Length of track in seconds, or a negative number if unknown.
Audio::Output * output
Definition: tonegen.h:85
long samples
Definition: tonegen.h:95
const Song * song
Definition: tonegen.h:88
virtual RESPONSE_CODE playerThread(void) override
Definition: tonegenplayer.cpp:128
int seconds_into_rep
Definition: tonegen.h:92
virtual void setVolume(float volume) override
Adjust volume in decibels.
volatile int current_rep
Definition: tonegen.h:91
void createTone(int volume)
Definition: tonegenplayer.cpp:39
Definition: tonegen.h:67
Channel channel
Definition: tonegen.h:73
friend Library
Definition: tonegen.h:70
friend Player
Definition: tonegen.h:69
const TEST_SONG * media() const
Definition: tonegen.cpp:410
friend Source
Definition: tonegen.h:68
virtual bool canExpandToAllSongs(void) const override
Indicate if arbitrary tracks can be requested from this source.
virtual ThingieList getSuggestions(const Filter &filter, SearchRange where) override
~Source(void)
Destroy a source.
virtual PianodPlaylist * getTransientPlaylist(const Filter &criteria) override
Create a temporary playlist based on a filter.
virtual PianodPlaylist * getMixPlaylist(void) override
virtual MusicThingie * getSuggestion(MusicThingie *thing, MusicThingie::Type type, SearchRange where) override
Retrieve an equivalent or related album, artist, or song from a source.
virtual float periodic(void) override
Do intermittent or background tasks.
virtual bool flush(void) override
Persist data for a source.
PianodPlaylist * mix_playlist
Definition: tonegen.h:140
virtual Media::Player * getPlayer(const AudioSettings &audio, PianodSong *song) override
virtual PianodPlaylist * createPlaylist(const char *name, const Filter &filter) override
Create a playlist using a filter.
virtual PlaylistList getPlaylists(const Filter &filter) override
Retrieve the source's playlists.
virtual PianodPlaylist * getEverythingPlaylist(void) override
PianodPlaylist * everything_playlist
Definition: tonegen.h:141
Library library
Definition: tonegen.h:139
virtual MusicThingie * getAnythingById(const Media::SplitId &id) override
virtual SongList getRandomSongs(PianodPlaylist *playlist, const UserList &users, Media::SelectionMethod) override
virtual const char * kind(void) const override
A unique string identifying the type of source.
virtual PianodPlaylist * createPlaylist(const char *name, MusicThingie::Type type, MusicThingie *from) override
Create a playlist using a thingie as an initial seed.
Essential data structures and support.
std::vector< const class User * > UserList
Definition: fundamentals.h:348
enum server_status_t RESPONSE_CODE
SearchRange
Definition: fundamentals.h:35
Public interface for media players.
Public interface for sources, which provide an interface interfaces to select available music,...
PlayList / Artist / Album / Song types that are interbred to form a library.
Source parameters for sources based on music library.
const char * Source
Definition: pandoratypes.h:113
Media source, source parameters and player interfaces.
Definition: connection.h:22
SelectionMethod
The manner in which shuffling is performed.
Definition: mediaunit.h:55
const char * Playlist
Definition: musickeys.cpp:66
Classes for playing test tones.
Definition: tonegen.cpp:20
Channel
Definition: tonegen.h:58
struct ToneGenerator::tone_albumt_t TONE_ALBUM
struct ToneGenerator::tone_sequence_t TONE_SEQUENCE
struct ToneGenerator::tone_song_t TEST_SONG
Audio output device & driver parameters.
Definition: fundamentals.h:52
Source parameters for filesystem source.
Definition: tonegen.h:129
bool discrete_channels
Definition: tonegen.h:130
Definition: tonegen.h:80
channel_sample left
Definition: tonegen.h:81
channel_sample right
Definition: tonegen.h:82
Definition: tonegen.h:111
SplitToneId(const std::string &id)
Definition: tonegen.cpp:336
std::string media_id
Definition: tonegen.h:112
Channel channel
Definition: tonegen.h:113
Definition: tonegen.h:44
const char * album
Definition: tonegen.h:46
const char * coverart
Definition: tonegen.h:48
const char * playlist
Definition: tonegen.h:47
const char * artist
Definition: tonegen.h:45
Definition: tonegen.h:38
float secondFreq
Definition: tonegen.h:41
float duration
Definition: tonegen.h:39
float relativeVolume
Definition: tonegen.h:42
float firstFreq
Definition: tonegen.h:40
Definition: tonegen.h:50
const TONE_ALBUM * album
Definition: tonegen.h:53
const char * title
Definition: tonegen.h:52
int toneRepetitions
Definition: tonegen.h:55
const TONE_SEQUENCE * tones
Definition: tonegen.h:54
const char * id
Definition: tonegen.h:51