RingTonePlayer.h
Go to the documentation of this file.
1 /****
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * Player.h - Support for playing simple ring tones
8  *
9  * RTTTL conversion code based on https://github.com/end2endzone/NonBlockingRTTTL
10  *
11  * @author Sept 2019 mikee47 <mike@sillyhouse.net>
12  *
13  ****/
14 
15 #pragma once
16 
17 #include <Timer.h>
18 #include <Delegate.h>
19 #include <Platform/Timers.h>
20 #include "RtttlParser.h"
21 
22 namespace RingTone
23 {
30 class Player
31 {
32 public:
33  using PrepareNoteDelegate = Delegate<void(unsigned frequency)>;
34  using CompleteDelegate = Delegate<void()>;
35  using PlayNoteDelegate = Delegate<void()>;
36 
37  Player() : totalPlayTime(NanoTime::Milliseconds, 0)
38  {
39  }
40 
42  {
43  end();
44  }
45 
51  void begin(RingTone::Parser* parser);
52 
56  void end();
57 
61  bool start(unsigned delayMs = 0);
62 
66  void stop();
67 
72  {
73  totalPlayTime.time = 0;
74  playTime.start();
75  }
76 
80  bool isStarted()
81  {
82  return started;
83  }
84 
86  {
87  prepareNoteDelegate = delegate;
88  }
89 
91  {
92  playNoteDelegate = delegate;
93  }
94 
96  {
97  completeDelegate = delegate;
98  }
99 
101  {
102  auto time = totalPlayTime;
103  if(started) {
104  time += playTime.elapsedTime();
105  }
106  return time;
107  }
108 
113  unsigned getSpeed() const
114  {
115  return speed;
116  }
117 
122  unsigned setSpeed(unsigned speed)
123  {
124  this->speed = std::min(std::max(speed, 10U), 250U);
125  return this->speed;
126  }
127 
132  unsigned adjustSpeed(int adjust)
133  {
134  return setSpeed(speed + adjust);
135  }
136 
137 protected:
142  virtual void prepareNote(unsigned frequency)
143  {
144  if(prepareNoteDelegate) {
145  prepareNoteDelegate(frequency);
146  }
147  }
148 
152  virtual void playNote()
153  {
154  if(playNoteDelegate) {
155  playNoteDelegate();
156  }
157  }
158 
163  virtual void complete()
164  {
165  if(completeDelegate) {
166  completeDelegate();
167  }
168  }
169 
170 private:
171  void scaleNote()
172  {
173  preparedNote.duration = (preparedNote.duration * 100) / speed;
174  }
175 
176  void playPreparedNote();
177 
178 private:
179  RingTone::Parser* parser = nullptr;
180  PrepareNoteDelegate prepareNoteDelegate;
181  PlayNoteDelegate playNoteDelegate;
182  CompleteDelegate completeDelegate;
183  NanoTime::Time<uint32_t> totalPlayTime;
184  OneShotFastMs playTime;
185  Timer noteTimer;
186  bool started = false;
187  uint8_t speed = 100;
188  RingTone::NoteDef preparedNote;
189 };
190 
191 } // namespace RingTone
Template class to implement a polled timer.
Definition: PolledTimer.h:68
void start()
Start the timer.
Definition: PolledTimer.h:103
NanoTime::Time< TimeType > elapsedTime() const
Get elapsed time since start() was last called.
Definition: PolledTimer.h:186
Base parser class.
Definition: RingTone.h:93
Base class to support playback of tunes.
Definition: RingTonePlayer.h:31
unsigned getSpeed() const
Get playback speed factor.
Definition: RingTonePlayer.h:113
virtual void complete()
Override this method to be called when a tune has finished playing.
Definition: RingTonePlayer.h:163
~Player()
Definition: RingTonePlayer.h:41
virtual void playNote()
Play a prepared tone.
Definition: RingTonePlayer.h:152
bool start(unsigned delayMs=0)
Start or continue playing the tune.
Delegate< void()> CompleteDelegate
Definition: RingTonePlayer.h:34
void resetPlayTime()
Stop playback and reset play time.
Definition: RingTonePlayer.h:71
void begin(RingTone::Parser *parser)
Initialise player.
unsigned adjustSpeed(int adjust)
Make a relative adjustment to playback speed.
Definition: RingTonePlayer.h:132
void onComplete(CompleteDelegate delegate)
Definition: RingTonePlayer.h:95
Delegate< void(unsigned frequency)> PrepareNoteDelegate
Definition: RingTonePlayer.h:33
void end()
Stop the player and un-reference parser.
const NanoTime::Time< uint32_t > getPlayTime()
Definition: RingTonePlayer.h:100
void stop()
Stop/pause playing the tune.
virtual void prepareNote(unsigned frequency)
Prepare a tone to be played @frequency Frequency of tone, in Hz. 0 means 'mute'.
Definition: RingTonePlayer.h:142
void onPlayNote(PlayNoteDelegate delegate)
Definition: RingTonePlayer.h:90
Delegate< void()> PlayNoteDelegate
Definition: RingTonePlayer.h:35
Player()
Definition: RingTonePlayer.h:37
unsigned setSpeed(unsigned speed)
Set playback speed factor.
Definition: RingTonePlayer.h:122
bool isStarted()
Determine if a tune is being played.
Definition: RingTonePlayer.h:80
void onPrepareNote(PrepareNoteDelegate delegate)
Definition: RingTonePlayer.h:85
Callback timer class.
Definition: Timer.h:263
Definition: NanoTime.h:40
Time< T > time(Unit unit, T value)
Helper function to create a Time and deduce the type.
Definition: NanoTime.h:423
@ Milliseconds
Definition: NanoTime.h:48
Definition: RingTone.h:19
T time
Definition: NanoTime.h:417
Definition: RingTone.h:43
uint16_t duration
Definition: RingTone.h:45