| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef GARNET_EXAMPLES_MEDIA_TONES_TONES_H_ |
| #define GARNET_EXAMPLES_MEDIA_TONES_TONES_H_ |
| |
| #include <list> |
| #include <map> |
| |
| #include <fuchsia/media/cpp/fidl.h> |
| #include <lib/fit/function.h> |
| #include <lib/fzl/vmo-mapper.h> |
| |
| #include "garnet/examples/media/tones/tone_generator.h" |
| #include "lib/component/cpp/startup_context.h" |
| #include "lib/fsl/tasks/fd_waiter.h" |
| #include "lib/fxl/functional/closure.h" |
| #include "lib/fxl/macros.h" |
| |
| namespace examples { |
| |
| class MidiKeyboard; |
| |
| class Tones { |
| public: |
| Tones(bool interactive, fit::closure quit_callback); |
| |
| ~Tones(); |
| |
| private: |
| friend class MidiKeyboard; |
| |
| // Quits the app. |
| void Quit(); |
| |
| // Calls |HandleKeystroke| on the message loop when console input is ready. |
| void WaitForKeystroke(); |
| |
| // Handles a keystroke, possibly calling |WaitForKeystroke| to wait for the |
| // next one. |
| void HandleKeystroke(); |
| |
| // Handles a note on/off event from a midi keyboard for the specified note. 0 |
| // corresponds to middle C, every tick above or below is a distance of 1/2 a |
| // step. So, -1 would be the B below middle C, while 3 would be the D# above |
| // middle C. |
| void HandleMidiNote(int note, int velocity, bool note_on); |
| |
| // Adds notes to the score. |
| void BuildScore(); |
| |
| // Handle a change in the minimum lead time requirement, starting playback if |
| // needed.. |
| void OnMinLeadTimeChanged(int64_t min_lead_time_nsec); |
| |
| // Sends as much content as is currently demanded. Ends the stream when all |
| // content has been sent. |
| void SendPackets(); |
| |
| // Fills |buffer| with audio. |
| void FillBuffer(float* buffer); |
| |
| // Determines whether all audio has been sent. |
| bool done() const { |
| return !interactive_ && frequencies_by_pts_.empty() && |
| tone_generators_.empty(); |
| } |
| |
| bool interactive_; |
| fit::closure quit_callback_; |
| fsl::FDWaiter fd_waiter_; |
| fuchsia::media::AudioRendererPtr audio_renderer_; |
| std::map<int64_t, float> frequencies_by_pts_; |
| std::list<ToneGenerator> tone_generators_; |
| int64_t pts_ = 0; |
| fzl::VmoMapper payload_buffer_; |
| uint32_t active_packets_in_flight_ = 0; |
| uint32_t target_packets_in_flight_ = 0; |
| bool started_ = false; |
| std::unique_ptr<MidiKeyboard> midi_keyboard_; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(Tones); |
| }; |
| |
| } // namespace examples |
| |
| #endif // GARNET_EXAMPLES_MEDIA_TONES_TONES_H_ |