| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <math.h> | 5 #include <math.h> |
| 6 #include <memory> | 6 #include <memory> |
| 7 | 7 |
| 8 #include "mojo/public/c/system/main.h" | 8 #include "mojo/public/c/system/main.h" |
| 9 #include "mojo/public/cpp/application/application_delegate.h" | 9 #include "mojo/public/cpp/application/application_impl_base.h" |
| 10 #include "mojo/public/cpp/application/application_impl.h" | |
| 11 #include "mojo/public/cpp/application/application_runner.h" | |
| 12 #include "mojo/public/cpp/application/connect.h" | 10 #include "mojo/public/cpp/application/connect.h" |
| 11 #include "mojo/public/cpp/application/run_application.h" |
| 13 #include "mojo/public/cpp/utility/run_loop.h" | 12 #include "mojo/public/cpp/utility/run_loop.h" |
| 14 #include "mojo/services/media/audio/interfaces/audio_server.mojom.h" | 13 #include "mojo/services/media/audio/interfaces/audio_server.mojom.h" |
| 15 #include "mojo/services/media/audio/interfaces/audio_track.mojom.h" | 14 #include "mojo/services/media/audio/interfaces/audio_track.mojom.h" |
| 16 #include "mojo/services/media/common/cpp/circular_buffer_media_pipe_adapter.h" | 15 #include "mojo/services/media/common/cpp/circular_buffer_media_pipe_adapter.h" |
| 17 #include "mojo/services/media/common/cpp/linear_transform.h" | 16 #include "mojo/services/media/common/cpp/linear_transform.h" |
| 18 #include "mojo/services/media/common/cpp/local_time.h" | 17 #include "mojo/services/media/common/cpp/local_time.h" |
| 19 #include "mojo/services/media/common/interfaces/timelines.mojom.h" | 18 #include "mojo/services/media/common/interfaces/timelines.mojom.h" |
| 20 | 19 |
| 21 namespace mojo { | 20 namespace mojo { |
| 22 namespace media { | 21 namespace media { |
| 23 namespace audio { | 22 namespace audio { |
| 24 namespace examples { | 23 namespace examples { |
| 25 | 24 |
| 26 static constexpr uint32_t SAMP_FREQ = 48000; | 25 static constexpr uint32_t SAMP_FREQ = 48000; |
| 27 static constexpr uint32_t CHUNK_USEC = 10000; | 26 static constexpr uint32_t CHUNK_USEC = 10000; |
| 28 static constexpr uint32_t BUF_LO_WATER_USEC = 500000; | 27 static constexpr uint32_t BUF_LO_WATER_USEC = 500000; |
| 29 static constexpr uint32_t BUF_HI_WATER_USEC = BUF_LO_WATER_USEC | 28 static constexpr uint32_t BUF_HI_WATER_USEC = BUF_LO_WATER_USEC |
| 30 + (4 * CHUNK_USEC); | 29 + (4 * CHUNK_USEC); |
| 31 static constexpr uint32_t BUF_DEPTH_USEC = BUF_HI_WATER_USEC | 30 static constexpr uint32_t BUF_DEPTH_USEC = BUF_HI_WATER_USEC |
| 32 + (4 * CHUNK_USEC); | 31 + (4 * CHUNK_USEC); |
| 33 static constexpr uint32_t FRAME_BYTES = sizeof(int16_t); | 32 static constexpr uint32_t FRAME_BYTES = sizeof(int16_t); |
| 34 | 33 |
| 35 static inline constexpr uint32_t USecToBytes(uint64_t usec) { | 34 static inline constexpr uint32_t USecToBytes(uint64_t usec) { |
| 36 return ((usec * SAMP_FREQ) / 1000000) * FRAME_BYTES; | 35 return ((usec * SAMP_FREQ) / 1000000) * FRAME_BYTES; |
| 37 } | 36 } |
| 38 | 37 |
| 39 class PlayToneApp : public ApplicationDelegate { | 38 class PlayToneApp : public ApplicationImplBase { |
| 40 public: | 39 public: |
| 41 ~PlayToneApp() override { Quit(); } | 40 ~PlayToneApp() override { OnQuit(); } |
| 42 | 41 |
| 43 // ApplicationDelegate | 42 // ApplicationImplBase overrides: |
| 44 void Initialize(ApplicationImpl* app) override; | 43 void OnInitialize() override; |
| 45 void Quit() override; | 44 void OnQuit() override; |
| 46 | 45 |
| 47 private: | 46 private: |
| 48 void GenerateToneCbk(MediaResult res); | 47 void GenerateToneCbk(MediaResult res); |
| 49 void PlayTone(double freq_hz, double amplitude, double duration_sec); | 48 void PlayTone(double freq_hz, double amplitude, double duration_sec); |
| 50 void PostShutdown(); | 49 void PostShutdown(); |
| 51 void Shutdown(); | 50 void Shutdown(); |
| 52 void OnConnectionError(const std::string& connection_name); | 51 void OnConnectionError(const std::string& connection_name); |
| 53 | 52 |
| 54 AudioServerPtr audio_server_; | 53 AudioServerPtr audio_server_; |
| 55 AudioTrackPtr audio_track_; | 54 AudioTrackPtr audio_track_; |
| 56 TimelineConsumerPtr timeline_consumer_; | 55 TimelineConsumerPtr timeline_consumer_; |
| 57 std::unique_ptr<CircularBufferMediaPipeAdapter> audio_pipe_; | 56 std::unique_ptr<CircularBufferMediaPipeAdapter> audio_pipe_; |
| 58 | 57 |
| 59 bool clock_started_ = false; | 58 bool clock_started_ = false; |
| 60 uint64_t media_time_ = 0; | 59 uint64_t media_time_ = 0; |
| 61 double freq_hz_ = 440.0; | 60 double freq_hz_ = 440.0; |
| 62 double amplitude_ = 1.0; | 61 double amplitude_ = 1.0; |
| 63 bool shutting_down_ = false; | 62 bool shutting_down_ = false; |
| 64 }; | 63 }; |
| 65 | 64 |
| 66 void PlayToneApp::Quit() { | 65 void PlayToneApp::OnQuit() { |
| 67 timeline_consumer_.reset(); | 66 timeline_consumer_.reset(); |
| 68 audio_pipe_.reset(); | 67 audio_pipe_.reset(); |
| 69 audio_track_.reset(); | 68 audio_track_.reset(); |
| 70 audio_server_.reset(); | 69 audio_server_.reset(); |
| 71 } | 70 } |
| 72 | 71 |
| 73 void PlayToneApp::Initialize(ApplicationImpl* app) { | 72 void PlayToneApp::OnInitialize() { |
| 74 mojo::ConnectToService(app->shell(), "mojo:audio_server", | 73 mojo::ConnectToService(shell(), "mojo:audio_server", |
| 75 GetProxy(&audio_server_)); | 74 GetProxy(&audio_server_)); |
| 76 audio_server_.set_connection_error_handler([this]() { | 75 audio_server_.set_connection_error_handler([this]() { |
| 77 OnConnectionError("audio_server"); | 76 OnConnectionError("audio_server"); |
| 78 }); | 77 }); |
| 79 | 78 |
| 80 audio_server_->CreateTrack(GetProxy(&audio_track_)); | 79 audio_server_->CreateTrack(GetProxy(&audio_track_)); |
| 81 audio_track_.set_connection_error_handler([this]() { | 80 audio_track_.set_connection_error_handler([this]() { |
| 82 OnConnectionError("audio_track"); | 81 OnConnectionError("audio_track"); |
| 83 }); | 82 }); |
| 84 | 83 |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 226 audio_pipe_->ResetSignalCallback(); | 225 audio_pipe_->ResetSignalCallback(); |
| 227 } | 226 } |
| 228 audio_pipe_ = nullptr; | 227 audio_pipe_ = nullptr; |
| 229 | 228 |
| 230 mojo::RunLoop::current()->PostDelayedTask([this]() -> void { | 229 mojo::RunLoop::current()->PostDelayedTask([this]() -> void { |
| 231 Shutdown(); | 230 Shutdown(); |
| 232 }, 0); | 231 }, 0); |
| 233 } | 232 } |
| 234 | 233 |
| 235 void PlayToneApp::Shutdown() { | 234 void PlayToneApp::Shutdown() { |
| 236 Quit(); | 235 OnQuit(); |
| 237 RunLoop::current()->Quit(); | 236 RunLoop::current()->Quit(); |
| 238 } | 237 } |
| 239 | 238 |
| 240 } // namespace examples | 239 } // namespace examples |
| 241 } // namespace audio | 240 } // namespace audio |
| 242 } // namespace media | 241 } // namespace media |
| 243 } // namespace mojo | 242 } // namespace mojo |
| 244 | 243 |
| 245 MojoResult MojoMain(MojoHandle app_request) { | 244 MojoResult MojoMain(MojoHandle app_request) { |
| 246 mojo::ApplicationRunner runner( | 245 mojo::media::audio::examples::PlayToneApp play_tone_app; |
| 247 std::unique_ptr<mojo::media::audio::examples::PlayToneApp>( | 246 return mojo::RunMainApplication(app_request, &play_tone_app); |
| 248 new mojo::media::audio::examples::PlayToneApp())); | |
| 249 return runner.Run(app_request); | |
| 250 } | 247 } |
| OLD | NEW |